Update release.js

This commit is contained in:
2025-05-12 13:41:52 +05:00
committed by GitHub
parent 1e5b8a2835
commit 260fb15161

View File

@@ -1,98 +1,10 @@
const axios = require('axios'); 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 = '') { 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}` : ''}`;
try { try {
// Запрос к API Anixart
const response = await axios.get(url, { timeout: 5000 }); const response = await axios.get(url, { timeout: 5000 });
const releaseData = response.data; const releaseData = response.data;
@@ -100,44 +12,65 @@ async function getReleaseFromAnixart(releaseId, token = '') {
releaseData.release = {}; releaseData.release = {};
} }
// Находим оригинальный note от Anixart // Извлекаем оригинальное примечание и название
const noteEntry = cachedNotes.find(entry => entry.id === Number(releaseId)); const originalNote = releaseData.release.note || '';
const originalNote = noteEntry ? noteEntry.note : '';
// Извлекаем данные для поиска
const titleOriginal = releaseData.release.title_original || ''; const titleOriginal = releaseData.release.title_original || '';
const titleRu = releaseData.release.title_ru || '';
const year = releaseData.release.year || '';
// Ищем аниме в Shikimori // Инициализируем note
const shikimoriAnime = await searchShikimoriAnime(titleOriginal, titleRu, year); let noteContent = '';
if (originalNote) {
noteContent += `<b>Примечание от Anixart:</b><br>${originalNote}<br>`;
}
// Поиск аниме в Shikimori
let shikimoriScore = 'N/A'; let shikimoriScore = 'N/A';
let characters = []; let mainCharacters = [];
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) { if (shikimoriAnime) {
shikimoriScore = shikimoriAnime.score || 'N/A'; shikimoriScore = shikimoriAnime.score || 'N/A';
characters = await fetchShikimoriCharacters(shikimoriAnime.id);
}
// Формируем новый note // Получаем персонажей
let newNote = originalNote ? `<b>Примечание от Anixart:</b><br>${originalNote}<br>` : ''; const rolesResponse = await axios.get(`https://shikimori.one/api/animes/${shikimoriAnime.id}/roles`, {
headers: {
// Добавляем оценку Shikimori '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',
if (shikimoriAnime && shikimoriScore !== 'N/A') { },
newNote += `${newNote ? '<br>' : ''}<b>Оценка Shikimori:</b> ${shikimoriScore}<br>`; timeout: 5000,
}
// Добавляем главных персонажей
if (characters.length > 0) {
newNote += `${newNote ? '<br>' : ''}<b>Главные персонажи:</b><br>`;
characters.forEach(char => {
const fullUrl = `https://shikimori.one${char.url}`; // Делаем ссылку полной
newNote += `<a href="${fullUrl}">${char.name}</a><br>`;
}); });
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, если есть данные, иначе оставляем пустую строку // Формируем note
releaseData.release.note = newNote || ''; if (shikimoriScore !== 'N/A' || mainCharacters.length > 0) {
noteContent += `<b>Оценки из Shikimori:</b> ${shikimoriScore}<br>`;
}
if (mainCharacters.length > 0) {
noteContent += `<b>Главные персонажи:</b> ${mainCharacters.join(', ')}<br>`;
}
// Применяем note, если есть что добавить
releaseData.release.note = noteContent || '';
return releaseData; return releaseData;
} catch (error) { } catch (error) {