diff --git a/api/v1/src/shikimori-proxy.ts b/api/v1/src/shikimori-proxy.ts index b0663e0..bdf80f3 100644 --- a/api/v1/src/shikimori-proxy.ts +++ b/api/v1/src/shikimori-proxy.ts @@ -1,19 +1,15 @@ import { serve } from "https://deno.land/std@0.140.0/http/server.ts"; -serve(async (req) => { - const url = new URL(req.url); - const search = url.searchParams.get("search"); - const year = url.searchParams.get("year"); +const baseHeaders = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)", + "Accept": "application/json", +}; +async function getShikimoriData(search, year) { if (!search) { - return new Response("Missing search param", { status: 400 }); + return { score: "N/A", characters: [] }; } - const baseHeaders = { - "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)", - "Accept": "application/json" - }; - const animeUrl = `https://shikimori.one/api/animes?search=${encodeURIComponent(search)}&limit=1${year ? `&year=${year}` : ""}`; try { @@ -22,9 +18,7 @@ serve(async (req) => { const anime = animeData?.[0]; if (!anime || !anime.id) { - return new Response(JSON.stringify({ score: "N/A", characters: [] }), { - headers: { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" } - }); + return { score: "N/A", characters: [] }; } const rolesUrl = `https://shikimori.one/api/animes/${anime.id}/roles`; @@ -36,21 +30,77 @@ serve(async (req) => { .slice(0, 5) .map((c) => ({ name: c.character.russian, - url: `https://shikimori.one${c.character.url}` + url: `https://shikimori.one${c.character.url}`, })); - const result = { + return { score: anime.score || "N/A", - characters: mainCharacters + characters: mainCharacters, }; - - return new Response(JSON.stringify(result), { - headers: { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" } - }); - } catch { - return new Response(JSON.stringify({ score: "N/A", characters: [] }), { - headers: { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" } + return { score: "N/A", characters: [] }; + } +} + +async function getReleaseFromAnixart(releaseId, token = "") { + const url = `https://api.anixart.tv/release/${releaseId}${token ? `?token=${token}` : ""}`; + + try { + const response = await fetch(url, { headers: baseHeaders }); + const data = await response.json(); + const release = data?.release; + + if (!release) { + return { code: 2, release: null }; + } + + const title = release.title_original || release.title_ru || ""; + const year = release.year || ""; + let noteExtra = ""; + + try { + const shikiData = await getShikimoriData(title, year); + const score = shikiData.score || "N/A"; + const characters = shikiData.characters.length + ? shikiData.characters.map((c) => `${c.name}`).join(", ") + : "N/A"; + + noteExtra = `Оценки из Shikimori: ${score}
Главные персонажи: ${characters}
`; + } catch { + noteExtra = `Оценки из Shikimori: N/A
Главные персонажи: N/A
`; + } + + const originalNote = release.note?.trim(); + let finalNote = noteExtra; + if (originalNote) { + finalNote += `
Примечание от Anixart:
${originalNote}`; + } + + release.note = finalNote; + + return { code: 0, release }; + } catch { + return { code: 2, release: null }; + } +} + +serve(async (req) => { + const url = new URL(req.url); + const path = url.pathname; + const token = url.searchParams.get("token"); + + // Эндпоинт: /api/release/{releaseId} + const releaseMatch = path.match(/^\/api\/release\/([^\/]+)/); + if (releaseMatch) { + const releaseId = releaseMatch[1]; + const result = await getReleaseFromAnixart(releaseId, token); + return new Response(JSON.stringify(result), { + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + }, }); } + + return new Response("Invalid endpoint", { status: 404 }); });