Skip to main content

anicli-api

Программный интерфейс набора парсеров аниме с различных источников.

Присутствует поддержка sync и async методов с помощью httpx библиотеки.

Парсеры работают на REST-API (если у источника есть доступ) или если такой интерфейс отсутствует, то с помощью lxml и regex библиотек.

install

pip install anicli-api

Overview

Структура проекта

  • source - наборы модулей для извлечения информации об аниме тайтлов из источников
  • player - наборы модулей для извлечения прямой ссылки на видео
anicli_api
├── base.py - базовый класс модуля-парсера
├── _http.py - предварительно сконфигурированные классы httpx.Client и httpx.AsyncClient
├── _logger.py - логгер
├── player - модули получения ссылок на видео
│     ├── parsers/... автоматически сгенерированные парсеры html страниц
│     ├── apis/... автоматически сгенерированные LLM rest-api клиенты
│     ├── ...  ready-made модули
│     ...
├── source - модули парсеров с источников
│     ├── parsers/... автоматически сгенерированные парсеры html страниц
│     ├── apis/... автоматически сгенерированные LLM rest-api клиенты
│     ├─ ... ready-made парсеры
│     ...
└── tools - прочие модули
dev/ - служебные модули со swagger документациями API и конфигурацией html парсеров

Схематичный принцип работы модуля из директории source

префикс a_ обозначает асинхронный метод, возвращаемые объекты идентичны

flowchart TD
    E[Extractor] -->|"search('QUERY') | a_search('QUERY')"| S("List[Search]")
    E -->|"ongoing() | a_ongoing()"| O("List[Ongoing]")

    O -->|"get_anime() | a_get_anime()"| A[Anime]
    S -->|"get_anime() | a_get_anime()"| A

    A -->|"get_episodes() | a_get_episodes()"|Ep["List[Episode]"]
    Ep -->|"get_sources() | a_get_sources()"|So["List[Source]"]
    So -->|"get_videos() | a_get_videos()"|V["List[Video]"]

quickstart

  1. вызов из установленного модуля PEP-0338:
python -m anicli-api.tools.dummy_cli <extractor-name>

# пример
python -m anicli-api.tools.dummy_cli animego
  1. вызов из склонированного проекта:
python anicli-api/tools/dummy_cli.py <extrator-name>
# пример
python anicli-api/tools/dummy_cli.py animego
  1. Использование в python коде:
from anicli_api.source.animego import Extractor
from anicli_api.tools import cli

if __name__ == '__main__':
    cli(Extractor())

cli() функция для простого ручного тестирования экстракторов, "имитирует" потенциальное настоящее приложение

Пример своей реализации

from anicli_api.source.animego import Extractor  # can usage any source


def _print_to_rows(items):
    print(*[f"{i}) {r}" for i, r in enumerate(items)], sep="\n")


if __name__ == "__main__":
    ex = Extractor()
    print("PRESS CTRL + C for exit app")
    while True:
        results = ex.search(input("search query > "))
        if not results:
            print("Not founded, try again")
        continue
    _print_to_rows(results)

    anime = results[int(input("anime > "))].get_anime()
    print(anime)

    episodes = anime.get_episodes()
    _print_to_rows(episodes)
    episode = episodes[int(input("episode > "))]

    sources = episode.get_sources()
    _print_to_rows(sources)
    source = sources[int(input("source > "))]

    videos = source.get_videos()
    _print_to_rows(videos)
    video = videos[int(input("video > "))]
    print(video.type, video.quality, video.url, video.headers)

С asyncio аналогично, но все методы получения объектов имеют префикс a_:

import asyncio
from anicli_api.source.animego import Extractor # или любой другой источник

async def main():
    ex = Extractor()
    prompt = input("search query > ")
    # a_ - async prefix.
    # simular in Ongoing, Anime, Episode, Source, Video objects
    results = await ex.a_search(prompt)
    print(*[f"{i}) {r}" for i, r in enumerate(results)], sep="\n")

if __name__ == '__main__':
    asyncio.run(main())

Player

Эти модули можно использовать как экстрактор прямых ссылок на видео

Эти модули минимально реализуют получение ссылок на видео с минимальными метаданными и заголовками для скачивания и не стремятся стать заменой yt-dlp

import asyncio

from anicli_api.player.sibnet import SibNet

async def main():
    videos = await SibNet().a_parse(URL)
    print(*videos)


if __name__ == '__main__':
    URL = 'https://video.sibnet.ru/shell.php?videoid=432356'
    print(*SibNet().parse(URL))
    # asyncio support!
    asyncio.run(main())

source description

  • name - имя модуля
  • type - тип источника получения данных.
    • API - rest-api (или graphql) запросы
    • SSR (server side rendering) - парсинг HTML страницы
  • note - примечания
  • dubbers - тип озвучек.
    • many - от различных авторов.
    • subtitles - только субтитры.
    • once - один вид (случайный)
    • author - своя
