[2026-09-22] eagle: family/how-to/gitea-config.md personal/plans/watchlist-tmdb-missing-marker.md personal/tech/lampac-deployment.md
This commit is contained in:
1 parent
42ac730a46
commit
e3618d5001
3 files changed
+243
-15
No files matched your search
@@ -2,8 +2,159 @@
|
||||
# Watchlist — автопоиск TMDB + маркер «нет в базе» (без ручных правок)
|
||||
|
||||
**Дата:** 2026-09-22
|
||||
**Статус:** ПЛАН УТВЕРЖДЁН Alex — в работе
|
||||
**Связано:** [[personal/plans/lampac-watchlist-plugin]], [[family/projects/watchlist-automation]], [[family/projects/watchlist-sync]]
|
||||
**Статус:** Шаги 1 и 2 ВЫПОЛНЕНЫ И ПРОВЕРЕНЫ. Шаг 1.3 переделывается. Шаг 3 — в работе.
|
||||
**Связано:** [[personal/plans/lampac-watchlist-plugin]], [[family/projects/watchlist-automation]], [[family/projects/watchlist-sync]], [[personal/tech/lampac-deployment]]
|
||||
|
||||
---
|
||||
|
||||
## 🔴 Прогресс 2026-09-22 (вечер): Шаг 1 пройден 3/3
|
||||
|
||||
**Итог автопоиска — проверено сырьём (`tests/accept_step1_order.py`):**
|
||||
|
||||
| Фильм (как в `.md`) | TMDB | Уровень резолва |
|
||||
|---|---|---|
|
||||
| Хамнет: История, вдохновившая «Гамлета» | **858024** | **2c** (kp_id 5454868 из ссылки) |
|
||||
| WeWork создание и крах компании | **795622** | **2b** (КП по названию) |
|
||||
| Астрал. Могильный ритуал 2 | **1576953** | **2c** (kp_id 11825624 из ссылки) |
|
||||
|
||||
### Порядок резолва в `enrich()` — финальный
|
||||
|
||||
```
|
||||
1) Radarr по названию
|
||||
2) TMDB по названию как есть
|
||||
2c) Кинопоиск по KP_ID ИЗ ССЫЛКИ -> имя/EN-алиас -> TMDB ← ПЕРВЫМ, он машинный
|
||||
2b) Кинопоиск по НАЗВАНИЮ -> имя/EN-алиас -> TMDB ← эвристика
|
||||
3) miss
|
||||
```
|
||||
|
||||
🔴 **Почему 2c выше 2b.** kp_id из ссылки в `.md` — машинный ключ, не зависит от
|
||||
переименований. Поиск по названию — эвристика с порогом, и на префиксах она врёт:
|
||||
«Астрал. Могильный ритуал 2» резолвился в **1264397** (1-я часть, 2024), потому что
|
||||
2b срабатывал первым и цеплялся за общий префикс. Порядок исправлен
|
||||
(`patch_step1e_order.py`).
|
||||
|
||||
### 🔴 Открытие: фильмы ПЕРЕИМЕНОВЫВАЮТ — kp_id надёжнее названия
|
||||
|
||||
«**Астрал. Могильный ритуал 2**» — это **старое название** фильма
|
||||
«**Могильный ритуал. Зло вернулось**». Доказательство (КП по id `11825624`):
|
||||
|
||||
| Поле КП | Значение |
|
||||
|---|---|
|
||||
| `name` | `Могильный ритуал. Зло вернулось` |
|
||||
| `alternativeName` | `Sengkolo: Petaka Satu Suro` |
|
||||
| `year` | 2026 |
|
||||
| `premiere.world` | 2026-01-22 |
|
||||
| `premiere.russia` | **2026-07-30** |
|
||||
|
||||
TMDB-цель из плана (`1291595`) была **неточной** — фактический TMDB **1576953**.
|
||||
|
||||
⚠️ **Следствие для правила маркеров:** в `.md` позиция помечена `🗓️` (строка 53),
|
||||
но фильм **уже вышел** (премьера РФ 30.07.2026, сегодня 22.09.2026) → по правилу
|
||||
Alex «есть → добавлять» он обязан быть в каталоге. **Снятие устаревшего `🗓️` —
|
||||
работа `resolve --recheck` (ночной крон), НЕ ручная правка.**
|
||||
Alex: *«В смысле снять устаревший маркер?! Это блядь было в задаче? Скрипт вроде
|
||||
уже автоматом сносит не-новинки из списка!»* — был прав, предложение отозвано.
|
||||
|
||||
### Три бага, найденные СЫРЬЁМ (не гаданием)
|
||||
|
||||
Найдены `depth_probe_step1.py` / `trace_step1.py` — трассировкой выдачи КП:
|
||||
|
||||
1. 🔴 **`docs[:3]` + слепой перебор.** КП по «WeWork» отдаёт 5 документов;
|
||||
релевантный (sim=1.00) на индексе 0, но его `name`
|
||||
`WeWork: Cоздание и крах компании` содержит **ЛАТИНСКУЮ `C`** в слове «Cоздание»
|
||||
(дефект данных КП) → промах TMDB; EN-алиас равен запросу и пропускался.
|
||||
Перебор уходил на индекс 2 (`We Work for the Dead`, sim=0.46) → мусор `1135465`.
|
||||
**Фикс:** `KP_SIM_THRESHOLD = 0.75` — документ близкий к запросу, но нерезолвенный,
|
||||
означает ОКОНЧАТЕЛЬНЫЙ промах, а не повод перебирать дальше.
|
||||
2. 🔴 **Порядок уровней.** Эвристика 2b опережала машинный 2c → 1-я часть вместо 2-й.
|
||||
3. 🔴 **Уровня 2c не существовало.** `kp_id` из ссылок в `.md` не использовался вообще.
|
||||
|
||||
### Что НЕ является ручным словарём (важно для инварианта №1)
|
||||
|
||||
`KP_SIM_THRESHOLD` и сопоставление по `kp_id` — **числовые/машинные критерии**,
|
||||
как проверка года ±1. Это не пары «название → фильм», прописанные человеком.
|
||||
Инвариант №1 не нарушен.
|
||||
|
||||
### Шаг 2 — ВЫПОЛНЕН
|
||||
|
||||
Позиция без `tmdb_id` вырезается из JSON **до** записи файлов:
|
||||
`items = [x for x in items if x.get("tmdb_id_raw")]` (в блоке перед `total += len(items)`).
|
||||
`total` и `count` считаются ПОСЛЕ фильтра — «здесь пусто» в плеере исчезает.
|
||||
|
||||
### Шаг 1.3 — МОЙ ПОДХОД БЫЛ НЕВЕРЕН, переделывается
|
||||
|
||||
`mark_missing.py` (парсит `.md` и ставит `❓` там, где «нет TMDB») **в прод не пошёл**.
|
||||
Dry-run на реальном файле: **344 пометки** вместо 48 из плана.
|
||||
|
||||
🔴 **Первопричина:** скрипт определяет «нет TMDB» **по тексту `.md`**, а не по факту
|
||||
резолва. Поэтому помечены заведомо рабочие позиции («Лило и Стич», «28 лет спустя» —
|
||||
в каталоге они с постерами).
|
||||
|
||||
**Правильный путь:** генератор **знает факт промаха** — он и должен писать список
|
||||
нерезолвленных; маркер ставится по этому списку. Не наоборот.
|
||||
|
||||
⚠️ Также установлено: `resolve --recheck --apply` из `watchlist-nightly.sh` **уже
|
||||
снимает маркер сам**, когда фильм находится. Ночной крон на Кра́кене (01:00):
|
||||
|
||||
```
|
||||
process-thumbs → resolve --recheck --apply → sync-down → sync-up
|
||||
```
|
||||
Плюс `cleanup` (02:00) — сносит просмотренное при заполнении диска.
|
||||
|
||||
### 📦 Репозиторий создан: `git_admin/lampac-scripts`
|
||||
|
||||
Alex: *«В developer. Пуш на gitea.»* Репо на gitea (private, HTTP 201), remote —
|
||||
ЧИСТЫЙ URL без токена (питфолл №1 из [[family/how-to/gitea-config.md]]):
|
||||
`https://git.mallexxx.duckdns.org/git_admin/lampac-scripts.git`,
|
||||
токен в `~/.git-credentials` (600).
|
||||
|
||||
```
|
||||
/Users/admin/Developer/lampac-scripts/
|
||||
├── scripts/gen_watchlist.py (из gen_watchlist_v2.py, 33 КБ)
|
||||
├── scripts/deploy_lampac.py
|
||||
├── scripts/mark_missing.py (в прод НЕ ставить — см. Шаг 1.3)
|
||||
└── tests/accept_step1.py, tests/accept_step1_order.py
|
||||
```
|
||||
|
||||
⚠️ `~/lampac-tmp/` — **НЕ git-репо**, свалка одноразовых пробников (`probe_*.py`,
|
||||
`diag_*.py`, 50+ файлов). Прод-генератор жил там без версионирования — это была ошибка.
|
||||
Исходники в `lampac-tmp` не удалялись (копирование, не перенос).
|
||||
|
||||
### 🧰 Локальные скрипты сессии (`~/lampac-tmp/`)
|
||||
|
||||
| Скрипт | Роль |
|
||||
|---|---|
|
||||
| `patch_step1_full.py` | ПОЛНЫЙ идемпотентный патч Шага 1 (собирает всё в один проход) |
|
||||
| `patch_step1d_kpid.py` | уровень 2c: `kp_search_by_id`, `tmdb_via_kp_id` |
|
||||
| `patch_step1e_order.py` | порядок 2c → 2b |
|
||||
| `depth_probe_step1.py` | глубина выдачи КП + sim по каждому документу |
|
||||
| `trace_step1.py` | пошаговая трассировка `tmdb_via_kp` |
|
||||
| `dryrun_step1_kpvia.py` | dry-run на 4 проблемных |
|
||||
| `invalidate_cache_step1.py`, `reset_keys_step1.py` | инвалидация кэша TMDB |
|
||||
| `verify_astral2_alias.py` | проверка гипотезы kp_id 11825624 |
|
||||
| `verify_step1c.py` | проверка порога на чистом кэше |
|
||||
| `create_gitea_repo.py` | создание репо на gitea через API |
|
||||
|
||||
🔴 **Грабли:** `cp gen_watchlist_v2.py.bak-step1b gen_watchlist_v2.py` откатил файл
|
||||
к версии **старше бэкапа** (снимок делался до записи). Правило: **сначала снимок,
|
||||
потом правки**; бэкап сразу после чтения файла.
|
||||
|
||||
🔴 **Грабли:** подстановка `$( … | sed … )` вырезается фильтром безопасности
|
||||
и в `write_file`, и в `patch` — строка собирается программно
|
||||
(питфолл №2 из [[family/how-to/gitea-config.md]]).
|
||||
|
||||
### Осталось
|
||||
|
||||
1. **Коммит + push** `lampac-scripts` на gitea.
|
||||
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. Доки.
|
||||
|
||||
---
|
||||
|
||||
@@ -40,6 +191,21 @@
|
||||
|
||||
Сейчас `🗓️` ставится в `discover` для upcoming. Позиции с `🗓️` **не должны** получать `❓`.
|
||||
|
||||
### 🔴 Правило Alex (2026-09-22) — критерий простой
|
||||
|
||||
> «БЛЯДЬ фильм есть или нет?? Если его можно смотреть то добавлять, если нет то нет,
|
||||
> простое правило. Ничего не укорачивать. Отображать как в tmdb/kp.»
|
||||
|
||||
1. **Вышел и смотрится → в каталог.** Маркер `🗓️` — производная от даты премьеры,
|
||||
а не догма. Если премьера прошла, а маркер остался — его снимает **`resolve --recheck`**
|
||||
(ночной крон), НЕ ручная правка и НЕ генератор.
|
||||
2. **Нельзя смотреть → нет в каталоге.** В списке — `❓`.
|
||||
3. **Названия не укорачивать.** Отдавать как в TMDB/КП — см. открытый пункт ниже.
|
||||
|
||||
⚠️ **Открытый пункт:** сейчас генератор пишет в карточку `it["name"]` = название
|
||||
**из `.md`**, а не из TMDB/КП. Требование «отображать как в tmdb/kp» это меняет —
|
||||
нужна отдельная правка генератора.
|
||||
|
||||
---
|
||||
|
||||
## Что установлено фактами (2026-09-22)
|
||||
@@ -108,11 +274,13 @@ KP API: `https://api.poiskkino.dev/v1.4/movie/search`, ключ `KP_KEY` из `.
|
||||
ритуал 2** вернутся к «НЕТ». Это НЕ потеря — это корректное состояние до того, как
|
||||
заработает автопоиск (Шаг 1). **Автопоиск обязан их найти сам:**
|
||||
|
||||
| Фильм | TMDB-цель | Как находится |
|
||||
|---|---|---|
|
||||
| Хамнет | `858024` «Гамнет» (2025) | KP → `alternativeName` = "Hamnet" → TMDB |
|
||||
| WeWork | `795622` (2021) | KP → EN-алиас → TMDB |
|
||||
| Астрал. Могильный ритуал 2 | `1291595` (2026) | KP → EN-алиас → TMDB |
|
||||
| Фильм | TMDB-цель | Как находится | Статус |
|
||||
|---|---|---|---|
|
||||
| Хамнет | `858024` (2025) | KP по kp_id `5454868` → имя → TMDB | ✅ найден, уровень 2c |
|
||||
| WeWork | `795622` (2021) | KP по названию → порог `KP_SIM_THRESHOLD` | ✅ найден, уровень 2b |
|
||||
| Астрал. Могильный ритуал 2 | ~~`1291595`~~ → **`1576953`** | KP по kp_id `11825624` → `Могильный ритуал. Зло вернулось` → TMDB | ✅ найден, уровень 2c |
|
||||
|
||||
⚠️ `1291595` из исходной таблицы — **неточный ID**. Фактический TMDB-идент = **1576953**.
|
||||
|
||||
Если Шаг 1 не найдёт их сам — задача НЕ выполнена.
|
||||
|
||||
@@ -262,13 +430,22 @@ def tmdb_via_kp(title, year, tmdb_key, kp_key, cache):
|
||||
|
||||
| Файл | Роль |
|
||||
|---|---|
|
||||
| `/Users/admin/lampac-tmp/gen_watchlist_v2.py` | генератор каталога |
|
||||
| `/Users/admin/lampac-tmp/deploy_lampac.py` | заливка на Кра́кен |
|
||||
| `/Users/admin/lampac-tmp/check_fixed2.py` | проверка постера по названию |
|
||||
| `~/Developer/lampac-scripts/scripts/gen_watchlist.py` | **ПРОД-генератор** каталога (репо, gitea) |
|
||||
| `~/Developer/lampac-scripts/scripts/deploy_lampac.py` | заливка на Кра́кен |
|
||||
| `~/Developer/lampac-scripts/scripts/mark_missing.py` | маркер ❓ — **в прод НЕ ставить** (см. Шаг 1.3) |
|
||||
| `~/Developer/lampac-scripts/tests/accept_step1*.py` | приёмки автопоиска (3/3) |
|
||||
| `~/lampac-tmp/gen_watchlist_v2.py` | рабочая копия + все патч-скрипты сессии |
|
||||
| Кра́кен: `lampac/scripts/gen_watchlist.py` | **ЗАДЕПЛОЕННАЯ старая версия** — ждёт обновления |
|
||||
| `~/Developer/watchlist-sync/watchlist_sync/resolver.py` | ЭТАЛОН cross-reference |
|
||||
| `~/Developer/watchlist-sync/watchlist_sync/discover.py` | фильтр новинок |
|
||||
| `~/.lampac_tmdb_cache.json` | кэш поиска TMDB |
|
||||
| `~/.lampac_tmdb_details.json` | кэш деталей карточки |
|
||||
| `~/Developer/watchlist-sync/watchlist_sync/discover.py` | фильтр новинок (Шаг 3) |
|
||||
| `~/.lampac_tmdb_cache.json` | кэш поиска TMDB (`.bak-20260922-step1`, `.bak-step1b`) |
|
||||
| `~/.lampac_tmdb_details.json` | кэш деталей карточки (`.bak-20260922-step1`) |
|
||||
|
||||
**Ключи:** `TMDB_KEY`, `KP_KEY` — из `~/Developer/watchlist-sync/.env` (на Маке).
|
||||
API: `https://api.poiskkino.dev/v1.4/movie/search` (с `follow_redirects=True`).
|
||||
**Ключи:** `TMDB_KEY`, `KP_KEY` — из `~/Developer/watchlist-sync/.env` (на Маке);
|
||||
на Кра́кене: `/srv/.../watchlist-sync/.env`. API: `https://api.poiskkino.dev/v1.4`
|
||||
(НЕ `api.kinopoisk.dev` — 301).
|
||||
|
||||
**Кэш TMDB — состояния:** `None` = «не нашли»; после внедрения автопоиска старые
|
||||
`None` **обязательно инвалидировать**, иначе новые запросы не пойдут.
|
||||
Скрипты: `invalidate_cache_step1.py` (все None), `reset_keys_step1.py` (точечно).
|
||||
Проверено: 393 записи → 341 успешная + 52 `None`.
|
||||
Reference in new issue
Block a user