Watchlist — фикс переполнения диска и фильтра ужасов
Статус: ✅ ВЫПОЛНЕНО 2026-09-21. Диск был 100% → 77% (404 ГБ). Все дефекты
починены и закоммичены (2642882, a131208). Крон возвращён с --batch 2.
Что произошло
2026-09-21 диск /dev/sda1 на Kraken заполнился на 100% (0 байт свободно).
Radarr отдавал disk I/O error — SQLite не мог писать. Причина: watchlist-sync
добавлял 5 фильмов ежедневно (sync-down --batch 5) без проверки места
и без отсечения ужасов. За сутки 18 → 28 фильмов, remux'ы по 57–93 ГБ.
Три корневых дефекта
#
Дефект
Где
Следствие
1
Нет проверки свободного места
sync_down.py
качал до полного заполнения
2
mark_queued молча проваливался
parser.py:77
часть фильмов без ⬇️
3
Нет фильтра по ужасам
sync_down.py:54
Midsommar и др. скачались
Дополнительно найдены и починены (смежные)
#
Дефект
Где
Следствие
4
_EMOJI_PREFIX брал только первый эмодзи из нескольких
Папки НЕ удалены (там .nfo, постеры). Диск: 100% → 77%.
Фаза 1 — стоп-кран по месту ✅
sync_down.py: MIN_FREE_GB = 100.0. Проверка через shutil.disk_usage,
НЕ df (df учитывает root-резерв ext4 и врёт на ~4%).
Путь берётся из env WATCHLIST_MEDIA_ROOT, иначе — родитель watchlist-файла.
Фаза 2 — фильтр ужасов + приоритет ⭐✅
sync_down.py:95 — перед добавлением проверяется candidate.is_horror():
Условие
Действие
есть ⭐ (U+2B50)
качаем всегда — обходит и рейтинг, и ужасы
ужас без ⭐
пропускаем
рейтинг < 6.0 без ⭐
пропускаем
⚠️⭐ (U+2B50) ≠ ✭ (U+272D) — последний декоративный, срезается _clean().
В dry-run: 33 horror item(s) skipped.
Фаза 3 — надёжные метки ✅
mark_queued → возвращает bool, поглощает эмодзи-префикс, ставит метку перед ним
новая unmark_queued — снятие метки (её не существовало)
_mark() в sync_down логирует [!] could not write ⬇️ marker при промахе
_clean чистит множественные эмодзи и одиночный год
cleanup не видит /media/movies — удаляет только Radarr-файлы, а просмотренное
у пользователя лежит в /media/movies (ручные торренты). Пересечение пусто,
поэтому cleanup пишет «nothing to delete» каждый день. Не исправлено — отдельная задача.
41 фильм с🧟♀️ перестанет качаться. Многие — свежие релизы 2025–2026.
Решение Alex: ожидаемое поведение; для исключения ставить ⭐.
Уроки
Скрипт, который качает данные, обязан иметь проверку свободного места — иначе
он гарантированно заполнит диск.
Функция-мутатор файла, которая «молча ничего не делает» при промахе regex —
источник тихой потери данных. Возвращать bool и логировать провал.
Regex на эмодзи-префиксы: ^[chars]+\s* берёт только первый эмодзи.
Нужно ^(?:[chars]+\s*)+ для повторяющихся групп.
Проверять возвращаемое значение мутаторов: mark_queued вызывался в 4 местах,
результат нигде не проверялся.