Commit graph

42 commits

Author SHA1 Message Date
vrubelroman
c9972f3d68 fix(cookies): не давать yt-dlp затирать мастер-файл кук, честнее алерты
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 52s
Реальный инцидент: cookies "протухли" за пару дней вместо ~года. Причина —
не срок годности, а сам yt-dlp: --cookies FILE читает И дописывает cookie
jar обратно в файл после каждого запуска (--help: "read cookies from and
dump cookie jar in"), а когда Instagram-экстрактор решает, что сессия
невалидна, он явно чистит sessionid из jar'а — и это тут же сохраняется на
диск через YoutubeDL.close(). Наш собственный health-check (каждые 30 мин)
и обычные скачивания медленно, но верно стирали себе рабочие cookies.

Фикс: yt-dlp больше никогда не видит мастер-файл, только одноразовую копию
в фиксированном /tmp-пути (безопасно — оба сервиса --workers=1, гонок нет).
Проверено: md5sum/mtime мастер-файлов не меняются ни после серии
/cookies/check, ни после реального /download/stream.

Заодно в bot.py: notify_admin_cookie_alert больше не заявляет "это НЕ
cookies" для extraction_failed — на практике это оказалось не всегда
верно (анонимный rate-limit тоже "не cookies" по факту, но валидная
сессия могла бы его обойти). В алерты добавлена проверяемая ссылка
(test_url из /cookies/check), чтобы сразу было видно, что это health-check
дёргает тестовый ролик, а не реальная ссылка пользователя. Новый статус
cookies_incomplete детектирует "файл есть, но sessionid нет" ещё до
сетевых проверок — ловит именно тот случай, что привёл к инциденту.

Отдельно: пользователю теперь показывается понятное сообщение, когда
Instagram сам блокирует контент как возрастной/чувствительный
("can't be seen by certain audiences") — вместо общего "Something went
wrong", раз повторная попытка всё равно не поможет. Админ по-прежнему
получает полный технический текст без изменений.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 15:18:13 +00:00
vrubelroman
8fa53f7cfc fix(instagram): смягчить /cookies/check, честное сообщение для гейтованного контента
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 1m0s
/cookies/check раньше тестировал только путь с cookies и при неудаче писал
cookies_invalid — даже когда реальное скачивание прекрасно работает через
app-level fallback без cookies. Теперь проверка повторяет этот же
эффективный путь: cookies path сломан известным багом yt-dlp (media/info
всегда 404 вместо редиректа на логин), но раз fallback его закрывает —
это не авария и не повод слать ложный алерт "куки протухли", который
обновление cookies всё равно не лечит. Если не работает и анонимный путь
(который cookies не использует) — это extraction_failed, а не cookies_invalid.

Отдельно: когда Instagram сам отказывает показывать контент анонимным/
несовместимым аккаунтам ("can't be seen by certain audiences") — это
легитимный отказ, а не наша поломка, и повторная попытка не поможет.
Пользователь теперь видит это прямо, а не общее "Something went wrong".
Админ по-прежнему получает полный технический текст без изменений.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-26 10:47:41 +00:00
vrubelroman
d597a5e1c5 fix(downloaders): Deno runtime, свежий yt-dlp, честный health-check, смоук-тест
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 2m36s
Возрастные YouTube-видео не скачивались: с cookies yt-dlp отбрасывает клиент
android и остаётся web, которому нужно решить n-challenge, а в образе стоял
Node 20 при требуемом минимуме 22 ("JS runtimes: node-20.19.2 (unsupported)").
Ставим Deno — рекомендованный yt-dlp рантайм и один статический бинарник.

Instagram падал с "empty media response" одинаково с cookies и без них —
дело было не в сессии, а в устаревшем экстракторе: слой pip был закеширован
на yt-dlp 2026.06.09. Поднимаем нижнюю границу до 2026.7.4.

/cookies/check помечал проблемой с cookies ЛЮБОЙ сбой, из-за чего на поломку
JS-рантайма прилетел алерт про протухшие cookies и увёл разбор не туда.
Теперь ответ содержит status: ok | cookies_invalid | extraction_failed |
no_cookies, и админ-бот шлёт разные сообщения. Разбор ответа в bot.py
сохраняет совместимость со старым форматом без поля status.

Добавлен smoke_test.py — гоняет реальные ссылки (включая обе регрессии выше)
через запущенные сервисы и печатает таблицу. Запускать после каждой правки.

Схема получения cookies переведена с крона на разовый ручной экспорт:
cookies-cron/ -> cookies/, удалены скрипты с анти-паттерном
`--cookies-from-browser BROWSER --cookies FILE`, который wiki yt-dlp прямо
запрещает и который сам ломал YouTube-сессию ротацией. Ключевые cookies живут
около года, поэтому обновление по расписанию не нужно — триггером служит алерт
health-check. deliver_cookies.sh только доставляет файлы по scp.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-26 00:31:16 +00:00
vrubelroman
5092d882e5 feat(bot): proactive cookie health-check + simpler user-facing errors
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 51s
Add /cookies/check to youtube-downloader and instagram-downloader,
polled every 30 min from bot.py; alerts the admin bot on
healthy->broken transitions (with a 24h re-reminder cap while still
broken) and on recovery. Also stop leaking raw exception text to end
users - they now see a plain, friendly English message while the
admin bot still gets full technical detail via notify_admin_error.
2026-07-25 22:30:49 +00:00
vrubelroman
be1acaaf2b feat(bot): forward download errors to admin bot
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 51s
Notify admin (URL + error text + user info) on any download failure
across all sources, and on the file-too-large case, mirroring the
existing successful-download notification.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-21 18:16:42 +00:00
vrubelroman
d5201df802 fix(stats): count link_count per Telegram user, not per chat
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 2m11s
chat_id is shared by every member of a group chat, so all group
messages incremented one shared row and username kept getting
overwritten by whoever sent last. Track link counts in a new
user_links table keyed by the real from_user.id instead.
2026-07-03 14:29:35 +00:00
vrubelroman
d9ff2aec57 feat(admin_bot): show link-senders count and top-5 active users in /stat
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 1m43s
Adds users.link_count, incremented in bot.py whenever a user submits
a recognized link (regardless of eventual download success), and
surfaces it in admin_bot's /stat as a count of users who ever sent a
link plus a top-5 leaderboard by link count.
2026-06-30 22:28:53 +00:00
vrubelroman
ac2bd8f644 fix(bot): retry admin video upload on transient httpx transport errors
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 1m44s
send_video_to_admin_bot() had no retry, unlike the client-facing
reply_video() path fixed earlier — a transient httpx.ReadError during
upload silently dropped the admin copy while the user still got their
video, since this function swallows its own exceptions.
2026-06-30 20:31:37 +00:00
vrubelroman
67dba21ff9 fix(youtube): correct extractor-args separator, soften worker recycling, retry video upload
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 1m53s
EXTRACTOR_ARGS used ':' instead of ';' between player_client and skip
fields, so yt-dlp parsed "android:skip=translated_subs" and "hls" as
bogus player_client values and silently fell back to the web client
only, which fails the n-challenge and returns no formats.

--max-requests=1 fully restarted the gunicorn worker after every
single request, opening a race window that could drop the response
connection right after a successful download; raised to 20 with
jitter to keep the periodic-recycle safety net without doing it on
every request.

reply_video() to Telegram had no retry, so a transient httpx
transport error during upload discarded an already-downloaded video;
added the same 3-attempt retry pattern already used for the
downloader services.
2026-06-30 20:24:46 +00:00
vrubelroman
ce6505c9bb chore: remove youtube quality selection ui 2026-06-04 21:32:13 +00:00
vrubelroman
a9d1ffc864 fix: prevent VK downloader from blocking queue 2026-05-25 16:46:35 +00:00
vrubelroman
5d3cd92a03 fix: add vk.ru domain support for VK videos 2026-05-09 16:58:12 +03:00
vrubelroman
60a0373d7f fix: remove client-side format cache, prefer first audio track over largest 2026-05-03 17:43:24 +03:00
vrubelroman
e2ead9db52 tweak: simplify auto-download text 2026-05-03 03:27:21 +03:00
vrubelroman
59b1c54668 fix: allow_unplayable_formats removed, reply_video, auto-select 480p, remove file sizes 2026-05-03 02:39:27 +03:00
vrubelroman
839cd57f6f fix: audio-only format, m4a/mp3 support, source URL in caption 2026-05-03 01:56:31 +03:00
vrubelroman
053f6c8afc fix: correct quality selection -- specific format_id first, exclude av01, validate video stream 2026-05-03 01:36:04 +03:00
vrubel
326eabaa99 Fix YouTube 500 error (n-challenge) and Telegram callback_data overflow 2026-04-30 17:21:10 +03:00
vrubelroman
4629535e97 fix: отправка видео как документ (без сжатия Telegram) и исправление format_id для точного выбора качества
- Замена reply_video() на reply_document() в bot.py — Telegram больше не сжимает видео
- Исправление format_id в get_youtube_formats(): конкретные format codes + fallback best[height<=N]
- Замена bestvideo[height<=N]+bestaudio на best[height<=N] — гарантированно работает когда
  YouTube не отдаёт отдельные video-only потоки для низких разрешений
- Добавлено логирование реально скачанного формата для диагностики
2026-04-30 01:36:43 +03:00
vrubelroman
4b7cc403b2 Implement file deletion after successful video sending in bot.py and update YouTube cookies for improved session management. 2026-01-10 22:26:18 +00:00
vrubelroman
551b64777a Update admin bot token, refine VK and Yapfiles URL handling, enhance Docker configuration for Instagram downloader, and improve YouTube downloader's cookie validation and error messaging. 2026-01-10 21:40:07 +00:00
vrubel
a918f93dfa Implement file deletion after successful video sending and update Instagram cookies 2025-12-25 00:35:48 +03:00
vrubel
9a64e1e6b8 вк япфайлс расширил домены 2025-12-25 00:09:47 +03:00
vrubel
2d248b9ce0 add admin bot 2025-12-20 22:17:20 +03:00
vrubel
8a20b91c54 stats errors 2025-12-20 05:22:55 +03:00
vrubelroman
c8feb4b78b убраны упоминания команд 2025-12-12 17:05:28 +03:00
vrubelroman
a9cea44bf6 убрал @rvrubel 2025-12-12 17:00:31 +03:00
vrubelroman
0ba861898d Updated error messages for file size limitations in both Russian and English to clarify maximum allowed size for video uploads. 2025-12-12 16:27:29 +03:00
vrubelroman
e3b1dd0d1c Обновлены таймауты для отправки видео в Telegram, чтобы улучшить обработку больших файлов. Исправлены значения cookie для Instagram. 2025-12-12 15:58:19 +03:00
vrubelroman
76ce3feecc Добавлена система очередей для обработки загрузки видео, улучшена обработка ошибок и добавлены новые текстовые сообщения для пользователей. Обновлены таймауты HTTP-запросов для поддержки больших файлов. Обновлены конфигурации Docker для всех загрузчиков с использованием Gunicorn. 2025-12-12 15:41:46 +03:00
vrubelroman
da98462bbc Добавлен TikTok загрузчик: обновлены конфигурации, добавлены функции для скачивания видео с TikTok и обновлены текстовые сообщения для поддержки нового источника. 2025-12-12 12:36:23 +03:00
vrubelroman
77fd4b15a3 добавлена локализация и команда /support 2025-12-12 11:11:51 +03:00
vrubelroman
cb1458bd93 подключил япфайл 2025-12-12 10:32:06 +03:00
vrubelroman
436e0cd541 Рефакторинг: микросервисная архитектура
- Разделение на микросервисы: youtube-downloader, instagram-downloader, vk-downloader
- Основной бот в корне проекта, работает через HTTP API с сервисами
- Каждый сервис запускается отдельно в своей папке
- Видео сохраняются в папке video/ и не удаляются
- Обновлена документация и архитектура
- Скрипты для Instagram cookies перенесены в instagram-downloader/
2025-12-11 01:07:04 +03:00
vrubelroman
8024eea868 мультипоток. очистка файлов. дополнил описание /start про группы 2025-12-10 21:05:27 +03:00
vrubelroman
5acd8fd9db возможность работать в группах 2025-12-10 20:35:38 +03:00
vrubelroman
5d597d199f удаление ссылки пользователя после получения видео 2025-12-10 17:12:43 +03:00
vrubelroman
aa5c4cd1e6 Добавлено автоматическое обновление Instagram cookies и поддержание сессии
- Автоматическая проверка срока действия cookies каждые 24 часа
- Автоматическое обновление cookies за 3 дня до истечения из браузера
- Поддержание активности сессии через периодические запросы
- Поддержка Chrome, Firefox, Edge, Opera для обновления cookies
- Добавлена функция update_instagram_cookies_from_browser()
- Добавлена функция check_instagram_cookies_expiry()
- Фоновая задача keep_instagram_session_alive() для поддержания сессии
- Обновлена документация в README.md
- Добавлена переменная INSTAGRAM_AUTO_UPDATE_DAYS в .env.example
2025-12-10 17:02:01 +03:00
vrubelroman
d05fc6f522 вк вынесен в отдельный сервис 2025-12-10 16:14:26 +03:00
vrubelroman
39bf9d1933 прикрутили базу данных 2025-12-10 15:36:27 +03:00
vrubelroman
f0e7e93e17 счетчик пользователей и скачанных видео 2025-12-10 15:14:01 +03:00
vrubelroman
ae8c7aba93 инста и ютуб работают, вк пока нет 2025-12-10 14:46:09 +03:00