diff --git a/api/v1/src/release.js b/api/v1/src/release.js index 9f1bf5a..e19433e 100644 --- a/api/v1/src/release.js +++ b/api/v1/src/release.js @@ -1,98 +1,10 @@ const axios = require('axios'); -// Кэш кастомных заметок -let cachedNotes = []; - -// Функция для загрузки заметок из внешнего API (Anixart) -async function fetchNotes() { - try { - 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) { - cachedNotes = []; - } -} - -// Загружаем заметки сразу при запуске -fetchNotes(); - -// Обновляем заметки каждые 10 минут -async function scheduleFetchNotes() { - await fetchNotes(); - setTimeout(scheduleFetchNotes, 10 * 60 * 1000); -} -scheduleFetchNotes(); - -// Функция для поиска аниме в Shikimori по названию -async function searchShikimoriAnime(titleOriginal, titleRu, year) { - try { - let searchQuery = titleOriginal || titleRu; - if (!searchQuery) return null; - - const response = await axios.get('https://shikimori.one/api/animes', { - params: { - search: encodeURIComponent(searchQuery), - limit: 1, - year: year || undefined, - }, - headers: { - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', - }, - timeout: 5000, - }); - - let anime = response.data[0] || null; - - if (!anime && titleRu && titleRu !== titleOriginal) { - const responseRu = await axios.get('https://shikimori.one/api/animes', { - params: { - search: encodeURIComponent(titleRu), - limit: 1, - year: year || undefined, - }, - headers: { - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', - }, - timeout: 5000, - }); - anime = responseRu.data[0] || null; - } - - return anime; - } catch (error) { - return null; - } -} - -// Функция для получения данных о персонажах с Shikimori -async function fetchShikimoriCharacters(animeId) { - try { - const response = await axios.get(`https://shikimori.one/api/animes/${animeId}/roles`, { - headers: { - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', - }, - timeout: 5000, - }); - - const characters = response.data - .filter(role => role.roles.includes('Main')) // Фильтр по "Main" - .map(role => role.character) - .filter(char => char && char.name && char.url) - .slice(0, 3); - - return characters; - } catch (error) { - return []; - } -} - -// Основная функция-парсер async function getReleaseFromAnixart(releaseId, token = '') { const url = `https://api.anixart.tv/release/${releaseId}${token ? `?token=${token}` : ''}`; try { + // Запрос к API Anixart const response = await axios.get(url, { timeout: 5000 }); const releaseData = response.data; @@ -100,44 +12,65 @@ async function getReleaseFromAnixart(releaseId, token = '') { releaseData.release = {}; } - // Находим оригинальный note от Anixart - const noteEntry = cachedNotes.find(entry => entry.id === Number(releaseId)); - const originalNote = noteEntry ? noteEntry.note : ''; - - // Извлекаем данные для поиска + // Извлекаем оригинальное примечание и название + const originalNote = releaseData.release.note || ''; const titleOriginal = releaseData.release.title_original || ''; - const titleRu = releaseData.release.title_ru || ''; - const year = releaseData.release.year || ''; - // Ищем аниме в Shikimori - const shikimoriAnime = await searchShikimoriAnime(titleOriginal, titleRu, year); + // Инициализируем note + let noteContent = ''; + + if (originalNote) { + noteContent += `Примечание от Anixart:
${originalNote}
`; + } + + // Поиск аниме в Shikimori let shikimoriScore = 'N/A'; - let characters = []; + let mainCharacters = []; - if (shikimoriAnime) { - shikimoriScore = shikimoriAnime.score || 'N/A'; - characters = await fetchShikimoriCharacters(shikimoriAnime.id); - } - - // Формируем новый note - let newNote = originalNote ? `Примечание от Anixart:
${originalNote}
` : ''; - - // Добавляем оценку Shikimori - if (shikimoriAnime && shikimoriScore !== 'N/A') { - newNote += `${newNote ? '
' : ''}Оценка Shikimori: ${shikimoriScore}
`; - } - - // Добавляем главных персонажей - if (characters.length > 0) { - newNote += `${newNote ? '
' : ''}Главные персонажи:
`; - characters.forEach(char => { - const fullUrl = `https://shikimori.one${char.url}`; // Делаем ссылку полной - newNote += `${char.name}
`; + if (titleOriginal) { + const shikimoriResponse = await axios.get('https://shikimori.one/api/animes', { + params: { + search: encodeURIComponent(titleOriginal), + limit: 1, + }, + headers: { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', + }, + timeout: 5000, }); + + const shikimoriAnime = shikimoriResponse.data[0]; + if (shikimoriAnime) { + shikimoriScore = shikimoriAnime.score || 'N/A'; + + // Получаем персонажей + const rolesResponse = await axios.get(`https://shikimori.one/api/animes/${shikimoriAnime.id}/roles`, { + headers: { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', + }, + timeout: 5000, + }); + + mainCharacters = rolesResponse.data + .filter(role => role.roles.includes('Main')) + .map(role => role.character) + .filter(char => char && char.name && char.url) + .slice(0, 3) + .map(char => char.name); // Берем только имена + } } - // Применяем note, если есть данные, иначе оставляем пустую строку - releaseData.release.note = newNote || ''; + // Формируем note + if (shikimoriScore !== 'N/A' || mainCharacters.length > 0) { + noteContent += `Оценки из Shikimori: ${shikimoriScore}
`; + } + + if (mainCharacters.length > 0) { + noteContent += `Главные персонажи: ${mainCharacters.join(', ')}
`; + } + + // Применяем note, если есть что добавить + releaseData.release.note = noteContent || ''; return releaseData; } catch (error) {