diff --git a/api/v1/src/release.js b/api/v1/src/release.js index 7cb31c3..b853fcb 100644 --- a/api/v1/src/release.js +++ b/api/v1/src/release.js @@ -26,34 +26,42 @@ async function scheduleFetchNotes() { } scheduleFetchNotes(); -// Функция для получения данных с Shikimori -async function fetchShikimoriData(animeId) { +// Функция для поиска аниме в Shikimori по названию +async function searchShikimoriAnime(titleRu, titleEn) { 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 || [], // Персонажи (нужны главные) - }; + const searchQuery = titleRu || titleEn; // Используем русское название, если есть, иначе английское + if (!searchQuery) return null; + + const response = await axios.get('https://shikimori.one/api/animes', { + params: { + search: searchQuery, + limit: 1, // Берем только первое совпадение + }, + timeout: 5000, + }); + + const anime = response.data[0]; + if (!anime) return null; + + return anime; } catch (error) { - console.error('Ошибка при запросе к Shikimori:', error.message); - return { score: 'N/A', characters: [] }; + console.error('Ошибка при поиске аниме в Shikimori:', error.message); + return null; } } -// Функция для получения данных с MyAnimeList -async function fetchMyAnimeListData(animeId) { +// Функция для получения данных о персонажах с Shikimori +async function fetchShikimoriCharacters(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'; + const response = await axios.get(`https://shikimori.one/api/animes/${animeId}/roles`, { timeout: 5000 }); + const characters = response.data + .filter(role => role.roles.includes('Main')) // Берем только главных персонажей + .map(role => role.character) + .filter(char => char && char.name && char.url); + return characters.slice(0, 3); // Ограничиваем до 3 персонажей } catch (error) { - console.error('Ошибка при запросе к MyAnimeList:', error.message); - return 'N/A'; + console.error('Ошибка при запросе персонажей из Shikimori:', error.message); + return []; } } @@ -73,37 +81,45 @@ async function getReleaseFromAnixart(releaseId, token = '') { const noteEntry = cachedNotes.find(entry => entry.id === Number(releaseId)); const originalNote = noteEntry ? noteEntry.note : ''; - // Предполагаем, что у тебя есть соответствие releaseId (Anixart) и ID на Shikimori/MyAnimeList. - // Это может быть маппинг в базе данных, но для примера я использую тот же releaseId. - const shikimoriData = await fetchShikimoriData(releaseId); - const malScore = await fetchMyAnimeListData(releaseId); + // Извлекаем названия релиза (предполагаем, что API Anixart возвращает их в releaseData) + const titleRu = releaseData.release.name_ru || ''; + const titleEn = releaseData.release.name_en || ''; + + // Ищем аниме в Shikimori по названию + const shikimoriAnime = await searchShikimoriAnime(titleRu, titleEn); + let shikimoriScore = 'N/A'; + let characters = []; + + if (shikimoriAnime) { + shikimoriScore = shikimoriAnime.score || 'N/A'; + characters = await fetchShikimoriCharacters(shikimoriAnime.id); + } // Формируем новый note let newNote = ''; - // Добавляем оригинальный note от Anixart, если он есть + // Добавляем оригинальный note от Anixart, только если он есть if (originalNote) { - newNote += `Примечание от Anixart:
${originalNote}

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

`; + // Добавляем оценку Shikimori + if (shikimoriScore !== 'N/A') { + newNote += `${newNote ? '
' : ''}Оценка Shikimori: ${shikimoriScore}
`; + } - // Добавляем главных персонажей (берем первые 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}
`; - } + // Добавляем главных персонажей + if (characters.length > 0) { + newNote += `${newNote ? '
' : ''}Главные персонажи:
`; + characters.forEach(char => { + newNote += `${char.name}
`; }); } - // Применяем новый note - releaseData.release.note = newNote; + // Применяем новый note, только если есть что добавить + if (newNote) { + releaseData.release.note = newNote; + } return releaseData; } catch (error) {