Канонизация. Один ролик теперь даёт одну запись: youtu.be/X, youtube.com/watch?v=X и та же ссылка с тайм-кодом или списком воспроизведения раньше считались тремя разными роликами, и счётчик популярности размазывался. Заодно закрыта приватная проблема: из адреса вырезаются метки перехода и всё похожее на секреты (token, api_key, signature и прочее) — лента публичная, и публиковать чужой токен нельзя. Уже накопленные записи приводятся к новому виду при старте, счётчики схлопнувшихся строк складываются. /readyz. Прежний /healthz отвечал «жив» даже при полном диске, мёртвом уборщике, неработающей БД и отсутствующем ffmpeg. Новый эндпоинт проверяет всё это плюс глубину очереди и возраст последнего прохода уборщика, и при деградации отдаёт 503 — чтобы поломка была видна мониторингу, а не только пользователям. Тесты. 187 проверок, сеть не используется. Покрыты: селекторы форматов (дословные эталоны плюс компиляция всех сочетаний самим yt-dlp), валидация ссылок и SSRF, path traversal и символические ссылки, имена файлов с кириллицей, отсев форматов с неизвестными кодеками, счётчики и лента, HTTP-слой. В conftest пути принудительно уводятся во временный каталог: импорт app создаёт менеджер, который подметает каталог загрузок, и без этой предосторожности прогон тестов удалял файлы работающего сервиса — так уже случалось. Тесты сразу нашли две несогласованности, обе исправлены: * отмена несуществующей задачи отвечала 409, хотя соседние ручки на ту же задачу отвечают 404; * метки времени в ленте писались с точностью до секунды, поэтому порядок «недавних» среди записей одной секунды был произвольным. Также объединены карты сообщений об ошибках: они дублировались в двух ручках и успели разойтись — на одну и ту же ссылку /api/info отвечал «Этот адрес недоступен», а /api/downloads глотал код и говорил «Плохая ссылка». Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AwY2Cg54RK7WZdvMaLV5Di
8 lines
85 B
Text
8 lines
85 B
Text
.venv/
|
|
downloads/*
|
|
!downloads/.gitkeep
|
|
__pycache__/
|
|
*.pyc
|
|
*.log
|
|
data/
|
|
.pytest_cache/
|