Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5ed6dedeab | |||
| 3271af445a | |||
| e7e9e5b826 | |||
| 5337758dee | |||
| 426793e56a | |||
| a794b77654 | |||
| c510c2a138 | |||
| 8cbf5cb20c | |||
| 54a8924384 |
@@ -93,6 +93,7 @@ func (a *App) GetAniListItem(aniId int, login bool) AniListGetSingleAnime {
|
|||||||
timeUntilAiring
|
timeUntilAiring
|
||||||
episode
|
episode
|
||||||
}
|
}
|
||||||
|
genres
|
||||||
tags{
|
tags{
|
||||||
id
|
id
|
||||||
name
|
name
|
||||||
@@ -222,6 +223,7 @@ func (a *App) AniListSearch(query string) any {
|
|||||||
timeUntilAiring
|
timeUntilAiring
|
||||||
episode
|
episode
|
||||||
}
|
}
|
||||||
|
genres
|
||||||
tags{
|
tags{
|
||||||
id
|
id
|
||||||
name
|
name
|
||||||
@@ -307,6 +309,7 @@ func (a *App) GetAniListUserWatchingList(page int, perPage int, sort string) Ani
|
|||||||
timeUntilAiring
|
timeUntilAiring
|
||||||
episode
|
episode
|
||||||
}
|
}
|
||||||
|
genres
|
||||||
tags{
|
tags{
|
||||||
id
|
id
|
||||||
name
|
name
|
||||||
|
|||||||
@@ -74,7 +74,8 @@ type MediaList struct {
|
|||||||
TimeUntilAiring int `json:"timeUntilAiring"`
|
TimeUntilAiring int `json:"timeUntilAiring"`
|
||||||
Episode int `json:"episode"`
|
Episode int `json:"episode"`
|
||||||
} `json:"nextAiringEpisode"`
|
} `json:"nextAiringEpisode"`
|
||||||
Tags []struct {
|
Genres []string `json:"genres"`
|
||||||
|
Tags []struct {
|
||||||
Id int `json:"id"`
|
Id int `json:"id"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ body:graphql {
|
|||||||
english
|
english
|
||||||
native
|
native
|
||||||
}
|
}
|
||||||
|
genre
|
||||||
description
|
description
|
||||||
coverImage {
|
coverImage {
|
||||||
large
|
large
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ export interface MediaList {
|
|||||||
timeUntilAiring: number;
|
timeUntilAiring: number;
|
||||||
episode: number;
|
episode: number;
|
||||||
};
|
};
|
||||||
|
genres: string[];
|
||||||
tags: [
|
tags: [
|
||||||
{
|
{
|
||||||
id: number;
|
id: number;
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
simklLoggedIn,
|
simklLoggedIn,
|
||||||
} from "../helperModules/GlobalVariablesAndHelperFunctions.svelte";
|
} from "../helperModules/GlobalVariablesAndHelperFunctions.svelte";
|
||||||
import { push } from "svelte-spa-router";
|
import { push } from "svelte-spa-router";
|
||||||
|
import WebsiteLink from "./WebsiteLink.svelte";
|
||||||
import type { AniListGetSingleAnime } from "../anilist/types/AniListCurrentUserWatchListType";
|
import type { AniListGetSingleAnime } from "../anilist/types/AniListCurrentUserWatchListType";
|
||||||
import Rating from "./Rating.svelte";
|
import Rating from "./Rating.svelte";
|
||||||
import {
|
import {
|
||||||
@@ -41,7 +42,7 @@
|
|||||||
import { AddAnimeServiceToTable } from "../helperModules/AddAnimeServiceToTable.svelte";
|
import { AddAnimeServiceToTable } from "../helperModules/AddAnimeServiceToTable.svelte";
|
||||||
import { CheckIfAniListLoggedInAndLoadWatchList } from "../helperModules/CheckIfAniListLoggedInAndLoadWatchList.svelte";
|
import { CheckIfAniListLoggedInAndLoadWatchList } from "../helperModules/CheckIfAniListLoggedInAndLoadWatchList.svelte";
|
||||||
import Datepicker from "./Datepicker.svelte";
|
import Datepicker from "./Datepicker.svelte";
|
||||||
import {Badge, Tooltip} from "flowbite-svelte";
|
import { Badge, Tooltip } from "flowbite-svelte";
|
||||||
const re = /^([0-9]{4})-([0-9]{2})-([0-9]{2})/;
|
const re = /^([0-9]{4})-([0-9]{2})-([0-9]{2})/;
|
||||||
|
|
||||||
let isAniListLoggedIn: boolean;
|
let isAniListLoggedIn: boolean;
|
||||||
@@ -827,15 +828,32 @@
|
|||||||
|
|
||||||
<div class="flex m-5">
|
<div class="flex m-5">
|
||||||
<div>
|
<div>
|
||||||
|
<h3 class="text-2xl">Genres</h3>
|
||||||
|
{#each currentAniListAnime.data.MediaList.media.genres as genre}
|
||||||
|
<div>
|
||||||
|
<Badge large border color="blue" class="m-1 w-52">
|
||||||
|
<div>
|
||||||
|
<WebsiteLink
|
||||||
|
id={genre}
|
||||||
|
url="https://anilist.co/search/anime/{genre}"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</Badge>
|
||||||
|
<Tooltip>{genre}</Tooltip>
|
||||||
|
</div>
|
||||||
|
{/each}
|
||||||
<h3 class="text-2xl">Tags</h3>
|
<h3 class="text-2xl">Tags</h3>
|
||||||
<div class="mt-2">
|
<div class="mt-2">
|
||||||
{#each currentAniListAnime.data.MediaList.media.tags as tag}
|
{#each currentAniListAnime.data.MediaList.media.tags as tag}
|
||||||
<div>
|
<div>
|
||||||
<Badge large border color="blue" class="m-1 w-52">
|
<Badge large border color="blue" class="m-1 w-52">
|
||||||
<div>
|
<div>
|
||||||
{tag.name} -
|
<WebsiteLink
|
||||||
<span class="text-xs">{tag.rank}%</span>
|
id={tag.name}
|
||||||
</div>
|
url="https://anilist.co/search/anime/?genres={tag.name}"
|
||||||
|
/>
|
||||||
|
<span class="text-xs">({tag.rank}%)</span>
|
||||||
|
</div>
|
||||||
</Badge>
|
</Badge>
|
||||||
<Tooltip>{tag.description}</Tooltip>
|
<Tooltip>{tag.description}</Tooltip>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Search from "./Search.svelte"
|
import Search from "./Search.svelte";
|
||||||
import {
|
import {
|
||||||
aniListLoggedIn,
|
aniListLoggedIn,
|
||||||
loginToAniList,
|
loginToAniList,
|
||||||
@@ -7,55 +7,81 @@
|
|||||||
loginToSimkl,
|
loginToSimkl,
|
||||||
malLoggedIn,
|
malLoggedIn,
|
||||||
simklLoggedIn,
|
simklLoggedIn,
|
||||||
} from "../helperModules/GlobalVariablesAndHelperFunctions.svelte"
|
} from "../helperModules/GlobalVariablesAndHelperFunctions.svelte";
|
||||||
import AvatarMenu from "./AvatarMenu.svelte";
|
import AvatarMenu from "./AvatarMenu.svelte";
|
||||||
import logo from "../assets/images/AniTrackLogo.svg"
|
import logo from "../assets/images/AniTrackLogo.svg";
|
||||||
|
import { link } from "svelte-spa-router";
|
||||||
|
|
||||||
let isAniListLoggedIn: boolean
|
let isAniListLoggedIn: boolean;
|
||||||
let isSimklLoggedIn: boolean
|
let isSimklLoggedIn: boolean;
|
||||||
let isMALLoggedIn: boolean
|
let isMALLoggedIn: boolean;
|
||||||
|
|
||||||
aniListLoggedIn.subscribe((value) => isAniListLoggedIn = value)
|
aniListLoggedIn.subscribe((value) => (isAniListLoggedIn = value));
|
||||||
simklLoggedIn.subscribe((value) => isSimklLoggedIn = value)
|
simklLoggedIn.subscribe((value) => (isSimklLoggedIn = value));
|
||||||
malLoggedIn.subscribe((value) => isMALLoggedIn = value)
|
malLoggedIn.subscribe((value) => (isMALLoggedIn = value));
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<nav class="border-gray-200 bg-gray-900">
|
<nav class="border-gray-200 bg-gray-900">
|
||||||
<div class="max-w-screen-xl flex flex-wrap items-center justify-between mx-auto p-4">
|
<div
|
||||||
|
class="max-w-screen-xl flex flex-wrap items-center justify-between mx-auto p-4"
|
||||||
|
>
|
||||||
<div class="flex items-center space-x-3 rtl:space-x-reverse">
|
<div class="flex items-center space-x-3 rtl:space-x-reverse">
|
||||||
<a href="/"><img src={logo} class="h-8" alt="AniTrack Logo"/></a>
|
<a href="/" use:link
|
||||||
|
><img src={logo} class="h-8" alt="AniTrack Logo" /></a
|
||||||
|
>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center min-[950px]:order-2 space-x-3 min-[950px]:space-x-0 rtl:space-x-reverse">
|
<div
|
||||||
|
class="flex items-center min-[950px]:order-2 space-x-3 min-[950px]:space-x-0 rtl:space-x-reverse"
|
||||||
|
>
|
||||||
<div class="min-[950px]:block min-[950px]:mr-4">
|
<div class="min-[950px]:block min-[950px]:mr-4">
|
||||||
<Search />
|
<Search />
|
||||||
</div>
|
</div>
|
||||||
<AvatarMenu/>
|
<AvatarMenu />
|
||||||
<button on:click={() => {
|
<button
|
||||||
let menu = document.querySelector("#navbar-user")
|
on:click={() => {
|
||||||
menu.classList.toggle("hidden")
|
let menu = document.querySelector("#navbar-user");
|
||||||
}} type="button"
|
menu.classList.toggle("hidden");
|
||||||
class="inline-flex items-center p-2 w-10 h-10 justify-center text-sm rounded-lg min-[950px]:hidden focus:outline-none focus:ring-2 text-gray-400 hover:bg-gray-700 focus:ring-gray-600"
|
}}
|
||||||
aria-controls="navbar-user" aria-expanded="false">
|
type="button"
|
||||||
|
class="inline-flex items-center p-2 w-10 h-10 justify-center text-sm rounded-lg min-[950px]:hidden focus:outline-none focus:ring-2 text-gray-400 hover:bg-gray-700 focus:ring-gray-600"
|
||||||
|
aria-controls="navbar-user"
|
||||||
|
aria-expanded="false"
|
||||||
|
>
|
||||||
<span class="sr-only">Open main menu</span>
|
<span class="sr-only">Open main menu</span>
|
||||||
<svg class="w-5 h-5" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none"
|
<svg
|
||||||
viewBox="0 0 17 14">
|
class="w-5 h-5"
|
||||||
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
aria-hidden="true"
|
||||||
d="M1 1h15M1 7h15M1 13h15"/>
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 17 14"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
stroke-width="2"
|
||||||
|
d="M1 1h15M1 7h15M1 13h15"
|
||||||
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="hidden items-center justify-between w-full pb-4 min-[950px]:pb-0 min-[950px]:flex min-[950px]:w-auto min-[950px]:order-1 border border-gray-700 min-[950px]:border-0 bg-gray-800 min-[950px]:bg-transparent rounded-lg" id="navbar-user">
|
<div
|
||||||
<ul class="flex flex-col font-medium pb-6 min-[950px]:p-0 mt-4 min-[950px]:space-x-8 rtl:space-x-reverse min-[950px]:flex-row min-[950px]:mt-0">
|
class="hidden items-center justify-between w-full pb-4 min-[950px]:pb-0 min-[950px]:flex min-[950px]:w-auto min-[950px]:order-1 border border-gray-700 min-[950px]:border-0 bg-gray-800 min-[950px]:bg-transparent rounded-lg"
|
||||||
|
id="navbar-user"
|
||||||
|
>
|
||||||
|
<ul
|
||||||
|
class="flex flex-col font-medium pb-6 min-[950px]:p-0 mt-4 min-[950px]:space-x-8 rtl:space-x-reverse min-[950px]:flex-row min-[950px]:mt-0"
|
||||||
|
>
|
||||||
<li>
|
<li>
|
||||||
{#if !isAniListLoggedIn}
|
{#if !isAniListLoggedIn}
|
||||||
<button on:click={loginToAniList}>
|
<button on:click={loginToAniList}>
|
||||||
<!-- class="block py-2 px-3 w-full min-[950px]:w-auto rounded text-gray-300 min-[950px]:hover:text-blue-500 hover:bg-gray-700 hover:text-white min-[950px]:hover:bg-transparent border-gray-700">-->
|
<!-- class="block py-2 px-3 w-full min-[950px]:w-auto rounded text-gray-300 min-[950px]:hover:text-blue-500 hover:bg-gray-700 hover:text-white min-[950px]:hover:bg-transparent border-gray-700">-->
|
||||||
AniList Login
|
AniList Login
|
||||||
</button>
|
</button>
|
||||||
{/if}
|
{/if}
|
||||||
{#if !isMALLoggedIn}
|
{#if !isMALLoggedIn}
|
||||||
<button on:click={loginToMAL}>
|
<button on:click={loginToMAL}>
|
||||||
<!-- class="block py-2 px-3 w-full min-[950px]:w-auto rounded min-[950px]:p-0 text-gray-300 min-[950px]:hover:text-blue-500 hover:bg-gray-700 hover:text-white min-[950px]:hover:bg-transparent border-gray-700">-->
|
<!-- class="block py-2 px-3 w-full min-[950px]:w-auto rounded min-[950px]:p-0 text-gray-300 min-[950px]:hover:text-blue-500 hover:bg-gray-700 hover:text-white min-[950px]:hover:bg-transparent border-gray-700">-->
|
||||||
MyAnimeList Login
|
MyAnimeList Login
|
||||||
</button>
|
</button>
|
||||||
{/if}
|
{/if}
|
||||||
@@ -63,14 +89,14 @@
|
|||||||
<li>
|
<li>
|
||||||
{#if !isSimklLoggedIn}
|
{#if !isSimklLoggedIn}
|
||||||
<button on:click={loginToSimkl}>
|
<button on:click={loginToSimkl}>
|
||||||
<!-- class="block py-2 px-3 w-full min-[950px]:w-auto rounded min-[950px]:p-0 text-gray-300 min-[950px]:hover:text-blue-500 hover:bg-gray-700 hover:text-white min-[950px]:hover:bg-transparent border-gray-700">-->
|
<!-- class="block py-2 px-3 w-full min-[950px]:w-auto rounded min-[950px]:p-0 text-gray-300 min-[950px]:hover:text-blue-500 hover:bg-gray-700 hover:text-white min-[950px]:hover:bg-transparent border-gray-700">-->
|
||||||
Simkl Login
|
Simkl Login
|
||||||
</button>
|
</button>
|
||||||
{/if}
|
{/if}
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="flex justify-center min-[950px]:hidden">
|
<div class="flex justify-center min-[950px]:hidden">
|
||||||
<Search/>
|
<Search />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,28 +1,32 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import {BrowserOpenURL} from "../../wailsjs/runtime"
|
import { BrowserOpenURL } from "../../wailsjs/runtime";
|
||||||
|
|
||||||
export let id: string
|
export let id: string;
|
||||||
let url = ""
|
export let url = "";
|
||||||
let isAniList = false
|
let isAniList = false;
|
||||||
let isMAL = false
|
let isMAL = false;
|
||||||
let isSimkl = false
|
let isSimkl = false;
|
||||||
let newId = id
|
let newId = id;
|
||||||
let re = /[ams]?-?(.*)/
|
let re = /[ams]?-?(.*)/;
|
||||||
if (id !== undefined && id.length > 0) {
|
if (id !== undefined && id.length > 0) {
|
||||||
isAniList = id.includes("a-")
|
isAniList = id.includes("a-");
|
||||||
isMAL = id.includes("m-")
|
isMAL = id.includes("m-");
|
||||||
isSimkl = id.includes("s-")
|
isSimkl = id.includes("s-");
|
||||||
newId = id.match(re)[1]
|
if (isAniList || isMAL || isSimkl) newId = id.match(re)[1];
|
||||||
}
|
else newId = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isAniList) url = `https://anilist.co/anime/${newId}`;
|
||||||
if (isAniList) url = `https://anilist.co/anime/${newId}`
|
if (isMAL) url = `https://myanimelist.net/anime/${newId}`;
|
||||||
if (isMAL) url = `https://myanimelist.net/anime/${newId}`
|
if (isSimkl) url = `https://simkl.com/anime/${newId}`;
|
||||||
if (isSimkl) url = `https://simkl.com/anime/${newId}`
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if url.length > 0}
|
{#if url.length > 0}
|
||||||
<button class="underline underline-offset-2 px-4 py-1" on:click={() => BrowserOpenURL(url)}>{newId}</button>
|
<button
|
||||||
|
type="button"
|
||||||
|
class="underline underline-offset-2 px-4 py-1"
|
||||||
|
on:click={() => BrowserOpenURL(url)}>{newId}</button
|
||||||
|
>
|
||||||
{:else}
|
{:else}
|
||||||
{id}
|
{id}
|
||||||
{/if}
|
{/if}
|
||||||
|
|||||||
@@ -364,7 +364,7 @@ export namespace main {
|
|||||||
id: number;
|
id: number;
|
||||||
mediaId: number;
|
mediaId: number;
|
||||||
userId: number;
|
userId: number;
|
||||||
// Go type: struct { ID int "json:\"id\""; IDMal int "json:\"idMal\""; Title struct { Romaji string "json:\"romaji\""; English string "json:\"english\""; Native string "json:\"native\"" } "json:\"title\""; Description string "json:\"description\""; CoverImage struct { Large string "json:\"large\"" } "json:\"coverImage\""; Season string "json:\"season\""; SeasonYear int "json:\"seasonYear\""; Status string "json:\"status\""; Episodes int "json:\"episodes\""; NextAiringEpisode struct { AiringAt int "json:\"airingAt\""; TimeUntilAiring int "json:\"timeUntilAiring\""; Episode int "json:\"episode\"" } "json:\"nextAiringEpisode\""; Tags []struct { Id int "json:\"id\""; Name string "json:\"name\""; Description string "json:\"description\""; Rank int "json:\"rank\""; IsMediaSpoiler bool "json:\"isMediaSpoiler\""; IsAdult bool "json:\"isAdult\"" } "json:\"tags\""; IsAdult bool "json:\"isAdult\"" }
|
// Go type: struct { ID int "json:\"id\""; IDMal int "json:\"idMal\""; Title struct { Romaji string "json:\"romaji\""; English string "json:\"english\""; Native string "json:\"native\"" } "json:\"title\""; Description string "json:\"description\""; CoverImage struct { Large string "json:\"large\"" } "json:\"coverImage\""; Season string "json:\"season\""; SeasonYear int "json:\"seasonYear\""; Status string "json:\"status\""; Episodes int "json:\"episodes\""; NextAiringEpisode struct { AiringAt int "json:\"airingAt\""; TimeUntilAiring int "json:\"timeUntilAiring\""; Episode int "json:\"episode\"" } "json:\"nextAiringEpisode\""; Genres []string "json:\"genres\""; Tags []struct { Id int "json:\"id\""; Name string "json:\"name\""; Description string "json:\"description\""; Rank int "json:\"rank\""; IsMediaSpoiler bool "json:\"isMediaSpoiler\""; IsAdult bool "json:\"isAdult\"" } "json:\"tags\""; IsAdult bool "json:\"isAdult\"" }
|
||||||
media: any;
|
media: any;
|
||||||
status: string;
|
status: string;
|
||||||
// Go type: struct { Year int "json:\"year\""; Month int "json:\"month\""; Day int "json:\"day\"" }
|
// Go type: struct { Year int "json:\"year\""; Month int "json:\"month\""; Day int "json:\"day\"" }
|
||||||
|
|||||||
@@ -1,79 +0,0 @@
|
|||||||
# @name AniChart
|
|
||||||
|
|
||||||
POST https://graphql.anilist.co
|
|
||||||
Accept: applicaton/json
|
|
||||||
X-REQUEST-TYPE: Graphql
|
|
||||||
|
|
||||||
query ($page: Int, $perPage: Int, $airingAt_greater:Int) {
|
|
||||||
Page(page: $page, perPage: $perPage) {
|
|
||||||
pageInfo {
|
|
||||||
total
|
|
||||||
perPage
|
|
||||||
currentPage
|
|
||||||
lastPage
|
|
||||||
hasNextPage
|
|
||||||
}
|
|
||||||
airingSchedules(airingAt_greater:$airingAt_greater){
|
|
||||||
id
|
|
||||||
airingAt
|
|
||||||
timeUntilAiring
|
|
||||||
episode
|
|
||||||
mediaId
|
|
||||||
media{
|
|
||||||
id
|
|
||||||
title{
|
|
||||||
english
|
|
||||||
romaji
|
|
||||||
native
|
|
||||||
}
|
|
||||||
type
|
|
||||||
format
|
|
||||||
status
|
|
||||||
startDate{
|
|
||||||
year
|
|
||||||
month
|
|
||||||
day
|
|
||||||
}
|
|
||||||
endDate{
|
|
||||||
year
|
|
||||||
month
|
|
||||||
day
|
|
||||||
}
|
|
||||||
season
|
|
||||||
seasonYear
|
|
||||||
episodes
|
|
||||||
duration
|
|
||||||
coverImage{
|
|
||||||
medium
|
|
||||||
large
|
|
||||||
color
|
|
||||||
extraLarge
|
|
||||||
}
|
|
||||||
bannerImage
|
|
||||||
genres
|
|
||||||
averageScore
|
|
||||||
meanScore
|
|
||||||
popularity
|
|
||||||
trending
|
|
||||||
favourites
|
|
||||||
tags{
|
|
||||||
id
|
|
||||||
name
|
|
||||||
description
|
|
||||||
category
|
|
||||||
rank
|
|
||||||
isGeneralSpoiler
|
|
||||||
isMediaSpoiler
|
|
||||||
isAdult
|
|
||||||
}
|
|
||||||
isAdult
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
"page": 50,
|
|
||||||
"perPage": 20,
|
|
||||||
"airingAt_greater": 1730260800
|
|
||||||
}
|
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
# @name AniList Item
|
|
||||||
|
|
||||||
POST https://graphql.anilist.co
|
|
||||||
Accept: applicaton/json
|
|
||||||
X-REQUEST-TYPE: Graphql
|
|
||||||
Authorization: Bearer {{ANILIST_ACCESS_TOKEN}}
|
|
||||||
|
|
||||||
query ($userId: Int, $mediaId: Int, $listType: MediaType) {
|
|
||||||
MediaList(mediaId: $mediaId, userId: $userId, type: $listType) {
|
|
||||||
id
|
|
||||||
mediaId
|
|
||||||
userId
|
|
||||||
media {
|
|
||||||
id
|
|
||||||
idMal
|
|
||||||
tags {
|
|
||||||
id
|
|
||||||
name
|
|
||||||
description
|
|
||||||
rank
|
|
||||||
isMediaSpoiler
|
|
||||||
isAdult
|
|
||||||
}
|
|
||||||
title {
|
|
||||||
romaji
|
|
||||||
english
|
|
||||||
native
|
|
||||||
}
|
|
||||||
description
|
|
||||||
coverImage {
|
|
||||||
large
|
|
||||||
}
|
|
||||||
season
|
|
||||||
seasonYear
|
|
||||||
status
|
|
||||||
episodes
|
|
||||||
nextAiringEpisode {
|
|
||||||
airingAt
|
|
||||||
timeUntilAiring
|
|
||||||
episode
|
|
||||||
}
|
|
||||||
isAdult
|
|
||||||
}
|
|
||||||
status
|
|
||||||
startedAt {
|
|
||||||
year
|
|
||||||
month
|
|
||||||
day
|
|
||||||
}
|
|
||||||
completedAt {
|
|
||||||
year
|
|
||||||
month
|
|
||||||
day
|
|
||||||
}
|
|
||||||
notes
|
|
||||||
progress
|
|
||||||
score
|
|
||||||
repeat
|
|
||||||
user {
|
|
||||||
id
|
|
||||||
name
|
|
||||||
avatar {
|
|
||||||
large
|
|
||||||
medium
|
|
||||||
}
|
|
||||||
statistics {
|
|
||||||
anime {
|
|
||||||
count
|
|
||||||
statuses {
|
|
||||||
status
|
|
||||||
count
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
"userId": 413504,
|
|
||||||
"mediaId": 170998,
|
|
||||||
"listType": "ANIME"
|
|
||||||
}
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
# @name AniList MediaList User Query
|
|
||||||
|
|
||||||
POST https://graphql.anilist.co
|
|
||||||
Accept: applicaton/json
|
|
||||||
X-REQUEST-TYPE: Graphql
|
|
||||||
|
|
||||||
query(
|
|
||||||
$page: Int
|
|
||||||
$perPage: Int
|
|
||||||
$userId: Int
|
|
||||||
$listType: MediaType
|
|
||||||
$status: MediaListStatus
|
|
||||||
) {
|
|
||||||
Page(page: $page, perPage: $perPage) {
|
|
||||||
pageInfo {
|
|
||||||
total
|
|
||||||
perPage
|
|
||||||
currentPage
|
|
||||||
lastPage
|
|
||||||
hasNextPage
|
|
||||||
}
|
|
||||||
mediaList(userId: $userId, type: $listType, status: $status) {
|
|
||||||
id
|
|
||||||
mediaId
|
|
||||||
userId
|
|
||||||
media {
|
|
||||||
id
|
|
||||||
idMal
|
|
||||||
title {
|
|
||||||
romaji
|
|
||||||
english
|
|
||||||
native
|
|
||||||
}
|
|
||||||
description
|
|
||||||
coverImage {
|
|
||||||
large
|
|
||||||
}
|
|
||||||
season
|
|
||||||
seasonYear
|
|
||||||
episodes
|
|
||||||
}
|
|
||||||
status
|
|
||||||
notes
|
|
||||||
progress
|
|
||||||
score
|
|
||||||
repeat
|
|
||||||
user {
|
|
||||||
id
|
|
||||||
statistics {
|
|
||||||
anime {
|
|
||||||
count
|
|
||||||
statuses {
|
|
||||||
status
|
|
||||||
count
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
{
|
|
||||||
"page": 1,
|
|
||||||
"perPage": 20,
|
|
||||||
"userId": 413504,
|
|
||||||
"listType": "ANIME",
|
|
||||||
"status": "CURRENT"
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
# @name AniList Search
|
|
||||||
|
|
||||||
POST https://graphql.anilist.co
|
|
||||||
Accept: applicaton/json
|
|
||||||
X-REQUEST-TYPE: Graphql
|
|
||||||
|
|
||||||
query ($search: String!, $listType: MediaType) {
|
|
||||||
Page (page: 1, perPage: 100) {
|
|
||||||
pageInfo {
|
|
||||||
total
|
|
||||||
currentPage
|
|
||||||
lastPage
|
|
||||||
hasNextPage
|
|
||||||
perPage
|
|
||||||
}
|
|
||||||
media (search: $search, type: $listType) {
|
|
||||||
id
|
|
||||||
idMal
|
|
||||||
title {
|
|
||||||
romaji
|
|
||||||
english
|
|
||||||
native
|
|
||||||
}
|
|
||||||
description
|
|
||||||
coverImage {
|
|
||||||
large
|
|
||||||
}
|
|
||||||
season
|
|
||||||
seasonYear
|
|
||||||
status
|
|
||||||
episodes
|
|
||||||
nextAiringEpisode{
|
|
||||||
airingAt
|
|
||||||
timeUntilAiring
|
|
||||||
episode
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
"search": "dan-da-dan",
|
|
||||||
"listType": "ANIME"
|
|
||||||
}
|
|
||||||
@@ -1,93 +0,0 @@
|
|||||||
# @name GetAniListUserWatchList
|
|
||||||
|
|
||||||
POST https://graphql.anilist.co
|
|
||||||
Accept: applicaton/json
|
|
||||||
X-REQUEST-TYPE: Graphql
|
|
||||||
|
|
||||||
query (
|
|
||||||
$page: Int
|
|
||||||
$perPage: Int
|
|
||||||
$userId: Int
|
|
||||||
$listType: MediaType
|
|
||||||
$status: MediaListStatus
|
|
||||||
$sort: [MediaListSort]
|
|
||||||
) {
|
|
||||||
Page(page: $page, perPage: $perPage) {
|
|
||||||
pageInfo {
|
|
||||||
total
|
|
||||||
perPage
|
|
||||||
currentPage
|
|
||||||
lastPage
|
|
||||||
hasNextPage
|
|
||||||
}
|
|
||||||
mediaList(userId: $userId, type: $listType, status: $status, sort: $sort) {
|
|
||||||
id
|
|
||||||
mediaId
|
|
||||||
userId
|
|
||||||
media {
|
|
||||||
id
|
|
||||||
idMal
|
|
||||||
title {
|
|
||||||
romaji
|
|
||||||
english
|
|
||||||
native
|
|
||||||
}
|
|
||||||
description
|
|
||||||
coverImage {
|
|
||||||
large
|
|
||||||
}
|
|
||||||
season
|
|
||||||
seasonYear
|
|
||||||
status
|
|
||||||
episodes
|
|
||||||
nextAiringEpisode {
|
|
||||||
airingAt
|
|
||||||
timeUntilAiring
|
|
||||||
episode
|
|
||||||
}
|
|
||||||
}
|
|
||||||
status
|
|
||||||
startedAt {
|
|
||||||
year
|
|
||||||
month
|
|
||||||
day
|
|
||||||
}
|
|
||||||
completedAt {
|
|
||||||
year
|
|
||||||
month
|
|
||||||
day
|
|
||||||
}
|
|
||||||
notes
|
|
||||||
progress
|
|
||||||
score
|
|
||||||
repeat
|
|
||||||
user {
|
|
||||||
id
|
|
||||||
name
|
|
||||||
avatar {
|
|
||||||
large
|
|
||||||
medium
|
|
||||||
}
|
|
||||||
statistics {
|
|
||||||
anime {
|
|
||||||
count
|
|
||||||
statuses {
|
|
||||||
status
|
|
||||||
count
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
{
|
|
||||||
"page": 1,
|
|
||||||
"perPage": 20,
|
|
||||||
"userId": 413504,
|
|
||||||
"listType": "ANIME",
|
|
||||||
"status": "CURRENT",
|
|
||||||
"sort": "UPDATED_TIME_DESC"
|
|
||||||
}
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
# @name GetAuthorizationToken
|
|
||||||
|
|
||||||
GET https://anilist.co/api/v2/oauth/authorize?client_id={{ANILIST_APP_ID}}&redirect_uri=http://localhost:6734/callback&response_type=code
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
# @name Load AniList Oauth Token
|
|
||||||
|
|
||||||
POST https://anilist.co/api/v2/oauth/token
|
|
||||||
Content-Type: application/x-www-form-urlencoded
|
|
||||||
Accept: application/json
|
|
||||||
|
|
||||||
grant_type=authorization_code
|
|
||||||
client_id={{ANILIST_APP_ID}}
|
|
||||||
client_secret={{ANILIST_SECRET_ID}}
|
|
||||||
redirect_uri=http://localhost:6734/callback
|
|
||||||
code={{ANILIST_CODE}}
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
# @name AniList Change Episode Watched
|
|
||||||
|
|
||||||
POST https://graphql.anilist.co
|
|
||||||
Content-Type: applicaton/json
|
|
||||||
Accept: applicaton/json
|
|
||||||
X-REQUEST-TYPE: Graphql
|
|
||||||
Authorization: Bearer {{ANILIST_ACCESS_TOKEN}}
|
|
||||||
|
|
||||||
mutation($mediaId:Int, $progress:Int, $status:MediaListStatus){
|
|
||||||
SaveMediaListEntry(mediaId:$mediaId, progress:$progress, status:$status){
|
|
||||||
id
|
|
||||||
mediaId
|
|
||||||
userId
|
|
||||||
media {
|
|
||||||
id
|
|
||||||
idMal
|
|
||||||
title {
|
|
||||||
romaji
|
|
||||||
english
|
|
||||||
native
|
|
||||||
}
|
|
||||||
description
|
|
||||||
coverImage {
|
|
||||||
large
|
|
||||||
}
|
|
||||||
season
|
|
||||||
seasonYear
|
|
||||||
status
|
|
||||||
episodes
|
|
||||||
nextAiringEpisode {
|
|
||||||
airingAt
|
|
||||||
timeUntilAiring
|
|
||||||
episode
|
|
||||||
}
|
|
||||||
isAdult
|
|
||||||
}
|
|
||||||
status
|
|
||||||
startedAt{
|
|
||||||
year
|
|
||||||
month
|
|
||||||
day
|
|
||||||
}
|
|
||||||
completedAt{
|
|
||||||
year
|
|
||||||
month
|
|
||||||
day
|
|
||||||
}
|
|
||||||
notes
|
|
||||||
progress
|
|
||||||
score
|
|
||||||
repeat
|
|
||||||
user {
|
|
||||||
id
|
|
||||||
name
|
|
||||||
avatar{
|
|
||||||
large
|
|
||||||
medium
|
|
||||||
}
|
|
||||||
statistics{
|
|
||||||
anime{
|
|
||||||
count
|
|
||||||
statuses{
|
|
||||||
status
|
|
||||||
count
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
"mediaId": 169417,
|
|
||||||
"progress": 12,
|
|
||||||
"status":"COMPLETED"
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
# @name AniList Change Status
|
|
||||||
|
|
||||||
POST https://graphql.anilist.co
|
|
||||||
Content-Type: applicaton/json
|
|
||||||
Accept: applicaton/json
|
|
||||||
X-REQUEST-TYPE: Graphql
|
|
||||||
Authorization: Bearer {{ANILIST_ACCESS_TOKEN}}
|
|
||||||
|
|
||||||
mutation($mediaId:Int, $status:MediaListStatus){
|
|
||||||
SaveMediaListEntry(mediaId:$mediaId, status:$status){
|
|
||||||
id
|
|
||||||
status
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
"mediaId": 1,
|
|
||||||
"status": "CURRENT"
|
|
||||||
}
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
# @name AniList Change Count
|
|
||||||
|
|
||||||
POST https://graphql.anilist.co
|
|
||||||
Content-Type: applicaton/json
|
|
||||||
Accept: applicaton/json
|
|
||||||
X-REQUEST-TYPE: Graphql
|
|
||||||
Authorization: Bearer {{ANILIST_ACCESS_TOKEN}}
|
|
||||||
|
|
||||||
mutation (
|
|
||||||
$mediaId: Int
|
|
||||||
$progress: Int
|
|
||||||
$status: MediaListStatus
|
|
||||||
$score: Float
|
|
||||||
$repeat: Int
|
|
||||||
$notes: String
|
|
||||||
$startedAt: FuzzyDateInput
|
|
||||||
$completedAt: FuzzyDateInput
|
|
||||||
) {
|
|
||||||
SaveMediaListEntry(
|
|
||||||
mediaId: $mediaId
|
|
||||||
progress: $progress
|
|
||||||
status: $status
|
|
||||||
score: $score
|
|
||||||
repeat: $repeat
|
|
||||||
notes: $notes
|
|
||||||
startedAt: $startedAt
|
|
||||||
completedAt: $completedAt
|
|
||||||
) {
|
|
||||||
mediaId
|
|
||||||
progress
|
|
||||||
status
|
|
||||||
score
|
|
||||||
repeat
|
|
||||||
notes
|
|
||||||
startedAt {
|
|
||||||
year
|
|
||||||
month
|
|
||||||
day
|
|
||||||
}
|
|
||||||
completedAt {
|
|
||||||
year
|
|
||||||
month
|
|
||||||
day
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
"mediaId": 170998,
|
|
||||||
"progress": 5,
|
|
||||||
"status": "CURRENT",
|
|
||||||
"score": 9.0,
|
|
||||||
"repeat": 0,
|
|
||||||
"notes": ",malSync::eyJ1IjoiaHR0cHM6Ly93d3cuY3J1bmNoeXJvbGwuY29tL3Nlcmllcy9HVkRIWDg1Wk4vI3NlYXNvbj1HNjNWQzJHUUsiLCJwIjoiIn0=::",
|
|
||||||
"startedAt": {
|
|
||||||
"year": 2024,
|
|
||||||
"month": 7,
|
|
||||||
"day": 10
|
|
||||||
},
|
|
||||||
"completedAt": {
|
|
||||||
"year": 0,
|
|
||||||
"month": 0,
|
|
||||||
"day": 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
# @name AniList Delete Media
|
|
||||||
|
|
||||||
POST https://graphql.anilist.co
|
|
||||||
Content-Type: applicaton/json
|
|
||||||
Accept: applicaton/json
|
|
||||||
X-REQUEST-TYPE: Graphql
|
|
||||||
Authorization: Bearer {{ANILIST_ACCESS_TOKEN}}
|
|
||||||
|
|
||||||
mutation ($id: Int) {
|
|
||||||
DeleteMediaListEntry(id: $id) {
|
|
||||||
deleted
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
"id": 430978266
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
# @name Get AnimeList
|
|
||||||
|
|
||||||
GET https://api.myanimelist.net/v2/users/{{MAL_USER}}/animelist?fields=list_status&status=watching&limit=1000
|
|
||||||
Content-Type application/x-www-form-urlencoded
|
|
||||||
Accept: application/json
|
|
||||||
Authorization: Bearer {{MAL_ACCESS_TOKEN}}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
# @name Get Authorization
|
|
||||||
|
|
||||||
POST https://myanimelist.net/v1/oauth2/token
|
|
||||||
Content-Type: application/x-www-form-urlencoded
|
|
||||||
Accept: application/json
|
|
||||||
|
|
||||||
grant_type=authorization_code&
|
|
||||||
client_id={{MAL_CLIENT_ID}}&
|
|
||||||
client_secret={{MAL_CLIENT_SECRET}}&
|
|
||||||
redirect_uri=http://localhost:6734/callback&
|
|
||||||
code={{MAL_CODE}}&
|
|
||||||
code_verifier={{MAL_VERIFIER}}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
# @name Get Single Anime
|
|
||||||
|
|
||||||
GET https://api.myanimelist.net/v2/anime/57380?fields=id,title,main_picture,alternative_titles,start_date,end_date,synopsis,mean,rank,popularity,num_list_users,num_scoring_users,nsfw,genres,created_at,updated_at,media_type,status,my_list_status,num_episodes,start_season,broadcast,source,average_episode_duration,rating,pictures,background,related_anime,recommendations,studios,statistics
|
|
||||||
Accept: application/json
|
|
||||||
Authorization: Bearer {{MAL_ACCESS_TOKEN}}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
# @name MAL Oauth Page
|
|
||||||
|
|
||||||
GET https://myanimelist.net/v1/oauth2/authorize?response_type=code&client_id={{MAL_CLIENT_ID}}&redirect_uri={{MAL_CALLBACK_URI}}
|
|
||||||
cookie MALSESSIONID=5ad688aafb78239bfd84752752ce193f; MALHLOGSESSID=632f67c3955267b4e57fc3d74b373ebb
|
|
||||||
Accept: application/json
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
# @name Update Anime Status
|
|
||||||
|
|
||||||
PATCH https://api.myanimelist.net/v2/anime/50205/my_list_status
|
|
||||||
Content-Type: application/x-www-form-urlencoded
|
|
||||||
Accept: application/json
|
|
||||||
Authorization: Bearer {{MAL_ACCESS_TOKEN}}
|
|
||||||
|
|
||||||
num_watched_episodes=3
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
# @name Get Code
|
|
||||||
|
|
||||||
GET https://simkl.com/oauth/authorize?response_type=code&client_id={{SIMKL_CLIENT_ID}}&redirect_uri=http://localhost:6734/callback
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
# @name Get Anime Full Info
|
|
||||||
|
|
||||||
GET https://api.simkl.com/anime/40084?extended=full
|
|
||||||
Accept application/json
|
|
||||||
simkl-api-key {{SIMKL_CLIENT_ID}}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
# @name GetUser WatchList
|
|
||||||
|
|
||||||
GET https://api.simkl.com/sync/all-items/anime/
|
|
||||||
Content-Type application/json
|
|
||||||
Accept application/json
|
|
||||||
simkl-api-key {{SIMKL_CLIENT_ID}}
|
|
||||||
Authorization Bearer {{SIMKL_AUTH_TOKEN}}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
# @name Search By MALID to Get Simkl ID
|
|
||||||
|
|
||||||
GET https://api.simkl.com/search/id?anilist=174576
|
|
||||||
Accept application/json
|
|
||||||
simkl-api-key {{SIMKL_CLIENT_ID}}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
# @name Delete Entry
|
|
||||||
|
|
||||||
GET https://api.simkl.com/sync/history/remove
|
|
||||||
Content-Type application/json
|
|
||||||
Accept application/json
|
|
||||||
simkl-api-key {{SIMKL_CLIENT_ID}}
|
|
||||||
Authorization Bearer {{SIMKL_AUTH_TOKEN}}
|
|
||||||
|
|
||||||
{
|
|
||||||
"shows": [
|
|
||||||
{
|
|
||||||
"ids": {
|
|
||||||
"simkl": 909121
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
# @name Update Episode
|
|
||||||
|
|
||||||
GET https://api.simkl.com/sync/history
|
|
||||||
Content-Type application/json
|
|
||||||
Accept application/json
|
|
||||||
simkl-api-key {{SIMKL_CLIENT_ID}}
|
|
||||||
Authorization Bearer {{SIMKL_AUTH_TOKEN}}
|
|
||||||
|
|
||||||
{
|
|
||||||
"shows": [
|
|
||||||
{
|
|
||||||
"title": "Ramen Aka Neko",
|
|
||||||
"ids": {
|
|
||||||
"simkl": 2307708,
|
|
||||||
"mal": "57325",
|
|
||||||
"anilist": "170998"
|
|
||||||
},
|
|
||||||
"episodes": [
|
|
||||||
{
|
|
||||||
"number": 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"number": 2
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"number": 3
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"number": 4
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"number": 5
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"number": 6
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
# @name SimklGetAuthorizationToken
|
|
||||||
|
|
||||||
POST https://api.simkl.com/oauth/token
|
|
||||||
Content-Type application/json
|
|
||||||
|
|
||||||
{
|
|
||||||
"grant_type": "authorization_code",
|
|
||||||
"client_id": "{{SIMKL_CLIENT_ID}}",
|
|
||||||
"client_secret": "{{SIMKL_CLIENT_SECRET}}",
|
|
||||||
"redirect_uri": "http://localhost:6734/callback",
|
|
||||||
"code": {{SIMKL_CODE}}
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
{
|
|
||||||
"$schema": "https://raw.githubusercontent.com/mistweaverco/kulala.nvim/main/schemas/http-client.env.schema.json",
|
|
||||||
"dev": {
|
|
||||||
"ANILIST_ACCESS_TOKEN": "",
|
|
||||||
"ANILIST_APP_ID": "",
|
|
||||||
"ANILIST_SECRET": "",
|
|
||||||
"ANILSIT_CODE": "",
|
|
||||||
"MAL_ACCESS_TOKEN": "",
|
|
||||||
"MAL_CLIENT_ID": "",
|
|
||||||
"MAL_CLIENT_SECRET": "",
|
|
||||||
"MAL_CODE": "",
|
|
||||||
"MAL_USER": "",
|
|
||||||
"MAL_VERIFIER": "",
|
|
||||||
"SIMKL_AUTH_TOKEN": "",
|
|
||||||
"SIMKL_CODE": "",
|
|
||||||
"SIMKL_CLIENT_ID": "",
|
|
||||||
"SIMKL_CLIENT_SECRET": ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -12,6 +12,6 @@
|
|||||||
},
|
},
|
||||||
"info": {
|
"info": {
|
||||||
"productName": "AniTrack",
|
"productName": "AniTrack",
|
||||||
"productVersion": "0.5.0"
|
"productVersion": "0.5.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user