diff --git a/api/v1/index.js b/api/v1/index.js index bbc6bd5..ffcae62 100644 --- a/api/v1/index.js +++ b/api/v1/index.js @@ -1,95 +1,103 @@ -const express = require('express'); -const { getEpisodeFromAnixart } = require('./src/episode'); -const getVerifiedUsers = require('./src/is_verified'); -const getRolesUsers = require('./src/is_roles'); -const { getProfileFromAnixart } = require('./src/profile'); -const getToggles = require('./src/toggles'); +const axios = require('axios'); -const app = express(); -const PORT = 3000; +// Функция для запроса к Anixart API с поддержкой releaseId, typeId и sourceId +async function getEpisodeFromAnixart(releaseId, token = '', typeId = '', sourceId = '') { + let url = `https://api.anixart.tv/episode/${releaseId}`; -// Новый эндпоинты Открываем - -// Эндпоинт для получения Verified -app.get('/api/is_roles', (req, res) => { - try { - const data = getRolesUsers(); - res.status(200).json(data); - } catch { - res.status(200).json([]); + // Если передан typeId, добавляем его в URL + if (typeId) { + url += `/${typeId}`; } -}); -// Эндпоинт для получения Verified -app.get('/api/is_verified', (req, res) => { - try { - const data = getVerifiedUsers(); - res.status(200).json(data); - } catch { - res.status(200).json([]); + // Если передан sourceId, добавляем его в URL + if (sourceId) { + url += `/${sourceId}`; + } + + // Если передан токен, добавляем его как query параметр + if (token) { + url += `?token=${token}`; } -}); -// Эндпоинт для получения профиля -app.get('/api/profile/:profileId', async (req, res) => { - const { profileId } = req.params; - const { token } = req.query; try { - const data = await getProfileFromAnixart(profileId, token); - res.json(data); + const response = await axios.get(url); + const data = response.data; + + // Проверяем структуру данных и, если что-то отсутствует, возвращаем кастомный ответ + if (data.code === 0 && !data.types) { + // Если нет данных о типах, обращаемся к Seele API + return await getEpisodeFromSeele(releaseId, token); + } + + // Если данные по типам или источникам есть, возвращаем их + return data; } catch (error) { - res.status(500).json({ error: error.message }); - } -}); + console.error("Ошибка при запросе к Anixart API:", error.message); -// Эндпоинт для получения информации об эпизоде (Новый эндпоинт) -app.get('/api/episode/:releaseId/:typeId?/:sourceId?', async (req, res) => { - const { releaseId, typeId, sourceId } = req.params; - const { token } = req.query; // Извлекаем token из query-параметров + // Если ошибка 404, то пробуем получить данные с Seele API + if (error.response && error.response.status === 404) { + return await getEpisodeFromSeele(releaseId, token); + } + + // В случае других ошибок + throw new Error("Ошибка при получении данных из Anixart API"); + } +} + +// Функция для запроса к Seele API +async function getEpisodeFromSeele(releaseId, token = '') { + const url = `https://cloud.seele.su/episode/${releaseId}.json${token ? `?token=${token}` : ''}`; try { - const data = await getEpisodeFromAnixart(releaseId, token, typeId, sourceId); - res.json(data); + const response = await axios.get(url); + const data = response.data; + + // Если нет данных по типам, возвращаем кастомный ответ + if (!data.types || data.types.length === 0) { + return getCustomNotFoundResponse(); + } + + // Возвращаем данные + return data; } catch (error) { - res.status(500).json({ error: error.message }); + if (error.response && error.response.status === 404) { + return getCustomNotFoundResponse(); + } + + console.error("Ошибка при запросе к Seele API:", error.message); + throw new Error("Ошибка при получении данных из Seele API"); } -}); +} -// Эндпоинт для конфигурационного JSON из toggles.js -app.get('/api/config/toggles', async (req, res) => { - try { - const toggles = await getToggles(); - res.json(toggles); - } catch (error) { - res.status(500).json({ error: error.message }); - } -}); +// Функция для создания кастомного JSON-ответа +function getCustomNotFoundResponse() { + 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": 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 + } + ] + }; +} -// Старый эндпоинты Открываем - -// Эндпоинт для получения информации об эпизоде (Старый эндпоинт) -app.get('/api/extension/episode/:releaseId', async (req, res) => { - const { releaseId } = req.params; - try { - const data = await getOldEpisodeFromAnixart(releaseId); - res.json(data); - } catch (error) { - res.status(500).json({ error: error.message }); - } -}); - -// Эндпоинт для конфигурационного JSON из toggles-old-1.js (Старый Toggles) -app.get('/api/extension/config/toggles', (req, res) => { - res.json(configDataOld); -}); - -// -------------------------- - -// Обработчик для всех неизвестных маршрутов -app.use((req, res) => { - res.status(404).json({ error: "Страница не существует!", status: 404 }); -}); - -app.listen(PORT, () => { - console.log(`Сервер запущен на http://localhost:${PORT}`); -}); +module.exports = { getEpisodeFromAnixart };