From ec49b14ac3be015ed1ef828655a5ddbaa20e0780 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Wed, 23 Sep 2026 21:09:43 +0600 Subject: [PATCH] [2026-09-23] plan: threshold from module README (watched_at, not percent) --- personal/plans/lampac-watched-to-watchlist.md | 41 ++++++++++++++++--- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/personal/plans/lampac-watched-to-watchlist.md b/personal/plans/lampac-watched-to-watchlist.md index e6a60a4a..dab3f6dc 100644 --- a/personal/plans/lampac-watched-to-watchlist.md +++ b/personal/plans/lampac-watched-to-watchlist.md @@ -57,7 +57,31 @@ watched_at = 0 deleted = 0 `docker cp lampac:/lampac/database/TimeCode.sql /tmp/` + `python3 -c "import sqlite3 ..."`. На хосте Кра́кена `python3` есть. -### 1.3 Что уже есть в `watchlist.json` — `tmdb_id` готов к матчу +### 1.4 Порог «просмотрено» — ответ из документации модуля + +README модуля (`/lampac/module/Sync/TimeCode/README.md`), раздел «Нативные клиенты»: + +> **«Отдельного флага "просмотрено" нет: это `percent`. road Lampa его не несёт +> и не несла никогда, порог завершённости — политика клиента, а не свойство записи.»** + +Значит порог задаёт **клиент** (Lampa на ТВ), сервер его не знает. Две колонки: + +| Колонка | Кто ставит | Значение | +|---|---|---| +| `watched_at` | клиент, мс | **Когда смотрели.** Арбитр конфликтов между устройствами | +| `updated_at` | сервер, мс | Когда приняли строку. Курсор дельт `?since=` | +| `percent` | клиент | Прогресс; флага «просмотрено» отдельно нет | + +**Отсюда критерий отбора строки:** +``` +deleted = 0 И percent > 0 И watched_at > 0 +``` +⚠️ `deleted=1` — это **снятая** отметка (надгробие), `position`/`percent` обнулены, +`duration` сохранён. Такие строки **не** считать просмотром. +⚠️ Состояние `percent=18, watched_at=0` (живая запись сейчас) = **начал смотреть, +не досмотрел** → `[x]` НЕ ставить. + +### 1.5 Что уже есть в `watchlist.json` — `tmdb_id` готов к матчу `$H/lampac/wwwroot/watchlist.json` → `channels.*.items[]`, у **346/346** films есть `tmdb_id`. Матч делается по TMDB-ID, **без** хрупкого сравнения названий. @@ -83,8 +107,12 @@ watched_at = 0 deleted = 0 2. **Новый файл** `watchlist_sync/sync_from_lampac.py`: - читает БД по пути из env `LAMPAC_TIMECODE_DB` (default `/lampac/database/TimeCode.sql`; хост-путь подставить в `.env`); - - отбирает `deleted = 0` и (`percent >= 90` **или** `watched_at > 0`); - - `identity` → `tmdb_id` (срезать `_movie` / `_tv`); `_tv` пропускать на первом этапе; + - отбирает `deleted = 0` **И** `percent > 0` **И** `watched_at > 0` + (см. 1.4 — «просмотрено» = `watched_at`, не `percent`); + - `identity` → `tmdb_id`; форматы `movie-674`, `674_movie`, `tv-1851-s1e2`; + на этапе 1 только фильмы, `tv-*` пропускать; + - `position`/`duration`/`percent` выводить в лог для отладки — по ним видно, + насколько клиент реально досмотрел; - строит `{tmdb_id: title}` из `watchlist.json` (`channels.*.items[]`); - для каждого найденного `[ ]`-строки в `.md` — `[x]` через `_mark_watched`; - `--dry-run` по умолчанию, `--apply` для записи; печатает каждое действие. @@ -95,8 +123,11 @@ watched_at = 0 deleted = 0 5. **Крон.** В `~/scripts/watchlist-nightly.sh` — новый вызов **после** `sync-up`, **до** `sync-vault (push)`. Правка через `sudo cp` (`~/scripts/` — `root:root 755`). Бэкап скрипта до правки. Сумма новой версии зафиксировать в доке. -6. **Порог `percent`.** Начать с `>= 90`. Проверить на живой записи (сейчас 18% — - не должна проходить). При ложных срабатываниях — поднять до 95. +6. **Порог.** Критерий — `watched_at > 0` (документация: «просмотрено» — это + `watched_at`, а не `percent`). Живая запись сейчас `percent=18, watched_at=0` — + проходить не должна. Если в логе увидим `watched_at > 0` при `percent` ~20-40 — + значит Lampa помечает как просмотренное раньше конца; тогда добавить нижний порог + `percent >= 50` и перепроверить. 7. **Документировать** в `family/projects/watchlist-automation.md` (раздел про синк) + ссылка из `personal/plans/lampac-watchlist-plugin.md`.