[2026-09-20] eagle: family/how-to/arr-stack-kraken.md family/projects/watchlist-automation.md family/projects/watchlist-sync.md
This commit is contained in:
1 parent
bd743da99c
commit
abee5a86d1
3 files changed
+133
-3
No files matched your search
@@ -129,6 +129,35 @@ systemctl --user list-timers --all ; systemctl list-timers --all | grep -i watch
|
||||
|
||||
**Где менять:** `watchlist-sync/watchlist_sync/arr.py` строки `qualityProfileId: 7` (radarr_add ~L77, sonarr_add ~L112). НЕ редактировать профили вручную иначе watchlist-sync надо обновить на новый id. Создать/править профиль «WEB-4K (no remux)» — Radarr/Sonarr → Settings → Quality Profiles.
|
||||
|
||||
✅ **Профиль подтверждён в бою (2026-09-20):** первый же фильм, добавленный через обновлённый `arr.py` (`Gladiator` 2000), взял релиз `UHD BDRip [H.265/2160p] [4K]` — то есть **4K, но кодированный `BDRip`, БЕЗ Remux**. Профиль фильтрует корректно, цель (4K без 60GB-ремьюксов) достигнута.
|
||||
|
||||
**Подтверждение через API (рабочие вызовы):**
|
||||
```bash
|
||||
# список профилей Sonarr (проверить что id=7 существует)
|
||||
curl -s "http://localhost:8989/sonarr/api/v3/qualityprofile" -H "X-Api-Key: $SONARR_KEY"
|
||||
# корневые папки (проверить /media/series-sonarr и freeSpace)
|
||||
curl -s "http://localhost:8989/sonarr/api/v3/rootfolder" -H "X-Api-Key: $SONARR_KEY"
|
||||
```
|
||||
|
||||
### 📁 Актуальные пути контейнеров (проверено 2026-09-20)
|
||||
|
||||
Пути на дисках легко перепутать — два HDD с разными UUID. Точные значения через `docker inspect`:
|
||||
|
||||
| Сервис | Хост-путь конфига |
|
||||
|--------|-------------------|
|
||||
| Radarr | `/srv/dev-disk-by-uuid-6194539b-.../docker/radarr/config/` (внутри `config.xml` с ApiKey) |
|
||||
| Transmission | `/srv/dev-disk-by-uuid-6194539b-.../docker/transmission/` → `/config` (внутри `settings.json`) |
|
||||
| Медиа (общая) | `/srv/dev-disk-by-uuid-49e8f586-.../media/` → `/media` и `/downloads` |
|
||||
|
||||
⚠️ **НЕ** `/srv/...49e8f586.../docker/transmission/config/settings.json` — такого файла нет. Transmission на **6194539b**, Radarr-конфиг тоже на **6194539b** (в подпапке `config/`, не в корне radarr). Проверять через:
|
||||
```bash
|
||||
docker inspect radarr --format '{{range .Mounts}}{{.Source}} -> {{.Destination}}{{println}}{{end}}'
|
||||
docker inspect transmission --format '{{range .Mounts}}{{.Source}} -> {{.Destination}}{{println}}{{end}}'
|
||||
```
|
||||
|
||||
**Чтение ApiKey Radarr:** `grep -oP '(?<=<ApiKey>)[^<]+' /srv/...6194539b.../docker/radarr/config/config.xml`
|
||||
**Transmission RPC:** `docker exec transmission transmission-remote --list` (без `-n` работает, rpc-username пустой)
|
||||
|
||||
## Ports (Docker network `media_net`)
|
||||
|
||||
All services in the shared external network `media_net` — доступны друг другу по имени контейнера (`radarr:7878`, `prowlarr:9696`, `transmission:9091`, `flaresolverr:8191`) и с хоста по `kraken:<port>`:
|
||||
|
||||
@@ -152,6 +152,92 @@ bash ~/scripts/watchlist-nightly.sh
|
||||
|
||||
**После прогона дублей: 0** (проверено отдельным скриптом). Секции целы: Новинки / Фильмы / Мультфильмы / Аниме / Новинки👎 / Связанные заметки.
|
||||
|
||||
### 🔴 БАГ: `sync-down` игнорирует порядок файла — сортирует по рейтингу (найден 2026-09-20)
|
||||
|
||||
**Симптом (сообщил Alex):** в батч на закачку попали фильмы, которые «далеко не в начале списка» — `Гладиатор`, `Американская история X`, `Я ругаюсь`, `Мастерская Сатаны`.
|
||||
|
||||
**Корень:** `watchlist_sync/sync_down.py:41`:
|
||||
```python
|
||||
resolved.sort(key=lambda x: x[1].rating or 0, reverse=True)
|
||||
```
|
||||
Код **полностью игнорирует позицию строки в файле** и берёт топ-5 по рейтингу TMDB/KP из всех неотмеченных `[ ]`-строк. Порядок списка не имеет значения вообще.
|
||||
|
||||
**Расхождение с докой:** в [[watchlist-sync]] §1.3 заявлено «Приоритет: порядок в файле (выше = важнее)» — **это не соответствует коду**. Реальный приоритет = рейтинг.
|
||||
|
||||
**Вторая половина причины:** в том же прогоне `process-thumbs` выполняется **до** `sync-down` и переносит 👍-позиции из `## Новинки` в начало основного списка. Среди перенесённых оказались `Мастерская Сатаны` (8.3) и `Я ругаюсь` (8.2) — с высокими рейтингами, поэтому они сразу выиграли отбор.
|
||||
|
||||
**Как считался батч 2026-09-20 (5 слотов):**
|
||||
| Слот | Фильм | Рейтинг | Итог |
|
||||
|------|-------|---------|------|
|
||||
| 1 | Крик / Scream | 10.0 | уже в Radarr → помечен `⬇️` |
|
||||
| 2 | Волшебный участок | 9.0 | 400 «already added» в Sonarr |
|
||||
| 3 | Гладиатор | 8.225 | **добавлен** |
|
||||
| 4 | Я ругаюсь | 8.229 | **добавлен** |
|
||||
| 5 | Мастерская Сатаны | 8.3 | **добавлен** |
|
||||
| — | Американская история X | ~8.2 | **добавлен** (слот освободился после первых двух) |
|
||||
|
||||
`Saving Private Ryan` (8.223) и `Иди и смотри` (8.214) проиграли `Гладиатору` (8.225) на тысячные доли.
|
||||
|
||||
### ❌ В `sync_down` ОТСУТСТВУЕТ фильтр по рейтингу
|
||||
|
||||
Проверено `grep -rn "6\.0\|min_rating" watchlist_sync/*.py`:
|
||||
- `cli.py:92` — `< 6.0` только для сброса кэша при `--recheck`, не отбор
|
||||
- `discover.py:105,203` — фильтр только для шага discover
|
||||
- `resolver.py:264` — `0.5` это сравнение рейтингов при ничьей, не порог
|
||||
|
||||
**В `sync_down` порога нет вообще.** Порог `min_rating: 6.0` из доки [[watchlist-sync]] §1.2 в коде не реализован. Итог: в очередь могут попасть фильмы с рейтингом 0.0-5.9.
|
||||
|
||||
**Замер 2026-09-20:** из 251 resolved-кандидатов **18 имеют рейтинг < 6.0** — например `Шестой элемент` 4.3, `Мегалополис` 5.2, `Бешеная любовь` 3.1, `Ворон 2024` 5.8.
|
||||
|
||||
⚠️ **Отдельный случай:** `rating == 0.0` означает «TMDB не дал оценку», а НЕ «плохой фильм». Таких двое: `Уроки благи`, `Годзилла и конг`. Наивный фильтр `< 6.0` их отсечёт и потеряет нормальное кино.
|
||||
|
||||
### 📋 ПЛАН (согласован с Alex 2026-09-20, НЕ реализован)
|
||||
|
||||
Alex выбрал **вариант 1** («только порядок в файле») + добавил требование фильтра по рейтингу. Итоговая формула: **порядок файла = приоритет, рейтинг = отбор**.
|
||||
|
||||
**Файл:** `watchlist_sync/sync_down.py`, две правки.
|
||||
|
||||
**1. Убрать сортировку (строка 41)** — удалить `resolved.sort(...)`, `resolved` остаётся в порядке `parse()` = сверху вниз.
|
||||
|
||||
**2. Добавить фильтр по рейтингу** при заполнении `resolved`:
|
||||
```python
|
||||
if result.status == "ok":
|
||||
if (result.candidate.rating or 0) >= MIN_RATING:
|
||||
resolved.append((item, result.candidate))
|
||||
else:
|
||||
print(f" [−] {item.title!r} — rating ... < {MIN_RATING}, skipped")
|
||||
```
|
||||
`MIN_RATING = 6.0` — вынести константой в начало файла (сейчас захардкожено в двух местах в разных видах).
|
||||
|
||||
**Явно решено НЕ трогать `process_thumbs`:** 👍 остаются в верхней части списка, то есть свежие новинки намеренно идут в первую очередь.
|
||||
|
||||
**Открытый вопрос (задан Alex, ответа ещё НЕТ):** отсекать ли `rating == 0.0` вместе с остальными, или пропускать нули как «неизвестно ≠ плохо». Рекомендация — пропускать.
|
||||
|
||||
**Порядок работы (шаги 1-4 выполнены ранее, 5-6 ожидают ответа):**
|
||||
1. ✅ Бэкап `sync_down.py`
|
||||
2. 🔴 Отдельный коммит `parser.py` (фикс дедупа) — **всё ещё не закоммичен**
|
||||
3. ⏸ Правка `sync_down.py` скриптом в файле
|
||||
4. ⏸ Коммит `feat: sync-down follows file order + rating filter`
|
||||
5. ⏸ Dry-run — показать первые 10 и что отсеивается
|
||||
6. ⏸ ОК Alex → реальный прогон
|
||||
|
||||
**Что покажет вариант 1 (симуляция file-order, первые 5):** `Под огнём` (7.1), `Секретный агент` (7.3), `Охота на воров 2: Пантера` (6.6), `Гадкая сестра` (7.3), `Семья в аренду` (7.8) — все свежие новинки из `## Новинки`, рейтинги в норме.
|
||||
|
||||
### 📦 Результат закачки по итогам прогона 2026-09-20
|
||||
|
||||
`sync-down` добавил 4 фильма (`Scream` уже был → `⬇️`). Проверено через Radarr API + Transmission:
|
||||
|
||||
| Фильм | Взятый релиз | Статус |
|
||||
|-------|--------------|--------|
|
||||
| Gladiator (2000) | `UHD BDRip [H.265/2160p] [4K]` | качается |
|
||||
| American History X (1998) | `BDRip [AVC]` | качается |
|
||||
| I Swear (2025) / Я ругаюсь | `BDRip [H.264/1080p] [DVO]` | качается |
|
||||
| Oficina do Diabo (2025) / Мастерская Сатаны | — | **релиз не найден**, ждёт RSS |
|
||||
|
||||
✅ **Профиль качества работает как задумано:** Gladiator взят в **4K, но `BDRip`, не Remux** — профиль 7 `WEB-4K (no remux)` фильтрует корректно.
|
||||
|
||||
**Застрявшие в очереди Radarr (со статусом `warning`, к этому прогону не относятся):** `Brokeback Mountain`, `Мортал Комбат 2`, `Sorry to Bother You`, `Город бога`, `День хомячка`. Отдельная задача — разобрать.
|
||||
|
||||
### 🟡 Побочная находка: Zulip-пинг не настроен на Кракене
|
||||
`_zulip_ping()` требует `ZULIP_URL`, `ZULIP_API_KEY`, `ZULIP_BOT_EMAIL`, но их **нет в `.env`** репо watchlist-sync. При 59 нерезолвленных items → `[warn] ... not set — skipping ping`. Уведомления о нерезолвленных до Alex не доходят.
|
||||
|
||||
@@ -166,10 +252,21 @@ bash ~/scripts/watchlist-nightly.sh
|
||||
```
|
||||
|
||||
### Статус на конец сессии
|
||||
- ✅ Фикс `parser.py` применён на Кракене, записан на диск, **`ast.parse` OK**.
|
||||
- ✅ Фикс `parser.py` применён на Кракене, записан на диск, **`ast.parse` OK**, проверен 3 прогонами (размер стабилен).
|
||||
- 🔴 **Фикс НЕ закоммичен** в репо watchlist-sync (git status показывает только `?? arr.py.bak-web4k-...`). Нужен коммит.
|
||||
- ✅ Файл watchlist вычищен и закоммичен в vault.
|
||||
- ✅ Файл watchlist вычищен (168 дублей убрано) и закоммичен в vault.
|
||||
- ✅ Ручной прогон `watchlist-nightly.sh` прошёл чисто, 4 фильма ушли в закачку.
|
||||
- 🔴 Крон по-прежнему отсутствует — pipeline живёт только вручную.
|
||||
- 🔴 Найден и задокументирован баг отбора в `sync_down` (сортировка по рейтингу вместо порядка файла) + отсутствие фильтра по рейтингу. План фикса согласован, реализация ждёт решения по нулевым рейтингам.
|
||||
|
||||
**Бэкапы, созданные в этой сессии:**
|
||||
```
|
||||
~/obsidian/family/documents/movies-watchlist.md.bak-20260920-192909 (838 строк, 26430 б — ДО фикса)
|
||||
~/obsidian/family/documents/movies-watchlist.md.dedupe-backup-20260920-193111 (до дедупа)
|
||||
/srv/.../watchlist-sync/watchlist_sync/parser.py.bak-20260920-192909 (md5 0f597606fa14f357ff3b25547bd18ea6)
|
||||
```
|
||||
|
||||
**Скрипты диагностики/фикса (на Кракене, `/tmp/`):** `wl_dedupe.py`, `wl_verify_final.py`, `wl_postcheck.py`, `wl_order2.py`, `wl_grab_check.py`, `wl_fix_parser3.py`. `wl_dedupe.py` пригоден для повторного использования при накоплении дублей.
|
||||
|
||||
## Cron Jobs (на Кракене с 2026-05-27)
|
||||
|
||||
@@ -285,6 +382,7 @@ Jellyfin library mapping: Movies → `movies`, Cartoons → `mixed` (movies + ep
|
||||
|
||||
## Open Tasks
|
||||
|
||||
- 🔴 **[2026-09-20] РЕАЛИЗОВАТЬ согласованный фикс `sync_down.py`** — ждёт ответа Alex по нулевым рейтингам. Детали плана в секции «📋 ПЛАН» выше. Две правки: убрать `resolved.sort()` (строка 41), добавить фильтр `MIN_RATING = 6.0` с видимым `print`.
|
||||
- 🔴 **[2026-09-20] Закоммитить фикс `parser.py`** в репо watchlist-sync. Правка применена на Кракене, но не в git — при следующем `git pull`/пересоздании `.venv` можно потерять. Файл: `watchlist_sync/parser.py` (функция `mark_ambiguous`, `_SUB_BULLETS`).
|
||||
- 🔴 **[2026-09-20] Восстановить cron для watchlist pipeline** — pipeline мёртв с 20 июня. Скрипты готовы и проверены вручную (прогон 2026-09-20 прошёл чисто), нужно вернуть в crontab юзера `kraken`:
|
||||
```
|
||||
@@ -292,8 +390,10 @@ Jellyfin library mapping: Movies → `movies`, Cartoons → `mixed` (movies + ep
|
||||
0 9 * * 0 bash ~/scripts/watchlist-discover.sh
|
||||
```
|
||||
⚠️ В [[arr-stack-kraken]] эти строки в секции «Cron'ы на Kraken» указаны как действующие, хотя фактически их НЕТ — док в той части расходится с реальностью.
|
||||
- 🟡 **[2026-09-20] Разобрать 5 застрявших закачек в очереди Radarr** со статусом `warning`: `Brokeback Mountain`, `Мортал Комбат 2`, `Sorry to Bother You`, `Город бога`, `День хомячка`. Висят давно, релиз не находится/не качается.
|
||||
- 🟡 **[2026-09-20] Настроить Zulip-пинг** — `ZULIP_URL` / `ZULIP_API_KEY` / `ZULIP_BOT_EMAIL` отсутствуют в `.env` watchlist-sync, 59 нерезолвленных items ушли в никуда без уведомления.
|
||||
- 🟡 **[2026-09-20] Добавить pre-check дублей в `sonarr_add()`** — сейчас при уже существующей серии прилетает `400 SeriesExistsValidator` и шумит в логе. В `radarr_add()` проверка есть.
|
||||
- 🟡 **[2026-09-20] Синхронизировать документацию с кодом** — [[watchlist-sync]] §1.2 и §1.3 описывают порог `min_rating: 6.0` и «приоритет = порядок в файле», которых в коде нет. Обновить после реализации фикса.
|
||||
- 🔴 **[2026-09-04] Решить стратегию качества загрузки новых фильмов** — уже РЕШЕНО 2026-09-04 (профиль `WEB-4K (no remux)`, id 7 для Radarr и Sonarr). Осталось только убедиться, что старые `⬇️`-позиции, добавленные до фикса, не тянут remux.
|
||||
- 🟡 Оставшиеся `❓`-позиции (71 маркер) — **намеренно не чистятся вручную** (решение Alex 2026-09-20). Разбираются через `resolve --recheck` при работающем кроне.
|
||||
- 🟡 Передавать Transmission locations через router script при каждом импорте (сейчас вручную)
|
||||
|
||||
@@ -76,7 +76,8 @@ Hermes Kraken cron job
|
||||
|
||||
**Батчинг:**
|
||||
- Максимум **5 новых** в одном прогоне (защита от flood)
|
||||
- Приоритет: порядок в файле (выше = важнее)
|
||||
- ⚠️🔴 **Приоритет — НЕ порядок в файле.** Дизайн заявлял «порядок в файле (выше = важнее)», но фактически в коде `sync_down.py:41` стоит `resolved.sort(key=lambda x: x[1].rating or 0, reverse=True)` — отбор идёт **по рейтингу TMDB/KP**, позиция строки игнорируется. Найдено 2026-09-20, фикс согласован (см. [[family/projects/watchlist-automation]] → «📋 ПЛАН»).
|
||||
- ⚠️🔴 **Фильтр по рейтингу в `sync_down` ОТСУТСТВУЕТ.** Порог `min_rating: 6.0` ниже описан как дизайн, но в коде `sync_down.py` его нет — в очередь могут попасть фильмы с рейтингом 0.0-5.9. На 2026-09-20 таких 18 из 251 кандидатов. `discover.py` фильтрует, `sync_down.py` — нет.
|
||||
- После добавления в Radarr/Sonarr → заменить `- [ ]` на `- [ ] ⬇️` в .md
|
||||
|
||||
**API:**
|
||||
|
||||
Reference in new issue
Block a user