🎌 AniLiberty.js

Полноценный Node.js клиент для AniLiberty API V1

v1.0.0

🚀 Быстрый старт

Установка

npm install anilibertyjs

Минимальный пример

const { AniLibertyClient, isSuccess } = require('anilibertyjs');

// Создаем клиент
const client = new AniLibertyClient();

// Получаем последние обновления
async function getLatestAnime() {
  const updates = await client.getUpdates({ limit: 5 });
  
  if (isSuccess(updates)) {
    updates.data.forEach(anime => {
      console.log(`${anime.title.ru} - ${anime.episodes_released} эп.`);
    });
  }
}

getLatestAnime();

✨ Возможности

🔒

Авторизация

Поддержка логин/пароль, OTP и социальных сетей

📚

Полный каталог

Доступ ко всему каталогу аниме с фильтрацией

🔍

Мощный поиск

Полнотекстовый поиск и автодополнение

Избранное

Управление избранными релизами

📦

Коллекции

Создание и управление коллекциями

📅

Расписание

Расписание выхода новых эпизодов

💾

Торренты

Скачивание торрент-файлов

📝

TypeScript

Полная поддержка TypeScript

📦 Установка

Через npm

npm install anilibertyjs

Через yarn

yarn add anilibertyjs

Требования

📖 Базовое использование

Создание клиента

const { AniLibertyClient } = require('anilibertyjs');

const client = new AniLibertyClient({
  baseUrl: 'https://aniliberty.top/api/v1',  // опционально
  timeout: 30000,                              // опционально (мс)
  headers: {                                   // опционально
    'User-Agent': 'MyApp/1.0.0'
  }
});

TypeScript

import { AniLibertyClient, Release, isSuccess } from 'anilibertyjs';

const client = new AniLibertyClient();

async function getCatalog() {
  const response = await client.getCatalog({ limit: 20 });
  
  if (isSuccess(response)) {
    const releases: Release[] = response.data;
    console.log(`Найдено релизов: ${releases.length}`);
  }
}

🔒 Авторизация

Логин и пароль

POST login(request: LoginRequest)
Авторизация пользователя по логину и паролю
Promise<ApiResponse<LoginResponse>>
const response = await client.login({
  login: 'username',
  password: 'password'
});

if (isSuccess(response)) {
  console.log('Токен:', response.data.access_token);
  // Токен автоматически сохраняется в клиенте
}

Параметры LoginRequest

Параметр Тип Обязательный Описание
login string Да Логин пользователя
password string Да Пароль пользователя

OTP (Одноразовый пароль)

POST otpGet(request: OTPGetRequest)
Запрашивает новый OTP код
// 1. Запросить OTP
const otpResponse = await client.otpGet({
  device_id: 'unique-device-id'
});

// 2. Пользователь вводит код из email/sms

// 3. Авторизация по OTP
const loginResponse = await client.otpLogin({
  code: 123456,
  device_id: 'unique-device-id'
});

Социальные сети

GET socialAuthVkRedirect()
Получить URL для авторизации через VK
// VK
const vkRedirect = await client.socialAuthVkRedirect();
// Перенаправить пользователя на vkRedirect.data.url

// Discord
const discordRedirect = await client.socialAuthDiscordRedirect();

// Google
const googleRedirect = await client.socialAuthGoogleRedirect();

Управление токеном

// Установить токен вручную
client.setAccessToken('your-token-here');

// Очистить токен
client.clearAccessToken();

// Обновить токен
await client.refreshToken();

// Выход
await client.logout();

📚 Каталог аниме

Получение каталога с фильтрацией

GET getCatalog(filters?: CatalogFilters)
Получить список релизов с расширенными фильтрами
const catalog = await client.getCatalog({
  page: 1,
  limit: 20,
  genres: ['action', 'comedy'],
  types: ['tv'],
  seasons: ['2024'],
  sort: 'rating',
  order: 'desc'
});

Параметры CatalogFilters

Параметр Тип Описание
page number Номер страницы
limit number Количество результатов на странице
types string[] Типы релизов (TV, OVA, Movie и т.д.)
genres string[] ID жанров
seasons string[] ID сезонов
statuses string[] ID статусов релизов
ratings string[] ID возрастных рейтингов
sort 'created_at' | 'updated_at' | 'title' | 'rating' Поле для сортировки
order 'asc' | 'desc' Порядок сортировки
include string | string[] Включить связанные данные
exclude string | string[] Исключить поля из ответа

Другие методы каталога

GET getRelease(releaseId: string)
const release = await client.getRelease('release-id');
GET getReleaseByCode(code: string)
const release = await client.getReleaseByCode('sword-art-online');
GET getRandomRelease()
const random = await client.getRandomRelease();
GET getUpdates(params?: PaginationParams)
const updates = await client.getUpdates({ limit: 10 });

👤 Пользовательские возможности

Профиль

// Получить профиль
const profile = await client.getMyProfile();

// Обновить профиль
await client.updateMyProfile({
  login: 'new-login',
  email: 'new@email.com',
  description: 'Моё описание'
});

// Изменить пароль
await client.updateMyPassword({
  old_password: 'old',
  new_password: 'new',
  new_password_confirmation: 'new'
});

Избранное

// Добавить в избранное
await client.addToFavorites({
  release_id: '123',
  status_id: '1'
});

// Получить избранное
const favorites = await client.getMyFavorites();

// Обновить статус
await client.updateFavorite('release-id', {
  status_id: '2'
});

// Удалить из избранного
await client.removeFromFavorites('release-id');

Коллекции

// Создать коллекцию
const collection = await client.createCollection({
  title: 'Моя коллекция',
  description: 'Описание',
  is_public: true
});

// Добавить релиз в коллекцию
await client.addReleaseToCollection(collection.data.id, {
  release_id: 'release-id'
});

// Получить все коллекции
const collections = await client.getMyCollections();

История просмотров

// Обновить позицию просмотра
await client.updateWatchHistory('release-id', {
  episode_id: 'episode-id',
  timestamp: 300,  // секунды
  duration: 1440   // общая длительность
});

// Получить историю
const history = await client.getWatchHistory();

// Очистить историю
await client.clearWatchHistory();

📚 Дополнительные ресурсы

Полная документация

Примеры кода

Смотрите папку examples/ в репозитории для детальных примеров: