Update release.ts
This commit is contained in:
@@ -5,10 +5,27 @@ const baseHeaders = {
|
|||||||
"Accept": "application/json",
|
"Accept": "application/json",
|
||||||
};
|
};
|
||||||
|
|
||||||
// Получение информации с Shikimori
|
// Взвешенное среднее из scores_stats
|
||||||
|
function calculateWeightedScore(stats) {
|
||||||
|
if (!stats?.length) return null;
|
||||||
|
|
||||||
|
let total = 0;
|
||||||
|
let count = 0;
|
||||||
|
|
||||||
|
for (const item of stats) {
|
||||||
|
const score = parseInt(item.name);
|
||||||
|
const votes = item.value;
|
||||||
|
total += score * votes;
|
||||||
|
count += votes;
|
||||||
|
}
|
||||||
|
|
||||||
|
return count ? (total / count).toFixed(2) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Получение данных с Shikimori
|
||||||
async function getShikimoriData(search, year) {
|
async function getShikimoriData(search, year) {
|
||||||
if (!search) {
|
if (!search) {
|
||||||
return { score: "N/A", characters: [] };
|
return { score: "N/A", weightedScore: "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}` : ""}`;
|
||||||
@@ -19,9 +36,16 @@ async function getShikimoriData(search, year) {
|
|||||||
const anime = animeData?.[0];
|
const anime = animeData?.[0];
|
||||||
|
|
||||||
if (!anime || !anime.id) {
|
if (!anime || !anime.id) {
|
||||||
return { score: "N/A", characters: [] };
|
return { score: "N/A", weightedScore: "N/A", characters: [] };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Взвешенный рейтинг из scores_stats
|
||||||
|
const statsUrl = `https://shikimori.one/api/animes/${anime.id}`;
|
||||||
|
const statsRes = await fetch(statsUrl, { headers: baseHeaders });
|
||||||
|
const statsData = await statsRes.json();
|
||||||
|
const weightedScore = calculateWeightedScore(statsData.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();
|
||||||
@@ -36,14 +60,15 @@ async function getShikimoriData(search, year) {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
score: anime.score || "N/A",
|
score: anime.score || "N/A",
|
||||||
|
weightedScore,
|
||||||
characters: mainCharacters,
|
characters: mainCharacters,
|
||||||
};
|
};
|
||||||
} catch {
|
} catch {
|
||||||
return { score: "N/A", characters: [] };
|
return { score: "N/A", weightedScore: "N/A", characters: [] };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Получение рейтинга с MyAnimeList (через Jikan)
|
// Рейтинг с MyAnimeList через Jikan
|
||||||
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`;
|
||||||
|
|
||||||
@@ -62,7 +87,7 @@ async function getMALScore(title) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Получение релиза и формирование итоговой заметки
|
// Получение и сборка данных о релизе
|
||||||
async function getReleaseFromAnixart(releaseId, token = "") {
|
async function getReleaseFromAnixart(releaseId, token = "") {
|
||||||
const url = `https://api.anixart.tv/release/${releaseId}${token ? `?token=${token}` : ""}`;
|
const url = `https://api.anixart.tv/release/${releaseId}${token ? `?token=${token}` : ""}`;
|
||||||
|
|
||||||
@@ -82,6 +107,7 @@ async function getReleaseFromAnixart(releaseId, token = "") {
|
|||||||
try {
|
try {
|
||||||
const shikiData = await getShikimoriData(title, year);
|
const shikiData = await getShikimoriData(title, year);
|
||||||
const shikiScore = shikiData.score || "N/A";
|
const shikiScore = shikiData.score || "N/A";
|
||||||
|
const shikiWeighted = shikiData.weightedScore || "N/A";
|
||||||
const characters = shikiData.characters.length
|
const characters = shikiData.characters.length
|
||||||
? shikiData.characters.map((c) => `<a href="${c.url}">${c.name}</a>`).join(", ")
|
? shikiData.characters.map((c) => `<a href="${c.url}">${c.name}</a>`).join(", ")
|
||||||
: "N/A";
|
: "N/A";
|
||||||
@@ -89,13 +115,15 @@ async function getReleaseFromAnixart(releaseId, token = "") {
|
|||||||
const malScore = await getMALScore(title);
|
const malScore = await getMALScore(title);
|
||||||
|
|
||||||
noteExtra =
|
noteExtra =
|
||||||
`<b>Рейтинг Shikimori:</b> ${shikiScore}<br>` +
|
`<b>Shikimori (официальный):</b> ${shikiScore}<br>` +
|
||||||
`<b>Рейтинг MyAnimeList:</b> ${malScore}<br>` +
|
`<b>Shikimori (взвешенный):</b> ${shikiWeighted}<br>` +
|
||||||
|
`<b>MyAnimeList:</b> ${malScore}<br>` +
|
||||||
`<b>Главные персонажи:</b> ${characters}<br>`;
|
`<b>Главные персонажи:</b> ${characters}<br>`;
|
||||||
} catch {
|
} catch {
|
||||||
noteExtra =
|
noteExtra =
|
||||||
`<b>Рейтинг Shikimori:</b> N/A<br>` +
|
`<b>Shikimori (официальный):</b> N/A<br>` +
|
||||||
`<b>Рейтинг MyAnimeList:</b> N/A<br>` +
|
`<b>Shikimori (взвешенный):</b> N/A<br>` +
|
||||||
|
`<b>MyAnimeList:</b> N/A<br>` +
|
||||||
`<b>Главные персонажи:</b> N/A<br>`;
|
`<b>Главные персонажи:</b> N/A<br>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -113,7 +141,7 @@ async function getReleaseFromAnixart(releaseId, token = "") {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Серверный эндпоинт
|
// Серверный роутинг
|
||||||
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