diff options
| author | Fuwn <[email protected]> | 2023-12-26 23:44:41 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2023-12-26 23:44:41 -0800 |
| commit | 4792d6c5fd628e9a455ef461d89b268a7ef114b3 (patch) | |
| tree | 864c73df2c99c4cf48ea478461b9393041402d8d /src/lib/Media | |
| parent | style(settings.json): prettier (diff) | |
| download | due.moe-4792d6c5fd628e9a455ef461d89b268a7ef114b3.tar.xz due.moe-4792d6c5fd628e9a455ef461d89b268a7ef114b3.zip | |
feat(manga): distributed proxy
Diffstat (limited to 'src/lib/Media')
| -rw-r--r-- | src/lib/Media/Manga/chapters.ts | 99 |
1 files changed, 85 insertions, 14 deletions
diff --git a/src/lib/Media/Manga/chapters.ts b/src/lib/Media/Manga/chapters.ts index 2e3c6678..36942ce4 100644 --- a/src/lib/Media/Manga/chapters.ts +++ b/src/lib/Media/Manga/chapters.ts @@ -3,6 +3,75 @@ import settings from '../../../stores/settings'; import type { UserIdentity } from '../../AniList/identity'; import { database } from '../../Database/chapters'; +const getManga = async ( + statusIn: string, + year: number, + native: string | null, + english: string | null, + romaji: string | null +) => { + let status = ''; + let error = false; + + switch (statusIn) { + case 'FINISHED': + { + status = 'completed'; + } + break; + case 'RELEASING': + { + status = 'ongoing'; + } + break; + case 'HIATUS': + { + status = 'hiatus'; + } + break; + case 'CANCELLED': + { + status = 'cancelled'; + } + break; + } + + const nullIfNullString = (s: string | null) => (s == 'null' ? null : s); + const get = async (title: string) => { + try { + return await ( + await fetch( + `https://due-proxy.fuwn.workers.dev/?q=https://api.mangadex.org/manga?title=${encodeURIComponent( + title + )}&year=${year}&status[]=${status}` + ) + ).json(); + } catch { + error = true; + } + }; + + let mangadexData = await get( + nullIfNullString(native) || nullIfNullString(english) || nullIfNullString(romaji) || '' + ); + + if (error) return new Response('rate-limited'); + + if (mangadexData['data'] === undefined || mangadexData['data'].length === 0) { + mangadexData = await get(nullIfNullString(english) || ''); + + if (mangadexData['data'] === undefined || mangadexData['data'].length === 0) { + mangadexData = await get(nullIfNullString(romaji) || ''); + } + } + + return Response.json(mangadexData, { + headers: { + 'Cache-Control': 'max-age=300' + } + }); +}; + export const chapterCount = async ( identity: UserIdentity, manga: Media, @@ -37,8 +106,12 @@ export const chapterCount = async ( 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}` + const mangadexData = await getManga( + manga.status, + manga.startDate.year, + manga.title.native, + manga.title.english, + manga.title.romaji ); if ((await mangadexData.clone().text()) === 'rate-limited') return -22; @@ -49,11 +122,11 @@ export const chapterCount = async ( 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(); + const lastChapterDataJson = await ( + await fetch( + `https://due-proxy.fuwn.workers.dev/?q=https://api.mangadex.org/manga/${mangadexId}/feed?order[chapter]=desc&translatedLanguage[]=en&limit=1&contentRating[]=safe&contentRating[]=suggestive&contentRating[]=erotica&contentRating[]=pornographic` + ) + ).json(); if (lastChapterDataJson['data'] === undefined || lastChapterDataJson['data'].length === 0) return await tryRecentMediaActivities(); @@ -72,13 +145,11 @@ export const chapterCount = async ( } if (!settings.get().calculateDisableOutOfDateVolumeWarning) { - 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(); + const volumeOfChapterData = await ( + await fetch( + `https://due-proxy.fuwn.workers.dev/?q=https://api.mangadex.org/chapter?manga=${mangadexId}&chapter=${manga.mediaListEntry?.progress}&contentRating[]=safe&contentRating[]=suggestive&contentRating[]=erotica&contentRating[]=pornographic&limit=1` + ) + ).json(); let lastAvailableVolume = lastChapterDataJson['data'][0]['attributes']['volume']; if (lastAvailableVolume === null) { |