[2026-09-25] eagle: personal/plans/lampac-watchlist-plugin.md personal/tech/lampac-deployment.md
This commit is contained in:
1 parent
bbfe0329e2
commit
ac78b0b7a2
2 files changed
+181
-28
No files matched your search
@@ -43,7 +43,7 @@ related:
|
||||
|
||||
| Слой | Путь | Примечание |
|
||||
|---|---|---|
|
||||
| **Mac, репо** | `~/Developer/lampac-scripts/scripts/build_plugin.py` | сборщик, 14 инвариантов |
|
||||
| **Mac, репо** | `~/Developer/lampac-scripts/scripts/build_plugin.py` | сборщик, 20 инвариантов |
|
||||
| **Mac, репо** | `~/Developer/lampac-scripts/scripts/plugin-cub.js` | 🔴 собранный выход, РУКАМИ не правим |
|
||||
| Mac, скрэтч | `/Users/admin/lampac-tmp/` | рабочая папка, вне git — не источник истины |
|
||||
| Кра́кен, хост | `/srv/dev-disk-by-uuid-6194539b-.../lampac/catalog/plugin.js` | bind-mount, вне git |
|
||||
@@ -53,7 +53,9 @@ related:
|
||||
**Репозиторий:** `https://git.mallexxx.duckdns.org/git_admin/lampac-scripts.git`
|
||||
(remote `origin`, ветка `main`). Локально в нём же: `scripts/gen_watchlist.py`,
|
||||
`scripts/deploy_lampac.py`, `scripts/mark_missing.py`, `tests/`.
|
||||
Коммит плагина 2026-09-25: **`5e55a47`** «секции CUB только на главной экране».
|
||||
Коммиты плагина 2026-09-25:
|
||||
- **`5e55a47`** — «секции CUB только на главной экране» (фильтр `wlOnMain`)
|
||||
- **`3a35475`** — «фильтр по component + предзагрузка меню + хук на activity»
|
||||
|
||||
```bash
|
||||
cd ~/Developer/lampac-scripts
|
||||
@@ -82,8 +84,59 @@ git commit -m "..." && git push origin main
|
||||
| **`Log.enable` + `Runtime.enable` дают 0 строк** | консольные сообщения, напечатанные ДО подключения, не отдаются | читать логи СРАЗУ после рестарта, либо подтверждать состояние пробами, а не логами |
|
||||
|
||||
⚠️ **`docker restart lampac` НЕ сбрасывает кэш `catalog.js` в браузере webOS** — нужен
|
||||
рестарт приложения на ТВ через `luna-send`. И **не спать** в ожидании: Alex на паузу
|
||||
`sleep 20` отреагировал резко («Чё нахуй за слип 20?!») — вместо сна опрашивать состояние.
|
||||
рестарт приложения на ТВ. И **не спать** в ожидании: Alex на паузу `sleep 20` отреагировал
|
||||
резко («Чё нахуй за слип 20?!») — вместо сна опрашивать состояние в цикле.
|
||||
|
||||
### 🔴🔴 ПЕРЕЗАПУСК LAMPA НА ТВ: `tv_restart.sh` БЕЗ PTY = НОЛЬ ЭФФЕКТА (2026-09-25)
|
||||
|
||||
**Самый дорогой питфолл сессии. Три круга правок «не доезжали» до ТВ из-за этого.**
|
||||
|
||||
`tv_restart.sh` (лежит в `/Users/admin/lampac-tmp/`) делает `close` → `sleep 5` → `launch`
|
||||
и печатает свои `echo`. **Это НЕ ответ `luna-send`.** Без PTY `luna-send` детектирует
|
||||
отсутствие TTY и **отказывается писать в pipe** — молча не работает. Вывод скрипта
|
||||
(`--- закрываю --- --- запускаю --- --- готово ---`) означает лишь то, что `echo`
|
||||
отработали; приложение при этом **не перезапускается**.
|
||||
|
||||
**КАК ПРАВИЛЬНО — только через враппер с `script -q -c`:**
|
||||
|
||||
```bash
|
||||
TV_HOST=root@192.168.1.70 ~/Automation/tv-luna-send.sh -n 1 \
|
||||
-f luna://com.webos.applicationManager/closeByAppId '{"id":"com.lampac.tv"}'
|
||||
# → {"appId":"com.lampac.tv","returnValue":true} ← живой ответ, доказательство
|
||||
|
||||
TV_HOST=root@192.168.1.70 ~/Automation/tv-luna-send.sh -n 1 \
|
||||
-f luna://com.webos.applicationManager/launch '{"id":"com.lampac.tv"}'
|
||||
# → {"returnValue":true}
|
||||
```
|
||||
|
||||
🔴 **Критерий «рестарт реально произошёл» = получен `returnValue: true`**, а НЕ
|
||||
наличие `echo`-строк в выводе. Без этого критерия легко принять неработающий
|
||||
рестарт за работающий и уйти в ложную диагностику «правка не применяется».
|
||||
|
||||
🔴 **Проверка, что новая версия плагина в памяти ТВ** — проба уникального маркера
|
||||
новой сборки, а не `ready`/`patch` (они истинны и для старой версии):
|
||||
|
||||
```js
|
||||
String(!!window.__wl_activity_hook) // маркер конкретной фичи этой сборки
|
||||
```
|
||||
|
||||
Выводить новый глобальный маркер в каждой существенной правке — иначе нечем
|
||||
отличить «старая версия в памяти» от «новая не применилась».
|
||||
|
||||
🔴 **Первый замер после рестарта — ВСЕГДА гонка.** Опрашивать в цикле:
|
||||
```
|
||||
попытка 1: ready=false activityHook=false ← Lampa грузится, НЕ вердикт
|
||||
попытка 2: ready=false activityHook=false
|
||||
попытка 3: ready=true activityHook=true ← только здесь вердикт
|
||||
```
|
||||
|
||||
⚠️ **`docker restart lampac` для доставки `plugin.js` НЕ НУЖЕН.** Проверено в сессии:
|
||||
`/catalog.js` отдаётся с `Cache-Control: no-cache, no-store, must-revalidate`,
|
||||
`Expires: 0`, `Pragma: no-cache` — сервер прямо запрещает кэширование. `catalog.js`
|
||||
подключается как **плагин** Lampa (`plugins_add` в `lampainit.js`), а не лежит в
|
||||
приложении на ТВ; `localStorage` хранит только СПИСОК плагинов (`plugins`), не код.
|
||||
Два адреса дают разный `Content-Length` (44198 через `127.0.0.1:9118` vs 44204 через
|
||||
`192.168.1.14:9118`) — разница ТОЛЬКО в подстановке `api_host`, код идентичен.
|
||||
|
||||
### 🔴 Форма `Lampa.Activity.active()` — ИЗМЕРЕНО (CDP, 2026-09-25)
|
||||
|
||||
@@ -149,15 +202,48 @@ node --check plugin-cub.js # SYNTAX OK обязателен
|
||||
# бэкап боевого
|
||||
ssh kraken 'cp .../lampac/catalog/plugin.js .../catalog/plugin.js.bak-<что>-$(date +%Y%m%d-%H%M%S)'
|
||||
scp plugin-cub.js kraken:.../lampac/catalog/plugin.js
|
||||
# 🔴 права + macOS-мусор (обязательно: файл монтируется :ro в контейнер)
|
||||
ssh kraken 'cd .../lampac/catalog && chmod 644 plugin.js && chown 1000:1000 plugin.js && rm -f ._*'
|
||||
# проверка, что файл виден в контейнере (bind-mount)
|
||||
ssh kraken 'docker exec lampac grep -c "<маркер>" /lampac/module/Catalog/plugin.js'
|
||||
# проверка по HTTP — что реально отдаётся ТВ
|
||||
ssh kraken 'curl -s http://127.0.0.1:9118/catalog.js | grep -c "<маркер>"'
|
||||
# рестарт ТВ ТОЛЬКО через враппер (см. выше) + проба маркера сборки
|
||||
```
|
||||
|
||||
⚠️ `docker restart lampac` в порядок **НЕ входит** — сервер отдаёт файл с
|
||||
`no-store`, рестарт нужен только приложению на ТВ (и только через `tv-luna-send.sh`).
|
||||
|
||||
🔴 **`plugin-cub.js` в репе — это ВЫХОД сборщика.** Правку вносим в `INJECT` внутри
|
||||
`build_plugin.py`, потом пересобираем; руками `plugin-cub.js` не редактируем, иначе
|
||||
следующая сборка затрёт правку. Инварианты в `checks{}` обязаны покрывать любую
|
||||
новую функцию — иначе регресс пройдёт молча.
|
||||
|
||||
### 🔴 Питфолл: инварианты, считающие ПОДСТРОКИ, ловят КОММЕНТАРИИ
|
||||
|
||||
Дважды за сессию сборка падала с `[x] ИНВАРИАНТ НАРУШЕН` **на корректном коде**:
|
||||
|
||||
1. `"wlWatchActivity call": out.count("wlWatchActivity()")` → `3` вместо `1`:
|
||||
вхождение есть и в определении функции, и в `startPlugin`.
|
||||
**Фикс:** считать по уникальному контексту — `out.count("wlPrefetch();wlWatchActivity();")`.
|
||||
2. `"НЕТ старого parts.__wl_done": _code.count("parts.__wl_done")` → `4` вместо `0`:
|
||||
строки-комментарии в `INJECT` начинаются с эмодзи + пробелов (``, U+1F534),
|
||||
поэтому фильтр `l.strip().startswith(("*","/*","//"))` их **не отфильтровал**.
|
||||
|
||||
**Рабочий фильтр — вырезать блочные комментарии регуляркой:**
|
||||
```python
|
||||
_inject_body = out.split(MARK)[1].split("function startPlugin")[0]
|
||||
_code = re.sub(r"/\*.*?\*/", "", _inject_body, flags=re.DOTALL)
|
||||
_code = "\n".join(l for l in _code.splitlines()
|
||||
if not l.strip().startswith("//"))
|
||||
# затем _code.count(...) — счёт только по исполняемому коду
|
||||
```
|
||||
⚠️ `re` надо **импортировать** — сборщик его изначально не подключал (`NameError`).
|
||||
|
||||
**Правило:** прежде чем «чинить» код из-за упавшего инварианта — проверить
|
||||
`grep -n "<строка>"` в собранном файле и убедиться, что счёт не из комментариев.
|
||||
Дважды соблазн был «поправить код», хотя ломалась ПРОВЕРКА.
|
||||
|
||||
### 🔴🔴 Как определить активный экран Lampa — по `component`, НЕ по `url`
|
||||
|
||||
**ИЗМЕРЕНО на живом ТВ 2026-09-25.** Форма объекта:
|
||||
|
||||
Reference in new issue
Block a user