diff --git a/family/projects/watchlist-automation.md b/family/projects/watchlist-automation.md index 0cfb2f8d..1da2e7cb 100644 --- a/family/projects/watchlist-automation.md +++ b/family/projects/watchlist-automation.md @@ -229,8 +229,17 @@ TMDB, не знал про `resolve` и его маркеры) и `sync_down.py` `arr.py` **удалён** (`git rm`, коммит `a524f5d`), ⬇️ больше не ставится нигде. Детали, три открытия при переносе (фильтры рейтинга/ужасов в фиде НЕ нужны; -❓ не исключает позицию из фида; спорные позиции надо брать из `all_candidates`) и -открытые пункты — [[personal/plans/lampac-watchlist-plugin]] § «ПЕРЕПИСЫВАНИЕ». +❓ не исключает позицию из фида; спорные позиции берутся из `all_candidates[0]` + ❓) +и открытые пункты — [[personal/plans/lampac-watchlist-plugin]] § «ПЕРЕПИСЫВАНИЕ». + +🔴 **Блокер выката (2026-09-24):** резолвер проекта матчит хуже старого генератора — +сверка по `tmdb_id` дала **86 позиций с другим фильмом**. Причина: в `gen_watchlist.py` +есть ступень «КП-по-номеру из ссылки» (`kinopoisk.ru/film/N/` → КП → TMDB), в +`resolver.py` её нет; до удаления arr-контента это маскировал Radarr-фастпатч. +На живой фид НЕ выкатывалось. Поэтому `lampac/scripts/gen_watchlist.py`, +`mark_missing.py` и `watchlist-catalog.sh` (крон 02:30) **пока НЕ удалены** — +оттуда берётся код `kp_search_by_id` / `_docs_to_tmdb`. +Метрики dry-run: 268 (с фильтрами) → 332 (без фильтров) → **397** (с `all_candidates[0]`). ### ✅ 2026-09-24 (вечер): контент удалён — Radarr/Sonarr пустые diff --git a/personal/plans/lampac-watchlist-plugin.md b/personal/plans/lampac-watchlist-plugin.md index 166bb63f..f667df80 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: sync-down-feed-implemented-392-parity-pending +status: sync-down-feed-implemented-matcher-parity-blocked tags: - lampac - lampa @@ -23,6 +23,7 @@ tags: - tmdb - card-parse - feed + - matcher-parity title: Watchlist в UI Lampa — каталог из списка type: plan updated: '2026-09-24' @@ -77,13 +78,37 @@ Alex уточнил требование: «это же чистая дораб в `all_candidates` — среди них верный. Старый генератор брал первый результат TMDB. Если строить фид строго по `result.status == "ok"`, теряется **54 позиции** (девять, Мементо, Babylon, Orville, Матрица-класс названий: Казино, Сияние, Оно, - Отступники, Бешеные псы…). 🟡 **На момент записи дока это НЕ решено** — ждёт решения - Alex: брать `all_candidates[0]` (полный фид 392, как раньше, но спорящие позиции - могут показать не тот фильм) **или** пропускать спорные (фид честный, ~54 позиции - пропадут до уточнения года в `.md`). + Отступники, Бешеные псы…). + ✅ **РЕШЕНО 2026-09-24:** Alex — «бери лучшего кандидата и пиши вопрос». Фид берёт + `all_candidates[0]`, а название уходит в `missing` → ❓ в `.md` (год, добавленный + после ❓, пиннит позицию на следующем прогоне). Реализовано в `sync_down.py`. + +**🔴 ГЛАВНЫЙ БЛОКЕР, вскрытый переносом (не закрыт):** резолвер проекта матчит +**хуже** старого генератора. Сверка по TMDB-номеру (не по названию — в фиде имена +из TMDB, в `.md` из строки, сравнение по имени бесполезно): + +``` +было в живом фиде, в новом с ДРУГИМ tmdb_id: 86 позиций + примеры: Злая: Часть 2, Разделение, Дракула, Ван Хельсинг, Судья Дредд, Дюна-класс +плюс мусорные матчи по кривым строкам: «[Убийственная вечеринка] (2025)» → фильм 2007 +``` + +**Причина:** в старом генераторе 4 ступени резолва — Radarr → TMDB → **КП-по-номеру +из ссылки `kinopoisk.ru/film/N/`** → КП-по-названию. Самая надёжная ступень +(номер из ссылки — машинный ключ, не зависит от переименований) в `resolver.py` +**отсутствует вообще**. До переноса это маскировал Radarr-фастпатч; после удаления +контента arr маскировка исчезла и расхождение вылезло. + +**Варианты (ждёт решения Alex):** +- **А (рекомендован):** перенести в `sync_down`/`resolver` ступень «КП-по-номеру из + ссылки» — код разобран и лежит в бэкапе `gen_watchlist.py` (`kp_search_by_id` + + `_docs_to_tmdb` с `_by_id`). ~30 мин, проверяется тем же diff по tmdb_id. +- **Б:** выкатить как есть и вычистить 86 расхождений руками — вернутся после прогона. **Замеры dry-run по ходу работы:** 268 (с фильтрами) → 332 (без фильтров, `ambiguous` -исключается) → цель 392, достигается только решением по п.3. +исключается) → **397** (`all_candidates[0]` + ❓; больше 392, потому что старый +генератор терял часть позиций на Radarr-фастпатче и ❓-строках). +На живой фид НЕ выкатывалось: сначала matcher-parity. **Реперные метрики живого фида на 2026-09-24** (для сверки после переноса): ``` @@ -102,15 +127,19 @@ Alex уточнил требование: «это же чистая дораб `cards/card-movie-NNN.json`. Механика `missing.json` → ❓ осталась, переехала внутрь `sync_down.py` (`_sync_question_marks`, двусторонняя — снимает протухший ❓). -**🟡 Незакрытое на конец сессии 2026-09-24 (для следующей сессии):** -1. **Решение по спорным позициям (54 шт.)** — см. п.3 «Три открытия»: брать - `all_candidates[0]` (полный фид 392) или пропускать. Ждёт ответа Alex. +**🔴 Незакрытое на конец сессии 2026-09-24 (для следующей сессии):** +1. **Matcher-parity (ГЛАВНОЕ)** — см. «ГЛАВНЫЙ БЛОКЕР» выше: перенести ступень + «КП-по-номеру из ссылки» в резолв фида (вариант А) либо вычистить 86 расхождений + руками (вариант Б). Без этого выкат на живой фид покажет не те фильмы на ~86 позициях. 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). + 🔴 НЕ удалять до закрытия п.1: оттуда берётся код `kp_search_by_id` / `_docs_to_tmdb`. 4. Прогон `--apply` на живой фид + `docker restart lampac` (сброс кэша Catalog) + приёмка в UI Lampa. +5. Правка `sync_down.py`: ветка «не нашлось» (`not_found`) обязана добавлять позицию + в `missing` — за это отвечает `_sync_question_marks` (двусторонний ❓). --- diff --git a/personal/tech/lampac-deployment.md b/personal/tech/lampac-deployment.md index 2bc09f5e..764c897b 100644 --- a/personal/tech/lampac-deployment.md +++ b/personal/tech/lampac-deployment.md @@ -50,11 +50,20 @@ related: Radarr (матч по названию → те же версии, что выбрал резолвер). После удаления контента из arr (2026-09-24) мост исчез → 3 карточки сменили фильм. -**Решение (план согласован, не реализован):** логика переезжает в проект как -`watchlist_sync/feed.py` + CLI-шаг `feed`, пути через `.env`-ключ `LAMPAC_ROOT`, шаг -встаёт в nightly между `resolve` и `sync-up`; `gen_watchlist.py` / `mark_missing.py` / -`watchlist-catalog.sh` (крон 02:30) — в `.bak`. Детали и порядок шагов — -[[personal/plans/lampac-watchlist-plugin]] § «2026-09-24 (вечер): ПЕРЕПИСЫВАНИЕ». +**Решение (✅ РЕАЛИЗОВАНО 2026-09-24, коммит `a524f5d`):** логика переехала НЕ в +отдельный `feed.py`, а **внутрь `sync_down.py`** — Alex уточнил: «это же чистая +доработка sync-down?». `sync-down` сам пишет фид (`wwwroot/watchlist.json`, +`watchlist-.json`, `cards/`, `cards.json`, `missing.json`) + двусторонний ❓. +Пути: `--feed-root` → env `LAMPAC_ROOT` → `/../lampac`; UUID-путей в коде нет. +`arr.py` удалён, ⬇️ не ставится. + +🔴 **Блокер, вскрытый переносом:** резолвер проекта матчит хуже старого генератора — +86 позиций получают другой `tmdb_id`. Причина: в `gen_watchlist.py` есть ступень +«КП-по-номеру из ссылки `kinopoisk.ru/film/N/`», в `resolver.py` её нет. Поэтому +`gen_watchlist.py` / `mark_missing.py` / `watchlist-catalog.sh` (крон 02:30) +**пока НЕ удалены** — из них берётся код `kp_search_by_id`. Детали, три открытия +при переносе и порядок шагов — [[personal/plans/lampac-watchlist-plugin]] +§ «2026-09-24 (вечер): ПЕРЕПИСЫВАНИЕ». ⚠️ **НЕ трогать при переносе:** `catalog/sites/watchlist.yaml` (`plugin: watchlist` — обязателен, кириллица в ключе вырезается регуляркой `ModInit`; первая категория diff --git a/personal/tech/watchlist-sync-feed.md b/personal/tech/watchlist-sync-feed.md new file mode 100644 index 00000000..3049b16d --- /dev/null +++ b/personal/tech/watchlist-sync-feed.md @@ -0,0 +1,93 @@ +--- +created: '2026-09-24' +namespace: personal +related: + - '[[personal/plans/lampac-watchlist-plugin]]' + - '[[family/projects/watchlist-sync]]' + - '[[personal/tech/lampac-deployment]]' +tags: + - watchlist-sync + - feed + - lampa + - lampac + - sync-down + - matcher-parity + - skill-mirror +title: watchlist-sync: sync-down как генератор фида Lampa +type: tech +updated: '2026-09-24' +--- + +# watchlist-sync: `sync-down` как генератор фида Lampa + +> Зеркало раздела скилла `watchlist-sync-resolver` § «sync-down = Lampa feed». + +## Что изменилось + +`sync-down` больше **не добавляет в arr** — он строит фид Lampa. Требование Alex: +«не отдельный скрипт на лампу, а один sync скрипт и писал сразу lampa feed», +уточнение: «это же чистая доработка sync-down?». + +**Коммит `a524f5d`** — «sync-down: build Lampa feed instead of adding to arr; drop arr.py». + +``` +sync-down [--apply] [--feed-root PATH] + резолв через resolver.resolve() + → $LAMPAC_ROOT/wwwroot/watchlist.json {channels:{films,new,cartoons,anime}} + wwwroot/watchlist-.json + wwwroot/cards/card-.json tmdb_id ЧИСЛОМ (иначе «здесь пусто») + wwwroot/cards.json + wwwroot/missing.json → ❓ в .md (двусторонний) +``` + +| Решение | Деталь | +|---|---| +| Пути | `--feed-root` → env `LAMPAC_ROOT` → `/../lampac`. UUID-путей в коде НЕТ | +| `--batch` | deprecated: фид несёт весь список | +| `arr.py` | 🔴 удалён (`git rm`), история в гите. Бэкапы не делались (решение Alex) | +| ⬇️ | не ставится нигде: закачки нет | +| ❓ | `_sync_question_marks` в `sync_down.py` — двусторонний (ставит и снимает) | +| Где код | **в проекте** `~/Developer/watchlist-sync/` (`watchlist_sync/sync_down.py`), не в `/tmp` | + +## Питфоллы переноса (три итерации) + +1. **Фильтры рейтинга/ужасов в фиде НЕ нужны.** `rating >= 6.0` и horror-skip — правила + ЗАКАЧКИ (Radarr), не каталога. С ними фид упал 392 → 268 позиций. Старый генератор + отдавал horror тоже (Вивариум, Субстанция, Ужасающий, Зубастики в живом фиде). +2. **`item.ambiguous` (❓) не исключает позицию из фида.** ❓ = «название неточное, + добавь год», а не «нерезолвлено». Из фида исключают только отсутствие `tmdb_id`. +3. **Бери `all_candidates[0]`.** При `status="ambiguous"` у `resolve()` `candidate=None`, + но топ-3 в `all_candidates`. Alex: «бери лучшего кандидата и пиши вопрос» → кандидат + в фид, название в `missing` → ❓ (год пиннит позицию на следующем прогоне). + ⚠️ Ранний `continue` на `status != "ok"` съедал этот путь — проверять порядок веток. + +Метрики dry-run: **268 → 332 → 397** (цель — не меньше старого фида 392; больше, потому +что старый генератор терял часть позиций на Radarr-фастпатче и ❓-строках). + +## 🔴 Блокер: matcher-parity (НЕ закрыт) + +Резолвер проекта матчит **хуже** старого `gen_watchlist.py`: сверка по `tmdb_id` дала +**86 позиций с другим фильмом**. + +⚠️ **Сверять только по `tmdb_id`.** По названию бесполезно: в фиде имена из TMDB +(`Несломленный`), в `.md` — из строки (`Unbroken`). + +**Причина:** в генераторе 4 ступени резолва — Radarr → TMDB → **КП-по-номеру из ссылки** +(`kinopoisk.ru/film/N/`, машинный ключ, не зависит от переименований) → КП-по-названию. +В `resolver.py` ступени «по номеру из ссылки» **нет**. До удаления arr-контента +расхождение маскировал Radarr-фастпатч. + +**Решение:** перенести `kp_search_by_id` + `_docs_to_tmdb` (с флагом `_by_id`) из +`lampac/scripts/gen_watchlist.py` в резолв фида. Это ~30 мин, проверяется тем же diff +по `tmdb_id`. + +🔴 **НЕ удалять** `lampac/scripts/gen_watchlist.py`, `mark_missing.py`, +`watchlist-catalog.sh` (крон 02:30) до переноса — оттуда берётся код. + +## Открытые пункты + +1. Matcher-parity (см. выше) — без него выкат покажет не те фильмы на ~86 позициях. +2. Вернуть `sync-down` в `watchlist-nightly.sh` (строка 40 — «ПРОПУЩЕН») и убрать + `watchlist-catalog.sh` + строку крона `30 2 * * *`. +3. Удалить `gen_watchlist.py` (878) + `mark_missing.py` (179) — ПОСЛЕ п.1. +4. `--apply` на живой фид + `docker restart lampac` + приёмка в UI Lampa.