{"id":19606311,"url":"https://github.com/lifailon/torapi","last_synced_at":"2025-04-27T19:32:59.095Z","repository":{"id":227325446,"uuid":"771025903","full_name":"Lifailon/TorAPI","owner":"Lifailon","description":"Unofficial API (backend) and RSS for RuTracker, Kinozal, RuTor and NoNameClub for receiving torrent files and detailed information about distribution.","archived":false,"fork":false,"pushed_at":"2025-02-12T21:59:46.000Z","size":9627,"stargazers_count":38,"open_issues_count":2,"forks_count":3,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-04-24T01:44:38.545Z","etag":null,"topics":["api","api-server","axios","cheerio","express","expressjs","github-actions","javascript","js","nodejs","postman","postman-test","rest-api","rss","rutorrent","rutracker","swagger","torrent","tracker","web"],"latest_commit_sha":null,"homepage":"https://app.swaggerhub.com/apis-docs/Lifailon/TorAPI","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Lifailon.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}},"created_at":"2024-03-12T15:00:59.000Z","updated_at":"2025-04-14T03:07:48.000Z","dependencies_parsed_at":"2024-03-21T20:26:01.872Z","dependency_job_id":"1b500e2c-3103-486a-ae50-0b7a29bb37cf","html_url":"https://github.com/Lifailon/TorAPI","commit_stats":null,"previous_names":["lifailon/torrentapi","lifailon/torapi"],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lifailon%2FTorAPI","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lifailon%2FTorAPI/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lifailon%2FTorAPI/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lifailon%2FTorAPI/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Lifailon","download_url":"https://codeload.github.com/Lifailon/TorAPI/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251196355,"owners_count":21550941,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["api","api-server","axios","cheerio","express","expressjs","github-actions","javascript","js","nodejs","postman","postman-test","rest-api","rss","rutorrent","rutracker","swagger","torrent","tracker","web"],"created_at":"2024-11-11T10:04:36.214Z","updated_at":"2025-04-27T19:32:59.083Z","avatar_url":"https://github.com/Lifailon.png","language":"JavaScript","readme":"\u003cp align=\"center\"\u003e\n    \u003cimg src=\"image/logo-02.png\" alt=\"Image alt\"\u003e\n\u003c/p\u003e\n\n---\n\n\u003cp align=\"center\"\u003e\n        \u003ca href=\"https://www.npmjs.com/package/torapi\"\u003e\u003cimg title=\"NPM\" src=\"https://img.shields.io/badge/NPM-%23CB3837.svg?style=for-the-badge\u0026logo=npm\u0026logoColor=white\"\u003e\u003c/a\u003e\n        \u003ca href=\"https://vercel.com/torapi/torapi\"\u003e\u003cimg title=\"Vercel\" src=\"https://img.shields.io/badge/vercel-%23000000.svg?style=for-the-badge\u0026logo=vercel\u0026logoColor=white\"\u003e\u003c/a\u003e\n        \u003ca href=\"https://hub.docker.com/r/lifailon/torapi\"\u003e\u003cimg title=\"Docker\" src=\"https://img.shields.io/badge/docker-%230db7ed.svg?style=for-the-badge\u0026logo=docker\u0026logoColor=white\"\u003e\u003c/a\u003e\n        \u003ca href=\"https://app.swaggerhub.com/apis-docs/Lifailon/TorAPI\"\u003e\u003cimg title=\"Swagger\" src=\"https://img.shields.io/badge/-Swagger-%23Clojure?style=for-the-badge\u0026logo=swagger\u0026logoColor=white\"\u003e\u003c/a\u003e\n        \u003ca href=\"https://documenter.getpostman.com/view/37302476/2sAXqzYeRj\"\u003e\u003cimg title=\"Postman\" src=\"https://img.shields.io/badge/Postman-FF6C37?style=for-the-badge\u0026logo=postman\u0026logoColor=white\"\u003e\u003c/a\u003e\n        \u003ca href=\"https://github.com/Lifailon/TorAPI/actions\"\u003e\u003cimg title=\"Actions\" src=\"https://img.shields.io/badge/Actions-%230075A8.svg?style=for-the-badge\u0026logo=githubactions\u0026logoColor=white\"\u003e\u003c/a\u003e\n        \u003ca href=\"https://github.com/Lifailon/TorAPI/blob/main/jenkins/jenkinsfile\"\u003e\u003cimg title=\"Actions\" src=\"https://img.shields.io/badge/jenkins-%232C5263?style=for-the-badge\u0026logo=jenkins\u0026logoColor=white\"\u003e\u003c/a\u003e\n    \u003cbr\u003e\n    \u003cbr\u003e\n        \u003ca href=\"https://github.com/Lifailon/TorAPI/actions\"\u003e\u003cimg title=\"Actions\"src=\"https://img.shields.io/github/actions/workflow/status/Lifailon/TorAPI/ci-postman-tests.yml?logo=Postman\u0026label=CI+Postman\"\u003e\u003c/a\u003e\n        \u003ca href=\"https://github.com/Lifailon/TorAPI/actions\"\u003e\u003cimg title=\"Actions\"src=\"https://img.shields.io/github/actions/workflow/status/Lifailon/TorAPI/cd-vercel.yml?logo=Vercel\u0026label=CD+Vercel\"\u003e\u003c/a\u003e\n        \u003ca href=\"https://github.com/Lifailon/TorAPI/actions\"\u003e\u003cimg title=\"Actions\"src=\"https://img.shields.io/github/actions/workflow/status/Lifailon/TorAPI/cd-docker-hub.yml?logo=GitHub-Actions\u0026label=CD+Docker+Hub\"\u003e\u003c/a\u003e\n        \u003ca href=\"https://hub.docker.com/r/lifailon/torapi\"\u003e\u003cimg title=\"Docker\"src=\"https://img.shields.io/docker/image-size/lifailon/torapi?\u0026color=blue\u0026logo=Docker\u0026label=Docker+Image\"\u003e\u003c/a\u003e\n    \u003cbr\u003e\n        \u003ca href=\"https://www.npmjs.com/package/torapi\"\u003e\u003cimg title=\"GitHub License\"src=\"https://img.shields.io/npm/v/torapi?logo=npm\u0026logoColor=red\"\u003e\u003c/a\u003e\n        \u003ca href=\"https://app.swaggerhub.com/apis-docs/Lifailon/TorAPI\"\u003e\u003cimg title=\"Swagger\"src=\"https://img.shields.io/swagger/valid/3.0?specUrl=https%3A%2F%2Fraw.githubusercontent.com%2FLifailon%2FTorAPI%2Fmain%2Fswagger%2Fswagger.yaml\u0026logo=Swagger\u0026label=Swagger\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003ch4 align=\"center\"\u003e\n    \u003ca href=\"README_EN.md\"\u003eEnglish\u003c/a\u003e | \u003cstrong\u003eРусский\u003c/strong\u003e\n\u003c/h4\u003e\n\nНеофициальный `API` (**backend**) для торрент трекеров RuTracker, Kinozal, RuTor и NoNameClub. Используется для быстрого и централизованного поиска раздач, получения торрент файлов, магнитных ссылок и подробной информации о раздаче по названию фильма, сериала или идентификатору раздачи.\n\nПроект вдохновлен ✨ [Torrent-Api-py](https://github.com/Ryuk-me/Torrent-Api-py) (ранее [Torrents-Api](https://github.com/Ryuk-me/Torrents-Api)) для русскоязычных торрент провайдеров.\n\nВы можете воспользоваться публичной и бесплатной версией опубликованной в [Vercel](https://torapi.vercel.app/api/provider/list), или развернуть его самостоятельно на любом облачной бессерверной платформе (`serverless`), а также локально с помощью [Docker](https://hub.docker.com/r/lifailon/torapi) или менеджера пакетов [NPM](https://www.npmjs.com/package/torapi).\n\nСпецификация **OpenAPI** доступна на официальном сайте [Swagger Hub](https://app.swaggerhub.com/apis-docs/Lifailon/TorAPI).\n\nВыпущено под лицензией [MIT](https://github.com/Lifailon/TorAPI/blob/rsa/LICENSE).\n\n- [💁 Для чего](#-для-чего)\n- [🎉 Реализовано](#-реализовано)\n- [📋 Список доступных провайдеров](#-список-доступных-провайдеров)\n- [⚡ Frontend](#-frontend)\n  - [Google Chrome Extension](#google-chrome-extension)\n  - [Wox Plugin](#wox-plugin)\n- [🚀 Deploy](#-deploy)\n- [🐳 Docker](#-docker)\n  - [Docker Hub](#docker-hub)\n  - [Docker Compose](#docker-compose)\n  - [Dockerfile](#dockerfile)\n- [📦 NPM](#-npm)\n- [🔨 Build](#-build)\n- [📚 Swagger](#-swagger)\n- [🧪 Postman](#-postman)\n- [👨‍🔬 Jenkins](#-jenkins)\n- [🎊 Другие проекты](#-другие-проекты)\n\n## 💁 Для чего\n\nПри использовании публичной версии не нужно использовать `VPN` сервисы, так как данный сервер выступает в роле шлюза, что позволяет интегрировать `API` в любой проект без сетевых ограничений, а также использовать новостную `RSS` ленту на мобильных устройствах, например, через [ReadYou](https://github.com/Ashinch/ReadYou) или [Feeder](https://github.com/spacecowboy/Feeder). Для работы API не требуется токен доступа и авторизация в трекерах.\n\n## 🎉 Реализовано\n\n- [X] Поиск по названию для получения актуальных или всех доступных раздач (со всех доступных страниц) из указанного провайдера (торрент-трекера) или со всех трекеров одновнеременно. Каждая раздача содержит уникальный идентификатор (используется для поиска по `id`), категорию (используется для фильтрации по категории), краткая информация и ссылка на скачивание торрент-файла.\n- [X] Получение списка категорий для всех провайдеров и фильтрация поиска по категории.\n- [X] Поиск по уникальному идентификатору раздачи указанного провайдера для получения дополнительной информации: магнитная ссылка и хэш сумма для прямой загрузки через любой торрент клиент, ссылки на базы даных о кинематографе (Кинопоиск и IMDb), ссылки на постеры, подробное описание и содержимое раздачи (список файлов и их размер).\n- [X] Получение новостных `RSS` лент для всех используемых провайдеров с поддержкой фильтрации в форматах `XML`, а также `JSON`.\n\n## 📋 Список доступных провайдеров\n\n| Имя провайдера                      | Зеркала | Регистрация  |  Фильтрация для поиска и RSS   | Поиск по ID  | RSS      |\n| -                                   | -       | -            |  -                             | -            | -        |\n| [RuTracker](https://rutracker.org)  | 3       | Yes*         |  Категория                     | Yes          | Native   |\n| [Kinozal](https://kinozal.tv)       | 3       | Yes*         |  Категория, год выхода, формат | Yes          | *Custom* |\n| [RuTor](https://rutor.info)         | 2       | No           |  Категория                     | Yes          | *Custom* |\n| [NoNameClub](https://nnmclub.to)    | 1       | No           |  Категория                     | Yes          | Native   |\n\n**\\*** Регистрация требуется только при скачивании торрент-файла по прямой ссылке. Все раздачи при поиске по **id** (идентификатору) содержат **хэш сумму** и **магнитные ссылки** (уже включают в себя актуальный список серверов торрент-трекеров), которые позволяют сразу начать загрузку содержимого раздачи или сгенерировать торрент-файл после загрузки метаданных с помощью любого торрент-клиента, например, [qBittorrent](https://github.com/qbittorrent/qBittorrent) (поддерживает RSS и поисковые плагины), [Transmission](https://github.com/transmission/transmission) или [Webtorrent Desktop](https://github.com/webtorrent/webtorrent-desktop).\n\nДоступ к новостным **RSS** лентам для *RuTracker* и *NoNameClub* осуществляется путем перенаправления оригинального канала. Для провайдеров *Kinozal* и *RuTor* реализована кастомная лента новостей с главной страницы, которые поддерживают фильтрацию по категориям.\n\n## ⚡ Frontend\n\n### Google Chrome Extension\n\nПользовательский интерфейс для браузера и мобильных устройств в стиле [Jackett](https://github.com/Jackett/Jackett) через расширение 🍿 [Libre Kinopoisk](https://github.com/Lifailon/LibreKinopoisk) для одновременного поиска раздач во всех доступных торрент-трекерах и загрузки контента.\n\n### Wox Plugin\n\nПлагин [Torrent Search](https://github.com/Lifailon/Wox.Plugins) для быстрого поиска раздач во всех доступных торрент-трекерах через интерфейс [Wox](https://github.com/Wox-launcher/Wox), которое доступно для установки из [репозитория плагинов](http://www.wox.one/plugin/431).\n\n## 🚀 Deploy\n\nВы можете развернуть свой публичный сервер на платформе Vercel из исходного кода репозитория. Для этого нажмите кнопку ниже и следуйте инструкциям:\n\n[![Vercel](https://img.shields.io/badge/Deploy-%23000000.svg?style=for-the-badge\u0026logo=vercel\u0026logoColor=white)](https://vercel.com/new/torapi/clone?repository-url=https://github.com/lifailon/TorAPI)\n\n## 🐳 Docker\n\nПроект использует [GitHub Actions](https://github.com/Lifailon/TorAPI/actions) для сборки контейнера Docker и автоматического тестирования функциональности всех конечных точек.\n\n### Docker Hub\n\nЗагрузите образ из [Docker Hub](https://hub.docker.com/repository/docker/lifailon/torapi/general) и запустите контейнер:\n\n```shell\ndocker run -d --name TorAPI -p 8443:8443 --restart=unless-stopped lifailon/torapi:latest\n```\n\nЧто бы использовать Proxy сервер, воспользуйтесь следующими параметрами при запуске контейнера:\n\n```shell\ndocker run -d --name TorAPI -p 8443:8443 --restart=unless-stopped \\\n  -e PROXY_ADDRESS=\"192.168.3.100\" \\\n  -e PROXY_PORT=\"9090\" \\\n  -e USERNAME=\"TorAPI\" \\\n  -e PASSWORD=\"TorAPI\" \\\n  lifailon/torapi:latest\n```\n\nЗамените содержимое переменных для подключения к прокси-серверу на свои. Если авторизация не используется, просто не указывайте эти параметры при запуске контейнера.\n\n### Docker Compose\n\nВозможно загрузить и использовать файл [docker-compose](docker-compose.yml) для сборки контейнера из **Docker Hub**:\n\n```shell\ncurl -sO https://raw.githubusercontent.com/Lifailon/TorAPI/main/docker-compose.yml\ncurl -sO https://raw.githubusercontent.com/Lifailon/TorAPI/main/.env.yml\n```\n\nОтредактируйте переменные окружения в файле [env](.env) (если необходимо использовать прокси сервер) и запустите контейнер:\n\n```shell\ndocker-compose up -d\n```\n\n### Dockerfile\n\nВы можете создать образ самостоятельно из исходных файлов проекта, используя [dockerfile](dockerfile).\n\nКлонируйте репозиторий:\n\n```shell\ngit clone https://github.com/Lifailon/TorAPI\ncd TorAPI\n```\n\nСоберите образ и запустите контейнер:\n\n```shell\ndocker build -t torapi .\ndocker run -d --name TorAPI -p 8443:8443 --restart=unless-stopped torapi\n```\n\n## 📦 NPM\n\nДля установки проекта и всех зависимостей, вы можете использовать менеджер пакетов [npm](https://www.npmjs.com/package/torapi):\n\n```shell\nnpm install -g torapi\n```\n\n## 🔨 Build\n\nДля сборки проекта из исходного кода, клонируйте репозиторий, установите зависимости и запустите сервер:\n\n```shell\ngit clone https://github.com/Lifailon/TorAPI\ncd TorAPI\nnpm install\nnpm start\n```\n\nПо умолчанию сервер будет запущен на порту `8443`.\n\nВы можете указать другой порт:\n\n```js\nnpm start -- --port 2024\n```\n\nДля разработки используется запуск в режиме [nodemon](https://github.com/remy/nodemon) (перезапускает сервер при изменение содержимого файлов):\n\n```\nnpm run dev\n```\n\nИспользование прокси сервера для всех запросов:\n\n```js\nnpm start -- --port 2024 --proxyAddress 192.168.3.100 --proxyPort 9090\n```\n\nАвторизация на прокси сервере:\n\n```js\nnpm start -- --port 2024 --proxyAddress 192.168.3.100 --proxyPort 9090 --username TorAPI --password TorAPI\n```\n\n## 📚 Swagger\n\nДокументация доступна через **Swagger UI** по адресу `http://localhost:8443/docs` с использованием модуля [swagger-ui-express](https://github.com/scottie1984/swagger-ui-express). Описание документации производится через библиотеку [swagger-jsdoc](https://github.com/Surnet/swagger-jsdoc).\n\nЧтобы создать или обновить файлы документации Swagger в формате `JSON` и `YAML`, используйте команду:\n\n```shell\nnpm run docs\n```\n\n## 🧪 Postman\n\nВы можете протестировать `API`, чтобы быстро проверить работоспособность всех конечных точек в консоли:\n\n```shell\nnpm start -- --test\n```\n\nВо время тестирования запускается локальный сервер, делается запрос к конечной точке `/api/provider/test`, логирует вывод в формате `JSON` и завершает свою работу.\n\nИзменение параметра заголовка в запросе:\n\n```shell\nnpm start -- --test --q \"The Rookie\"\n```\n\nТакже доступны параметризированные функциональные тесты через [GitHub Actions](/.github/workflows/ci-postman-tests.yml) с использованием [Postman](/test/postman.json) и [Newman](https://github.com/postmanlabs/newman) для формирования отчета в формате `junit` или `html`.\n\nЛокальный запуск тестов:\n\n```shell\nnpm install -g newman\n\nnewman run test/postman.json \\\n    --iteration-count 1 \\\n    --env-var \"baseUrl=http://localhost:8443\" \\\n    --env-var \"query=The Rookie\" \\\n    --env-var \"queryAllPage=test\" \\\n    --env-var \"categoryRuTracker=1605\" \\\n    --env-var \"categoryKinozal=20\" \\\n    --env-var \"categoryRuTor=10\" \\\n    --env-var \"categoryNoNameClub=1318\"\n\n┌─────────────────────────┬────────────────────┬───────────────────┐\n│                         │           executed │            failed │\n├─────────────────────────┼────────────────────┼───────────────────┤\n│              iterations │                  1 │                 0 │\n├─────────────────────────┼────────────────────┼───────────────────┤\n│                requests │                 45 │                 0 │\n├─────────────────────────┼────────────────────┼───────────────────┤\n│            test-scripts │                167 │                 0 │\n├─────────────────────────┼────────────────────┼───────────────────┤\n│      prerequest-scripts │                154 │                 0 │\n├─────────────────────────┼────────────────────┼───────────────────┤\n│              assertions │                169 │                 0 │\n├─────────────────────────┴────────────────────┴───────────────────┤\n│ total run duration: 32s                                          │\n├──────────────────────────────────────────────────────────────────┤\n│ total data received: 1.95MB (approx)                             │\n├──────────────────────────────────────────────────────────────────┤\n│ average response time: 663ms [min: 2ms, max: 6.1s, s.d.: 1216ms] │\n└──────────────────────────────────────────────────────────────────┘\n```\n\nИспользование [K6](https://github.com/grafana/k6) для нагрузочного тестирования:\n\n```shell\n$env:TOR_API_QUERY=\"The Rookie\"\nk6 run test/k6.js\n```\n\n## 👨‍🔬 Jenkins\n\nДля автоматизации процесса развертвывания, тестирования и управления (запуск, остановка и выгрузка логов) на удаленной машине в локальной среде используется [Jenkins Pipeline](jenkinsfile).\n\n---\n\n## 🎊 Другие проекты\n\n- 🔎 [LibreKinopoisk](https://github.com/Lifailon/LibreKinopoisk) - расширение Google Chrome, которое добавляет кнопки на сайт Кинопоиск и предоставляет интерфейс **TorAPI** в стиле [Jackett](https://github.com/Jackett/Jackett) (без необходимости устанавливать серверную часть и использовать VPN) для быстрого поиска фильмов и сериалов в открытых источниках.\n\n- 🧲 [Kinozal Bot](https://github.com/Lifailon/Kinozal-Bot) - Telegram бот, который позволяет автоматизировать процесс доставки контента до вашего телевизора, используя только телефон. Предоставляет удобный интерфейс для взаимодействия с торрент трекером [Кинозал](https://kinozal.tv) и базой данных [TMDB](https://www.themoviedb.org) для отслеживания даты выхода серий, сезонов и поиска актеров для каждой серии, а также возможность управлять торрент клиентом [qBittorrent](https://github.com/qbittorrent/qBittorrent) или [Transmission](https://github.com/transmission/transmission) на вашем компьютере, находясь удаленно от дома и из единого интерфейса.\n\n- 📡 [Froxy](https://github.com/Lifailon/froxy/blob/main/README_RU.md) - классический и обратный прокси сервер на базе `.NET` для запуска в режиме командной строки и контейнера [Docker](https://hub.docker.com/r/lifailon/froxy). Поддерживает проксирование `HTTPS` трафика (`CONNECT` запросы) и протокол `SOCKS5` для туннелирования `TCP` трафика, а также `TCP`, `UDP` и `HTTP/HTTPS` протоколы для обратоного проксирования (поддерживается обработка `GET` и `POST` запросов с передачей заголовков и тела запроса для работы с `API` и передачи `cookie`).\n\n- ❤️ [WebTorrent Desktop api](https://github.com/Lifailon/webtorrent-desktop-api) - форк клиента [WebTorrent Desktop](https://github.com/webtorrent/webtorrent-desktop), в котором добавлен механизм удаленного управления через `REST API` на базе [Express Framework](https://github.com/expressjs/express).","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flifailon%2Ftorapi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flifailon%2Ftorapi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flifailon%2Ftorapi/lists"}