[2026-09-25] eagle: personal/tech/lampac-deployment.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-25 23:31:54 +06:00
1 parent ac78b0b7a2
commit 9eb5cf001e
1 file changed
+70 -11
+70 -11
View File
@@ -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).