From f16908d630d3f6977445f12746ff4ae9966a6f0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=BC=E3=83=BC=E3=83=AC?= Date: Tue, 27 May 2025 19:37:38 +0500 Subject: [PATCH] Update episode.js --- api/v1/src/episode.js | 111 +++++++++++++++++++++++++++++------------- 1 file changed, 78 insertions(+), 33 deletions(-) diff --git a/api/v1/src/episode.js b/api/v1/src/episode.js index beb3192..7467b65 100644 --- a/api/v1/src/episode.js +++ b/api/v1/src/episode.js @@ -1,28 +1,46 @@ const axios = require('axios'); +const fs = require('fs'); +const path = require('path'); -// Функция для запроса к Anixart API +const loginList = JSON.parse( + fs.readFileSync(path.join(__dirname, 'login.json'), 'utf8') +); + +// Получить логин по токену +async function getLoginFromToken(token) { + try { + const response = await axios.get(`https://api.anixart.tv/profile/preference/login/info?token=${token}`); + return response.data.login; + } catch (error) { + console.error("Ошибка при получении логина по токену:", error.message); + return null; + } +} + +// Главная функция получения эпизода async function getEpisodeFromAnixart(releaseId, token = '') { + const login = token ? await getLoginFromToken(token) : null; + const allowedLogins = loginList.map(u => u.login); + + // Проверка доступа + if (!login || !allowedLogins.includes(login)) { + return getAccessDeniedResponse(); + } + const url = `https://api.anixart.tv/episode/${releaseId}${token ? `?token=${token}` : ''}`; try { const response = await axios.get(url); const data = response.data; - // Изменение структуры поля `workers` data.types = data.types.map((type) => ({ ...type, - // id: 0, workers: "источник: seele.su", - // name: "Недоступно (⁠≧⁠▽⁠≦⁠)", - // icon: null, - // view_count: null, - // pinned: false, - // episodes_count: null, })); - // Если список `types` пуст, обращаемся к Seele API if (data.code === 1 || data.types.length === 0) { return await getEpisodeFromSeele(releaseId, token); } + return data; } catch (error) { console.error("Ошибка при запросе к Anixart API:", error.message); @@ -30,19 +48,48 @@ async function getEpisodeFromAnixart(releaseId, token = '') { } } -// Функция для запроса к Seele API +// Ответ если нет доступа +function getAccessDeniedResponse() { + return { + code: 0, + types: [ + { + "@id": 1, + id: 1, + name: "Для просмотра требуется Anixart EX", + icon: "https://cloud.seele.su/images/seele.jpg", + workers: "Купить доступ: @seele_off", + is_sub: false, + episodes_count: 0, + view_count: 0, + pinned: false + }, + { + "@id": 2, + id: 2, + name: "Не забудьте подписаться на наш Telegram-канал!", + icon: "https://cloud.seele.su/images/seele.jpg", + workers: "ТГК: @seele_channel", + is_sub: false, + episodes_count: 0, + view_count: 0, + pinned: false + } + ] + }; +} + +// Seele fallback async function getEpisodeFromSeele(releaseId, token = '') { const url = `https://cloud.seele.su/episode/${releaseId}.json${token ? `?token=${token}` : ''}`; try { const response = await axios.get(url); const data = response.data; - // Проверяем наличие `types`, если пусто - возвращаем кастомный ответ if (!data.types || data.types.length === 0) { return getCustomNotFoundResponse(); } - // Изменение структуры поля `workers` data.types = data.types.map((type) => ({ ...type, workers: "источник: seele.su", @@ -50,7 +97,6 @@ async function getEpisodeFromSeele(releaseId, token = '') { return data; } catch (error) { - // Если ошибка - 404, возвращаем кастомный ответ if (error.response && error.response.status === 404) { return getCustomNotFoundResponse(); } @@ -59,32 +105,31 @@ async function getEpisodeFromSeele(releaseId, token = '') { } } -// Функция для создания кастомного JSON-ответа function getCustomNotFoundResponse() { - return { - "code": 0, - "types": [ + return { + code: 0, + types: [ { "@id": 1, - "id": 1, - "name": "К сожалению, это аниме недоступно!", - "icon": "https://cloud.seele.su/images/seele.jpg", - "workers": "Это аниме полностью удалено с сервера anixart, либо его там не было изначально.", - "is_sub": false, - "episodes_count": 0, - "view_count": 0, - "pinned": false + id: 1, + name: "К сожалению, это аниме недоступно!", + icon: "https://cloud.seele.su/images/seele.jpg", + workers: "Это аниме полностью удалено с сервера anixart, либо его там не было изначально.", + is_sub: false, + episodes_count: 0, + view_count: 0, + pinned: false }, { "@id": 2, - "id": 2, - "name": "Не забудьте подписаться на наш Telegram-канал 😊", - "icon": "https://cloud.seele.su/images/seele.jpg", - "workers": "Тгк: @seele_channel", - "is_sub": false, - "episodes_count": 0, - "view_count": 0, - "pinned": false + id: 2, + name: "Не забудьте подписаться на наш Telegram-канал", + icon: "https://cloud.seele.su/images/seele.jpg", + workers: "ТГК: @seele_channel", + is_sub: false, + episodes_count: 0, + view_count: 0, + pinned: false } ] };