From e78395762253ea61ffe3bdc857edc2610417dfbd Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Tue, 22 Sep 2026 12:28:40 +0600 Subject: [PATCH] [2026-09-22] eagle: family/how-to/tv-lampac-plugin.md personal/plans/lampac-watchlist-plugin.md personal/tech/lampac-deployment.md --- family/how-to/tv-lampac-plugin.md | 79 ++++++++-- personal/plans/lampac-watchlist-plugin.md | 168 +++++++++++++++++++--- personal/tech/lampac-deployment.md | 91 +++++++++++- 3 files changed, 298 insertions(+), 40 deletions(-) diff --git a/family/how-to/tv-lampac-plugin.md b/family/how-to/tv-lampac-plugin.md index 05fd2ef5..39046256 100644 --- a/family/how-to/tv-lampac-plugin.md +++ b/family/how-to/tv-lampac-plugin.md @@ -50,21 +50,61 @@ Lampa в webOS использует `localStorage`, который Chromium хр ## 🔴 Пункта «Настройки → Источник» НЕ СУЩЕСТВУЕТ (проверено 2026-09-22) **Не повторять эту ошибку — Alex дважды сказал, что пункта нет.** -Я его выдумал, отвечая «как увидеть списки». Правильный путь ниже — **и он не сработает, -пока не исправлен баг `plugin.js`** (см. следующий раздел). +Я его выдумал, отвечая «как увидеть списки». -В Lampa **нет** отдельного пункта меню для выбора источника каталога. Источник переключается -**прямо из меню каталогов на главной**: +**Правильный путь (Alex нашёл сам 2026-09-22):** +**Настройки → «остальное» → основной источник → «Мой список».** -1. Открыть Lampa на главной странице -2. Встать на любой ряд каталога и нажать **влево** на пульте -3. Слева выедет **панель со списком источников** -4. Выбрать **«Мой список»** и нажать OK -5. Каталог перестроится на watchlist +⚠️ Мой предыдущий вариант («влево на ряду → панель источников») **не подтверждён**. -🔴 **НО:** UI Lampa строит этот список через `Object.keys(Lampa.Api.sources)`. -Плагин Lampac регистрирует источник **не-enumerable** → в панели его **нет**. -Alex именно это и увидел: «Ни на главной ни в Фильмах нет». +⚠️ **При выборе «Мой список» исчезает родной каталог CUB** — это **не баг Lampa**, +а следствие архитектурной ошибки в нашей конфигурации (заполнен блок `menu`). +Разбор и фикс — раздел «🔴 Архитектура: `menu` подменяет каталог» ниже. + +## 🔴 Архитектура: `menu` подменяет каталог, `main` добавляет сверху + +**Что хотел Alex:** + +> «Я предполагал что будет отображаться то что и раньше (список cub) но В НЕГО будет +> сверху добавлено несколько секций в которых будут РЕАЛЬНЫЕ ЭЛЕМЕНТЫ — а не сгенерируют +> пустые заглушки!» + +| Блок YAML | Поведение | +|---|---| +| **`menu`** | ❌ **подменяет** родные разделы (Фильмы/Сериалы/Аниме) — родной каталог **исчезает** | +| **`main`** | ✅ **добавляет секции на главную сверху** — родной каталог **остаётся** | + +Наша конфигурация заполнила **оба** → при выборе источника «Мой список» пропал весь CUB. + +**Фикс:** в `catalog/sites/watchlist.yaml` **убрать `menu`**, оставить только `main`. + +Механика в `plugin.js`: `function menu()` собирает из `catalog.menu`; +`function main()` строит `parts_data` из `catalog.main` и подмешивает в `Lampa.Api.partNext`. + +## 🟡 «Здесь пусто» и нет постеров — потому что данные не из Radarr + +Второй симптом: элементы без превью, при открытии «здесь пусто». +Замер выдачи `/catalog/list?plugin=watchlist&cat=films`: + +| Метрика | Значение | +|---|---| +| Всего позиций | 360 | +| С постером (`img != null`) | **0** | +| С реальным ID (`film/...`) | **18** | + +Причина: генератор парсил `movies-watchlist.md` — **текст названий**, без TMDB ID и постеров. +Остальным 342 подставлялся `href` на **поиск** Кинопоиска → Lampa открывала страницу поиска. + +**Правильный источник — Radarr API** (туда фильмы и добавлялись, там уже есть `tmdbId` +и `images[].remoteUrl`). Alex: «Они уже резолвятся же блядь!! Оно же добавлялось в arr!» + +```bash +curl -sL "http://localhost:7878/api/v3/movie?apikey=$KEY" | jq length # → 50 +# ⚠️ -L обязателен, без него 307 и пустое тело +``` + +Покрытие: Radarr **50** фильмов vs `.md` **360**. Что делать с остальными 310 — открытый +вопрос к Alex. ## 🔴 БАГ: источник не виден в панели (`enumerable: false`) @@ -260,12 +300,21 @@ var plugins_add = [ - Плагин `catalog.js` **добавлен**, `window.plugin_catalog = true`, `appready = true`. - `Storage.field('source')` = `'Мой список'` — источник **выбран**. - `Lampa.Api.sources['Мой список']` **существует** и отдаёт каталог - (`search, movie, cartoons, anime, menu, main`) — **пользоваться каталогом можно**. + (`search, movie, cartoons, anime, menu, main`) — **технически доступен**. - ❌ В панели выбора источника его **нет** — `plugin.js` регистрирует свойство без `enumerable: true`. **Баг в Lampac, не в нашей настройке.** -**Осталось:** смонтировать поправленный `plugin.js` через compose (ждёт апрува Alex). -Полный разбор — [[personal/plans/lampac-watchlist-plugin]], раздел «ГЛАВНЫЙ ПИТФОЛЛ». +**Что переделывается (2026-09-22, после разбора с Alex):** + +1. Убрать блок `menu` из `watchlist.yaml` → вернуть родной каталог CUB, оставить только `main` +2. Переключить источник данных с парсинга `.md` на **Radarr API** → постеры + TMDB ID +3. Смонтировать поправленный `plugin.js` (`enumerable: true`) + +**Ждёт апрува Alex.** Полный разбор — [[personal/plans/lampac-watchlist-plugin]], +раздел «🔴 АРХИТЕКТУРНАЯ ОШИБКА». + +**Скрипт-автоматизация по-прежнему не создана** — и, вероятно, не нужна: источник +переключается через **Настройки → «остальное» → основной источник** (Alex сделал сам). **Скрипт-автоматизация по-прежнему не создана.** Прямая запись в localStorage **не нужна**: проблема оказалась не в настройках Lampa, а в коде плагина. Если автоматизация понадобится — diff --git a/personal/plans/lampac-watchlist-plugin.md b/personal/plans/lampac-watchlist-plugin.md index 194239de..91d1c31e 100644 --- a/personal/plans/lampac-watchlist-plugin.md +++ b/personal/plans/lampac-watchlist-plugin.md @@ -7,7 +7,7 @@ related: - '[[family/projects/watchlist-sync]]' - '[[family/projects/watchlist-automation]]' - '[[family/documents/movies-watchlist]]' -status: active +status: rework tags: - lampac - lampa @@ -16,6 +16,7 @@ tags: - webos - plugin - kraken + - radarr title: Watchlist в UI Lampa — каталог из списка type: plan updated: '2026-09-22' @@ -26,18 +27,122 @@ updated: '2026-09-22' > Реализовано 2026-09-22. План был переписан после разведки кода модуля Catalog. > Базовое развёртывание — [[personal/plans/lampac-kraken]] (шаги 1–6 закрыты). > -> **Итог одной строкой:** Lampac отдаёт `movies-watchlist.md` как каталог Lampa -> через модуль `Catalog` → 4 категории (360/33/3/7 позиций), автообновление кроном 02:30. -> Серверная часть полностью рабочая. **Осталось одно:** в `plugin.js` Lampac баг -> (`defineProperty` без `enumerable:true`) — из-за него источник «Мой список» не виден -> в списке выбора Lampa на ТВ. Фикс готов, ждёт апрува Alex (2026-09-22). -> См. «🔴 ГЛАВНЫЙ ПИТФОЛЛ». +> 🔴 **АРХИТЕКТУРА ПРИЗНАНА НЕВЕРНОЙ 2026-09-22 — переписывается.** +> Сделано `menu` (подмена родных разделов) вместо `main` (секции СВЕРХУ). +> Плюс источник данных — парсинг текстового `.md` вместо **Radarr API**, где уже +> есть TMDB ID и постеры. Alex: «Я предполагал что будет отображаться то что и раньше +> (список cub) но В НЕГО будет сверху добавлено несколько секций в которых будут +> РЕАЛЬНЫЕ ЭЛЕМЕНТЫ - а не сгенерируют пустые заглушки!» +> См. «🔴 АРХИТЕКТУРНАЯ ОШИБКА» — читать ПЕРВЫМ. +> +> **Итог одной строкой:** серверная часть каталога работает (4 категории, 360/33/3/7), +> но реализована не по замыслу: подменяет каталог вместо добавления секций, +> и не использует Radarr как источник постеров/ID. + +## 🔴 АРХИТЕКТУРНАЯ ОШИБКА 2026-09-22 — почему каталог «не работает» + +**Что хотел Alex (дословно):** + +> «Я предполагал что будет отображаться то что и раньше (список cub) но В НЕГО будет +> сверху добавлено несколько секций в которых будут РЕАЛЬНЫЕ ЭЛЕМЕНТЫ — а не сгенерируют +> пустые заглушки! Нахуя это надо то?! Чё блядь значит оно так и должно быть?!» + +**Что сделано вместо этого — две независимые ошибки:** + +### Ошибка 1 — структура: `menu` вместо `main` + +Модуль Catalog умеет **два независимых блока**, и они делают РАЗНОЕ: + +| Блок YAML | Что делает | Поведение | +|---|---|---| +| **`menu`** | **подменяет** родные разделы Lampa (Фильмы/Сериалы/Аниме) | ❌ заполнен → родной каталог исчезает | +| **`main`** | **добавляет секции на главную СВЕРХУ** | ✅ родной каталог остаётся | + +Реализация заполнила **оба** (`menu` и `main`) → при выборе источника «Мой список» +исчез весь CUB-контент. + +**Симптом по словам Alex:** «при его выборе исчезло все что было до этого из списка CUB +во всех разделах. Нет превью.» + +**Фикс:** в `sites/watchlist.yaml` **убрать блок `menu`**, оставить только `main`. +Тогда родной каталог (CUB/tmdb) работает как раньше, а твои секции идут рядами сверху. + +Код: `plugin.js` → `function menu()` собирает из `catalog.menu`; если ключа нет — +`menu` не подменяется (вернётся пустой, Lampa использует родные). `main()` строит +`parts_data` из `catalog.main` и подмешивает их в `Lampa.Api.partNext`. + +### Ошибка 2 — источник данных: парсинг `.md` вместо Radarr API + +Генератор читал `movies-watchlist.md` — **текстовый список названий**. В нём +**нет ни TMDB ID, ни постеров**. Результат: + +| Метрика | Значение | +|---|---| +| Всего позиций (films) | 360 | +| Из них с постером (`img != null`) | **0** | +| Из них с реальным ID (`film/...`) | **18** | + +Остальные 342 отдавались с `id` = **ссылка на поиск Кинопоиска** +(`index.php?kp_query=...`). Отсюда жалоба «при открытии элемента пишет *здесь пусто*»: +Lampa идёт по ссылке, получает страницу поиска, а не фильм. + +**Правильный источник — Radarr API.** Alex: «Они уже резолвятся же блядь!! Оно же +добавлялось в arr!» — TMDB ID и постеры уже есть там, потому что фильмы добавлялись +в Radarr. + +```bash +# API-ключ Radarr +grep -oE "[^<]+" /srv/dev-disk-by-uuid-6194539b-.../docker/radarr/config.xml +# → cbcb8ec320104359920c0f611d503c7b + +# ⚠️ ВАЖНО: -L обязателен! Без него Radarr отдаёт 307, тело пустое +curl -sL "http://localhost:7878/api/v3/movie?apikey=$KEY" | jq length +# → 50 +``` + +**Форма ответа Radarr (то, что нужно было брать с самого начала):** + +```json +{ + "tmdbId": 1292695, + "title": "They Will Kill You", + "year": 2026, + "hasFile": true, + "images": [{"coverType":"poster", + "remoteUrl":"https://image.tmdb.org/t/p/original/6oI4oQKTWMVUlr8Ivqydp28R"}] +} +``` + +Есть **всё**: TMDB ID → рабочий `href`, `remoteUrl` → постер, `title`/`year` → название, +`hasFile` → скачан или нет. Плюс постеры локально: `/config/MediaCover/` (46 каталогов). + +⚠️ **Покрытие:** в Radarr **50 фильмов**, в `.md` — **360**. Разница (310) — то, что +в список записано, но в Radarr не заказано. Что с ними делать — **решение Alex +не получено**, открытый вопрос №1 ниже. + +### Что НЕ надо было делать (записано, чтобы не повторять) + +- Парсить текст вместо API, где данные уже резолвлены +- Складывать `menu` + `main` одновременно +- Считать «список названий» готовым каталогом для UI с постерами + +### Alex: корневая претензия к процессу + +> «А нахуя ты это так реализовал?? Подумать блядь вообще не твое!» + +Разбор: задача звучала как «покажи список в UI» — и была прочитана буквально +(«отдать строки файла»). **Надо было сначала выяснить, откуда брать постеры и ID** +(а ответ — Radarr, куда фильмы и добавлялись), а не начинать с парсера текста. ## Задача Показывать список фильмов Alex (`family/documents/movies-watchlist.md`) **в UI Lampa на ТВ** — каталогом. Не локальный плейбэк. Формулировка Alex: «отображение фильмов из списка». +**Уточнение от 2026-09-22 (важное!):** каталог **добавляется СЕКЦИЯМИ СВЕРХУ** к родному +каталогу Lampa. Родной CUB-контент **не подменяется и не исчезает**. Элементы — **реальные** +фильмы с постерами и карточками, а не пустые заглушки (см. «🔴 АРХИТЕКТУРНАЯ ОШИБКА»). + ⚠️ **Что НЕ спрашивать повторно.** Задача — **отображение**, не воспроизведение. Список — это перечень, а не источник видео. Вопрос «а что играть по клику?» — **выдумка сверх постановки**, Alex на него реагировал раздражением («я чё тебе сказал в постановке задачи»). @@ -167,18 +272,21 @@ Cron: `30 2 * * *` → лог `~/logs/watchlist-catalog.log`. Причина: `nightly` — рабочий боевой скрипт, его падение остановило бы весь пайплайн списка. Отдельный cron падает изолированно. -## Что осталось (единственное незакрытое) +## Что осталось — ПЕРЕДЕЛКА (после признания архитектуры неверной) -**Не шаг Alex, а правка сервера.** Плагин на ТВ уже добавлен и **источник уже выбран** -(`Storage.field('source') = 'Мой список'`). Проблема — баг в `plugin.js` Lampac -(см. «🔴 ГЛАВНЫЙ ПИТФОЛЛ»): источник не виден в UI из-за `enumerable: false`. +| # | Шаг | Статус | +|---|---|---| +| 1 | Генератор берёт данные **из Radarr API** (`localhost:7878/api/v3/movie`), а не парсит текст | ⏳ ждёт апрува | +| 2 | Подставлять в `id` → `tmdbId`, в `img` → `images[].remoteUrl` (постер), `year` → `year` | ⏳ | +| 3 | Из `sites/watchlist.yaml` **убрать блок `menu`**, оставить `main` → родной CUB остаётся | ⏳ | +| 4 | Постеры кэшировать локально (Radarr `MediaCover/` или проксировать через `tmdbproxy`) | ⏳ | +| 5 | Фикс `plugin.js` (`enumerable:true`) — **отдельная независимая правка**, см. ниже | ⏳ ждёт апрува | -**Ждёт апрува Alex** (2026-09-22): смонтировать поправленный `plugin.js` через compose. +**Порядок:** шаги 1–4 закрывают жалобу «пустые заглушки + исчез CUB». +Шаг 5 — про то, что источника вообще не видно в списке выбора. -Путь на ТВ, который раньше писался («влево → панель → выбрать источник») — **не сработает**, -пока баг не исправлен: в панели источника просто нет. - -Приёмка = категории видны в UI Lampa, названия совпадают с `movies-watchlist.md`. +Приёмка (формулировка Alex): **родной список CUB на месте, сверху добавлены ряды +с реальными фильмами из списка, у элементов есть постеры и рабочие карточки.** ## Диагностический скрипт для ТВ (`/tmp/lampa_probe.py`) @@ -497,15 +605,33 @@ ssh kraken 'sed -i "s/\"catalog\": true/\"catalog\": false/" \ Для строк без рейтинга (например `- [ ] Gods don't give gifts`) — сортировать как `0`, в конец группы. Опционально: добирать через TMDB (кэш `tmdbproxy` в Lampac) — решить при реализации. -## Открытые вопросы (не блокируют, решение Alex не запрошено) +## Открытые вопросы — БЛОКИРУЮЩИЕ (2026-09-22, ждут решения Alex) -1. **Постеры** — тянуть через TMDB-кэш Lampac или не тянуть вовсе? Сейчас пустые. -2. **Карточка** — нужна ли (описание/рейтинг внутри Lampa), или достаточно списка названий? +1. **Что делать с 310 фильмами, которых нет в Radarr?** + В `.md` — 360, в Radarr — 50. У 310 нет TMDB ID и постера. + Варианты: (а) показывать только 50 из Radarr; (б) добирать остальные через TMDB-search + (часть названий найдётся криво: «девять» → не то); (в) показывать заглушкой без постера. + **Без решения шаг 1 переделки не начать.** +2. **Нужны 4 секции или одна?** Секции «Фильмы / Новинки / Мультфильмы / Аниме» + или одна «Мой список» сверху. Вопрос задан, ответа нет. + +## Открытые вопросы (не блокируют) + +1. **Постеры** — тянуть через TMDB-кэш Lampac, через Radarr `MediaCover/`, или `remoteUrl` CDN? +2. **Карточка** — `card_parse` не настроен. С реальным TMDB ID карточка должна + подтянуться штатным механизмом Lampa — проверить после переделки. 3. **`🗓️` upcoming** — показывать или прятать? Сейчас показываем. 4. **`❓` ambiguous** — сейчас показываем с названием как есть. -Ни один из них **не мешает работе** — каталог отдаётся, категории на месте. -Спрашивать только если Alex сам затронет тему. +## ⚠️ Отменённые/ошибочные указания (не повторять) + +- ❌ **«Настройки → Источник»** — такого пункта в Lampa **не существует**. Выдумано, + Alex не нашёл. Источник переключается в разделе «остальное → основной источник» + (Alex нашёл сам 2026-09-22). +- ❌ **«влево → панель источников»** — тоже не подтверждено. +- ❌ **`plugins_add` в `lampainit.js`** — это серверные плагины Lampac + (`tmdbproxy.js`, `cubproxy.js`, `online.js`, `catalog.js`…), а **не** список плагинов Lampa. + `catalog.js` там есть при `"catalog": true` в init.conf. ## Связанные diff --git a/personal/tech/lampac-deployment.md b/personal/tech/lampac-deployment.md index 77da9e62..1254d51b 100644 --- a/personal/tech/lampac-deployment.md +++ b/personal/tech/lampac-deployment.md @@ -198,6 +198,93 @@ Configure complete ← HTTP начинает отвечать Плагин на ТВ: `http://192.168.1.14:9118/catalog.js` → источник «Мой список». +⏳ **Переделывается (2026-09-22).** Текущая реализация признана неверной: заполнен +блок `menu` (подменяет родной каталог CUB вместо добавления секций сверху), а данные +берутся парсингом `.md` вместо **Radarr API** (в `.md` нет TMDB ID и постеров). +Разбор ошибки — [[personal/plans/lampac-watchlist-plugin]], секция «🔴 АРХИТЕКТУРНАЯ ОШИБКА». + +### 🔴 `menu` vs `main` — принципиальная разница + +| Блок YAML | Что делает | +|---|---| +| `menu` | **подменяет** родные разделы Lampa (Фильмы/Сериалы/Аниме) → родной каталог исчезает | +| `main` | **добавляет секции на главную СВЕРХУ** → родной каталог остаётся | + +Заполнять нужно **только `main`**, если задача — «добавить ряды к родному каталогу». +`plugin.js` → `function menu()` собирает из `catalog.menu`; `function main()` строит +`parts_data` из `catalog.main` и подмешивает в `Lampa.Api.partNext`. + +### ⚠️ Баг Lampac: источник не виден в списке выбора + +`plugin.js`, строка 59 (`loadCatalogs()`), **два вхождения**: + +```js +Object.defineProperty(Lampa.Api.sources, key, { get: function(){ return Api; } }); +``` + +`defineProperty` по умолчанию `enumerable: false` → `Object.keys(Lampa.Api.sources)` +не перечисляет источник → Lampa не рисует его в панели выбора. При этом +`Api.sources['Мой список']` работает напрямую и каталог отдаёт. + +**Фикс:** `{ get: ..., enumerable: true, configurable: true }`. + +`plugin.js` живёт **в образе**, не на HDD (`docker inspect` — монтируются только +`catalog/sites` и `catalog/override`). Правка через `docker exec` теряется при +пересоздании. Постоянный путь — volume: + +```yaml +volumes: + - ./catalog/plugin.js:/lampac/module/Catalog/plugin.js:ro +``` + +Проверка синтаксиса ПЕРЕД заливкой: `node --check /tmp/catalog-plugin.js`. +Статус: **не применено**, ждёт апрува Alex. + +### Radarr как источник данных (постеры, TMDB ID) + +Фильмы уже резолвлены в Radarr — там есть TMDB ID и постеры. Это **правильный +источник** для каталога; `.md` их не содержит. + +```bash +# API-ключ +grep -oE "[^<]+" /srv/dev-disk-by-uuid-6194539b-.../docker/radarr/config.xml + +# ⚠️ -L обязателен, иначе 307 и пустое тело +curl -sL "http://localhost:7878/api/v3/movie?apikey=$KEY" | jq length # → 50 +``` + +Поля ответа: `tmdbId`, `title`, `year`, `hasFile`, `images[].remoteUrl` (постер TMDB), +`images[].coverType == "poster"`. Кэш постеров на диске: Radarr `/config/MediaCover/`. + +## Занятые порты на Кра́кене (2026-09-22) +`7878` Radarr · `8096` Jellyfin · `8191` FlareSolverr · `8989` Sonarr · `9000` Portainer · +`9091` Transmission · `9696` Prowlarr · `51413` Transmission (UDP) · **`9118` Lampac** + +## Отладка UI Lampa на ТВ (webOS) + +Правки по SSH не сделать, но **состояние читается** через Chrome DevTools Protocol: + +```bash +# webOS отдаёт DevTools на порту 9998 (WebAppMgr --remote-debugging-port=9998) +curl -s http://192.168.1.70:9998/json | jq -r '.[] | "\(.type): \(.url)"' +# → file:///.../com.lampac.tv/index.html?card=...&source=cub +``` + +Дальше `websocket` + `Runtime.evaluate` читает живые переменные: + +| Выражение | Что даёт | +|---|---| +| `Lampa.Storage.field('source')` | выбранный источник | +| `Object.keys(Lampa.Api.sources).join('\|')` | перечисляемые источники | +| `Object.getOwnPropertyDescriptor(Lampa.Api.sources,'Мой список')` | `enumerable`/`configurable` | +| `Lampa.Api.sources['Мой список'].getCatalog()` | ключи каталога | + +Скрипты-пробы: `/tmp/lampa_probe.py`, `/tmp/lampa_probe2.py`, `/tmp/lampa_probe3.py`. + +⚠️ `tcpdump` на Кра́кене **нет**. `luna://com.webos.service.capture/takeScreenShot` +на этом ТВ **не существует**. `luna-send` пишет в tty → нужен `script -q -c`. +Подробности: [[family/how-to/tv-lampac-plugin]]. + ### Общее про модуль | Что | Как | @@ -235,10 +322,6 @@ Proxy, SISI, Sync, Telemetry, Tracks, Transcoding, WebLog`. Полный пример YAML (`vokino.yaml`): `docker exec lampac cat /lampac/module/Catalog/sites/vokino.yaml`. -## Занятые порты на Кра́кене (2026-09-22) -`7878` Radarr · `8096` Jellyfin · `8191` FlareSolverr · `8989` Sonarr · `9000` Portainer · -`9091` Transmission · `9696` Prowlarr · `51413` Transmission (UDP) · **`9118` Lampac** - Выбор порта — `docker compose config` + `sudo ss -tlnp` перед деплоем. ## Интеграция с Lampa (ТВ) — ✅ СДЕЛАНО 2026-09-22