From 81467fe14fb201af80a391287fb26c6b2c1078dc Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Thu, 24 Sep 2026 17:13:02 +0600 Subject: [PATCH] [2026-09-24] eagle: family/projects/watchlist-automation.md personal/plans/lampac-watchlist-plugin.md --- family/projects/watchlist-automation.md | 20 ++++--- personal/plans/lampac-watchlist-plugin.md | 69 +++++++++++++++++------ 2 files changed, 65 insertions(+), 24 deletions(-) diff --git a/family/projects/watchlist-automation.md b/family/projects/watchlist-automation.md index e8158486..0cfb2f8d 100644 --- a/family/projects/watchlist-automation.md +++ b/family/projects/watchlist-automation.md @@ -1,6 +1,6 @@ --- created: '2026-05-20' -updated: '2026-09-23' +updated: '2026-09-24' status: active tags: - kraken @@ -207,7 +207,7 @@ curl -s --max-time 10 "http://localhost:7878/radarr/api/v3/queue?pageSize=50" \ | Что | Было (защита 2026-09-22) | Стало (2026-09-24) | |---|---|---| -| `arr.py`: `monitored` + `searchForMovie` / `searchForMissingEpisodes` | `False` | **`True`** — коммит `ef7e7af` (push): добавление сразу ищет и качает | +| `arr.py`: `monitored` + `searchForMovie` / `searchForMissingEpisodes` | `False` | **`True`** — коммит `ef7e7af` (push): добавление сразу ищет и качает. 🔴 **Вечером того же дня `arr.py` УДАЛЁН** (`a524f5d`) вместе с переходом `sync-down` на фид Lampa — см. «Консолидация» ниже | | Radarr `rssSyncInterval` | `0` | **15 мин** (`PUT /api/v3/config/indexer`, HTTP 202) | | Sonarr `rssSyncInterval` | `0` | **15 мин** (там же) | | `sync-down` в кроне | вырезан | **остался вырезан** — авто-пути из watchlist нет, добавление только руками | @@ -221,12 +221,16 @@ curl -s --max-time 10 "http://localhost:7878/radarr/api/v3/queue?pageSize=50" \ (частичный молча возвращает старое). Через host-config тупик: валидатор требует непустой `allowedHosts` при `authenticationRequired != Enabled` и не принимает звёздочку. -**🔴 Дальше — консолидация (план согласован 2026-09-24, не реализован):** отдельный -генератор каталога `lampac/scripts/gen_watchlist.py` признан вторым независимым матчером -TMDB — он не знает про `resolve` и его маркеры, из-за чего после удаления arr каталог -разъехался с `.md` на 3 позициях (Олдбой/Unbroken/Shogun). Слияние логики в модуль -проекта `watchlist_sync/feed.py` + CLI-шаг `feed` — см. -[[personal/plans/lampac-watchlist-plugin]] § «2026-09-24 (вечер): ПЕРЕПИСЫВАНИЕ». +**✅ Консолидация РЕАЛИЗОВАНА 2026-09-24:** генератор каталога слит в `sync-down`. +Было две независимых цепочки — `lampac/scripts/gen_watchlist.py` (878 строк, свой матчер +TMDB, не знал про `resolve` и его маркеры) и `sync_down.py` (arr-путь). Теперь **один +модуль**: `sync-down` резолвит через `resolver.resolve()` и пишет фид Lampa +(`wwwroot/watchlist.json`, `watchlist-.json`, `cards/`, `cards.json`, `missing.json`). +`arr.py` **удалён** (`git rm`, коммит `a524f5d`), ⬇️ больше не ставится нигде. + +Детали, три открытия при переносе (фильтры рейтинга/ужасов в фиде НЕ нужны; +❓ не исключает позицию из фида; спорные позиции надо брать из `all_candidates`) и +открытые пункты — [[personal/plans/lampac-watchlist-plugin]] § «ПЕРЕПИСЫВАНИЕ». ### ✅ 2026-09-24 (вечер): контент удалён — Radarr/Sonarr пустые diff --git a/personal/plans/lampac-watchlist-plugin.md b/personal/plans/lampac-watchlist-plugin.md index 66669193..166bb63f 100644 --- a/personal/plans/lampac-watchlist-plugin.md +++ b/personal/plans/lampac-watchlist-plugin.md @@ -8,7 +8,7 @@ related: - '[[family/projects/watchlist-automation]]' - '[[family/documents/movies-watchlist]]' - '[[personal/plans/lampac-watched-to-watchlist]]' -status: unified-feed-approved-awaiting-implementation +status: sync-down-feed-implemented-392-parity-pending tags: - lampac - lampa @@ -44,25 +44,46 @@ updated: '2026-09-24' Unbroken 2003→Несломленный 2014, Shogun 1968→Убийца сёгуна 1980). Лечим не годами в `.md`, а слиянием матчеров. -**План (согласован, реализация НЕ начата).** +**Статус: ✅ РЕАЛИЗОВАНО 2026-09-24 (вечер).** Отказ от отдельного `feed.py`/CLI-шага — +Alex уточнил требование: «это же чистая доработка sync-down?» → **`sync-down` сам пишет фид**. +Отдельного шага `feed` в CLI и в nightly НЕ появилось. -| Шаг | Что | +| Что | Как сделано | |---|---| -| 1 | Логику `gen_watchlist.py` перенести в модуль проекта: `watchlist_sync/feed.py`, функция `run()` как у остальных | -| 2 | Новый CLI-шаг `feed`; в nightly — ПОСЛЕ `resolve` (маркеры уже стоят), ПЕРЕД `sync-up` | -| 3 | Пути — через `.env`-ключ `LAMPAC_ROOT=/srv/.../lampac` (не хардкод); модуль сам собирает `wwwroot/watchlist.json`, `wwwroot/cards/`, `cache/` | -| 4 | Проверка на копии фида: ожидание **392 позиции / 390 постеров / missing 30** — точь-в-точь как текущий живой | -| 5 | Живой прогон + `docker restart lampac` (сброс кэша Catalog) | -| 6 | Выпилить: `lampac/scripts/gen_watchlist.py` + `mark_missing.py` → `*.bak-20260924`; `~/scripts/watchlist-catalog.sh` + строка крон `30 2 * * *` | -| 7 | Доки + скилл, коммит/пуш | +| Новый `watchlist_sync/sync_down.py` | ~380 строк вместо 195: `resolve` → `wwwroot/watchlist.json` + `watchlist-.json` + `cards/card-.json` + `cards.json` + `missing.json`; опционально ❓-синк | +| CLI | `sync-down [--apply] [--feed-root]`; `--batch` оставлен deprecated (в фид идёт весь список) | +| Пути | `--feed-root` → env `LAMPAC_ROOT` → `/../lampac` (fallback для Мак-чекаута). Хардкода UUID-путей в коде нет | +| `arr.py` | 🔴 **УДАЛЁН** (`git rm`, коммит `a524f5d`) — история сохранена в гите. Бэкапы НЕ делались (решение Alex: «в истории гита останется») | +| ⬇️ | **не ставится больше нигде.** Alex: «⬇️ больше ставить не надо, ведь закачки нет». `mark_queued` в `parser.py` оставлен для исторических строк | +| Коммит | `a524f5d` — «sync-down: build Lampa feed instead of adding to arr; drop arr.py» | -**Что НЕ трогаем:** `catalog/sites/watchlist.yaml` (контракт Lampac — `plugin: watchlist`, -категории, `card_parse`/`card_args` с `format`-выражениями), `catalog/plugin.js` -(инжект секций в CUB через `Api.partNext`), структура `cards/card-movie-NNN.json`. -Механика `missing.json` → маркер ❓ уже живёт в проекте и работает. +**🔴 Три открытия при переносе (стоили трёх итераций — не повторять):** -**`sync-down` остаётся вырезанным из крона** — добавлений в arr из watchlist нет; -`arr.py` не трогаем (автозакачка вернулась для РУЧНЫХ добавлений, коммит `ef7e7af`). +1. **Фильтры рейтинга/ужасов в фиде НЕ НУЖНЫ.** Я притащил в фид правила закачки + (`rating >= 6.0`, horror-skip) — фид упал до 268 позиций из 392. Это правила + **Radarr** («не качаем то, что не смотрим»), а каталог — не очередь закачки: + старый генератор отдавал horror тоже (Вивариум, Субстанция, Ужасающий, Зубастики + есть в живом фиде). В `sync_down.py` оставлен явный комментарий с запретом + возвращать эти фильтры. + +2. **`item.ambiguous` (❓) НЕ исключает позицию из фида.** ❓ означает «название в `.md` + неточное, пригодился бы год», а НЕ «нерезолвлено». Резолвер для таких всё равно + отдаёт кандидата, и старый генератор их публиковал (Альфа, Кибердеревня, Орвилл, + Ножницы — все с постерами в живом фиде). Из фида исключают только: нет `tmdb_id` + и `result.year_ambiguous` (🗓️ — реально два разных фильма). + +3. **Фид должен брать лучшего кандидата, а не отказываться.** `resolve()` при + неоднозначности возвращает `status="ambiguous"`, `candidate=None`, но топ-3 лежат + в `all_candidates` — среди них верный. Старый генератор брал первый результат TMDB. + Если строить фид строго по `result.status == "ok"`, теряется **54 позиции** + (девять, Мементо, Babylon, Orville, Матрица-класс названий: Казино, Сияние, Оно, + Отступники, Бешеные псы…). 🟡 **На момент записи дока это НЕ решено** — ждёт решения + Alex: брать `all_candidates[0]` (полный фид 392, как раньше, но спорящие позиции + могут показать не тот фильм) **или** пропускать спорные (фид честный, ~54 позиции + пропадут до уточнения года в `.md`). + +**Замеры dry-run по ходу работы:** 268 (с фильтрами) → 332 (без фильтров, `ambiguous` +исключается) → цель 392, достигается только решением по п.3. **Реперные метрики живого фида на 2026-09-24** (для сверки после переноса): ``` @@ -75,6 +96,22 @@ Unbroken 2003→Несломленный 2014, Shogun 1968→Убийца сёг (`~/Developer/watchlist-sync/`), `/tmp` — только для чтения чужих файлов и одноразовых выборок. Мак-репа и Кракен держатся на одном коммите (`4266e37` на момент старта). +**Границы (что не трогаем):** `catalog/sites/watchlist.yaml` (контракт Lampac: +`plugin: watchlist`, категории, `card_parse`/`card_args` с `format`-выражениями), +`catalog/plugin.js` (инжект секций в CUB через `Api.partNext`), структура +`cards/card-movie-NNN.json`. Механика `missing.json` → ❓ осталась, переехала внутрь +`sync_down.py` (`_sync_question_marks`, двусторонняя — снимает протухший ❓). + +**🟡 Незакрытое на конец сессии 2026-09-24 (для следующей сессии):** +1. **Решение по спорным позициям (54 шт.)** — см. п.3 «Три открытия»: брать + `all_candidates[0]` (полный фид 392) или пропускать. Ждёт ответа Alex. +2. Возврат `sync-down` в `watchlist-nightly.sh` (строка 40 сейчас «ПРОПУЩЕН»; + в 02:30 крутится отдельный `watchlist-catalog.sh`) + удаление `watchlist-catalog.sh` + и строки крона `30 2 * * *`. +3. Удаление `lampac/scripts/gen_watchlist.py` (878 строк) и `mark_missing.py` (179). +4. Прогон `--apply` на живой фид + `docker restart lampac` (сброс кэша Catalog) + + приёмка в UI Lampa. + --- > Реализовано 2026-09-22. План был переписан после разведки кода модуля Catalog.