[2026-09-22] eagle: family/how-to/gitea-config.md family/projects/watchlist-sync.md personal/plans/watchlist-tmdb-missing-marker.md personal/tech/lampac-deployment.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-22 17:38:36 +06:00
1 parent e3618d5001
commit 62c4ba3d06
4 files changed
+199 -15

No files matched your search

+113 -13
View File
@@ -2,11 +2,110 @@
# Watchlist — автопоиск TMDB + маркер «нет в базе» (без ручных правок)
**Дата:** 2026-09-22
**Статус:** Шаги 1 и 2 ВЫПОЛНЕНЫ И ПРОВЕРЕНЫ. Шаг 1.3 переделывается. Шаг 3 — в работе.
**Статус:** Шаги 1, 1.3, 2, 3 ВЫПОЛНЕНЫ И ПРОВЕРЕНЫ, оба репо запушены.
Осталось только: деплой на Кра́кен + имя в карточке из TMDB/КП.
**Связано:** [[personal/plans/lampac-watchlist-plugin]], [[family/projects/watchlist-automation]], [[family/projects/watchlist-sync]], [[personal/tech/lampac-deployment]]
---
## ✅ ФИНАЛ 2026-09-22: шаги 1, 1.3, 2, 3 закрыты
### Коммиты (оба запушены, SHA сверены с remote)
| Репо | Remote | SHA | Что |
|---|---|---|---|
| `lampac-scripts` | gitea `git_admin/lampac-scripts` | `1765c05` | генератор + деплой + маркер + приёмки |
| `watchlist-sync` | github `mallexxx/watchlist-sync` | `396acc3` | Шаг 3: TMDB-фильтр в `discover.py` + `cli.py` |
Проверка: `git rev-parse HEAD` == `git ls-remote origin refs/heads/main` — совпало обоих.
### 📊 Результат прогона генератора (сырьё, не оценка)
| Метрика | Было (задеплоено) | Стало |
|---|---|---|
| Позиций в каталоге | 403 | **373** |
| Без TMDB-ID | 48 | **0** |
| Автопоиск по названию (2b) | — | **17** |
| Автопоиск по kp_id (2c) | — | **4** |
| Нерезолвленных (`missing.json`) | — | **30** |
| Источники | — | Radarr 9, TMDB 343, карточек 373 |
Разбивка: films 331 (постеров 327) · new 32 · cartoons 3 · anime 7.
Скрыто без TMDB: films **29**, new **1**.
### Шаг 1.3 — ПЕРЕДЕЛАН, теперь верен
**Было (неверно):** `mark_missing.py` решал «нет TMDB» **по тексту `.md`** → 344 пометки
вместо 48. Помечал заведомо рабочие позиции («Лило и Стич», «28 лет спустя» — в каталоге
они с постерами). В прод не пошёл.
**Стало (верно):** генератор пишет снимок нерезолвленных → `missing.json` рядом с JSON
каталога (`{"generated":true,"count":30,"missing":[...]}`), маркер ставится **по факту
промаха генератора**:
```bash
python3 scripts/gen_watchlist.py <путь.md> <путь/watchlist.json> # пишет missing.json
python3 scripts/mark_missing.py --missing <путь>/missing.json <путь.md> [--apply]
```
**Dry-run на реальном файле (.md с Кра́кена, 596 позиций):**
| Категория | Кол-во |
|---|---|
| всего позиций | 596 |
| не в `missing.json` | 350 |
| `🗓️` (не тронуты) | 39 |
| `[x]` просмотрено (не тронуты) | 179 |
| уже с `❓` | 10 |
| **будет помечено** | **18** |
Помеченные — черновые заметки с опечатками и подсказками в скобках, ровно то, что
требует ручной правки названия: `Джеймс Кемерон морские приключения?`,
`Разговорник/Квартетник`, `Аэроплан (Нильсен)`, `Солярис Тарковский`, `Идиот Бортко`,
`Спрут сериал`, `бердманн`, `Hemlock Grove (сериал)`, `Pandas 2018/Doc`,
`Some like it hot 1959 в джазе только деву`, `Мулан фильм`,
`Москва слезами не верить`, `Байкал удивительное приключение юмы`,
`Перед почтением сжечь`, `Курасава скрытая крепость`, `Клетка (джей ло)`,
`Ирана`, `Лена 2012`.
⚠️ Сопоставление — по **нормализованному** названию (нижний регистр, `ё→е`, без
пунктуации/эмодзи, без хвостового года), устойчиво к правкам `.md` ночным кроном.
Запись атомарная (tmp + rename), бэкап `.bak-questions`, проверка «файл не стал меньше».
### Шаг 3 — ВЫПОЛНЕН, живой dry-run
**Файлы:** `watchlist_sync/discover.py` (+`_resolvable()`, +`tmdb_key`), `cli.py` (передаёт `TMDB_KEY`).
Проверка идёт **после** фильтра по рейтингу, голосам, году и дедупликации.
`upcoming` (`🗓️`) не проверяется — календарь информативен, в каталог они не идут.
```bash
cd ~/Developer/watchlist-sync && . ./.env && .venv/bin/python -m watchlist_sync.cli discover
```
**Отсеяно 6 позиций** (ровно те, что дали бы «здесь пусто»):
`Одиссея` · `Майкл` · `Убежище` · `Обитель зла` · `Приглашение` · `Властелины вселенной`
Из 150 released + 50 upcoming прошло: **5 released, 16 upcoming**.
### Грабли сессии (не повторять)
1. 🔴 **Патчи по якорю не находили место** и тихо пропускались: импорт
`SequenceMatcher`, константы `KP_BASE`/`UA`/`KP_SIM_THRESHOLD`, блок `stats` в
`enrich()`, блок 2b, отчёт `main()`. Сообщения «= … (уже есть)» маскировали промах.
**Итог:** функции вставились, а зависимости — нет; файл падал на `NameError`.
**Правило:** после патча проверять не только «синтаксис валиден», но и наличие
каждой константы/импорта; критичные правки — через `patch`, а не строковую замену.
2. 🔴 **`run()` получил `tmdb_key` в тело, но не в сигнатуру** — Pyright сразу показал
`No parameter named "tmdb_key"` в `cli.py`. Сигнатуру править ОТДЕЛЬНО.
3. 🔴 **Откат из бэкапа вернул более старую версию.** `cp gen_watchlist_v2.py.bak-step1b …`
— снимок делался ДО записи, поэтому «бэкап» был старше правок.
**Правило: сначала снимок, потом правки.**
4. 🔴 **Подстановка `$( … | sed … )` вырезается** и в `write_file`, и в `patch`.
Строка собирается программно (питфолл №2 из [[family/how-to/gitea-config.md]]).
---
## 🔴 Прогресс 2026-09-22 (вечер): Шаг 1 пройден 3/3
**Итог автопоиска — проверено сырьём (`tests/accept_step1_order.py`):**
@@ -143,18 +242,18 @@ Alex: *«В developer. Пуш на gitea.»* Репо на gitea (private, HTTP
и в `write_file`, и в `patch` — строка собирается программно
(питфолл №2 из [[family/how-to/gitea-config.md]]).
### Осталось
### Осталось (после финала — только 2 пункта)
1. **Коммит + push** `lampac-scripts` на gitea.
1. **Деплой** нового `gen_watchlist.py` на Кра́кен (`lampac/scripts/`) + обновить
`~/scripts/watchlist-catalog.sh`, чтобы после генерации гонялся `mark_missing.py`.
⚠️ Проверить, что на Кра́кене есть `KP_KEY` в `/srv/.../watchlist-sync/.env` —
без него уровни 2b/2c не работают.
2. **Имя в карточке из TMDB/КП**, не из `.md` — требование Alex
(«Отображать как в tmdb/kp», «Ничего не укорачивать»). Сейчас генератор пишет
в карточку `it["name"]` = название из `.md`.
3. **Шаг 1.3 переделать:** список нерезолвленных из генератора → маркер `❓`.
4. **Шаг 3:** фильтр в `discover.py`. Уже прочитано: `discover.run(watchlist, kp_key, dry_run)`,
вызов в `cli.py:215`. Резолвер: `resolve(title, tmdb_key, kp_key)` → `ResolveResult`,
`AMBIG_SCORE_THRESHOLD = 0.75` (resolver.py:12).
5. **Деплой** `gen_watchlist.py` на Кра́кен (`lampac/scripts/`).
6. Доки.
Выполнено: шаги 1, 1.3, 2, 3; репо `lampac-scripts` (gitea `1765c05`),
`watchlist-sync` (github `396acc3`).
---
@@ -430,14 +529,15 @@ def tmdb_via_kp(title, year, tmdb_key, kp_key, cache):
| Файл | Роль |
|---|---|
| `~/Developer/lampac-scripts/scripts/gen_watchlist.py` | **ПРОД-генератор** каталога (репо, gitea) |
| `~/Developer/lampac-scripts/scripts/gen_watchlist.py` | **ПРОД-генератор** каталога (репо, gitea `1765c05`). Пишет `watchlist.json` + `cards/` + `missing.json` |
| `~/Developer/lampac-scripts/scripts/deploy_lampac.py` | заливка на Кра́кен |
| `~/Developer/lampac-scripts/scripts/mark_missing.py` | маркер ❓ — **в прод НЕ ставить** (см. Шаг 1.3) |
| `~/Developer/lampac-scripts/scripts/mark_missing.py` | маркер ❓ по `missing.json` (переделан, `--missing`) |
| `~/Developer/lampac-scripts/tests/accept_step1*.py` | приёмки автопоиска (3/3) |
| `~/lampac-tmp/gen_watchlist_v2.py` | рабочая копия + все патч-скрипты сессии |
| `~/lampac-tmp/` | рабочая свалка + все патч-скрипты сессии (НЕ git) |
| Кра́кен: `lampac/scripts/gen_watchlist.py` | **ЗАДЕПЛОЕННАЯ старая версия** — ждёт обновления |
| `~/Developer/watchlist-sync/watchlist_sync/resolver.py` | ЭТАЛОН cross-reference |
| `~/Developer/watchlist-sync/watchlist_sync/discover.py` | фильтр новинок (Шаг 3) |
| `~/Developer/watchlist-sync/watchlist_sync/discover.py` | TMDB-фильтр (Шаг 3, `_resolvable()`) |
| `~/Developer/watchlist-sync/watchlist_sync/cli.py` | `discover` передаёт `TMDB_KEY` |
| `~/.lampac_tmdb_cache.json` | кэш поиска TMDB (`.bak-20260922-step1`, `.bak-step1b`) |
| `~/.lampac_tmdb_details.json` | кэш деталей карточки (`.bak-20260922-step1`) |