diff --git a/family/projects/watchlist-automation.md b/family/projects/watchlist-automation.md index 4cddd8e9..4cb755d5 100755 --- a/family/projects/watchlist-automation.md +++ b/family/projects/watchlist-automation.md @@ -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` — закрыт должок по грязному дереву diff --git a/personal/plans/lampac-watched-to-watchlist.md b/personal/plans/lampac-watched-to-watchlist.md index 21eb7d9a..598da83a 100755 --- a/personal/plans/lampac-watched-to-watchlist.md +++ b/personal/plans/lampac-watched-to-watchlist.md @@ -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 :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/` в