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

This commit is contained in:
Alexey Martemyanov committed 2026-09-22 11:32:59 +06:00
1 parent 3e4ebf70aa
commit 0edc4fe42f
4 files changed
+443 -86

No files matched your search

+188 -29
View File
@@ -7,7 +7,7 @@ related:
- '[[family/projects/watchlist-sync]]'
- '[[family/projects/watchlist-automation]]'
- '[[family/documents/movies-watchlist]]'
status: proposed
status: active
tags:
- lampac
- lampa
@@ -21,16 +21,26 @@ type: plan
updated: '2026-09-22'
---
# Watchlist в UI Lampa — каталог из списка (план)
# Watchlist в UI Lampa — каталог из списка
> Составлен 2026-09-22, переписан после разведки кода Catalog. Ждёт подтверждения Alex.
> Реализовано 2026-09-22. План был переписан после разведки кода модуля Catalog.
> Базовое развёртывание — [[personal/plans/lampac-kraken]] (шаги 1–6 закрыты).
>
> **Итог одной строкой:** Lampac отдаёт `movies-watchlist.md` как каталог Lampa
> через модуль `Catalog` → 4 категории (360/34/3/7 позиций), автообновление кроном 02:30.
> Работает на стороне сервера; на ТВ остаётся добавить плагин
> `http://192.168.1.14:9118/catalog.js` (см. «Что осталось на Alex»).
## Задача
Показывать список фильмов Alex (`family/documents/movies-watchlist.md`) **в UI Lampa на ТВ** — каталогом.
Не локальный плейбэк. Формулировка Alex: «отображение фильмов из списка».
⚠️ **Что НЕ спрашивать повторно.** Задача — **отображение**, не воспроизведение.
Список — это перечень, а не источник видео. Вопрос «а что играть по клику?» —
**выдумка сверх постановки**, Alex на него реагировал раздражением («я чё тебе сказал в постановке задачи»).
Штатное воспроизведение Lampa (торренты/онлайн) работает само, отдельно решать нечего.
## ✅ Затык снят: чем это делается
В образе Lampac уже есть модуль **`Catalog`** — YAML-каталоги → плагин Lampa `/catalog.js`.
@@ -139,35 +149,179 @@ Lampa на ТВ: плагин http://192.168.1.14:9118/catalog.js
**Склоняюсь к (1)** — генерировать `wwwroot/watchlist.json`, Lampac отдаёт его сам, без новых сущностей.
## Что показывать в каталоге
## Обновление каталога — реализовано
Секции берём из самого файла: `## Фильмы`, `## Мультфильмы`, `## Аниме` → три категории меню.
Поля: `name` (название), `year`, `href` (ссылка на Кинопоиск — уже есть в файле как `[название](https://www.kinopoisk.ru/film/NNN/)`),
`image` — постер (можно взять через TMDB-кэш Lampac, `tmdbproxy`).
Скрипт `~/scripts/watchlist-catalog.sh` (root:root, ставить только `sudo install -m 755`):
⚠️ **`href` в файле — ссылка Кинопоиска**, а Lampa ждёт карточку. Отрисовку карточки решает `card_parse`
(в vokino он ходит по `{host}/view/{uri}`). Для нашего случая возможен режим **только список, без карточки** —
проверить на этапе реализации.
1. `python3 $LAMPAC/scripts/gen_watchlist.py <watchlist.md> $LAMPAC/wwwroot/watchlist.json`
2. `docker restart lampac` — **обязательно**, сбрасывает кэш Catalog (см. питфолл 3)
## Обновление каталога
Cron: `30 2 * * *` → лог `~/logs/watchlist-catalog.log`.
Время выбрано после `watchlist-nightly` (01:00) и `watchlist-cleanup` (02:00).
- Генератор дёргать **после** `watchlist-nightly.sh` (уже кроном 01:00 на Кра́кене) — догенерировать JSON
- ⚠️ `watchlist-nightly.sh` в `~/scripts/` — **root:root**, правка только `sudo install -m 755`
- Партия данных меняется (`⬇️`, `[x]`, 👍→перенос) — JSON пересобирать после каждого прогона
Бэкап crontab перед установкой: `~/crontab-backup-20260922-112915.txt`.
## Шаги (черновик, уточняется на этапе реализации)
⚠️ **`watchlist-catalog.sh` сделан отдельной задачей, а не врезан в `watchlist-nightly.sh`.**
Причина: `nightly` — рабочий боевой скрипт, его падение остановило бы весь пайплайн списка.
Отдельный cron падает изолированно.
1. Включить модуль Catalog: `SkipModules` + `catalog: true`, закрепить `init.conf` volume.
2. Смонтировать `module/Catalog/` (или только `sites/` + `override/`) на HDD — чтобы каталоги не терялись.
3. Написать генератор `movies-watchlist.md` → JSON (переиспользовать `parser.py` из watchlist-sync).
4. Положить JSON туда, откуда Lampac отдаёт статику.
5. Написать `sites/watchlist.yaml` по образцу `vokino.yaml`.
6. Подключить на ТВ: Lampa → Настройки → Плагины → `http://192.168.1.14:9118/catalog.js`.
7. **Приёмка:** категории видны в UI Lampa на ТВ, названия совпадают со списком.
## Что осталось на Alex (единственное незакрытое)
Добавить плагин на ТВ — **пультом**, 1 минута:
1. Lampa → **Настройки → Плагины** → добавить URL `http://192.168.1.14:9118/catalog.js`
2. Lampa → **Настройки → Источник** → выбрать **«Мой список»**
Приёмка = категории видны в UI Lampa, названия совпадают с `movies-watchlist.md`.
Автоматизация этого шага по SSH **не проверялась** — см. [[family/how-to/tv-lampac-plugin]]
(там заготовка подхода и питфоллы localStorage).
## Известные ограничения
| Ограничение | Детали |
|---|---|
| **Постеров нет** | `image` пустой. Опционально — тянуть через TMDB-кэш Lampac (`tmdbproxy`) |
| **Карточки нет** | Только список названий. `card_parse` не настроен — Lampa может показывать пустую карточку |
| **`🗓️` upcoming показываются** | Не прячем. Решение Alex не запрашивалось |
| **Перезапуск контейнера** | Каждое обновление каталога = `docker restart lampac` (~30 сек простоя). Кэш не инвалидируется иначе |
## ⚠️ Что проверено, а что нет
**Проверено по HTTP (серверная часть):**
| Проверка | Результат |
|---|---|
| `/catalog.js` по IP | 200, `api_host:'http://192.168.1.14:9118'` |
| Каталог в `/catalog` | «Мой список» в списке каналов |
| JSON-файлы | `watchlist.json` + `watchlist-{films,new,cartoons,anime}.json` — все 200 |
| Выдача по категориям | films 360 · new 34 · cartoons 3 · anime 7 |
| Сортировка | ⭐ → рейтинг ↓ → ужасы |
| Чистота названий | эмодзи-маркеров 0 |
**НЕ проверено:**
- ❌ **UI Lampa на ТВ** — Alex ещё не добавил плагин. Это единственная непроверенная часть.
- ❌ Боевой прогон крона в 02:30 (скрипт отработал вручную успешно).
- ❌ Карточка/постеры в UI.
## Файлы реализации (на HDD Кра́кена)
Корень: `/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/lampac/`
| Путь | Роль |
|---|---|
| `config-module/init.conf` | включает Catalog → `/lampac/init.conf:ro` |
| `catalog/sites/watchlist.yaml` | описание каталога |
| `catalog/override/` | переопределения (пусто) |
| `wwwroot/watchlist.json` | все секции |
| `wwwroot/watchlist-<code>.json` | по файлу на категорию |
| `scripts/gen_watchlist.py` | генератор |
| `docker-compose.yml` | 7 монтирований; бэкапы `.bak-*` |
На хосте: `~/scripts/watchlist-catalog.sh`, лог `~/logs/watchlist-catalog.log`.
## Откат
`catalog: false` + вернуть `Catalog` в `SkipModules`. Ничего в Lampac не патчится.
```bash
# выключить каталог
ssh kraken 'sed -i "s/\"catalog\": true/\"catalog\": false/" \
/srv/.../lampac/config-module/init.conf && docker restart lampac'
# в Lampa убрать плагин catalog.js
# cron: crontab -l | grep -v watchlist-catalog | crontab -
```
Ничего в коде Lampac не патчилось — только конфиг и данные.
## Статус: ✅ РЕАЛИЗОВАНО 2026-09-22
Каталог «Мой список» работает, отдаётся в Lampa через `/catalog.js`.
### Что сделано
| # | Шаг | Результат |
|---|---|---|
| 1 | Включён модуль Catalog | `SkipModules` без Catalog + `catalog: true` → `/catalog.js` 200 |
| 2 | `init.conf` смонтирован | `./config-module/init.conf:/lampac/init.conf:ro` — правится на HDD, не теряется |
| 3 | `sites/` + `override/` смонтированы | `./catalog/sites`, `./catalog/override` |
| 4 | `wwwroot` смонтирован | `./wwwroot` — Lampac сам отдаёт JSON по HTTP |
| 5 | Генератор написан | `lampac/scripts/gen_watchlist.py` |
| 6 | `sites/watchlist.yaml` создан | `lampac/catalog/sites/watchlist.yaml` |
| 7 | Автообновление в cron | `30 2 * * *` → `~/scripts/watchlist-catalog.sh` |
| 8 | Проверка | 4 категории: films 360, new 34, cartoons 3, anime 7 |
### Архитектура (финальная)
```
family/documents/movies-watchlist.md ← источник
│ gen_watchlist.py (свой парсер, ~200 строк)
▼
lampac/wwwroot/watchlist.json ← все секции
lampac/wwwroot/watchlist-<code>.json ← по файлу на категорию
│ Lampac отдаёт wwwroot по HTTP сам
▼
lampac/catalog/sites/watchlist.yaml ← описание для Catalog
│ plugin=watchlist, jsonPath: true, nodes: $.items[*]
▼
Lampa на ТВ: плагин http://192.168.1.14:9118/catalog.js
```
### 🔴 Питфоллы, найденные по ходу (не повторять)
1. **Catalog ВЫБРАСЫВАЕТ элемент с пустым `href`.**
`ListController.cs`: `if (!IsNullOrWhiteSpace(name) && !IsNullOrWhiteSpace(href))`.
Симптом: из 404 позиций отдалось 52 — ровно те, у кого есть ссылка Кинопоиска.
**Фикс:** генератор подставляет fallback-href
`https://www.kinopoisk.ru/index.php?kp_query=<название>`.
2. **Catalog НЕ подставляет `{cat}` в `nodes`.**
JSONPath статичен, отфильтровать секцию внутри одного файла нечем.
Симптом: все категории отдавали весь список (404 вместо 360/34/3/7).
**Фикс:** генератор пишет отдельный плоский файл на категорию
(`watchlist-films.json` и т.д.), `nodes: "$.items[*]"` одинаков для всех.
3. **Кэш Catalog без версии данных.**
Ключ `catalog:{plugin}:{search}:{sort}:{cat}:{page}` — не зависит от содержимого.
Симптом: после перегенерации JSON выдача не менялась.
**Фикс:** `docker restart lampac` в скрипте обновления.
4. **`init.conf` не был смонтирован.**
Файл живёт в образе; правки через `docker exec` теряются при пересоздании.
Правки шли в `current.conf` (сгенерированный) — неверная цель.
**Фикс:** volume `:ro` + свой минимальный `init.conf` (перекрывает `base.conf`).
5. **`api_host` подставляется из запроса** (`{localhost}` → хост, по которому пришли).
По IP `192.168.1.14` отдаёт правильный адрес — специально ничего настраивать не нужно.
6. **Кириллица в inline-jq внутри `ssh '...'`** ломает команду (tirith + quoting).
Выносить в файл или убирать строки с кириллицей.
### Управление
```bash
ssh kraken
cd /srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/lampac
# перегенерировать каталог + сбросить кэш
bash ~/scripts/watchlist-catalog.sh
# логи
tail -f ~/logs/watchlist-catalog.log
# только генератор (без перезапуска)
python3 scripts/gen_watchlist.py \
/home/kraken/obsidian/family/documents/movies-watchlist.md \
wwwroot/watchlist.json
```
### Откат
```bash
# выключить каталог
ssh kraken 'sed -i "s/\"catalog\": true/\"catalog\": false/" \
/srv/.../lampac/config-module/init.conf && docker restart lampac'
# в Lampa убрать плагин catalog.js
```
## Правила отбора и сортировки (утверждено Alex 2026-09-22)
@@ -204,16 +358,21 @@ Lampa на ТВ: плагин http://192.168.1.14:9118/catalog.js
Для строк без рейтинга (например `- [ ] Gods don't give gifts`) — сортировать как `0`, в конец группы.
Опционально: добирать через TMDB (кэш `tmdbproxy` в Lampac) — решить при реализации.
## Открытые вопросы
## Открытые вопросы (не блокируют, решение Alex не запрошено)
1. **Нужна ли карточка** (описание/рейтинг внутри Lampa), или достаточно списка названий с постерами?
2. **Постеры** — тянуть через TMDB-кэш Lampac или не тянуть вовсе?
3. **`🗓️` upcoming** — показывать или прятать? (сейчас по умолчанию показываем)
1. **Постеры** — тянуть через TMDB-кэш Lampac или не тянуть вовсе? Сейчас пустые.
2. **Карточка** — нужна ли (описание/рейтинг внутри Lampa), или достаточно списка названий?
3. **`🗓️` upcoming** — показывать или прятать? Сейчас показываем.
4. **`❓` ambiguous** — сейчас показываем с названием как есть.
Ни один из них **не мешает работе** — каталог отдаётся, категории на месте.
Спрашивать только если Alex сам затронет тему.
## Связанные
- [[personal/plans/lampac-kraken]] — базовое развёртывание
- [[personal/tech/lampac-deployment]] — эксплуатация, порты, питфоллы
- [[personal/plans/lampac-kraken]] — базовое развёртывание (шаги 1–6 сделаны)
- [[personal/tech/lampac-deployment]] — эксплуатация Lampac, модуль Catalog
- [[family/how-to/tv-lampac-plugin]] — подключение плагина на ТВ
- [[family/projects/watchlist-sync]] — парсер списка, CLI
- [[family/projects/watchlist-automation]] — форматы маркеров, cron
- [[family/documents/movies-watchlist]] — источник данных