diff --git a/family/how-to/arr-stack-kraken.md b/family/how-to/arr-stack-kraken.md index 60df2af7..3ba5033b 100644 --- a/family/how-to/arr-stack-kraken.md +++ b/family/how-to/arr-stack-kraken.md @@ -591,14 +591,17 @@ GET /Users/{uid}/Items?IsPlayed=true&IncludeItemTypes=Movie&Fields=DatePlayed,Pa 🔴 **`DatePlayed` возвращается `None` для всех просмотренных.** Логику, зависящую от даты просмотра, строить нельзя. `IsPlayed=true` работает, `UserData.Played` работает — дата нет. -**Jellyfin видит просмотренными всего 6 фильмов** (Король Лев, Меч короля, Эль рояль, Остров сокровищ, Схватка с дьяволом, Труп невесты) — все из `/media/movies` (ручные торренты). Ни одного из `/media/movies-radarr` (18 фильмов, 702 ГБ). То есть пересечение `[x]` ∩ Radarr-файлы **пусто**. +**Jellyfin видит просмотренными всего 6 фильмов** (Король Лев, Меч короля, Эль рояль, Остров сокровищ, Схватка с дьяволом, Труп невесты) — все из `/media/movies` (ручные торренты). Ни одного из `/media/movies-radarr` (на 2026-09-21 — 28 фильмов). То есть пересечение `[x]` ∩ Radarr-файлы **пусто**. -### Radarr: состояние библиотеки (замер 2026-09-20) +⚠️ **Это не косметика, а причина, по которой авто-очистка диска не работает.** `sync-up` переносит watched-историю Jellyfin в `[x]`, а `cleanup` удаляет только то, что помечено `[x]`. Пока Jellyfin не видит Radarr-библиотеку, диск (94.7%) будет заполняться, а cleanup будет ежедневно писать «nothing to delete». Разбираться с этим, а не с cleanup. Детали — [[family/plans/watchlist-cleanup]]. -- 46 фильмов в базе, **18 с файлами**, суммарно **702 ГБ**. +### Radarr: состояние библиотеки (замер 2026-09-21) + +- 46 фильмов в базе, **28 с файлами** (на 2026-09-20 было 18 — библиотека растёт, диск заполняется). - Топ по размеру: Babylon 98.8 GB, Schindler's List 95.9, Midsommar 91.9, Triangle of Sadness 85.6, Chaos Walking 62.7, Unhinged 60.9. -- `recycleBin: ''` (корзина не настроена), `recycleBinCleanupDays: 7`, `deleteEmptyFolders: False`. -- **Все 18 monitored=True.** Если удалить файл, не сняв monitored, Radarr скачает заново. +- `recycleBin: ''` — **корзины нет, и настраивать её решено НЕ будет** (2026-09-21). `PUT config/mediamanagement` с путём хоста даёт `400 FolderWritableValidator: not writable by user 'abc'`: внутри контейнера Radarr медиа замаплено как `/media`, хостового пути `/srv/...6194539b.../media/.recyclebin` там не существует. Обходить маппингом ради корзины признано нецелесообразным — удаление идёт через Radarr API, а не `rm`. `recycleBinCleanupDays: 7`, `deleteEmptyFolders: False`. +- **Все monitored=True.** Если удалить файл, не сняв monitored, Radarr скачает заново — поэтому `cleanup` делает `PUT monitored=false` **до** `DELETE` (порядок критичен). +- 🔴 **Диск `/dev/sda1` заполнен на 94.7%** (4.8 ГБ свободно, `df` показывает 100%). Порог авто-удаления (90%) пройден, cron `watchlist-cleanup` работает ежедневно в 02:00 — но удалять пока нечего, см. ниже. Проверка одним вызовом: ```bash diff --git a/family/plans/watchlist-cleanup.md b/family/plans/watchlist-cleanup.md index 3900aff1..9d0c4b85 100644 --- a/family/plans/watchlist-cleanup.md +++ b/family/plans/watchlist-cleanup.md @@ -62,8 +62,8 @@ ``` watchlist_sync/cleanup.py — новый модуль (~180 строк) watchlist_sync/cli.py — команда cleanup + импорт _cleanup -/tmp/watchlist-cleanup.sh — обёртка (НЕ установлена в ~/scripts/, см. ниже) ``` +Обёртка: `~/scripts/watchlist-cleanup.sh` (была `/tmp/watchlist-cleanup.sh` — перенесена 2026-09-21). **Команда:** ```bash @@ -188,7 +188,8 @@ docker exec radarr ls -la /media ``` Затем указать `recycleBin` в **контейнерном** пути (вероятно `/media/.recyclebin`), либо отказаться от корзины. -**Альтернатива:** не настраивать корзину вовсе — тогда DELETE необратим. Решение за Alex. +**Альтернатива:** ~~не настраивать корзину вовсе — тогда DELETE необратим. Решение за Alex.~~ +❌ **РЕШЕНО 2026-09-21: корзины НЕ будет** (см. раздел «ИТОГ» вверху). DELETE необратим — принято осознанно. ## 🟡 Обёртка — РЕШЕНО 2026-09-21 @@ -249,15 +250,18 @@ headers = {"Authorization": 'MediaBrowser Token="%s"' % token} |--------|---------| | Запись из Radarr удалять? | Нет — остаётся, `monitored: false` через PUT до DELETE | | Секции | Все `[x]` (не ограничено `## Фильмы`) | -| Корзина | Пытались настроить `recycleBin` → **застряло**, см. раздел выше | +| Корзина | ❌ НЕ настраивается — решено 2026-09-21, см. «ИТОГ» вверху | | Лимит за прогон | 10 | -| Cron | **Не добавлен.** Сначала показать dry-run Alex | +| Cron | ✅ `0 2 * * * ... --apply` (установлен 2026-09-21) | ## Безопасность - **Порог проверять через `shutil.disk_usage`, не `df`.** - **Dry-run обязателен** — первый прогон только показывает, что удалил бы. -- Операция необратима при отсутствии корзины — подтверждение Alex перед первым реальным запуском. +- Операция необратима (корзины нет, решено осознанно). Защита — порог 90% + лимит 10 за прогон. +- ⚠️ **Проверять флаг `--apply` при любой правке крона.** Обёртка по умолчанию делает dry-run: + `bash watchlist-cleanup.sh` без аргумента ничего не удаляет и пишет «nothing to delete». + Именно так ошибка чуть не прошла незамеченной. --- diff --git a/family/projects/watchlist-automation.md b/family/projects/watchlist-automation.md index 04bbbd5e..e6f99aa6 100644 --- a/family/projects/watchlist-automation.md +++ b/family/projects/watchlist-automation.md @@ -1,6 +1,6 @@ --- created: '2026-05-20' -updated: '2026-09-20' +updated: '2026-09-21' status: active tags: - kraken @@ -475,17 +475,22 @@ Sonarr API base: http://localhost:8989/sonarr/api/v3/ ``` Проверка закачки: `queue` в Radarr показывает `grabbed/downloading`; `history` даёт точное имя взятого релиза. Transmission — `docker exec transmission transmission-remote --list` (RPC-юзер в `settings.json` пустой). -## Cron Jobs (на Кракене, восстановлены 2026-09-20) +## Cron Jobs (на Кракене, восстановлены 2026-09-20, дополнены 2026-09-21) Весь watchlist pipeline работает на Кракене (мигрировал с Eagle 2026-05-27). **Крон был мёртв с 2026-06-20 по 2026-09-20, восстановлен** (детали в начале документа). | Job | Расписание | Скрипт | |-----|-----------|--------| | `watchlist-nightly` | ежедн. 01:00 | `~/scripts/watchlist-nightly.sh` | +| `watchlist-cleanup` | ежедн. 02:00 | `~/scripts/watchlist-cleanup.sh --apply` | | `watchlist-discover` | вс 09:00 | `~/scripts/watchlist-discover.sh` | ⚠️ Фактический путь — `~/scripts/`, **не** `~/.hermes/scripts/`. Оба скрипта вызывают CLI напрямую через `uv run --project $WS`, без LLM. `uv` лежит в `~/.local/bin/uv`. +⚠️ **`~/scripts/` — root:root 755.** Добавить/заменить скрипт можно только `sudo install -m 755` (у kraken `sudo` без пароля). Обычная запись (`>`, `cp`) откажет с `Permission denied`. + +⚠️ **`watchlist-cleanup.sh` без аргумента = dry-run.** В кроне обязателен `--apply`, иначе удаление не произойдёт и лог будет писать «nothing to delete». Это самая тихая из возможных поломок — проверять флаг при любой правке крона. + `WS` в обоих скриптах: `/srv/dev-disk-by-uuid-49e8f586-3839-4c5d-a1e1-58bfc3579ade/watchlist-sync` — **другой UUID**, чем фактический корень репо (см. ниже). Возможный источник поломки: проверить, что путь резолвится. **watchlist-nightly.sh** (на Кракене): @@ -594,10 +599,10 @@ Jellyfin library mapping: Movies → `movies`, Cartoons → `mixed` (movies + ep - ✅ **[2026-09-20] Реальный прогон с новой логикой выполнен** — 19:53, `Done`, +3 фильма. Батч по порядку файла, ⭐ первым. - ✅ **[2026-09-20] Крон ВОССТАНОВЛЕН** — установлен 21:21 в crontab юзера `kraken`, бэкап `~/crontab-backup-20260920-212155.txt`. `nightly` 01:00 + `discover` вс 09:00, логи в `/tmp/`. Первая проверка в бою — прогон в 01:00. - 🟡 **[2026-09-20] Логи крона в `/tmp/`** — теряются при перезагрузке. Перенести в постоянное место (`~/logs/` или на диск), если нужна история прогонов. -- 🟡 **[2026-09-20] Удаление просмотренных фильмов при заполнении диска >90%** — механизм **РЕАЛИЗОВАН** (коммит `aafbaf7`, команда `cleanup`, dry-run проверен), но **застрял на настройке корзины Radarr**. См. [[family/plans/watchlist-cleanup]]. Замер 2026-09-20: диск **83.7%** (не 88% — `df` считает с root-резервом), кандидатов на удаление **0**. Jellyfin **не отдаёт `DatePlayed`** (`None` у всех) — логика построена без опоры на дату. Не в cron, пока Alex не посмотрит dry-run. +- ✅ **[2026-09-21] Удаление просмотренных фильмов при заполнении диска >90% — ЗАКРЫТО И В КРОНЕ.** Обёртка `~/scripts/watchlist-cleanup.sh` (была в `/tmp` — перенесена через `sudo install`, у kraken sudo **без пароля**), cron `0 2 * * * ... --apply`, лог `/home/kraken/logs/watchlist-cleanup.log`. **Корзина Radarr (`recycleBin`) — решено НЕ настраивать** (контейнерный/хостовый пути расходятся; Alex больше не переспрашивать). Обёртка по умолчанию делает **dry-run** — без `--apply` в кроне был бы вечный холостой ход. Полные детали — [[family/plans/watchlist-cleanup]]. ⚠️ Питфолл: `/media` — **не медиа-диск**, а пустая папка на SD-карте (`/dev/mmcblk0p2`), отдаёт 33.9%. Реальный диск `/dev/sda1` в `/srv/dev-disk-by-uuid-6194539b-.../`. Использовать `os.statvfs`, не `shutil.disk_usage("/media")`. -- 🟡 **[2026-09-20] Корзина Radarr `recycleBin` не настраивается** — `PUT /api/v3/config/mediamanagement` → `400 FolderWritableValidator: not writable by user 'abc'`. Причина: внутри контейнера путь хоста не существует (Radarr видит `/media`). Нужна проверка `docker inspect radarr` mounts. Проверка **не выполнена** — апрув истёк. -- 🟡 **[2026-09-20] Обёртка `watchlist-cleanup.sh` не установлена в `~/scripts/`** — директория `root:root 755`, писать нельзя. Нужен `sudo install -m 755`. Протестирована из `/tmp/`. +- 🔴 **[2026-09-21] ДИСК КРИТИЧЕН: 94.7% / свободно 4.8 ГБ.** Порог 90% пройден, cleanup реально запускается, но **удаляет 0 файлов**: пересечение `[x]` ∩ Radarr-библиотека = **пусто** (177 просмотренных vs 28 фильмов с файлами). Ждёт, пока в watchlist поставят `[x]` на Radarr-фильмы. Топ-кандидаты: Babylon 98.8 ГБ, Schindler's List 95.9, Midsommar 91.9, Triangle of Sadness 85.6. +- 🔴 **[2026-09-21] КОРЕНЬ: `[x]` не проставляется на новые закачки.** `sync-up` (Jellyfin watched → `[x]`) видит только 6 старых фильмов из `/media/movies`, ни одного из `/media/movies-radarr`. Пока это не починено, cleanup бесполезен, а диск будет заполняться. **Главная незакрытая задача всего pipeline.** - 🟡 **[2026-09-20] `sync-down` берёт всего 5 за прогон** — при 250 кандидатах разбор очереди займёт ~50 ночей. Рассмотреть увеличение `--batch` (сейчас `--batch 5` в `watchlist-nightly.sh`). Особенно актуально, раз фильтр `<6.0` уже отсеял 18. - 🟡 **[2026-09-20] Разобрать 5 застрявших закачек в очереди Radarr** со статусом `warning`: `Brokeback Mountain`, `Мортал Комбат 2`, `Sorry to Bother You`, `Город бога`, `День хомячка`. Висят давно, релиз не находится/не качается. - 🟡 **[2026-09-20] `Oficina do Diabo` / `Мастерская Сатаны` (2025)** — в Radarr, но релиз не найден. Ждёт RSS. Проверить через несколько дней.