From 48c256545bf7223400a9b1a1347979ed20394223 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=BC=E3=83=BC=E3=83=AC?= Date: Mon, 12 May 2025 13:15:42 +0500 Subject: [PATCH] Update release.js --- api/v1/src/release.js | 89 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 79 insertions(+), 10 deletions(-) diff --git a/api/v1/src/release.js b/api/v1/src/release.js index 34c24ed..7cb31c3 100644 --- a/api/v1/src/release.js +++ b/api/v1/src/release.js @@ -3,12 +3,15 @@ const axios = require('axios'); // Кэш кастомных заметок let cachedNotes = []; -// Функция для загрузки заметок из внешнего API +// Функция для загрузки заметок из внешнего API (Anixart) async function fetchNotes() { try { - const response = await axios.get('https://anixart.seele.su/api/release_note'); - cachedNotes = Array.isArray(response.data) ? response.data : []; - } catch { + const response = await axios.get('https://anixart.seele.su/api/release_note', { timeout: 5000 }); + cachedNotes = Array.isArray(response.data) && response.data.every(item => typeof item.id === 'number' && typeof item.note === 'string') + ? response.data + : []; + } catch (error) { + console.error('Ошибка при загрузке заметок Anixart:', error.message); cachedNotes = []; } } @@ -17,28 +20,94 @@ async function fetchNotes() { fetchNotes(); // Обновляем заметки каждые 10 минут -setInterval(fetchNotes, 10 * 60 * 1000); +async function scheduleFetchNotes() { + await fetchNotes(); + setTimeout(scheduleFetchNotes, 10 * 60 * 1000); +} +scheduleFetchNotes(); + +// Функция для получения данных с Shikimori +async function fetchShikimoriData(animeId) { + try { + const response = await axios.get(`https://shikimori.one/api/animes/${animeId}`, { timeout: 5000 }); + const data = response.data; + return { + score: data.score || 'N/A', + characters: data.characters || [], // Персонажи (нужны главные) + }; + } catch (error) { + console.error('Ошибка при запросе к Shikimori:', error.message); + return { score: 'N/A', characters: [] }; + } +} + +// Функция для получения данных с MyAnimeList +async function fetchMyAnimeListData(animeId) { + try { + // Для MyAnimeList нужен API-ключ, здесь предполагается, что у тебя есть доступ. + // Используем публичный API (примерный формат). + const response = await axios.get(`https://api.myanimelist.net/v2/anime/${animeId}?fields=mean`, { + headers: { Authorization: 'Bearer YOUR_MAL_TOKEN' }, + timeout: 5000, + }); + return response.data.mean || 'N/A'; + } catch (error) { + console.error('Ошибка при запросе к MyAnimeList:', error.message); + return 'N/A'; + } +} // Основная функция-парсер async function getReleaseFromAnixart(releaseId, token = '') { const url = `https://api.anixart.tv/release/${releaseId}${token ? `?token=${token}` : ''}`; try { - const response = await axios.get(url); + const response = await axios.get(url, { timeout: 5000 }); const releaseData = response.data; if (!releaseData.release) { releaseData.release = {}; } - // Применяем кастомный note, если он есть + // Находим оригинальный note от Anixart const noteEntry = cachedNotes.find(entry => entry.id === Number(releaseId)); - if (noteEntry) { - releaseData.release.note = noteEntry.note; + const originalNote = noteEntry ? noteEntry.note : ''; + + // Предполагаем, что у тебя есть соответствие releaseId (Anixart) и ID на Shikimori/MyAnimeList. + // Это может быть маппинг в базе данных, но для примера я использую тот же releaseId. + const shikimoriData = await fetchShikimoriData(releaseId); + const malScore = await fetchMyAnimeListData(releaseId); + + // Формируем новый note + let newNote = ''; + + // Добавляем оригинальный note от Anixart, если он есть + if (originalNote) { + newNote += `Примечание от Anixart:
${originalNote}

`; } + // Добавляем оценки + newNote += `Оценки:
`; + newNote += `Shikimori: ${shikimoriData.score}
`; + newNote += `MyAnimeList: ${malScore}

`; + + // Добавляем главных персонажей (берем первые 3, например) + if (shikimoriData.characters.length > 0) { + newNote += `Главные персонажи:
`; + const mainCharacters = shikimoriData.characters.slice(0, 3); // Ограничиваем 3 персонажами + mainCharacters.forEach(char => { + if (char.name && char.url) { + newNote += `${char.name}
`; + } + }); + } + + // Применяем новый note + releaseData.release.note = newNote; + return releaseData; - } catch { + } catch (error) { + console.error('Ошибка при запросе релиза:', error.message); return { code: 2, release: null,