[2026-09-25] eagle: personal/tech/lampac-deployment.md
This commit is contained in:
1 parent
ac78b0b7a2
commit
9eb5cf001e
1 file changed
+70
-11
@@ -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).
|
||||
|
||||
Reference in new issue
Block a user