diff options
| author | Fuwn <[email protected]> | 2023-09-14 14:39:22 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2023-09-14 14:39:22 -0700 |
| commit | 00095848c8c82b4db9a52f0e85ac29b0f991e99b (patch) | |
| tree | dc9fe8ce3f4234077f0bb1b266b632a7450af5e4 /src/lib/Media | |
| parent | refactor(manga): rename from mangadex (diff) | |
| download | due.moe-00095848c8c82b4db9a52f0e85ac29b0f991e99b.tar.xz due.moe-00095848c8c82b4db9a52f0e85ac29b0f991e99b.zip | |
refactor: move media to folder
Diffstat (limited to 'src/lib/Media')
| -rw-r--r-- | src/lib/Media/anime.ts | 67 | ||||
| -rw-r--r-- | src/lib/Media/manga.ts | 69 |
2 files changed, 136 insertions, 0 deletions
diff --git a/src/lib/Media/anime.ts b/src/lib/Media/anime.ts new file mode 100644 index 00000000..0eed9121 --- /dev/null +++ b/src/lib/Media/anime.ts @@ -0,0 +1,67 @@ +import { get } from 'svelte/store'; +import anime from '../../stores/anime'; +import { mediaListCollection, type Media, Type } from '../AniList/media'; +import lastPruneTimes from '../../stores/lastPruneTimes'; +import type { AniListAuthorisation, UserIdentity } from '../AniList/identity'; + +export const cleanCache = (user: AniListAuthorisation, identity: UserIdentity) => { + return mediaListCollection( + user, + identity, + Type.Anime, + get(anime), + get(lastPruneTimes).anime, + true + ); +}; + +export const updateMedia = (id: number, progress: number | undefined, callback: () => void) => { + fetch(`/api/anilist-increment?id=${id}&progress=${(progress || 0) + 1}`).then(callback); +}; + +export const totalEpisodes = (anime: Media) => { + return anime.episodes === null ? '' : `<span style="opacity: 50%">/${anime.episodes}</span>`; +}; + +export const airingTime = (anime: Media, upcoming = false) => { + const untilAiring = anime.nextAiringEpisode?.timeUntilAiring; + let timeFrame; + + if (untilAiring !== undefined) { + let minutes = untilAiring / 60; + + if (minutes >= 30) { + let hours = minutes / 60; + + if (hours >= 24) { + let weeks = Math.floor(Math.floor(hours / 24) / 7); + + if (weeks >= 1) { + weeks = Math.round(weeks); + + timeFrame = `${weeks} week${weeks === 1 ? '' : 's'}`; + } else { + const days = Math.round(Math.floor(hours / 24)); + + timeFrame = `${days} day${days === 1 ? '' : 's'}`; + } + } else { + hours = Math.round(hours); + + timeFrame = `${hours} hour${hours === 1 ? '' : 's'}`; + } + } else { + minutes = Math.round(minutes); + + timeFrame = `${minutes} minute${minutes === 1 ? '' : 's'}`; + } + + if (upcoming) { + return `${anime.nextAiringEpisode?.episode}${totalEpisodes(anime)} in ${timeFrame}`; + } else { + return `<span style="opacity: 50%">${anime.nextAiringEpisode?.episode} in ${timeFrame}</span>`; + } + } + + return ''; +}; diff --git a/src/lib/Media/manga.ts b/src/lib/Media/manga.ts new file mode 100644 index 00000000..7150bf60 --- /dev/null +++ b/src/lib/Media/manga.ts @@ -0,0 +1,69 @@ +import { recentMediaActivities, type Media } from '$lib/AniList/media'; +import type { UserIdentity } from '../AniList/identity'; +import { chapterDatabase } from '../chapterDatabase'; + +export const chapterCount = async ( + identity: UserIdentity, + manga: Media, + preferActivity = false +): Promise<number | null> => { + const chapters = await chapterDatabase.chapters.get(manga.id); + + if (chapters !== undefined) { + return chapters.chapters === -1 ? null : chapters.chapters; + } + + if (preferActivity) { + return await recentMediaActivities(identity, manga); + } + + const tryRecentMediaActivities = async () => { + const anilistData = await recentMediaActivities(identity, manga); + + await chapterDatabase.chapters.put({ + id: manga.id, + chapters: anilistData ? anilistData : -1 + }); + + return anilistData; + }; + + const mangadexData = await ( + await fetch( + `/api/mangadex/manga?english=${manga.title.english}&year=${manga.startDate.year}&romaji=${manga.title.romaji}&native=${manga.title.native}` + ) + ).json(); + + if (mangadexData['data'] === undefined || mangadexData['data'].length === 0) { + return await tryRecentMediaActivities(); + } + + const lastChapterData = await ( + await fetch(`/api/mangadex/feed?id=${mangadexData['data'][0]['id']}`) + ).json(); + + if (lastChapterData['data'] === undefined || lastChapterData['data'].length === 0) { + return await tryRecentMediaActivities(); + } + + let lastChapter = lastChapterData['data'][0]['attributes']['chapter']; + + if ((manga.mediaListEntry || { progress: 0 }).progress > lastChapter) { + const anilistData = await recentMediaActivities(identity, manga); + + if (anilistData !== null && anilistData > lastChapter) { + lastChapter = anilistData; + } + } + + if (lastChapter == 0) { + lastChapter = -1; + } + + await chapterDatabase.chapters.put({ + id: manga.id, + chapters: Number(lastChapter) + }); + + return Number(lastChapter); +}; |