# ТЗ: Telegram-сервис “YouTube → MP3” + Admin bot (Docker Compose, Ubuntu 24.04, Python) ## 0. Цель Нужно реализовать сервис на Python, который состоит из **двух Telegram-ботов**: 1) **User-bot** — принимает от пользователя ссылку на YouTube-видео и возвращает аудио-дорожку в **MP3**. Имя файла должно быть **идентично названию видео на YouTube**. 2) **Admin-bot** — получает **все MP3**, которые были выданы пользователям user-bot, вместе с метаданными: - название файла (title) - Telegram username пользователя (кто запросил) - исходная ссылка на видео Сервис разворачивается в Docker через docker-compose на хосте **Ubuntu 24.04**. --- ## 1. Общие требования - Язык: **Python**. - Сервис работает в Docker. - Используется **docker compose** (актуальная версия). - В репозитории должен быть файл `.env.example`. Реальный `.env` хранится на сервере и находится в `.gitignore`. - При `isProd=true` используются **продовые** токены ботов, при `isProd=false` — **тестовые**. - В обоих режимах всегда запускаются **оба бота** (user + admin), меняются только токены. --- ## 2. Переменные окружения Файл `.env.example` должен содержать: - `IS_PROD=false` (строка `true/false`) Токены 4 ботов: - `TG_USER_BOT_TOKEN_PROD=...` - `TG_ADMIN_BOT_TOKEN_PROD=...` - `TG_USER_BOT_TOKEN_TEST=...` - `TG_ADMIN_BOT_TOKEN_TEST=...` Дополнительно (можно включить, если нужно для реализации): - `ADMIN_CHAT_ID=` (если admin-bot должен отправлять файлы в конкретный чат/пользователю; если не задан — отправлять **все админам admin-бота, которые ему написали /start** и тем самым зарегистрировались) - `WORKDIR=/data` (папка для временных файлов внутри контейнера) - `LOG_LEVEL=INFO` > Важно: логика выбора токенов: - если `IS_PROD=true` → берём `*_PROD` - иначе (`false`) → берём `*_TEST` --- ## 3. Docker / Compose требования ### 3.1 Контейнер В контейнере должны быть установлены: - `yt-dlp` - `ffmpeg` - **опционально** `nodejs` (т.к. YouTube иногда требует JS runtime; установка допускается) ### 3.2 Временное хранение файлов - Все промежуточные файлы (скачанное аудио/MP3) должны храниться во **временной папке**, смонтированной как **volume** на хост. - После успешной отправки MP3 **и пользователю, и в admin-bot** файл должен быть **удалён**. --- ## 4. Очередь и конкурентность - Все запросы на скачивание должны обрабатываться **строго последовательно** (FIFO очередь). - В один момент времени выполняется **только 1 активная загрузка/конвертация** (однопоточно, один worker). - Если несколько пользователей отправляют ссылки одновременно — они “встают в очередь”. - Пользователь должен получать сообщения о статусе: - “Принято в очередь, позиция: N” - “Начинаю обработку” - “Готово, отправляю файл” - “Ошибка: …” --- ## 5. Функционал user-bot ### 5.1 Вход Пользователь отправляет сообщение, содержащее ссылку на YouTube-видео. Поддерживаемые ссылки: - `https://www.youtube.com/...` - `https://youtu.be/...` (это короткий домен YouTube, его тоже нужно поддержать) Если ссылка не похожа на YouTube — отвечаем пользователю: “Пришли ссылку на YouTube-видео.” ### 5.2 Получение названия видео - Бот пытается получить `title` через `yt-dlp` метаданными. - Если **название получить не удалось** (пустое/ошибка/не распарсилось), включается интерактивный шаг: 1) Бот пишет: “Не смог определить название. Введи имя файла (без расширения .mp3).” 2) Бот ждёт ответ пользователя текстом. 3) Полученное имя используется как название выходного mp3. ### 5.3 Формирование корректного имени файла - Название файла должно быть безопасным для файловой системы: - запрещённые символы заменять на `_` - ограничить длину (например, до 150 символов) - итоговый файл: `