Update shikimori-proxy.ts

This commit is contained in:
2025-05-12 14:45:03 +05:00
committed by GitHub
parent 2845b74a25
commit d568f62fe3

View File

@@ -1,18 +1,14 @@
import { serve } from "https://deno.land/std@0.140.0/http/server.ts"; import { serve } from "https://deno.land/std@0.140.0/http/server.ts";
serve(async (req) => { const baseHeaders = {
const url = new URL(req.url);
const search = url.searchParams.get("search");
const year = url.searchParams.get("year");
if (!search) {
return new Response("Missing search param", { status: 400 });
}
const baseHeaders = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"Accept": "application/json" "Accept": "application/json",
}; };
async function getShikimoriData(search, year) {
if (!search) {
return { score: "N/A", characters: [] };
}
const animeUrl = `https://shikimori.one/api/animes?search=${encodeURIComponent(search)}&limit=1${year ? `&year=${year}` : ""}`; const animeUrl = `https://shikimori.one/api/animes?search=${encodeURIComponent(search)}&limit=1${year ? `&year=${year}` : ""}`;
@@ -22,9 +18,7 @@ serve(async (req) => {
const anime = animeData?.[0]; const anime = animeData?.[0];
if (!anime || !anime.id) { if (!anime || !anime.id) {
return new Response(JSON.stringify({ score: "N/A", characters: [] }), { return { score: "N/A", characters: [] };
headers: { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" }
});
} }
const rolesUrl = `https://shikimori.one/api/animes/${anime.id}/roles`; const rolesUrl = `https://shikimori.one/api/animes/${anime.id}/roles`;
@@ -36,21 +30,77 @@ serve(async (req) => {
.slice(0, 5) .slice(0, 5)
.map((c) => ({ .map((c) => ({
name: c.character.russian, 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", 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 { } catch {
return new Response(JSON.stringify({ score: "N/A", characters: [] }), { return { score: "N/A", characters: [] };
headers: { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" } }
}
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) => `<a href="${c.url}">${c.name}</a>`).join(", ")
: "N/A";
noteExtra = `<b>Оценки из Shikimori:</b> ${score}<br><b>Главные персонажи:</b> ${characters}<br>`;
} catch {
noteExtra = `<b>Оценки из Shikimori:</b> N/A<br><b>Главные персонажи:</b> N/A<br>`;
}
const originalNote = release.note?.trim();
let finalNote = noteExtra;
if (originalNote) {
finalNote += `<br><b>Примечание от Anixart:</b><br>${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 });
}); });