name url type dubbers note
animego https://animego.org SSR many источники kodik, animego, не работает на IP отличных от СНГ и стран прибалтики
anilibria https://aniliberty.top API author старое название, актуальное aniliberty
animevost https://animevost.org API author
sameband https://sameband.studio SSR author
yummy_anime https://site.yummyani.me API many
anilib_me https://animelib.org API many (???), при чрезмерной эксплуатации могут дать бан по ip (API запросы возвращают код 403)
hdrezka https://hdrezka-home.tv SSR once

players description

  • name - имя плеера
  • max quality - максимальное разрешение выдаваемое источником. Это может быть 0 (аудио, без видео), 144, 240, 360, 480, 720, 1080
  • note - примечания
name max quality note
kodik 720 (на старых тайтлах как ранние One Peace, Evangelion) - 480) работает только на IP СНГ и стран прибалтики
aniboom 1080 работает только на IP СНГ и стран прибалтики. Иногда не возвращает mpd ссылку на видео
sibnet 480
anilibria 720, иногда 1080
animevost 720
sameband 1080
anilib 1080, 2060 (4k) требуется авторизация для доступа к оригинальному плееру, добавить заголовок Authorization: Bearer .... Авторизация через ВК работает на старом домене
okcdn (cdnvideohub) 1080, 2060 (4k?) streamlink/streamlink/issues/6369: IP адрес и user-agent плеера должны совпадать с user-agent и IP, откуда шёл запрос из объектов Extractor
hdrezka 1080

Настроенные httpx.Client / httpx.AsyncClient, переданные root extractor, сохраняют identity во всей цепочке объектов до player. Для общей HTTP-сессии нескольких extractors передайте им одни и те же client instances явно.

See also

  • docs - lib usage
  • dev - swagger документации и dsl конфиг парсеры с рецептами изготовления
  • e2e tests - E2E тест для проверки базовой работоспособности модулей

Примечания

  • Этот проект не включает инструменты кеширования и сохранения всех полученных данных, только готовые реализации парсеров и программные интерфейсы
  • Проект разработан преимущественно на личное, некоммерческое использование с client-side стороны. Проект не несет ответственности за поломки, убытки и решение предоставляется "Как есть" в соответствии с MIT лицензией.
  • Основная цель этого проекта — связать автоматизацию и эффективность извлечения того, что предоставляется пользователю в Интернете. Весь контент, доступный в рамках проекта, размещается на внешних неаффилированных источниках.

Release files for anicli_api 0.12.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for anicli_api 0.12.0
File Size Uploaded
anicli_api-0.12.0.tar.gz 65.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for anicli_api 0.12.0
File Interpreter ABI Platform
anicli_api-0.12.0-py3-none-any.whl Python 3 none any Details

Total release size: 154.7 kB

Release files / anicli_api-0.12.0.tar.gz

Download URL anicli_api-0.12.0.tar.gz
Size 65.8 kB
Tags Source
SHA-256 checksum
How to use checksums
be5d4d56814687af2a48dfcded92143aad422aae38c6f432a995ffa09e6bd66a
BLAKE2b-256 checksum
How to use checksums
fd03fd9dc0438de4f84cb00ea6a1c778c5a42ab3ccc6e05be0c681c3fe04cdb4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / anicli_api-0.12.0-py3-none-any.whl

Download URL anicli_api-0.12.0-py3-none-any.whl
Size 88.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2b61564a45ebeb55e331a0c185a06fb2050612c17366869bd2cf39d4923c4641
BLAKE2b-256 checksum
How to use checksums
cc5127da393e927070d7936db6f2d90f101b569f41918ec2c26527f5404b0c75
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

This release

0.12.0 This release

2 release files

0.11.0

2 release files

0.9.2

2 release files

0.9.1

2 release files

0.9.0

2 release files

0.8.13

2 release files

0.8.12

2 release files

0.8.10

2 release files

0.8.9

2 release files

0.8.8

2 release files

0.8.7

2 release files

0.8.6

2 release files

0.8.5

2 release files

0.8.4

2 release files

0.8.3

2 release files

0.8.2

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.17

2 release files

0.7.16

2 release files

0.7.15

2 release files

0.7.14

2 release files

0.7.13

2 release files

0.7.12

2 release files

0.7.11

2 release files

0.7.9

2 release files

0.7.8

2 release files

0.7.7

2 release files

0.7.6

2 release files

0.7.5

2 release files

0.7.4

2 release files

0.7.3

2 release files

0.7.2

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.13

2 release files

0.6.11

2 release files

0.6.10

2 release files

0.6.9

2 release files

0.6.8

2 release files

0.6.7

2 release files

0.6.6

2 release files

0.6.5

2 release files

0.6.4

2 release files

0.6.3

2 release files

0.6.2

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.5.14

2 release files

0.5.13

2 release files

0.5.12

2 release files

0.5.11

2 release files

0.5.10

2 release files

0.5.9

2 release files

0.5.8

2 release files

0.5.7

2 release files

0.5.6

2 release files

0.5.5

2 release files

0.5.4

2 release files

0.5.3

2 release files

0.5.2

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.10

2 release files

0.4.9

2 release files

0.4.8

2 release files

0.4.7

2 release files

0.4.5

2 release files

0.4.4

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.8

2 release files

0.3.7

2 release files

0.3.6

2 release files

0.3.5

2 release files

0.3.4

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page