diff --git a/personal/tech/lampac-deployment.md b/personal/tech/lampac-deployment.md index 3f6f0368..a4f0a16d 100644 --- a/personal/tech/lampac-deployment.md +++ b/personal/tech/lampac-deployment.md @@ -34,6 +34,46 @@ related: (патч `enumerable:true` + инжект секций через перехват `Lampa.Api.partNext`). Полный план и статус — [[personal/plans/lampac-watchlist-plugin]]. +> ✅ **ИТОГ СЕССИИ 2026-09-25:** фильтр «секции только на главной» работает; дубль секций убран проверкой по DOM. Коммиты `5e55a47` и `3a35475` в репо `~/Developer/lampac-scripts`. Инвариантов сборщика — **18**. + +### 🔴🔴 ДУБЛЬ СЕКЦИЙ: флаг не годится, проверять DOM (финальный фикс) + +**Симптом (Alex):** «Главная: есть Новинки → Фильмы: снова есть Новинки → Главная: Новинки теперь под секциями Огонь и В высоком качестве». + +**Замер:** в DOM **13 заголовков вместо 9** — наши 4 вверху, 5 родных, и **наши 4 второй раз внизу**. Плюс `window.__wl_injected = false` при уже вставленных секциях. + +**Причина — ГОНКА флага.** Хук `wlWatchActivity` снимал `__wl_injected` на старте activity `main`, но `partNext` вызывается **позже** и в этом окне срабатывает **дважды**. Оба вызова видят флаг снятым → два комплекта секций. Lampa первый комплект не удаляет → визуально «watchlist уплыл вниз». + +🔴 **До этого был второй провал:** флаг жил на массиве (`parts.__wl_done`), но `parts` приходит **НОВЫМ массивом** на каждом вызове → `!parts.__wl_done` истинно всегда. **Флаг на `parts` не работает в принципе.** + +**✅ РАБОЧЕЕ РЕШЕНИЕ — спрашивать DOM, а не флаг:** + +```js +function wlFirstTitle() { // заголовок из манифеста, не хардкод + var k = Object.keys(window.__wl_menu || {}); + return k.length ? k[0] : ''; +} +function wlInjected() { // наши секции уже отрисованы? + var want = wlFirstTitle(); + if (!want) return false; + var t = document.querySelectorAll('.items-line__title'); + for (var i = 0; i < t.length; i++) { + if ((t[i].textContent || '').trim() === want) return true; + } + return false; +} +// условие вставки: +if (wlOnMain() && Lampa.Arrays.isArray(parts) && !wlInjected()) { ... } +``` + +**Хук `wlWatchActivity` удалён полностью** — он был источником гонки. Проверка по DOM самодостаточна: сколько бы раз ни позвали `partNext`, второй вставки не будет. + +⚠️ **Инвариант по имени функции — со скобкой:** `"function wlInject(parts"`, иначе подстрока ловит `function wlInjected` и сборка падает с ложным нарушением. + +### 🔴 Побочная находка: родные секции CUB тоже дублируются + +В замере дублировались **не только наши** секции: «Сейчас смотрят», «Рекомендуем посмотреть», «В высоком качестве» шли по два раза. Это поведение ЛАМПЫ на навигации (накапливает пул, не перерисовывает), **не следствие патча плагина**. Отдельная задача — не приписывать её своему коду. + ### Где лежит файл — ✅ ИСПРАВЛЕНО 2026-09-25: ЭТО РЕПОЗИТОРИЙ, а не `/Users/admin/lampac-tmp/` 🔴 **`/Users/admin/lampac-tmp/` — рабочая папка сессии 2026-09-22, НЕ под git.** @@ -297,18 +337,14 @@ function wlComp(a) { секции и `slice(0, parts_limit)` отработал → наши секции попадают в пул только следующим раундом. Alex видел это как «есть, но сильно после первых секций». -### 🔴 Перезапуск Lampa на ТВ обязателен +### 🔴 Перезапуск Lampa на ТВ — ТОЛЬКО через враппер с PTY -`docker restart lampac` **НЕ сбрасывает** кэш `catalog.js` в браузере webOS — ТВ -продолжит исполнять старую версию плагина. Нужен рестарт приложения на ТВ: - -```bash -scp /Users/admin/lampac-tmp/tv_restart.sh root@192.168.1.70:/tmp/ \ - && ssh root@192.168.1.70 'sh /tmp/tv_restart.sh' -``` - -⚠️ `luna-send` через `ssh 'script -q -c "luna-send ... -a {\"id\":...}"'` ломается на -экранировании JSON (luna-send печатает help) — поэтому скрипт кладётся файлом на ТВ. +🔴🔴 **УСТАРЕВШИЙ СПОСОБ, НЕ ИСПОЛЬЗОВАТЬ.** `scp tv_restart.sh` + `ssh 'sh /tmp/tv_restart.sh'` +**не работает**: без PTY `luna-send` отказывается писать в pipe и молчит, а `echo` +внутри скрипта создаёт ложное впечатление успеха. Три круга правок плагина не доехали +до ТВ именно из-за этого. Рабочий раздел — выше: +**«ПЕРЕЗАПУСК LAMPA НА ТВ: `tv_restart.sh` БЕЗ PTY = НОЛЬ ЭФФЕКТА»** +(команда через `~/Automation/tv-luna-send.sh`, критерий приёмки `returnValue: true`). ### 🔴 Форма `Lampa.Activity.active()` — ИЗМЕРЕНО на живом ТВ 2026-09-25 @@ -4282,3 +4318,26 @@ python3 probe_ui.py "$WS" (Доки: `family/how-to/tv-luna-send.md`.) 3. Реальный запрос клиента ловить `tcpdump` на сервере — см. «ПРАВИЛО ДИАГНОСТИКИ» выше. +### 🔴 Дополнено 2026-09-25 — четыре питфолла, стоившие четырёх кругов + +4. **Рестарт ТВ через `tv_restart.sh` НЕ РАБОТАЕТ** — нет PTY, `luna-send` молчит, + скрипт печатает только свои `echo`. Только враппер: + `TV_HOST=root@192.168.1.70 ~/Automation/tv-luna-send.sh ...`. Критерий успеха — + **`returnValue: true` в ответе**, не наличие эхо-строк. +5. **Проверять применение правки по УНИКАЛЬНОМУ маркеру сборки.** `ready`/`patch` + истинны и для старой версии в памяти → ложное «применено». Выводить новый + глобальный флаг в каждой существенной правке. +6. **Первый замер после рестарта — гонка.** Опрашивать в цикле до `ready=true`, + иначе `ready=false, patch=false` читается как «плагин не доехал». +7. **Заливать с `chmod 644` + `chown 1000:1000` + `rm -f ._*`** — файл монтируется + `:ro` в контейнер, macOS-мусор ломает чтение. +8. **`docker restart lampac` для доставки `plugin.js` не нужен** — сервер отдаёт + `no-store`; рестарт контейнера НЕ сбрасывает `hybridCache` (он в памяти процесса). + +### 🔴 Правило: «номер вызова на объекте не работает» + +Флаг однократности, повешенный на объект пула (`parts.__wl_done`), **не работает** — +Lampa создаёт `parts` заново на каждый вызов `partNext`. Флаги однократности +держать **глобально** (`window.*`) и сбрасывать по событию смены экрана. +Симптом нарушения: секции **дублируются** (13 заголовков вместо 9). +