|
Функция |
Описание |
| Поиск |
Умный поиск |
Автоматически определяет фильм или сериал по запросу |
|
Русские субтитры |
Приоритизация релизов с RusSub, MVO, DVO, AVO |
|
Качество в деталях |
Разрешение, кодек, HDR, аудио, субтитры — всё видно |
| Скачивание |
One-click grab |
Скачивание релиза одной кнопкой |
|
qBittorrent fallback |
Автообход профильных ограничений Radarr/Sonarr |
|
Push release |
Отправка релизов напрямую в *arr |
| Трендинг |
Популярные фильмы |
Топ недели из TMDb с постерами |
|
Популярные сериалы |
Трендовые сериалы с детальной информацией |
| Мониторинг |
Календарь релизов |
Расписание выходов с индикатором дней |
|
Уведомления |
Оповещения о завершении скачивания |
|
Статус сервисов |
Проверка доступности Prowlarr/Radarr/Sonarr |
| Emby |
Библиотека |
Просмотр последних добавлений в Emby |
|
Сканирование |
Запуск сканирования библиотек |
| Управление |
Настройки |
Профили качества, папки, разрешение — на пользователя |
|
История |
Лог всех действий с фильтрами |
|
Доступ |
Whitelist по Telegram ID + роли админов |
TG_arr
├── bot/
│ ├── main.py # Точка входа
│ ├── config.py # Pydantic Settings из ENV
│ ├── db.py # SQLite (aiosqlite)
│ ├── models.py # Датаклассы и Pydantic-модели
│ ├── clients/
│ │ ├── base.py # HTTP-клиент (httpx + tenacity)
│ │ ├── prowlarr.py # Prowlarr API + парсинг качества
│ │ ├── radarr.py # Radarr API v3
│ │ ├── sonarr.py # Sonarr API v3
│ │ ├── qbittorrent.py # qBittorrent Web API
│ │ ├── emby.py # Emby API
│ │ ├── tmdb.py # TMDb API (трендинг)
│ │ └── registry.py # Фабрика клиентов (singleton)
│ ├── services/
│ │ ├── search_service.py # Оркестрация поиска
│ │ ├── add_service.py # Добавление + grab + fallback
│ │ ├── scoring.py # Скоринг релизов
│ │ └── notification_service.py # Уведомления
│ ├── handlers/
│ │ ├── start.py # /start, /help, /cancel
│ │ ├── search.py # Поиск и граб
│ │ ├── trending.py # Популярное (TMDb)
│ │ ├── calendar.py # Календарь релизов
│ │ ├── downloads.py # Активные загрузки
│ │ ├── emby.py # Emby-интеграция
│ │ ├── settings.py # Настройки пользователя
│ │ ├── status.py # Здоровье сервисов
│ │ └── history.py # История действий
│ ├── ui/
│ │ ├── keyboards.py # Inline-клавиатуры
│ │ └── formatters.py # HTML-форматирование
│ └── middleware/
│ └── auth.py # Авторизация (whitelist)
├── tests/ # pytest + pytest-asyncio
├── Dockerfile # Python 3.12-slim, non-root
├── docker-compose.yml # Portainer-ready
└── .env.example # Все переменные с описанием
- Docker и Docker Compose (или Portainer)
- Работающие Prowlarr, Radarr, Sonarr
- Telegram-бот от @BotFather
- Ваш Telegram ID (узнать: @userinfobot)
git clone https://github.com/Jkaotlic/TG_arr.git
cd TG_arr
cp .env.example .env
nano .env # Заполнить обязательные переменные
Обязательные переменные
| Переменная |
Описание |
TELEGRAM_BOT_TOKEN |
Токен бота из @BotFather |
ALLOWED_TG_IDS |
Telegram ID пользователей (через запятую) |
PROWLARR_URL |
URL Prowlarr (например http://prowlarr:9696) |
PROWLARR_API_KEY |
API-ключ Prowlarr |
RADARR_URL |
URL Radarr (например http://radarr:7878) |
RADARR_API_KEY |
API-ключ Radarr |
SONARR_URL |
URL Sonarr (например http://sonarr:8989) |
SONARR_API_KEY |
API-ключ Sonarr |
Опциональные переменные
| Переменная |
По умолчанию |
Описание |
ADMIN_TG_IDS |
— |
ID админов (через запятую) |
QBITTORRENT_URL |
— |
URL qBittorrent Web UI |
QBITTORRENT_USERNAME |
admin |
Логин qBittorrent |
QBITTORRENT_PASSWORD |
— |
Пароль qBittorrent |
EMBY_URL |
— |
URL Emby Server |
EMBY_API_KEY |
— |
API-ключ Emby |
TMDB_API_KEY |
— |
API-ключ TMDb (для трендинга) |
TMDB_LANGUAGE |
ru-RU |
Язык TMDb-ответов |
TIMEZONE |
Europe/Moscow |
Часовой пояс |
LOG_LEVEL |
INFO |
Уровень логирования |
AUTO_GRAB_SCORE_THRESHOLD |
80 |
Порог автозахвата |
NOTIFY_DOWNLOAD_COMPLETE |
true |
Уведомлять о скачивании |
NOTIFY_CHECK_INTERVAL |
60 |
Интервал проверки (сек) |
RESULTS_PER_PAGE |
5 |
Результатов на страницу |
Проверка логов:
docker compose logs -f tg-arr-bot
В Portainer создайте Stack, вставьте содержимое docker-compose.yml и добавьте переменные окружения в секции Environment variables (не нужно загружать .env файл). Нажмите Deploy the stack.
| Команда |
Описание |
/start |
Приветствие и главное меню |
/help |
Список команд и справка |
/search <запрос> |
Умный поиск (автоопределение) |
/movie <запрос> |
Поиск фильмов |
/series <запрос> |
Поиск сериалов |
/settings |
Настройки профиля |
/status |
Статус Prowlarr/Radarr/Sonarr |
/history |
История действий |
/downloads (/dl) |
Показать список активных загрузок qBittorrent |
/qstatus |
Статус qBittorrent (скорость, активные загрузки) |
/pause <hash> |
Поставить торрент на паузу |
/resume <hash> |
Возобновить торрент |
/cancel |
Отмена текущей операции |
Также можно просто отправить текстовое сообщение как поисковый запрос.
Dune 2021 # Фильм с годом
Breaking Bad S02 # Сериал, 2-й сезон
The Office 1080p # С предпочтением качества
Andor S01E05 # Конкретный эпизод
Каждый релиз оценивается по множеству факторов. Базовый балл — 50.
| Категория |
Фактор |
Баллы |
| Разрешение |
2160p / 1080p / 720p |
+25 / +20 / +10 |
| Источник |
REMUX / BluRay / WEB-DL / WEBRip |
+30 / +20 / +15 / +10 |
| Кодек |
AV1 / x265 (HEVC) / x264 |
+15 / +10 / +5 |
| HDR |
Dolby Vision / HDR10+ / HDR10 |
+15 / +12 / +10 |
| Аудио |
Atmos / TrueHD / DTS-HD / DTS |
+10 / +8 / +7 / +5 |
| Субтитры |
RusSub / MVO / DVO / AVO |
+15 |
| Сиды |
За каждые 10 сидов (макс. +20) |
+2 |
| Качество |
REPACK / PROPER |
+5 |
| Фактор |
Баллы |
| CAM / TS / TC |
-50 / -40 / -30 |
sample / trailer в названии |
-200 |
| Слишком маленький файл |
-20 |
| Слишком большой файл |
-10 |
# Виртуальное окружение
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# Установка зависимостей
pip install -r requirements.txt
# Конфигурация
cp .env.example .env
# Запуск
python -m bot.main
# Тесты
pytest -x -q
# Тесты с покрытием
pytest --cov=bot --cov-report=html
- Доступ только для пользователей из
ALLOWED_TG_IDS
- API-ключи никогда не попадают в сообщения
- Non-root пользователь в Docker-контейнере
- Health check для мониторинга состояния
- SQLite хранит только метаданные и настройки
Бот не отвечает
- Проверьте
ALLOWED_TG_IDS — ваш Telegram ID должен быть в списке
- Проверьте токен бота
- Смотрите логи:
docker compose logs tg-arr-bot
Не подключается к Prowlarr/Radarr/Sonarr
- Убедитесь что сервисы запущены
- Проверьте URL-адреса из контейнера бота
- Проверьте API-ключи
- Используйте команду
/status для диагностики
Не находит релизы
- Проверьте индексеры в Prowlarr
- Попробуйте более точный запрос
- Проверьте поиск через UI Prowlarr
Ошибка добавления фильма/сериала
- Проверьте наличие профилей качества в Radarr/Sonarr
- Проверьте настройку root folders
- Смотрите логи Radarr/Sonarr
| Компонент |
Технология |
| Язык |
Python 3.12 |
| Telegram |
aiogram 3.26.0 |
| HTTP |
httpx + tenacity (retry) |
| Конфигурация |
pydantic-settings v2 |
| БД |
SQLite (aiosqlite) |
| Логирование |
structlog |
| Сериализация |
orjson |
| Контейнеризация |
Docker (python:3.12-slim) |
| Тесты |
pytest + pytest-asyncio |
Проект распространяется под лицензией MIT.