Update release.ts
This commit is contained in:
@@ -1,14 +1,16 @@
|
|||||||
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";
|
||||||
|
|
||||||
|
// In-memory cache
|
||||||
|
const cache = new Map(); // ключ — releaseId, значение — { code, release }
|
||||||
|
|
||||||
const baseHeaders = {
|
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",
|
||||||
};
|
};
|
||||||
|
|
||||||
// Функция для расчёта рейтинга из rates_scores_stats
|
// Расчёт взвешенного рейтинга Shikimori
|
||||||
function calculateWeightedScore(stats) {
|
function calculateWeightedScore(stats) {
|
||||||
if (!stats?.length) return null;
|
if (!stats?.length) return null;
|
||||||
|
|
||||||
let total = 0;
|
let total = 0;
|
||||||
let count = 0;
|
let count = 0;
|
||||||
|
|
||||||
@@ -22,30 +24,22 @@ function calculateWeightedScore(stats) {
|
|||||||
return count ? (total / count).toFixed(2) : null;
|
return count ? (total / count).toFixed(2) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Получаем данные Shikimori
|
// Получение данных Shikimori по названию и году
|
||||||
async function getShikimoriData(search, year) {
|
async function getShikimoriData(titles, year) {
|
||||||
if (!search) {
|
for (const title of titles) {
|
||||||
return { weightedScore: "N/A", characters: [] };
|
const animeUrl = `https://shikimori.one/api/animes?search=${encodeURIComponent(title)}&limit=1${year ? `&year=${year}` : ""}`;
|
||||||
}
|
|
||||||
|
|
||||||
const animeUrl = `https://shikimori.one/api/animes?search=${encodeURIComponent(search)}&limit=1${year ? `&year=${year}` : ""}`;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const animeRes = await fetch(animeUrl, { headers: baseHeaders });
|
const animeRes = await fetch(animeUrl, { headers: baseHeaders });
|
||||||
const animeData = await animeRes.json();
|
const animeData = await animeRes.json();
|
||||||
const anime = animeData?.[0];
|
const anime = animeData?.[0];
|
||||||
|
if (!anime || !anime.id) continue;
|
||||||
|
|
||||||
if (!anime || !anime.id) {
|
|
||||||
return { weightedScore: "N/A", characters: [] };
|
|
||||||
}
|
|
||||||
|
|
||||||
// Получаем рейтинг из rates_scores_stats
|
|
||||||
const statsUrl = `https://shikimori.one/api/animes/${anime.id}`;
|
const statsUrl = `https://shikimori.one/api/animes/${anime.id}`;
|
||||||
const statsRes = await fetch(statsUrl, { headers: baseHeaders });
|
const statsRes = await fetch(statsUrl, { headers: baseHeaders });
|
||||||
const statsData = await statsRes.json();
|
const statsData = await statsRes.json();
|
||||||
const weightedScore = calculateWeightedScore(statsData.rates_scores_stats) || "N/A";
|
const weightedScore = calculateWeightedScore(statsData.rates_scores_stats) || "N/A";
|
||||||
|
|
||||||
// Получаем главных персонажей
|
|
||||||
const rolesUrl = `https://shikimori.one/api/animes/${anime.id}/roles`;
|
const rolesUrl = `https://shikimori.one/api/animes/${anime.id}/roles`;
|
||||||
const rolesRes = await fetch(rolesUrl, { headers: baseHeaders });
|
const rolesRes = await fetch(rolesUrl, { headers: baseHeaders });
|
||||||
const roles = await rolesRes.json();
|
const roles = await rolesRes.json();
|
||||||
@@ -58,16 +52,16 @@ async function getShikimoriData(search, year) {
|
|||||||
url: `https://shikimori.one${c.character.url}`,
|
url: `https://shikimori.one${c.character.url}`,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
return {
|
return { weightedScore, characters: mainCharacters };
|
||||||
weightedScore,
|
|
||||||
characters: mainCharacters,
|
|
||||||
};
|
|
||||||
} catch {
|
} catch {
|
||||||
return { weightedScore: "N/A", characters: [] };
|
continue;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return { weightedScore: "N/A", characters: [] };
|
||||||
}
|
}
|
||||||
|
|
||||||
// Получаем рейтинг MyAnimeList через Jikan
|
// Получение рейтинга с MyAnimeList
|
||||||
async function getMALScore(title) {
|
async function getMALScore(title) {
|
||||||
const url = `https://api.jikan.moe/v4/anime?q=${encodeURIComponent(title)}&limit=1`;
|
const url = `https://api.jikan.moe/v4/anime?q=${encodeURIComponent(title)}&limit=1`;
|
||||||
|
|
||||||
@@ -75,19 +69,20 @@ async function getMALScore(title) {
|
|||||||
const response = await fetch(url);
|
const response = await fetch(url);
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
const anime = data?.data?.[0];
|
const anime = data?.data?.[0];
|
||||||
|
if (!anime || !anime.score) return "N/A";
|
||||||
if (!anime || !anime.score) {
|
|
||||||
return "N/A";
|
|
||||||
}
|
|
||||||
|
|
||||||
return `${anime.score}★`;
|
return `${anime.score}★`;
|
||||||
} catch {
|
} catch {
|
||||||
return "N/A";
|
return "N/A";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Основная функция получения релиза и формирования примечания
|
// Основная функция обработки релиза
|
||||||
async function getReleaseFromAnixart(releaseId, token = "") {
|
async function getReleaseFromAnixart(releaseId, token = "") {
|
||||||
|
// Проверка кэша
|
||||||
|
if (cache.has(releaseId)) {
|
||||||
|
return cache.get(releaseId);
|
||||||
|
}
|
||||||
|
|
||||||
const url = `https://api.anixart.tv/release/${releaseId}${token ? `?token=${token}` : ""}`;
|
const url = `https://api.anixart.tv/release/${releaseId}${token ? `?token=${token}` : ""}`;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -96,46 +91,54 @@ async function getReleaseFromAnixart(releaseId, token = "") {
|
|||||||
const release = data?.release;
|
const release = data?.release;
|
||||||
|
|
||||||
if (!release) {
|
if (!release) {
|
||||||
return { code: 2, release: null };
|
const result = { code: 2, release: null };
|
||||||
|
cache.set(releaseId, result);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
const title = release.title_original || release.title_ru || "";
|
const title_original = release.title_original || "";
|
||||||
|
const title_ru = release.title_ru || "";
|
||||||
const year = release.year || "";
|
const year = release.year || "";
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const shikiData = await getShikimoriData(title, year);
|
const shikiData = await getShikimoriData([title_original, title_ru], year);
|
||||||
const shikiScore = shikiData.weightedScore !== "N/A" ? `<b>Рейтинг Shikimori:</b> ${shikiData.weightedScore}★` : "";
|
const shikiScore = shikiData.weightedScore !== "N/A" ? `<b>Рейтинг Shikimori:</b> ${shikiData.weightedScore}★` : "";
|
||||||
const malScoreRaw = await getMALScore(title);
|
const malScoreRaw = await getMALScore(title_original || title_ru);
|
||||||
const malScore = malScoreRaw !== "N/A" ? `<b>Рейтинг MyAnimeList:</b> ${malScoreRaw}` : "";
|
const malScore = malScoreRaw !== "N/A" ? `<b>Рейтинг MyAnimeList:</b> ${malScoreRaw}` : "";
|
||||||
const characters = shikiData.characters.length
|
const characters = shikiData.characters.length
|
||||||
? `<b>Главные персонажи:</b> ` + shikiData.characters.map(c => `<a href="${c.url}">${c.name}</a>`).join(", ")
|
? `<b>Главные персонажи:</b> ` + shikiData.characters.map(c => `<a href="${c.url}">${c.name}</a>`).join(", ")
|
||||||
: "";
|
: "";
|
||||||
|
|
||||||
// Собираем рейтинг и персонажей, фильтруя пустые строки
|
|
||||||
const ratingParts = [shikiScore, malScore].filter(Boolean).join("<br>");
|
const ratingParts = [shikiScore, malScore].filter(Boolean).join("<br>");
|
||||||
const charsPart = characters ? characters : "";
|
|
||||||
|
|
||||||
// Примечание от Anixart (без лишних br если пустое)
|
|
||||||
const originalNote = release.note?.trim();
|
const originalNote = release.note?.trim();
|
||||||
|
|
||||||
let finalNote = "";
|
let finalNote = "";
|
||||||
|
|
||||||
if (ratingParts) finalNote += ratingParts;
|
if (ratingParts) finalNote += ratingParts;
|
||||||
if (charsPart) finalNote += (finalNote ? "<br>" : "") + charsPart;
|
if (characters) finalNote += (finalNote ? "<br>" : "") + characters;
|
||||||
if (originalNote) finalNote += (finalNote ? "<br><br>" : "") + `<b>Примечание от Anixart:</b><br>${originalNote}`;
|
if (originalNote) finalNote += (finalNote ? "<br><br>" : "") + `<b>Примечание от Anixart:</b><br>${originalNote}`;
|
||||||
|
|
||||||
release.note = finalNote || null;
|
release.note = finalNote || null;
|
||||||
|
|
||||||
} catch {
|
} catch {
|
||||||
release.note = null;
|
release.note = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return { code: 0, release };
|
// Принудительно разблокируем
|
||||||
|
release.is_ru_blocked = false;
|
||||||
|
release.is_tpp_disabled = false;
|
||||||
|
release.is_view_blocked = false;
|
||||||
|
release.is_play_disabled = false;
|
||||||
|
|
||||||
|
const result = { code: 0, release };
|
||||||
|
cache.set(releaseId, result);
|
||||||
|
return result;
|
||||||
} catch {
|
} catch {
|
||||||
return { code: 2, release: null };
|
const result = { code: 2, release: null };
|
||||||
|
cache.set(releaseId, result);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// HTTP сервер
|
// HTTP-сервер
|
||||||
serve(async (req) => {
|
serve(async (req) => {
|
||||||
const url = new URL(req.url);
|
const url = new URL(req.url);
|
||||||
const path = url.pathname;
|
const path = url.pathname;
|
||||||
|
|||||||
Reference in New Issue
Block a user