added ability to get anime as needed from MAL

This commit is contained in:
2024-08-16 15:07:06 -04:00
parent 3b5518113e
commit fb2d5fbdea
10 changed files with 572 additions and 46 deletions

View File

@ -14,7 +14,8 @@
title,
watchListPage,
animePerPage,
malWatchList
malWatchList,
malPrimary
} from "./GlobalVariablesAndHelperFunctions.svelte";
import {
CheckIfAniListLoggedIn,
@ -38,11 +39,13 @@
let isAniListLoggedIn: boolean
let isAniListPrimary: boolean
let isMalPrimary: boolean
let aniListWatchListLoaded: AniListCurrentUserWatchList
aniListLoggedIn.subscribe((value) => isAniListLoggedIn = value)
aniListPrimary.subscribe((value) => isAniListPrimary = value)
aniListWatchlist.subscribe((value) => aniListWatchListLoaded = value)
malPrimary.subscribe((value) => isMalPrimary = value)
let page: number
@ -72,10 +75,14 @@
if (loggedIn) {
GetMyAnimeListLoggedInUser().then(user => {
malUser.set(user)
GetMyAnimeList(1000).then(watchList => {
malWatchList.set(watchList)
if (isMalPrimary){
GetMyAnimeList(1000).then(watchList => {
malWatchList.set(watchList)
malLoggedIn.set(loggedIn)
})
} else {
malLoggedIn.set(loggedIn)
})
}
})
}
})

View File

