[2026-09-27] eagle: family/projects/watchlist-automation.md personal/plans/lampac-watched-to-watchlist.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-27 21:55:11 +06:00
1 parent 508144236e
commit a143f8ab2e
2 files changed
+151 -6

No files matched your search

+50 -4
View File
@@ -1,6 +1,6 @@
---
created: '2026-05-20'
updated: '2026-09-24'
updated: '2026-09-27'
status: active
tags:
- kraken
@@ -30,7 +30,8 @@ timecodes.identity ('movie-674' / '674_movie', строгие формы)
→ tmdb_id
→ 1) .resolve_cache.json (candidate.tmdb_id → ключ = заголовок .md) — ТОЧНО
→ 2) фолбэк: watchlist.json (href → name TMDB-ru / original + год ±1)
→ _mark_watched ([x], строка уезжает в блок просмотренных)
→ _mark_watched ([x]) — ⚠️ ИСПРАВЛЕНО 2026-09-27: ФАКТИЧЕСКИ вставляется НЕ в блок
просмотренных, а «выше первой [x] в файле» — баг, см. ниже «2026-09-27»
```
**Критерий просмотренного:** `deleted=0` И `percent >= 90` (env
@@ -38,8 +39,12 @@ timecodes.identity ('movie-674' / '674_movie', строгие формы)
(бывает >0 при 18%). Сериалы `tv-*` — скип, этап 2.
**Ключевые факты:**
- БД `TimeCode.sql` — только внутри контейнера lampac (НЕ на volume!),
читается копией `docker cp`; `sqlite3` в контейнере нет.
- ✅ БД `TimeCode.sql` — **на ХОСТЕ** (bind-mount `./database:/lampac/database`,
исправлено 2026-09-24 13:38): `/srv/dev-disk-by-uuid-6194539b-…/lampac/database/TimeCode.sql`,
модуль читает напрямую, **`docker cp` больше не нужен**. ⚠️ Раньше было «только
внутри контейнера, НЕ на volume» — УСТАРЕЛО. WAL: свежие данные в `-wal`, голый
`cp` одного `.sql` = пустая оболочка; читать каталог целиком или `sqlite3 X ".backup Y"`.
`sqlite3` в контейнере нет.
- `Sync.sql` (bookmarks) и `Sisi.sql` — ПУСТЫЕ: закладки Lampa не
синхронизируются на Lampac, TimeCode — единственный канал просмотров.
- `timecodes`: UNIQUE(user, identity) — одна строка на юзера+фильм,
@@ -74,6 +79,47 @@ bind-mount для `/lampac/database` (риск потери истории пр
досмотра фильм пропадает из «Мой список» в Lampa после ночного прогона
(каталог 02:30 выкидывает `[x]`).
## 🔴 2026-09-27: `[x]` НЕ падает вниз списка — баг `_mark_watched` (диагноз)
**Симптом Alex:** «Почему просмотренные в watchlist типа Даун Хаус или Кокаиновый
медведь не падают вниз списка? Да и новинки как будто давно не обновлялись»
**Корень** — `watchlist_sync/sync_up.py:69`, `_mark_watched`:
```python
insert_at = next((i for i, l in enumerate(lines) if re.match(r'\s*-\s*\[x\]', l)), None)
lines.insert(insert_at, raw)
```
`next(...)` = **первая** `[x]`-строка файла. Докстринг обещает `top of the [x] section`,
фактически получается `top of file`. Расхождение кода и комментария = баг.
**Факт из `.md` 27.09:** `- [x] Даун Хаус` — строка **326**, окружена `[ ]`-соседями.
Блок просмотренных реально: **421 → 674**. `Кокаиновый медведь` — строка 106,
`Проект конец света` — 109. Между ними и блоком ~130 строк со `[ ]`.
**Аудит:** 178 `[x]`-строк в главных секциях, из них **4** выше блока 421–674 —
все четыре пришли от `sync-from-lampac` после 25.09. Остальные 174 уже стояли
в блоке, и вставка «выше первой `[x]`» для них работала правильно.
**Готовый инструмент уже есть:** `parser.py:401 find_main_last_watched(ls)` — её
использует только `process_thumbs` (`insert_at = last_watched + 1`). `_mark_watched`
её не зовёт. Фикс — ~5 строк, **НЕ применён, ждёт команды Alex**.
**Каталог Lampa при этом НЕ затронут** — проверено: `watchlist.json` 27.09 01:07,
`count: 403` (films 357 / new 32 / cartoons 7 / anime 7), ни одного `[x]` в фиде.
Ночной пайплайн отработал полностью, бэкап `TimeCode.sql` за 27.09 в 01:09 создан.
**Второй симптом — «новинки не обновлялись»:** каталог обновляется каждую ночь,
а секция `## Новинки` в `.md` — нет: последний `discover` был **21.09**. Крон стоит
(`0 9 * * 0`), но в логе `watchlist-discover.sh` за 27.09 (воскресенье) шага
`discover` нет — только `sync-vault` pull и push, причём push на 5 минут раньше pull.
**`jq`-питфолл фида:** `.channels.films | length` → **2** (ключи `items`/`title`),
а не число позиций. Правильно: `.channels.films.items | length` → 357.
Полный разбор, аудит и план фикса — [[personal/plans/lampac-watched-to-watchlist]] §11.
## 🔴 2026-09-23: канал «Lampa → `[x]`» найден; фиксы сирот закоммичены
### Коммит `ffe7974` — закрыт должок по грязному дереву
+101 -2
View File
@@ -1,10 +1,10 @@
---
title: Отметка «просмотрено» из Lampa → watchlist.md
type: plan
status: implemented-threshold-tbd
status: implemented-bug-open-markwatched-insert
namespace: personal
created: 2026-09-23T00:00:00.000Z
updated: '2026-09-24T00:00:00.000Z'
updated: '2026-09-27T00:00:00.000Z'
tags:
- lampac
- lampa
@@ -325,6 +325,105 @@ table`). Голый `cp`/`docker cp` одного `.sql` — НЕ бэкап. Ч
---
## 11. 🔴 2026-09-27 — ДИАГНОЗ: `[x]` НЕ падает вниз списка (баг `_mark_watched`)
> **Симптом Alex:** «Почему просмотренные в watchlist типа Даун Хаус или Кокаиновый
> медведь не падают вниз списка? Да и новинки как будто давно не обновлялись»
### 11.1 Корень: вставка в НАЧАЛО, а не в конец блока просмотренных
`watchlist_sync/sync_up.py:69` внутри `_mark_watched`:
```python
insert_at = next((i for i, l in enumerate(lines) if re.match(r'\s*-\s*\[x\]', l)), None)
lines.insert(insert_at, raw)
```
`next(...)` = **первая** `[x]`-строка файла → вставка идёт **выше** неё.
Комментарий докстринга обещает `move to top of [x] section` — фактически `top of file`.
Расхождение кода и комментария и есть баг.
**Факт из файла 27.09:** `- [x] Даун Хаус` — **строка 326**, окружена `[ ]`-соседями
(324/325, 327/328) → уехала вверх на одну позицию и застряла. Строки **106** и **109**
(`Кокаиновый медведь`, `Проект конец света`) — тот же случай.
Блок просмотренных реально начинается на **строке 421** (`Бойцовский клуб`) и кончается
на **674**. Между позицией строки и блоком — ~130 строк со `[ ]` (11 секций, включая
`## Мультфильмы` на 676). Строка при вставке «по одной» эту дистанцию не проходит никогда.
**Аудит:** 178 `[x]`-строк в главных секциях, из них **4** выше блока 421–674 — все
четыре пришли от `sync-from-lampac` после 25.09. Остальные 174 уже стояли в блоке,
и вставка «выше первой `[x]`» для них работала правильно.
### 11.2 Готовый инструмент уже в коде
Точная функция для правки существует: **`parser.py:401 find_main_last_watched(ls)`** —
находит последний `[x]` в главных секциях (исключая `Новинки`/`Новинки👎`). Её использует
только `process_thumbs` (`parser.py:420`: `insert_at = last_watched + 1`).
`_mark_watched` её не зовёт — отсюда баг.
**Фикс (НЕ применён, ждёт команды Alex):** ~5 строк в `sync_up.py` — заменить `next(...)`
на `parser.find_main_last_watched(lines)` + `insert_at = idx + 1`. Тест: копия `.md`,
сверка diff, только потом заливка. Порядок правок штатный: коммит ДО → правка → заливка
→ проверка Alex → коммит ПОСЛЕ.
### 11.3 ⚠️ Расхождение доков и кода: пути БД
`family/projects/watchlist-automation.md` (раздел 2026-09-24) описывает матч так:
```
→ _mark_watched ([x], строка уезжает в блок просмотренных)
```
и «БД `TimeCode.sql` — только внутри контейнера lampac (НЕ на volume!)».
**Проверено 27.09 — устарело:** БД живёт **на хосте** по bind-mount'у (исправлено
2026-09-24 13:38, см. §10 «FIX ВЫПОЛНЕН»): `/srv/dev-disk-by-uuid-6194539b-…/lampac/database/TimeCode.sql`.
Строку про «только в контейнере» в `watchlist-automation.md` надо поправить.
Строка «строка уезжает в блок просмотренных» **фактом не подтверждается** — см. 11.1.
Это то же расхождение, что и баг: док писался по замыслу, а не по коду.
### 11.4 Второй симптом: «новинки давно не обновлялись» — тут ДВА разных «не обновлялись»
| Что | Факт 27.09 |
|---|---|
| **Каталог Lampa** | ✅ обновляется каждую ночь: `watchlist.json` — 27.09 01:07, `count: 403` (films 357 / new 32 / cartoons 7 / anime 7). Бэкап `TimeCode.sql` за 27.09 в 01:09 создан |
| **Секция `## Новинки` в `.md`** | 🔴 последний `discover` был **21.09**. Крон стоит (`0 9 * * 0`), но в логе `watchlist-discover.sh` за 27.09 (воскресенье) — только `sync-vault` pull и push, шага `discover` нет |
**Плюс структурная причина:** `discover` кладёт новинки в `## Новинки - 👍/👎`, а
`sync_down.py:70` держит эту секцию в `HIDE_SECTIONS = {"Новинки👎", "Связанные заметки"}`
(и `SECTION_TO_CODE` для `"Новинки - 👍/👎"` → `new`, но фильтр `HIDE_SECTIONS` её
не отсекает — в канале `new` на 27.09 лежит 32 позиции). То есть новые «новинки»
могут появиться в `.md`, но в фид Lampa попадают только после 👍.
### 11.5 Побочная находка: `push` раньше `pull`
В логе `watchlist-discover.sh` за 27.09 `sync-vault push` (10:21:08) идёт **на 5 минут
раньше** последнего `pull`. По таймингу не совпадает ни с ночным прогоном (01:00),
ни с расписанием discover (09:00) — либо ручной прогон, либо повторный запуск.
На данные не повлияло, но порядок pull/push в скрипте стоит проверить.
### 11.6 Что решено / что ждёт
**Ждёт команды Alex (правки кода не делались):**
| # | Дефект | Правка |
|---|---|---|
| 1 | `[x]` вставляется в начало вместо конца блока | `sync_up.py`, ~5 строк, замена на `find_main_last_watched` |
| 2 | `discover` не запускался 27.09 | до правки крона — `bash -x` скрипта + его содержимое |
| 3 | 4 «застрявшие» `[x]` (106/109/111/326) | вручную нельзя (правило «маркеры только скриптами»). После фикса №1 они съедут сами только при повторном `_mark_watched` для той же строки — для них вызова не будет. Варианты: оставить до следующего синка, либо одноразовый проход `sync-up` по уже-`[x]` строкам (новая функция, отдельный апрув) |
### 11.7 Питфоллы диагностики этой сессии
| # | Грабля | Обход |
|---|---|---|
| 19 | Логи крона в `/tmp/watchlist-nightly.log` **не читаются** — файла нет (см. §8.2, `/tmp` чистится ребутом). Прогон восстанавливается только по mtime артефактов | проверять артефакты: `watchlist.json` mtime, `~/backup/timecode/TimeCode-<дата>.sql`, размер `.md` по коммитам |
| 20 | `git log --oneline` показывает только последний коммит дня — «изменений нет» по diff'у с `HEAD` **не значит**, что nightly не работал | сверять **размер `.md` по коммитам** (`git show <c>:path \| wc -c`); ночной прогон виден как бамп 30696 → 30802 |
| 21 | `jq '.channels.films \| length'` даёт **2** (ключи `items`/`title`), а не число позиций | `.channels.films.items \| length` → 357 |
---
## 3. Шаги
1. **Бэкап.** `TimeCode.sql` + `movies-watchlist.md` + `watchlist-sync/` в