import { recentMediaActivities, type Media } from '$lib/AniList/media'; import manga from '../../stores/manga'; import settings from '../../stores/settings'; import type { UserIdentity } from '../AniList/identity'; import { chapterDatabase } from './chapters'; export const pruneAllManga = async () => { const all = await chapterDatabase.chapters.toArray(); const ids = all.map((m) => m.id); manga.set(''); await chapterDatabase.chapters.bulkDelete(ids); }; export const volumeCount = async (manga: Media): Promise => (await chapterDatabase.chapters.get(manga.id))?.volumes as number | null; export const chapterCount = async ( identity: UserIdentity, manga: Media, disableGuessing: boolean // preferActivity = false ): Promise => { 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 ( await fetch( `/api/mangadex/manga?english=${manga.title.english}&year=${manga.startDate.year}&romaji=${manga.title.romaji}&native=${manga.title.native}&status=${manga.status}` ) ).json(); if (mangadexData['data'] === undefined || mangadexData['data'].length === 0) { return await tryRecentMediaActivities(); } const mangadexId = mangadexData['data'][0]['id']; const lastChapterData = await (await fetch(`/api/mangadex/feed?id=${mangadexId}`)).json(); if (lastChapterData['data'] === undefined || lastChapterData['data'].length === 0) { return await tryRecentMediaActivities(); } let lastChapter = lastChapterData['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 volumeOfChapterData = await ( await fetch( `/api/mangadex/chapter?id=${mangadexId}&chapter=${manga.mediaListEntry?.progress}` ) ).json(); let lastAvailableVolume = lastChapterData['data'][0]['attributes']['volume']; if (lastAvailableVolume === null) { let chapterIndex = 0; while (chapterIndex < lastChapterData['data'].length && lastAvailableVolume === null) { if (lastChapterData['data'][chapterIndex]['attributes']['volume'] !== null) { lastAvailableVolume = lastChapterData['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); };