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 });
});