@ -3,7 +3,9 @@
anilistModal,
simklWatchList,
aniListLoggedIn,
simklLoggedIn
simklLoggedIn,
malLoggedIn,
malAnime
} from "./GlobalVariablesAndHelperFunctions.svelte";
import {aniListAnime} from "./GlobalVariablesAndHelperFunctions.svelte";
import {Button} from "flowbite-svelte";
@ -14,16 +16,28 @@
import { writable } from 'svelte/store';
import type {SimklAnime} from "./simkl/types/simklTypes";
import { get } from 'svelte/store';
import {AniListUpdateEntry, SimklSyncEpisodes, SimklSyncRating, SimklSyncStatus} from "../wailsjs/go/main/App";
import {
AniListUpdateEntry,
SimklSyncEpisodes,
SimklSyncRating,
SimklSyncStatus
} from "../wailsjs/go/main/App";
import type {MALAnime} from "./mal/types/MALTypes";
import type {AniListUpdateVariables} from "./anilist/types/AniListTypes";
const simklWatch = get(simklWatchList);
let isAniListLoggedIn: boolean
let isMalLoggedIn: boolean
let isSimklLoggedIn: boolean
let simklAnimeIndex: number
let currentMalAnime: MALAnime
let simklAnime: SimklAnime | undefined = undefined
aniListLoggedIn.subscribe((value) => isAniListLoggedIn = value)
malLoggedIn.subscribe((value) => isMalLoggedIn = value)
simklLoggedIn.subscribe((value) => isSimklLoggedIn = value)
malAnime.subscribe((value) => currentMalAnime = value)
for (let i = 0; i < simklWatch.anime.length; i++) {
if (Number(simklWatch.anime[i].show.ids.mal) === aniListAnime.data.MediaList.media.idMal) {
@ -35,23 +49,34 @@
type statusOption = {
id: number,
aniList: string,
mal: string,
simkl: string,
}
const statusOptions: statusOption[] = [
{ id: 0, aniList: "CURRENT", simkl: "watching"},
{ id: 1, aniList: "PLANNING", simkl: "plantowatch"},
{ id: 2, aniList: "COMPLETED", simkl: "completed"},
{ id: 3, aniList: "DROPPED", simkl: "dropped"},
{ id: 4, aniList: "PAUSED", simkl: "hold"},
{ id: 5, aniList: "REPEATING", simkl: "watching"}
{ id: 0, aniList: "CURRENT", mal: "watching", simkl: "watching"},
{ id: 1, aniList: "PLANNING", mal: "plan_to_watch", simkl: "plantowatch"},
{ id: 2, aniList: "COMPLETED", mal: "completed", simkl: "completed"},
{ id: 3, aniList: "DROPPED", mal: "dropped", simkl: "dropped"},
{ id: 4, aniList: "PAUSED", mal: "on_hold", simkl: "hold"},
{ id: 5, aniList: "REPEATING", mal: "rewatching", simkl: "watching"}
]
let startingAnilistStatusOption: statusOption
startingAnilistStatusOption = statusOptions.filter(option => aniListAnime.data.MediaList.status === option.aniList)[0]
let items = [];
let items = [] as {
id: number
service: string
progress: number
status: string
startedAt: string
completedAt: string
score: number
repeat: number
notes: string
}[];
if(isAniListLoggedIn) {
items.push({
@ -67,6 +92,20 @@
})
}
if(isMalLoggedIn) {
items.push({
id: currentMalAnime.id,
service: "MyAnimeList",
progress: currentMalAnime.my_list_status.num_episodes_watched,
status: currentMalAnime.my_list_status.status,
startedAt: currentMalAnime.my_list_status.start_date,
completedAt: currentMalAnime.my_list_status.finish_date,
score: currentMalAnime.my_list_status.score,
repeat: currentMalAnime.my_list_status.num_times_rewatched,
notes: currentMalAnime.my_list_status.comments
})
}
if(isSimklLoggedIn && simklAnime !== undefined) {
items.push({
id: simklAnime.show.ids.simkl,
@ -114,7 +153,7 @@
const ratingInWords = {
0: "Not Reviewed",
1: "Apalling",
1: "Appalling",
2: "Horrible",
3: "Very Bad",
4: "Bad",
@ -213,43 +252,45 @@
}
const submitData = async () => {
await AniListUpdateEntry(
aniListAnime.data.MediaList.mediaId,
values.progress,
values.status.aniList,
values.score,
values.repeat,
values.notes,
values.startedAt.year,
values.startedAt.month,
values.startedAt.day,
values.completedAt.year,
values.completedAt.month,
values.completedAt.day
).then((value) => {
let body: AniListUpdateVariables = {
mediaId: aniListAnime.data.MediaList.mediaId,
progress: values.progress,
status: values.status.aniList,
score: values.score,
repeat: values.repeat,
notes: values.notes,
startedAt: {
year: values.startedAt.year,
month: values.startedAt.month,
day: values.startedAt.day
},
completedAt: {
year: values.completedAt.year,
month: values.completedAt.month,
day: values.completedAt.day
}
}
await AniListUpdateEntry(body).then((value) => {
console.log(value)
})
if (simklLoggedIn) {
if (simklAnime.watched_episodes_count !== values.progress) {
await SimklSyncEpisodes(simklAnime, values.progress).then(value => {
console.log(value)
await SimklSyncEpisodes(simklAnime, values.progress).then(() => {
simklAnime.watched_episodes_count = values.progress
simklWatch.anime[simklAnimeIndex].watched_episodes_count = values.progress
})
}
if (simklAnime.user_rating !== values.score) {
await SimklSyncRating(simklAnime, values.score).then(value => {
console.log(value)
await SimklSyncRating(simklAnime, values.score).then(() => {
simklAnime.user_rating = values.score
simklWatch.anime[simklAnimeIndex].user_rating = values.score
})
}
if (simklAnime.status !== values.status.simkl) {
SimklSyncStatus(simklAnime, values.status.simkl).then(value => {
console.log(value)
SimklSyncStatus(simklAnime, values.status.simkl).then(() => {
simklAnime.status = values.status.simkl
simklWatch.anime[simklAnimeIndex].status = values.status.simkl
})

View File

@ -1,7 +1,7 @@
<script lang="ts" context="module">
import {
GetAniListItem,
GetAniListLoggedInUser, GetAniListUserWatchingList, GetMyAnimeListLoggedInUser,
GetAniListLoggedInUser, GetAniListUserWatchingList, GetMyAnimeListAnime, GetMyAnimeListLoggedInUser,
GetSimklLoggedInUser, LogoutAniList, LogoutMyAnimeList, LogoutSimkl
} from "../wailsjs/go/main/App";
import type {
@ -11,7 +11,7 @@
import {writable} from 'svelte/store'
import type {SimklUser, SimklWatchList} from "./simkl/types/simklTypes";
import {type AniListUser, MediaListSort} from "./anilist/types/AniListTypes";
import type {MALWatchlist, MyAnimeListUser} from "./mal/types/MALTypes";
import type {MALAnime, MALWatchlist, MyAnimeListUser} from "./mal/types/MALTypes";
export let aniListAnime: AniListGetSingleAnime
export let title = writable("")
@ -21,11 +21,13 @@
export let malLoggedIn = writable(false)
export let simklWatchList = writable({} as SimklWatchList)
export let aniListPrimary = writable(true)
export let malPrimary = writable(false)
export let simklUser = writable({} as SimklUser)
export let aniListUser = writable({} as AniListUser)
export let malUser = writable({} as MyAnimeListUser)
export let aniListWatchlist = writable({} as AniListCurrentUserWatchList)
export let malWatchList = writable({} as MALWatchlist)
export let malAnime = writable({} as MALAnime)
export let watchListPage = writable(1)
export let animePerPage = writable(20)
@ -35,18 +37,30 @@
let perPage: number
let aniWatchlist: AniListCurrentUserWatchList
let isMalLoggedIn: boolean
aniListPrimary.subscribe(value => isAniListPrimary = value)
watchListPage.subscribe(value => page = value)
animePerPage.subscribe(value => perPage = value)
aniListWatchlist.subscribe(value => aniWatchlist = value)
malLoggedIn.subscribe(value => isMalLoggedIn = value)
export function GetAniListSingleItemAndOpenModal(aniId: number, login: boolean): void {
GetAniListItem(aniId, login).then(result => {
aniListAnime = result
GetAniListItem(aniId, login).then(aniListResult => {
aniListAnime = aniListResult
title.set(aniListAnime.data.MediaList.media.title.english === "" ?
aniListAnime.data.MediaList.media.title.romaji :
aniListAnime.data.MediaList.media.title.english)
anilistModal.set(true)
if(isMalLoggedIn) {
GetMyAnimeListAnime(aniListAnime.data.MediaList.media.idMal).then(malResult => {
console.log(malResult)
malAnime.set(malResult)
anilistModal.set(true)
})
} else {
anilistModal.set(true)
}
})
}

View File

@ -80,4 +80,27 @@ export enum MediaListSort {
MediaTitleNativeDesc = "MEDIA_TITLE_NATIVE_DESC",
MediaPopularity = "MEDIA_POPULARITY",
MediaPopularityDesc = "MEDIA_POPULARITY_DESC"
}
export interface StartedAt {
year: number
month: number
day: number
}
export interface CompletedAt {
year: number
month: number
day: number
}
export interface AniListUpdateVariables {
mediaId: number
progress: number
status: string
score: number
repeat: number
notes: string
startedAt: StartedAt
completedAt: CompletedAt
}

View File

@ -31,13 +31,15 @@ export interface AnimeStatistics {
}
export interface MALWatchlist {
data: {
node: Node
listStatus: ListStatus
}[]
data: [MALAnimeFromList]
paging: Paging
}
export interface MALAnimeFromList {
node: Node
listStatus: ListStatus | MyListStatus
}
export interface Node {
id: number
title: string
@ -63,3 +65,90 @@ export interface Paging {
previous: string
next: string
}
export interface MALAnime {
id: number;
title: string;
main_picture: {
large: string;
medium: string;
};
alternative_titles: {
synonyms: string[];
en: string;
ja: string;
};
start_date: string;
end_date: string;
synopsis: string;
mean: number;
rank: number;
popularity: number;
num_list_users: number;
num_scoring_users: number;
nsfw: string;
genres: {
id: number;
name: string;
}[];
created_at: string;
updated_at: string;
media_type: string;
status: string;
my_list_status: MyListStatus;
num_episodes: number;
start_season: {
year: number;
season: string;
};
broadcast: {
day_of_the_week: string;
start_time: string;
};
source: string;
average_episode_duration: number;
rating: string;
studios: {
id: number;
name: string;
}[];
pictures: {
large: string;
medium: string;
}[];
background: string;
related_anime: {
node: MALAnime;
relation_type: string;
relation_type_formatted: string;
}[];
recommendations: {
node: MALAnime;
num_recommendations: number;
}[];
Statistics: {
num_list_users: number;
Status: {
watching: string;
completed: string;
on_hold: string;
dropped: string;
plan_to_watch: string;
};
};
}
export interface MyListStatus {
status: string;
score: number;
num_episodes_watched: number;
is_rewatching: boolean;
start_date: string;
finish_date: string;
priority: number;
num_times_rewatched: number;
rewatch_value: number;
tags: string[];
comments: string;
updated_at: string;
}