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,