[2026-09-22] eagle: personal/plans/watchlist-tmdb-missing-marker.md personal/tech/lampac-deployment.md
This commit is contained in:
1 parent
9b635e1475
commit
0508cca13e
2 files changed
+229
-11
No files matched your search
@@ -219,9 +219,14 @@ ssh kraken "bash -n ~/scripts/watchlist-catalog.sh && echo OK"
|
||||
| Файл | Путь | Права | md5 |
|
||||
|---|---|---|---|
|
||||
| генератор | `$H/scripts/gen_watchlist.py` | `kraken:kraken 600` | `3c7d4df34ee20f84b92c1b4be46d8382` |
|
||||
| маркер | `$H/scripts/mark_missing.py` | `kraken:kraken 600` | `43b3bb15e2aaad1ccb352d705990406c` |
|
||||
| маркер | `$H/scripts/mark_missing.py` | `kraken:kraken 600` | `43b3bb15e2aaad1ccb352d705990406c` (до фикса снятия) |
|
||||
| крон-скрипт | `~/scripts/watchlist-catalog.sh` | `root:root 755` | `17672d62285de5f33e0a89776ba34416` |
|
||||
|
||||
🔴 **`mark_missing.py` перезалит в ночь 2026-09-22** с фиксом «маркер в обе стороны»
|
||||
(снятие `❓`). Прежний md5 `43b3bb15…` устарел — сверять по `python3 mark_missing.py`
|
||||
на dry-run: должен показывать строку `снято` в статистике. Если её нет — залита
|
||||
старая версия, маркер сниматься не будет.
|
||||
|
||||
Бэкап прежнего генератора: `$H/scripts/gen_watchlist.py.bak-20260922-175754`.
|
||||
|
||||
### Боевой прогон (эталон для сравнения)
|
||||
@@ -316,7 +321,96 @@ python3 scripts/mark_missing.py --missing <wwwroot>/missing.json <путь.md> [
|
||||
🔴 **Первая версия `mark_missing.py` решала «нет TMDB» по тексту строки** и дала
|
||||
**344 пометки вместо 18** (помечала рабочие позиции с постерами). В прод не пошла.
|
||||
Сопоставление теперь по нормализованному названию (нижний регистр, `ё→е`, без
|
||||
пунктуации/эмодзи, без хвостового года). `🗓️` и `[x]` не трогаются, `❓` не дублируется.
|
||||
пунктуации/эмодзи, без хвостового года). `🗓️` и `[x]` не трогаются.
|
||||
|
||||
### 🔴🔴 Маркер ❓ работает В ОБЕ СТОРОНЫ (фикс 2026-09-22, ночь)
|
||||
|
||||
**Симптом:** `Духless`, `Бумбараш`, `Everything Everywhere All at Once` были
|
||||
в `watchlist.json` с постерами и TMDB-ID, но в боевом `.md` стояли с `❓`.
|
||||
Расхождение файла и каталога.
|
||||
|
||||
**Первопричина:** правило было «позиции НЕТ в `missing.json` → **не трогать**».
|
||||
`mark_missing.py` только **ставил** `❓` и никогда не **снимал**. Правка названия
|
||||
Alex'ом → резолв проходит → маркер остаётся навсегда.
|
||||
|
||||
**Фикс:** нет в `missing.json` → **снять** `❓`, если он есть. Список нерезолвленных —
|
||||
ИСТИНА, работает в обе стороны.
|
||||
|
||||
```python
|
||||
# mark_missing.py, analyze()
|
||||
if norm(title) not in missing:
|
||||
stats["не_в_missing"] += 1
|
||||
if QUESTION in body: # ← НОВОЕ: снятие
|
||||
cleaned = re.sub(r"\s*" + QUESTION + r"\s*", " ", body).strip()
|
||||
changes.append((i, raw.rstrip("\n"),
|
||||
"%s- [%s] %s" % (indent, box, cleaned)))
|
||||
continue
|
||||
```
|
||||
|
||||
⚠️ **Защита «файл стал меньше → отмена» УДАЛЕНА** — она стала ложной: снятие
|
||||
маркера законно уменьшает файл (2 байта на позицию). Замена — число строк-позиций
|
||||
(`ITEM_RE`) не должно измениться.
|
||||
|
||||
**Dry-run на боевом `.md` (596 позиций):** снять `24`, поставить `18`,
|
||||
уже_вопрос `10`, `🗓️` `39`, `[x]` `179`, не в missing `350`.
|
||||
|
||||
### 🔴 Два формата ключа кэша — как проверять факт резолва
|
||||
|
||||
```
|
||||
'{title}|' ← tmdb_search() -> list[3] = [tmdb_id, media_type, poster]
|
||||
'kp|{title}|{limit}' ← kp_search() -> list[5] = документы КП
|
||||
'kpid|{id}' ← kp_search_by_id()
|
||||
```
|
||||
|
||||
`472` ключа: `None` (промах) — 59 · `list` — 408 · `dict` — 5.
|
||||
**Ключ `'{title}|'` со списком = резолв УСПЕШЕН.** Самый быстрый способ проверить,
|
||||
найдётся ли позиция, не гоняя генератор.
|
||||
|
||||
### 🔴 Проверка «есть ли фильм в каталоге» — ключ поля `name`, НЕ `title`
|
||||
|
||||
```json
|
||||
{ "count": 373,
|
||||
"channels": { "films": { "title": "Фильмы",
|
||||
"items": [ { "name": "...", "image": "...", "href": "..." } ] } } }
|
||||
```
|
||||
|
||||
Проверка через `.title` даёт ложный «0 позиций». Читать `channels.*.items[].name`.
|
||||
Эталон: `373` позиции · `369` с постерами · `373` с `href`.
|
||||
|
||||
### 🔴 Диагностика на Кра́кене: только скриптом ФАЙЛОМ
|
||||
|
||||
`ssh kraken 'grep "Духless" file'` → **блок апрува → таймаут → `BLOCKED`**.
|
||||
Кириллица в аргументах инлайн-команд через ssh не проходит (см.
|
||||
[[family/how-to/tv-luna-send.md]] — тот же класс проблемы).
|
||||
|
||||
Рабочий шаблон:
|
||||
|
||||
```bash
|
||||
# 1. write_file локально -> /Users/admin/lampac-tmp/probe_x.py (или .sh)
|
||||
# 2. scp /Users/admin/lampac-tmp/probe_x.py kraken:/tmp/probe_x.py
|
||||
# 3. ssh kraken 'bash /tmp/probe_x.sh' # или python3 /tmp/probe_x.py
|
||||
```
|
||||
|
||||
⚠️ Импорт генератора в пробнике: `sys.path.insert(0, "$H/scripts")`, затем
|
||||
`import gen_watchlist as G` и **обязательно** `env = G.load_env()` — свой упрощённый
|
||||
разбор `.env` даёт `KP=NO TMDB=NO` и ложный вывод «ключей нет».
|
||||
|
||||
### Боевой путь `.md` и бэкапы
|
||||
|
||||
```
|
||||
$H/obsidian/family/documents/movies-watchlist.md # 29 632 Б, kraken:kraken
|
||||
```
|
||||
|
||||
`$H` = `/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/lampac`.
|
||||
Бэкапы: `/tmp/movies-watchlist.md.bak-live`, `.bak-run2`, `.bak-questions` (от маркера).
|
||||
🔴 `find / -name "movies-watchlist.md"` без `-maxdepth` возвращает пусто на этом хосте —
|
||||
искать по диапазонам `-maxdepth 5..6`.
|
||||
|
||||
### 🔴 `grep -c` считает СТРОКИ, а не вхождения
|
||||
|
||||
`grep -c '❓'` дал `34`, и это было принято за число маркеров. Правильно —
|
||||
`str.count()` в Python по прочитанному файлу. Для счётчиков символов всегда Python,
|
||||
не греп.
|
||||
|
||||
## 🔄 Ночной крон на Кра́кене — что делает автоматика
|
||||
|
||||
|
||||
Reference in new issue
Block a user