{"id":34041527,"url":"https://github.com/vypivshiy/ani-cli-ru","last_synced_at":"2026-03-17T22:09:55.463Z","repository":{"id":38360476,"uuid":"423446331","full_name":"vypivshiy/ani-cli-ru","owner":"vypivshiy","description":"Просмотр аниме с русской озвучкой в терминале ","archived":false,"fork":false,"pushed_at":"2026-03-12T18:38:27.000Z","size":1506,"stargazers_count":209,"open_issues_count":26,"forks_count":13,"subscribers_count":7,"default_branch":"master","last_synced_at":"2026-03-13T00:42:47.655Z","etag":null,"topics":["anime","cli","cli-app","linux","linux-cli","russian","tui","video"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vypivshiy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-11-01T11:51:26.000Z","updated_at":"2026-03-12T18:38:30.000Z","dependencies_parsed_at":"2026-02-23T16:03:14.473Z","dependency_job_id":null,"html_url":"https://github.com/vypivshiy/ani-cli-ru","commit_stats":{"total_commits":263,"total_committers":6,"mean_commits":"43.833333333333336","dds":0.3612167300380228,"last_synced_commit":"0201a56786972fdc3e92725f4c58f60451bcb25c"},"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/vypivshiy/ani-cli-ru","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vypivshiy%2Fani-cli-ru","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vypivshiy%2Fani-cli-ru/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vypivshiy%2Fani-cli-ru/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vypivshiy%2Fani-cli-ru/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vypivshiy","download_url":"https://codeload.github.com/vypivshiy/ani-cli-ru/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vypivshiy%2Fani-cli-ru/sbom","scorecard":{"id":1240980,"data":{"date":"2026-01-05","repo":{"name":"github.com/vypivshiy/ani-cli-ru","commit":"2513c8fc4228fd9ecff4a154f6977478887a2049"},"scorecard":{"version":"v5.4.1-0.20251227023010-525a93017816","commit":"525a93017816fa74238c545bdecac6af16ce00f1"},"score":2.8,"checks":[{"name":"Code-Review","score":0,"reason":"Found 2/28 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/525a93017816fa74238c545bdecac6af16ce00f1/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/525a93017816fa74238c545bdecac6af16ce00f1/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/525a93017816fa74238c545bdecac6af16ce00f1/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/525a93017816fa74238c545bdecac6af16ce00f1/docs/checks.md#maintained"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/525a93017816fa74238c545bdecac6af16ce00f1/docs/checks.md#pinned-dependencies"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/525a93017816fa74238c545bdecac6af16ce00f1/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/525a93017816fa74238c545bdecac6af16ce00f1/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/525a93017816fa74238c545bdecac6af16ce00f1/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/525a93017816fa74238c545bdecac6af16ce00f1/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/525a93017816fa74238c545bdecac6af16ce00f1/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: GNU General Public License v3.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/525a93017816fa74238c545bdecac6af16ce00f1/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/525a93017816fa74238c545bdecac6af16ce00f1/docs/checks.md#signed-releases"}},{"name":"Vulnerabilities","score":8,"reason":"2 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: https://osv.dev/GHSA-vqfr-h8mv-ghfj","Warn: Project is vulnerable to: https://osv.dev/GHSA-847f-9342-265h"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/525a93017816fa74238c545bdecac6af16ce00f1/docs/checks.md#vulnerabilities"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/525a93017816fa74238c545bdecac6af16ce00f1/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 4 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/525a93017816fa74238c545bdecac6af16ce00f1/docs/checks.md#sast"}}]},"last_synced_at":"2026-01-11T08:15:15.330Z","repository_id":38360476,"created_at":"2026-01-11T08:15:15.330Z","updated_at":"2026-01-11T08:15:15.330Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30633240,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-17T17:32:55.572Z","status":"ssl_error","status_checked_at":"2026-03-17T17:32:38.732Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["anime","cli","cli-app","linux","linux-cli","russian","tui","video"],"created_at":"2025-12-13T22:03:24.414Z","updated_at":"2026-03-17T22:09:55.437Z","avatar_url":"https://github.com/vypivshiy.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# anicli-ru\n\n---\n\nCLI приложение и локальный вебсервер для поиска и просмотра аниме из терминала с русской озвучкой или субтитрами.\nПоддерживает unix, linux, windows 10/11 (через windows terminal)\n\n## Demonstration\nCLI:\n\nhttps://github.com/user-attachments/assets/77298253-4e3d-4420-8891-ee821d4834a6\n\nWEB:\n\nhttps://github.com/user-attachments/assets/d8bf90aa-a2df-48fe-a625-5e3a30a5cf67\n\n## Index\n\n* [Установка](#Установка)\n    * [API interface](#API-interface)\n* [Usage](#Usage)\n    * [Check Updates](#Check-Updates)\n* [CLI](#CLI)\n    *[interface](#interface)\n* [WEB](#WEB)\n* [Command Reference](#Command-Reference)\n    * [Commands](#Commands)\n        * [version](#version)\n        * [update](#update)\n        * [check-updates](#check-updates)\n        * [web](#web)\n        * [cli](#cli)\n    * [Notes](#Notes)\n* [License](#License)\n## Установка\n\n- Требуется python 3.9 или выше\n- Для CLI требуется [mpv видеоплеер](https://github.com/mpv-player/mpv)\n- Проект поставляется через pip, рекомендуется устанавливать через [uv](https://docs.astral.sh/uv/guides/tools/#installing-tools) или [pipx](pipx.pypa.io/latest/getting-started/)\n- Минимальная установка, только CLI клиент\n    - UV - `uv tool install anicli-ru` (рекомендуется)\n    - PIPX - `pipx install anicli-ru`\n\n### Опциональные зависимости:\n\n- Установка всех зависимостей (CLI + webserver + browser cookie extractor)\n    - `uv tool install anicli-ru[all]`\n    - `pipx install anicli-ru[all]`\n\n- Извлечение cookies из браузера в клиент (используется для редкого обхода ddos-guard/cloudflare, требуется зависимость [rookiepy](https://github.com/thewh1teagle/rookie))\n    - `uv tool install anicli-ru[cookies]`\n    - `pipx install anicli-ru[cookies]`\n- Локальный веб клиент\n    - `uv tool install anicli-ru[web]`\n    - `pipx install anicli-ru[cookies]`\n\n- termux webclient (TODO, untested)\n\n\u003e TODO: add install script for termux (кто протестирует - можете закинуть PR с shell скриптом установки)\n\nПредполагаю, что локальный клиент должен работать в android termux эмуляторе. \nДля работоспособности требуются следующие зависимости:\n\n```shell\npkg install python-dev libxml2-dev libxslt-dev libiconv-dev\n```\n\nЗатем скачать проект, установить пакеты и запустить\n\n### API interface\n\nКлиент и парсеры умышленно разделены в отдельные репозитории: чтобы мне было удобнее экспериментировать и исправлять и сторонним пользователям использовать в проекте.\n\nЕсли только нужны готовые парсеры и API интрефейс, используйте библиотеку https://github.com/vypivshiy/anicli-api\n\n## Usage\n\nДля вывода информации о коммандах используйте:\n\n```shell\nanicli-ru --help\n```\n\nдоступных опции:\n\n```shell\nanicli-ru cli --help \n```\n\nВывод установленной версии клиента и API\n\n```shell\nanicli-ru version\n```\n\n### Check Updates\n\n\u003e работает если установлен через uv или pipx, иначе необходимо вручную обновлять\n\nПроверить обновления\n\n```shell\nanicli-ru check-updates\n```\n\nУстановить обновления:\n\n```shell\nanicli-ru update\n```\n\nпринудительно переустановить:\n\n```shell\nanicli-ru update --force \n```\n\n### CLI\n\nРеализован поверх [prompt-toolkit](https://github.com/prompt-toolkit/python-prompt-toolkit), визуализация вывода идёт через [rich](https://github.com/Textualize/rich), воспроизведение видео через [mpv](https://github.com/mpv-player/mpv) плеер.\n\nВывод всех доступных источников:\n\n\u003e Дополнительная информация об источниках описана в [anicli-api/source-description](https://github.com/vypivshiy/anicli-api?tab=readme-ov-file#source-description)\n\n\n```shell\nanicli-ru cli\n```\n\nЗапуск поиска при старте. \n\n```shell\nanicli-ru cli -s animego --search isekai\n```\n\nЗапуск ongoing при старте\n\n```shell\nanicli-ru cli -s animego --ongoing\n```\n\nПонижение качества доступных видео (выбирает самый ближайший)\n\n```shell\n# например, для kodik это 360, для dreamcast - 1080\nanicli-ru cli -s animego -q 360\n```\n\n#### interface\n\n- Нажимайте `\u003ctab\u003e` кнопку или начинайте вводить - выведутся доступные команды\n- search, ongoing - есть простой фильтр по названию тайтла - вводите символы в назваии тайтла - они поднимутся вверх в автодополнении\n\nEpisodes:\n\nДля эпизодов есть фильтр по номерам. Индекс начинается с 1.\n\nПримеры:\n\n1. выбрать 1, 3 и 5 эпизод:\n\n```\n1 3 5\n```\n\n2. выбрать 1, 3 и с 5 по 10:\n\n```\n1 3 5-10\n```\n\n3. если ошибетесь и добавите лишние данные - фильтр откорректируется автоматически:\n\nнапример при вводе\n```\n1 1 2 3 1-2\n```\n\nфинальный фильтр:\n\n```\n1-3\n```\n\n4. Воспроизведение серии видео\n\n- создаёт временный файл-плейлист. \n    - в unix/linux записывает в директорию `/tmp`, \n    - в windows - в директорию `%TMP%` (по умолчанию `C:\\Users\\\u003cUSERNAME\u003e\\AppData\\Local\\Temp`)\n- размер плейлиста зависит от ключа `--m3u-size` (по умолчанию, значение 6).\n- не рекомендуется увеличивать значение если не планируете всё смотеть \"в один присест\", так как ссылки на видео живут примерно 24 часа\n- автоматически собирает плейлист на основе значений источника и даббера. \n    - Например, если вы выбрали Ongoing и озвучку \"Субтитры\", а для последнего он отсутвует (но есть Animevost) - поток прервётся.\n\n### WEB\n\n\u003e[!warning]\n\u003e Реализован для локального использования, категорически не рекомендуется применять в production и(или) публичной сети. \n\u003e Не рассчитан для выполнения 24/7\n\u003e\n\u003e Да я ваибкодил его, но также затерпел и **вайбдебажил и вайбтестил его** \n\nПростой вебклиент со статическим рендером страниц и встроенным reverse-proxy трансляции видео в плеер.\n\nСтек сервера:\n- backend: [fastapi](https://github.com/fastapi/fastapi)\n- frontend: pure js, [water.css](https://watercss.kognise.dev/)\n- видеоплеер - [Artplayer.js](https://artplayer.org/) и плагины hls.js, dash.js\n- не применяются базы данных - данные кешируются в ОЗУ процесса сервера\n\nДля запуска требуется установить зависимость:\n    - uv tool install `ani-cli-ru[web]`\n    - pipx install `ani-cli-ru[web]`\n\nзапускать командой:\n\n```shell\nanicli-ru web\n```\n\nДля прочих настроек (ip, port, ttl) введите\n\n```shell\nanicli-ru web --help\n```\n\nВходить по ссылке со сгенерированным токеном или сканировать QR код.\nПример вывода ссылки для входа:\n\n```\nServer started at: http://127.0.0.1:8000/?token=HSB6l1qzoBogpPNpBakXhA\n```\n\nВ search/ongoing/episode страницах доступны фильтры по заголовку и номерам эпизодов. \nСинтаксис поиска номера эпизода идентичен как в CLI\n\n## Command Reference\n\n### Commands\n\n#### version\n\n**Description:** Напечатать версию приложения и anicli-api\n\n**Usage:**\n```\nanicli version\n```\n\n#### update\n\n**Description:** Обновить приложение \n\n\u003e[!note]\n\u003e Работает если установлено в pipx или uv, в обычном pip нужно обновлять вручную\n\n**Usage:**\n```\nanicli update [--force]\n```\n\n**Options:**\n- `--force`: Принудительно обновить api и клиент\n\n#### check-updates\n\n**Description:** Проверить наличие обновлений на pypi\n\n**Usage:**\n```\nanicli check-updates\n```\n\n#### web\n\n**Description:** Запустить локальный сервер (experimental, LOCAL USE ONLY)\n\n**Usage:**\n```\nanicli web [OPTIONS]\n```\n\n**Options:**\n- `-h, --host TEXT`: IP host (default: 127.0.0.1)\n- `-p, --port INTEGER`: Port (default: 8000)\n- `-mw, --max-workers INTEGER`: Uvicorn max workers (default: 1)\n- `-c, --chunk-size TEXT`: Размер чанка видеопотока для трансляции в вебплеер. Поддерживает суффиксы: k/K (kbytes), m/M (mbytes), или число (bytes) (по умолчанию: 1M - 1 мегабайт)\n- `-s, --source TEXT`: Источник (можно переключить в веб интерфейсе)\n- `--ttl TEXT`: Cache TTL - через сколько уничтожишь извлеченные объекты. Поддерживает суффиксы: h/H (hours), m/M (minutes), или число (seconds) (default: 12h)\n\n#### cli\n\n**Description:** Запуск интерактивного cli приложения (требуется mpv видеоплеер)\n**Usage:**\n```\nanicli cli [OPTIONS]\n```\n\n**Required Options:**\n- `-s, --source TEXT`: Источник (можно изменить в приложении)\n\n**Optional Options:**\n- `-q, --quality INTEGER`: Качество видео по умолчанию. Если оно недоступно - выберет близжайшее значение. (default: 2060)\n- `--search TEXT`: При запуске вывести результат поиска тайтлов по запросу \n- `--ongoing`: При запуске вывести доступные онгоинги\n- `-mo, --mpv-opts TEXT`: Дополнительные MPV опции. Должны быть одной строкой. Пример: `\"-config=/.config/mpv/mpv.conf --no-audio\"`\n- `--m3u-size INTEGER`: Максимальный размер плейлиста (slice-play) (default: 6). Не рекомендуется увеличивать размер - извлечённые ссылки имеют срок жизни и не живут долго!\n- `--timeout INTEGER`: HTTP client timeout (seconds) (default: 60)\n- `--proxy TEXT`: Прокси для клиента. поддерживает http(s), socks4/5. Имеет формат scheme://user:password@host:port\n- `--cookies-from-browser TEXT`: Извлечь cookies из браузера и загрузить в httpx клиент. Требуется зависимость `anicli[cookies]`\n- `--cookies PATH`: прочитать cookie из файла (должны быть в netscape формате)\n- `-H, --header TEXT`: Добавить http заголовки в клиент, можно передать несколько раз (формат: Key=Value)\n- `--header-file PATH`: Путь до файла с заголовками headers (формат на одну строку:, Key=Value)\n\n### Notes\n\n- The `web` command is experimental and intended for local network use only, not suitable for production deployment\n- The `cli` command requires an MPV player to be installed and available in your system PATH\n- Both `--search` and `--ongoing` options cannot be used simultaneously in the cli command\n- Chunk size and TTL options support various suffixes for convenience:\n  - Chunk size: k/K for kilobytes, m/M for megabytes, or plain integer for bytes\n  - TTL: h/H for hours, m/M for minutes, or plain integer for seconds\n\n\n## License\n\nGPL3\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvypivshiy%2Fani-cli-ru","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvypivshiy%2Fani-cli-ru","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvypivshiy%2Fani-cli-ru/lists"}