aboutsummaryrefslogtreecommitdiff
path: root/src/lib/Media
diff options
context:
space:
mode:
authorFuwn <[email protected]>2023-09-14 14:39:22 -0700
committerFuwn <[email protected]>2023-09-14 14:39:22 -0700
commit00095848c8c82b4db9a52f0e85ac29b0f991e99b (patch)
treedc9fe8ce3f4234077f0bb1b266b632a7450af5e4 /src/lib/Media
parentrefactor(manga): rename from mangadex (diff)
downloaddue.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.ts67
-rw-r--r--src/lib/Media/manga.ts69
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);
+};