diff options
| author | Fuwn <[email protected]> | 2023-12-17 04:42:55 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2023-12-17 04:42:55 -0800 |
| commit | 9ad5f28246db93f6ef72e25d8b477e4f11865ddb (patch) | |
| tree | 46b7505e35070d3e33f2844f53131b2da3db8dd4 /src/lib/Media/Manga/chapters.ts | |
| parent | refactor(manga): move cache (diff) | |
| download | due.moe-9ad5f28246db93f6ef72e25d8b477e4f11865ddb.tar.xz due.moe-9ad5f28246db93f6ef72e25d8b477e4f11865ddb.zip | |
refactor(manga): move chapters and volumes
Diffstat (limited to 'src/lib/Media/Manga/chapters.ts')
| -rw-r--r-- | src/lib/Media/Manga/chapters.ts | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/src/lib/Media/Manga/chapters.ts b/src/lib/Media/Manga/chapters.ts new file mode 100644 index 00000000..4e2971c9 --- /dev/null +++ b/src/lib/Media/Manga/chapters.ts @@ -0,0 +1,107 @@ +import { recentMediaActivities, type Media } from '$lib/AniList/media'; +import settings from '../../../stores/settings'; +import type { UserIdentity } from '../../AniList/identity'; +import { chapterDatabase } from './database'; + +export const chapterCount = async ( + identity: UserIdentity, + manga: Media, + disableGuessing: boolean + // 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 () => { + if (disableGuessing) return null; + + const anilistData = await recentMediaActivities(identity, manga, settings.get().guessMethod); + + await chapterDatabase.chapters.put({ + id: manga.id, + chapters: anilistData ? anilistData : -1, + volumes: null + }); + + return anilistData; + }; + + if (manga.format === 'NOVEL') return await tryRecentMediaActivities(); + + const mangadexData = await fetch( + `/api/mangadex/manga?english=${manga.title.english}&year=${manga.startDate.year}&romaji=${manga.title.romaji}&native=${manga.title.native}&status=${manga.status}` + ); + + if ((await mangadexData.clone().text()) === 'rate-limited') return -22; + + const mangadexDataJson = await mangadexData.json(); + + if (mangadexDataJson['data'] === undefined || mangadexDataJson['data'].length === 0) + return await tryRecentMediaActivities(); + + const mangadexId = mangadexDataJson['data'][0]['id']; + const lastChapterData = await fetch(`/api/mangadex/feed?id=${mangadexId}`); + + if ((await lastChapterData.clone().text()) === 'rate-limited') return -22; + + const lastChapterDataJson = await lastChapterData.json(); + + if (lastChapterDataJson['data'] === undefined || lastChapterDataJson['data'].length === 0) + return await tryRecentMediaActivities(); + + let lastChapter = lastChapterDataJson['data'][0]['attributes']['chapter']; + let completedVolumes = null; + + if ((manga.mediaListEntry || { progress: 0 }).progress > lastChapter) { + const anilistData = await recentMediaActivities(identity, manga, settings.get().guessMethod); + + if (anilistData !== null && anilistData > lastChapter) lastChapter = anilistData; + } + + if (!settings.get().disableOutOfDateVolumeWarning) { + const volumeOfChapterDataResponse = await fetch( + `/api/mangadex/chapter?id=${mangadexId}&chapter=${manga.mediaListEntry?.progress}` + ); + + if ((await volumeOfChapterDataResponse.clone().text()) === 'rate-limited') return -22; + + const volumeOfChapterData = await volumeOfChapterDataResponse.json(); + let lastAvailableVolume = lastChapterDataJson['data'][0]['attributes']['volume']; + + if (lastAvailableVolume === null) { + let chapterIndex = 0; + + while (chapterIndex < lastChapterDataJson['data'].length && lastAvailableVolume === null) { + if (lastChapterDataJson['data'][chapterIndex]['attributes']['volume'] !== null) + lastAvailableVolume = lastChapterDataJson['data'][chapterIndex]['attributes']['volume']; + + chapterIndex += 1; + } + } + + if (volumeOfChapterData['data'] !== undefined && volumeOfChapterData['data'].length > 0) { + const volumeOfChapter = volumeOfChapterData['data'][0]['attributes']['volume']; + + if (volumeOfChapter !== null) completedVolumes = volumeOfChapter; + + if (completedVolumes === volumeOfChapter) completedVolumes -= 1; + } + } + + if (lastChapter == 0) lastChapter = -1; + + await chapterDatabase.chapters.put({ + id: manga.id, + chapters: Number(lastChapter), + volumes: completedVolumes + }); + + return Number(lastChapter); +}; + +export const estimatedDayReading = (chapters: number) => chapters / 164; |