[2026-09-22] eagle: family/how-to/tv-lampac-plugin.md personal/plans/lampac-watchlist-plugin.md personal/tech/lampac-deployment.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-22 12:18:33 +06:00
1 parent 97237168a0
commit e1256f18b9
3 files changed
+349 -31

No files matched your search

+135 -15
View File
@@ -28,8 +28,10 @@ updated: '2026-09-22'
>
> **Итог одной строкой:** Lampac отдаёт `movies-watchlist.md` как каталог Lampa
> через модуль `Catalog` → 4 категории (360/33/3/7 позиций), автообновление кроном 02:30.
> Работает на стороне сервера; на ТВ остаётся добавить плагин
> `http://192.168.1.14:9118/catalog.js` и выбрать источник (см. «Что осталось на Alex»).
> Серверная часть полностью рабочая. **Осталось одно:** в `plugin.js` Lampac баг
> (`defineProperty` без `enumerable:true`) — из-за него источник «Мой список» не виден
> в списке выбора Lampa на ТВ. Фикс готов, ждёт апрува Alex (2026-09-22).
> См. «🔴 ГЛАВНЫЙ ПИТФОЛЛ».
## Задача
@@ -165,21 +167,35 @@ Cron: `30 2 * * *` → лог `~/logs/watchlist-catalog.log`.
Причина: `nightly` — рабочий боевой скрипт, его падение остановило бы весь пайплайн списка.
Отдельный cron падает изолированно.
## Что осталось на Alex (единственное незакрытое)
## Что осталось (единственное незакрытое)
Добавить плагин на ТВ — **пультом**, 1 минута:
**Не шаг Alex, а правка сервера.** Плагин на ТВ уже добавлен и **источник уже выбран**
(`Storage.field('source') = 'Мой список'`). Проблема — баг в `plugin.js` Lampac
(см. «🔴 ГЛАВНЫЙ ПИТФОЛЛ»): источник не виден в UI из-за `enumerable: false`.
1. Lampa → **Настройки → Плагины** → добавить URL `http://192.168.1.14:9118/catalog.js`
2. **Полностью перезапустить Lampa** (не сворачивать) — каталоги регистрируются только при старте
3. На главной встать на ряд каталога и нажать **влево** → в выехавшей панели выбрать **«Мой список»**
**Ждёт апрува Alex** (2026-09-22): смонтировать поправленный `plugin.js` через compose.
🔴 **Пункта «Настройки → Источник» в Lampa НЕ СУЩЕСТВУЕТ** — я его выдумал, Alex дважды указал на ошибку.
Источник переключается панелью слева в меню каталогов. Подробно: [[family/how-to/tv-lampac-plugin]].
Путь на ТВ, который раньше писался («влево → панель → выбрать источник») — **не сработает**,
пока баг не исправлен: в панели источника просто нет.
Приёмка = категории видны в UI Lampa, названия совпадают с `movies-watchlist.md`.
Автоматизация этого шага по SSH **не проверялась** — см. [[family/how-to/tv-lampac-plugin]]
(там заготовка подхода и питфоллы localStorage).
## Диагностический скрипт для ТВ (`/tmp/lampa_probe.py`)
Правки в UI Lampa по SSH напрямую не сделать, но **состояние читается** через DevTools:
```python
pages = json.load(urllib.request.urlopen("http://192.168.1.70:9998/json", timeout=8))
target = next(p for p in pages if "com.lampac.tv" in p.get("url",""))
ws = websocket.create_connection(target["webSocketDebuggerUrl"], timeout=10)
# Runtime.evaluate:
# Lampa.Storage.field('source')
# Object.keys(Lampa.Api.sources).join('|')
# Object.getOwnPropertyDescriptor(Lampa.Api.sources,'Мой список')
# Lampa.Api.sources['Мой список'].getCatalog()
```
Требует `pip3 install websocket-client` (стоит). См. [[family/how-to/tv-lampac-plugin]].
## Известные ограничения
@@ -207,13 +223,117 @@ Cron: `30 2 * * *` → лог `~/logs/watchlist-catalog.log`.
**НЕ проверено:**
- ❌ **UI Lampa на ТВ** — Alex добавил плагин, но каталог в UI не увидел.
Соединений ТВ → `:9118` на момент диагностики — **ноль**. Гипотеза: не сделан полный
перезапуск Lampa (каталоги регистрируются только при старте) либо не выбран источник
в панели слева. **Требуется подтверждение от Alex.**
- ✅ **UI Lampa на ТВ — ПРИЧИНА НАЙДЕНА 2026-09-22** (см. ниже «🔴 ГЛАВНЫЙ ПИТФОЛЛ»).
Диагностика через Chrome DevTools ТВ (`http://192.168.1.70:9998/json`):
- ТВ **физически достаёт** Кра́кен — `curl` с ТВ отдаёт `/catalog` 200 за 0.26 с.
- Lampa **работает и ходит на сервер** — соединение `192.168.1.70 → 192.168.1.14:9118` ESTABLISHED.
- `Storage.field('source')` = **`'Мой список'`** — источник уже выбран!
- `Lampa.Api.sources['Мой список']` **существует** и отдаёт каталог
(`getCatalog()` → `search, search_lazy, movie, cartoons, anime, menu, main`).
- ❌ НО: `Object.keys(Lampa.Api.sources)` = `'tmdb|cub'` — **источника нет в перечислении**.
- Причина: `defineProperty(..., {get: ..., enumerable:false, configurable:false})`.
- **Диагноз: баг в `plugin.js` самого Lampac, а не в нашей настройке.** UI Lampa строит
список источников через `Object.keys()` — «Мой список» из него выпадает, поэтому в UI
источник не видно и выбрать его нельзя.
- ❌ Боевой прогон крона в 02:30 (скрипт отработал вручную успешно).
- ❌ Карточка/постеры в UI.
## 🔴 ГЛАВНЫЙ ПИТФОЛЛ: источник не виден в UI Lampa (`enumerable: false`)
**Симптом.** Alex: «Ни на главной ни в Фильмах нет! Там только Сейчас смотрят, рекомендуем итд».
Плагин добавлен, серверная часть отдаёт всё корректно, а в UI источника нет.
**Диагностика (по возрастанию точности):**
1. `ssh kraken 'sudo ss -tn | grep ":9118"'` — сначала показал **0 соединений** (ложный вывод:
замер сделан в момент старта Lampa). Через 30 с на ТВ:
`netstat -tn | grep 9118` → **1 ESTABLISHED + 6 TIME_WAIT** — Lampa скачала все файлы.
2. Foreground-приложение: `luna-send -n 1 -f luna://com.webos.applicationManager/getForegroundAppInfo {}`
→ `com.lampac.tv`. Запускать надо `launch` с **экранированным JSON в кавычках**,
иначе `errorCode: 2 invalid parameters`.
3. Доступ к отладчику ТВ: **`curl http://192.168.1.70:9998/json`** — webOS отдаёт Chrome
DevTools Protocol на порту 9998 (у `WebAppMgr` в аргументах `--remote-debugging-port=9998`).
Через `websocket` + `Runtime.evaluate` читаются переменные живой Lampa.
4. Ключевой замер: `JSON.stringify(Object.getOwnPropertyDescriptor(Lampa.Api.sources,'Мой список'))`
→ `{"enumerable":false,"configurable":false}`.
**Корень.** В `/lampac/module/Catalog/plugin.js` (строка 59, `loadCatalogs()`, **два вхождения**):
```js
Object.defineProperty(Lampa.Api.sources, key, { get: function(){ return Api; } });
```
Свойство создаётся не-enumerable → `Object.keys()` его не видит → Lampa не рисует источник
в панели выбора. При этом `Api.sources['Мой список']` доступен напрямую и каталог отдаёт.
**Фикс** (одна правка, два вхождения):
```js
Object.defineProperty(Lampa.Api.sources, key,
{ get: function(){ return Api; }, enumerable: true, configurable: true });
```
**Как применять — `plugin.js` живёт в образе, не на HDD!** (проверено:
`docker inspect` не показывает монтирования на `module/Catalog`, монтируются только
`catalog/sites` и `catalog/override`). Правка через `docker exec` **исчезнет при обновлении образа**.
Предложенный путь (на апруве у Alex, 2026-09-22):
```yaml
# docker-compose.yml
volumes:
- ./catalog/plugin.js:/lampac/module/Catalog/plugin.js:ro
```
```bash
# 1. забрать, поправить локально (sed/grep по файлу не применять — только patch)
ssh kraken 'docker exec lampac cat /lampac/module/Catalog/plugin.js' > /tmp/catalog-plugin.js
# 2. бэкап
cp /tmp/catalog-plugin.js /tmp/catalog-plugin.js.bak-$(date +%Y%m%d-%H%M%S)
# 3. правка двух вхождений defineProperty → +enumerable:true,configurable:true
# 4. проверка синтаксиса ПЕРЕД заливкой
node --check /tmp/catalog-plugin.js
# 5. на HDD, добавить volume, пересоздать
scp /tmp/catalog-plugin.js kraken:/srv/.../lampac/catalog/plugin.js
ssh kraken 'cd /srv/.../lampac && docker compose up -d'
# 6. проверка на ТВ: Object.keys(Lampa.Api.sources) должен стать 'tmdb|cub|Мой список'
```
**Откат:** убрать строку volume из compose → `docker compose up -d`. Плюс бэкап файла в `/tmp`.
**Статус: правка НЕ применена** — ждёт апрува Alex (2026-09-22).
## Готовые команды диагностики ТВ (переиспользовать)
```bash
# 1. Что запущено на ТВ (luna-send пишет в tty → нужен script -q -c)
ssh root@192.168.1.70 'script -q -c "luna-send -n 1 -f \
luna://com.webos.applicationManager/getForegroundAppInfo {}" /dev/null'
# 2. Запустить приложение (JSON экранирован И обёрнут в кавычки)
ssh root@192.168.1.70 'script -q -c "luna-send -n 1 -f \
luna://com.webos.applicationManager/launch \"{\\\"id\\\":\\\"com.lampac.tv\\\"}\"" /dev/null'
# 3. Достаёт ли ТВ Кра́кен
ssh root@192.168.1.70 'curl -s -o /dev/null -w "%{http_code} %{time_total}s\n" \
--max-time 8 http://192.168.1.14:9118/catalog'
# 4. Живые соединения с Lampac (на ТВ, не на сервере!)
ssh root@192.168.1.70 'netstat -tn 2>/dev/null | grep 9118'
# 5. DevTools-цель Lampa на ТВ
curl -s --max-time 8 "http://192.168.1.70:9998/json" | /usr/bin/jq -r '.[] | "\(.type): \(.url)"'
```
Скрипты-пробы DevTools: `/tmp/lampa_probe.py` (состояние источника),
`/tmp/lampa_probe3.py` (асинхронный вызов `menu()` каталога).
⚠️ `tcpdump` на Кра́кене **нет** — для съёма трафика ставить не стали, использован
DevTools-подход (дал больше: видно состояние JS, а не только пакеты).
⚠️ `luna://com.webos.service.capture/takeScreenShot` на этом ТВ **не существует**
(`Unknown method`) — скриншот так не снять.
## Файлы реализации (на HDD Кра́кена)
Корень: `/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/lampac/`