[2026-09-21] eagle: family/how-to/arr-stack-kraken.md family/plans/watchlist-cleanup.md family/projects/watchlist-automation.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-21 15:34:09 +06:00
1 parent 5fed6aef4a
commit 21505ec241
3 files changed
+87 -7

No files matched your search

+8
View File
@@ -284,6 +284,14 @@ curl -s -H "X-Api-Key: $PKEY" "http://localhost:9696/prowlarr/api/v1/search?quer
## Известные проблемы
- **✅ 2026-09-21 — ДИСК ЗАПОЛНИЛСЯ НА 100%, ПРИЧИНА УСТРАНЕНА.** `sync-down` добавлял
**5 фильмов ежедневно без проверки свободного места** → диск 0 байт, Radarr отдавал
`disk I/O error` (SQLite не мог писать). Освобождено вручную: удалены **5 remux = 403 ГБ**
(Babylon 93 / Schindler's List 90 / Midsommar 86 / Triangle of Sadness 80 / Unhinged 57 ГБ),
`monitored=false` выставлен всем 5 → диск **100% → 77%** (404 ГБ свободно).
В код добавлен `MIN_FREE_GB = 100`. Полный разбор — [[family/plans/watchlist-disk-overflow-fix]].
⚠️ **Профиль `WEB-4K (no remux)` НЕ защищает от переполнения** — он фильтрует тип релиза,
но не размер файла и не проверяет свободное место.
- **⚠️ 2026-09-20: compose-файл может ВРАТЬ про сеть.** Ранее в compose Radarr был указан `jellyfin_default`, а реально контейнер жил в `docker_default`; при починке выяснилось, что compose уже писал `media_net`, но контейнеры не были пересозданы. **Всегда проверять фактическое `docker inspect -f '{{range $k,$v := .NetworkSettings.Networks}}{{$k}} {{end}}' <container>`, а не docker-compose.yml.**
- **17 фильмов в Radarr `hasFile=False`** — ждут подходящего релиза в Prowlarr. Scream (1996) в процессе загрузки.
- **Prowlarr** — если долго не находит релизы, проверить статус индексеров (`/api/v1/health`). ⚠️ health врёт, реальную причину блокировки смотреть в `config/logs/prowlarr.debug.txt` — см. секцию «🔴 Индексера Prowlarr — починка Cloudflare (2026-09-20)» ниже.
+23 -3
View File
@@ -1,9 +1,27 @@
# План: авто-удаление просмотренного (watchlist cleanup)
**Дата:** 2026-09-20 (обновлено 2026-09-21)
**Статус:** ✅ РЕАЛИЗОВАНО И В КРОНЕ. Корзина закрыта (без неё). ⚠️ **Бесполезен сейчас: диск 100%, пересечение `[x]` ∩ Radarr = 0. Блокер — заполнение диска, см. [[family/plans/watchlist-disk-overflow-fix]]**
**Статус:** ✅ РЕАЛИЗОВАНО И В КРОНЕ. Корзина закрыта (без неё). ⚠️ **По-прежнему бесполезен: пересечение `[x]` ∩ Radarr = 0 + не покрывает `/media/movies`. Диск освобождён 2026-09-21 вручную (100% → 77%), см. [[family/plans/watchlist-disk-overflow-fix]]**
**Связано:** [[watchlist-automation]], [[arr-stack-kraken]], [[watchlist-disk-overflow-fix]]
> ## ✅ 2026-09-21 — ИНЦИДЕНТ ЗАКРЫТ (краткая выжимка для будущих сессий)
>
> Задачу «диск 100%» решали **не через cleanup**, а правкой `sync-down`. Полный разбор —
> [[family/plans/watchlist-disk-overflow-fix]]. Здесь — только то, что касается cleanup:
>
> 1. **cleanup НЕ виноват в заполнении** — он только удаляет (Alex поправил первичный неверный вывод).
> 2. **Корень:** `sync-down --batch 5` ежедневно без проверки места. Починено: `MIN_FREE_GB = 100`,
> фильтр ужасов, надёжный `mark_queued` (коммиты `2642882`, `a131208`).
> 3. **Диск освобождён вручную** — удалены 5 remux (403 ГБ), `monitored=false`. Не cleanup'ом.
> 4. **cleanup всё ещё не освободит место**, потому что:
> - пересечение `[x]` ∩ Radarr-файлы = **0** (просмотренное лежит в `/media/movies` — ручные торренты);
> - cleanup смотрит **только Radarr-библиотеку** и не покрывает `/media/movies`.
> → **Открытая задача.** Расширять cleanup на `/media/movies` — отдельная работа.
> 5. Крон cleanup (`0 2 * * *`) **оставлен активным** — безвреден, сработает когда появится `[x]` ∩ Radarr.
>
> **Порядок правок для будущих сессий:** коммит ДО → правка → заливка → проверка Alex → коммит ПОСЛЕ.
> `~/scripts/` на kraken — root:root, писать только через `sudo install -m 755`, `sudo` без пароля.
---
## 🟢 ИТОГ 2026-09-21: в кроне, корзины нет
@@ -155,8 +173,10 @@ Triangle of Sadness 79.7 / Unhinged 56.7). Остальные 22 файла —
**Сделано:** крон `watchlist-nightly` + `watchlist-discover` **остановлен** (бэкап `~/crontab-backup-20260921.txt`).
`watchlist-cleanup` (02:00) **оставлен активным** — он безвреден.
**Ожидает апрува:** удаление 5 remux-файлов + снятие `⬇️` у Неистового.
Полный план ремонта — [[family/plans/watchlist-disk-overflow-fix]].
**⚪ УСТАРЕЛО (историческая запись):** «ожидает апрува удаление 5 remux + снятие `⬇️`».
**Фактически выполнено 2026-09-21:** 5 remux удалены (403 ГБ), `monitored=false` всем 5,
`⬇️` снята у Неистового (стр. 107) и Списка Шиндлера (стр. 396), крон возвращён с `--batch 2`.
Итог и верификация — [[family/plans/watchlist-disk-overflow-fix]].
### Что это меняет для cleanup
+56 -4
View File
@@ -47,27 +47,41 @@ Jellyfin (8096) → rescan → виден контент
| `👎` | не хочу (новинка) | process-thumbs перемещает в `## Новинки👎` |
| `🗓️` | upcoming (ещё не вышел) | discover помечает, не скачивается |
| `❓` | не найдено / ambiguous | ждёт ручного уточнения |
| `🧟‍♀️` | horror (genre_id=27) | информационный маркер |
| `⭐` | **приоритет к загрузке** (U+2B50) | sync-down берёт в первую очередь, **фильтр рейтинга не применяется** ✅ реализовано 2026-09-20 |
| `🧟‍♀️` | horror (genre_id=27) | **не скачивается** (фильтр в `sync-down` с 2026-09-21), если нет `⭐` |
| `⭐` | **приоритет к загрузке** (U+2B50) | sync-down берёт в первую очередь, **обходит ВСЕ фильтры** (рейтинг + ужасы) ✅ 2026-09-20/21 |
⚠️ **`✭` (U+272D) — НЕ приоритет.** Alex 2026-09-20 явно указал: звёздочкой-приоритетом считается только `⭐` (U+2B50). Символ `✭` используется в файле как обычная пометка «выделенное», приоритетом не является.
Также: `⭐` засчитывается **только в строке фильма** (`- [ ] Название ⭐ …`), НЕ в под-буллетах кандидатов, которые генерирует `mark_ambiguous` (там формат «Название (год) ★N.N»). `[x]` (просмотренные) с `⭐` игнорируются. Работает **из всех секций** (`## Фильмы`, `## Новинки`, `## Мультфильмы`, `## Аниме`).
## Правила отбора в `sync-down` (актуально с 2026-09-20)
## Правила отбора в `sync-down` (актуально с 2026-09-21)
Приоритет определяется **двумя факторами**, а не позицией строки:
| Условие | Поведение |
|---------|-----------|
| `⭐` (U+2B50) в строке фильма | **первыми**, фильтр рейтинга **не применяется** |
| `⭐` (U+2B50) в строке фильма | **первыми**, фильтры рейтинга И ужасов **не применяются** |
| ужас (`is_horror()`, genre_id=27) без `⭐` | **отсеивается**, с логом `[🧟] … horror, skipped` ⬅️ новое 2026-09-21 |
| все остальные `[ ]` | **по порядку файла** (сверху вниз), рейтинг ≥ 6.0 |
| рейтинг < 6.0 (включая `0.0`) | отсеивается, с логом `[−] … skipped` |
| `[x]` | пропускается |
| `❓` / `🗓️` (ambiguous) | пропускается, обрабатывается отдельно |
⚠️ **Стоп-кран по месту (2026-09-21):** перед любым добавлением проверяется `MIN_FREE_GB = 100`.
Если свободно меньше — прогон останавливается (`[STOP] free space … — nothing queued`).
Проверка через **`shutil.disk_usage`**, не `df`. Именно отсутствие этой проверки заполнило диск
на 100% 2026-09-21 — см. [[family/plans/watchlist-disk-overflow-fix]].
**Фильтр ужасов работает по ЖАНРУ (`candidate.is_horror()`, TMDB genre_id=27), а не по эмодзи `🧟♀️`.**
В dry-run 2026-09-21: **33 horror item(s) skipped**, 14 rating skipped.
Результат для Alex: 41 фильм с `🧟♀️` (многие — свежие релизы 2025–2026) больше не качается.
Обход — поставить `⭐` в строку фильма.
⚠️ **Порядок файла ≠ рейтинг.** До 2026-09-20 код сортировал по рейтингу TMDB и игнорировал позицию в списке — из-за этого в батч попадали фильмы «не из начала списка». Исправлено коммитом `ada47da`.
⚠️ **`--batch` снижен 5 → 2** (2026-09-21) после инцидента с диском. Меняется в
`~/scripts/watchlist-nightly.sh` (root:root — править через `sudo cp`).
⚠️ **`⭐` = обход фильтров, а не смена сортировки.** Это принципиальная позиция Alex («Я блядь сказал в приоритете завела»): звёздочка означает явное «хочу», поэтому рейтинг для неё не проверяется вовсе.
## Структура секций movies-watchlist.md
@@ -111,6 +125,44 @@ crontab -l # проверка
⚠️ **В `docker exec hermes-kraken hermes cron list` по-прежнему «No scheduled jobs»** — это НЕ про watchlist. Watchlist-скрипты детерминированные, живут в системном cron, в Hermes-планировщике их не должно быть. Не искать их там.
## 🔴 2026-09-21: ДИСК 100% — инцидент и починка `sync-down`
**Симптом:** диск `/dev/sda1` на Kraken — **0 байт свободно** (`df` 100%). Radarr API отдавал
`disk I/O error` (SQLite не может писать при нуле места) — метаданные недоступны.
**Причина (НЕ cleanup):** `sync-down` в кроне `watchlist-nightly` (01:00) добавлял
**5 фильмов ежедневно** (`--batch 5`), **без проверки свободного места** и **без фильтра ужасов**.
Radarr качал remux'ы по 57–93 ГБ, пока диск не кончился. Профиль `WEB-4K (no remux)` фильтрует
**тип релиза**, но НЕ размер файла и НЕ проверяет место — от переполнения не защищает.
**Освобождено вручную:** удалены 5 remux = **403 ГБ** (Babylon 93 / Schindler's List 90 /
Midsommar 86 / Triangle of Sadness 80 / Unhinged 57 ГБ), всем выставлен `monitored=false`
через Radarr API. Диск: **100% → 77%** (404 ГБ).
**Починено в коде (коммиты `2642882`, `a131208`):**
| Что | Деталь |
|---|---|
| Стоп-кран по месту | `MIN_FREE_GB = 100.0` в `sync_down.py`, проверка через `shutil.disk_usage` (не `df`) |
| Фильтр ужасов | `candidate.is_horror()` (genre_id=27) пропускает ужасы, если нет `⭐` |
| `mark_queued` | возвращает `bool`, поглощает эмодзи-префикс, логирует промах через `_mark()` |
| `unmark_queued` | **новая функция** — снятие `⬇️` (не существовала) |
| `_clean` | чистит **множественные** эмодзи (`^(?:[chars]+\s*)+`) и **одиночный** год (`*` вместо `+`) |
| `sync_up._mark_watched` | видит эмодзи-префикс (иначе фильм не переходил в `[x]`) |
| `--batch` | **5 → 2** в `~/scripts/watchlist-nightly.sh` (root:root, править `sudo cp`) |
**Питфоллы, найденные в процессе:**
- `~/scripts/` на Kraken — **root:root 755**, `scp` падает с `Permission denied`. Только `sudo cp`.
- Крон-файлы вернуть можно только через `crontab /tmp/файл`; `crontab -l > f` для бэкапа обязателен.
- `du` по USB-HDD не влезает в SSH-таймаут на 100%-заполненном диске — запускать в фоне через `systemd-run`.
- Когда диск в нуле, **сначала освободить место**, только потом любые API-вызовы Radarr: SQLite мёртв.
**Открытая задача:** `cleanup` ([[family/plans/watchlist-cleanup]]) **не покрывает `/media/movies`** —
смотрит только Radarr-библиотеку, поэтому просмотренное из ручных торрентов не удаляется.
Пересечение `[x]` ∩ Radarr-файлы = 0.
**Полный разбор инцидента:** [[family/plans/watchlist-disk-overflow-fix]]
## 🔴 Аудит 2026-09-20: как выглядело состояние ДО восстановления (историческая справка)
**На момент аудита автодобавление фильмов НЕ работало по расписанию.** Скрипты были живы, но их никто не запускал.