Merge wiki additions into vault files

- wireguard-vpn: add Related notes section
- tv-luna-send: add Common Luna URIs table
- htpc-magic4pc: add WebOS app build/deploy, auto-launch, back key sections
- watchlist-automation: new file (full pipeline overview, migrated from wiki)
- watchlist-discover: update cron jobs (migrated to Kraken 2026-05-27)
This commit is contained in:
Alexey Martemyanov
2026-05-29 15:36:34 +06:00
parent 2ccb7e0a4a
commit 9ba2688a13
5 changed files with 244 additions and 3 deletions
+72
View File
@@ -92,6 +92,78 @@ TV шлёт координаты в пространстве 0–1920 × 0–108
- **Бинарь слетает** после `rpm-ostree upgrade` → пересобрать и скопировать.
- **Display switching** — при смене между `:0` и `:1` xdotool перезапускается. Если переключение происходит часто (мигающие окна) — возможны краткие потери мыши.
## WebOS TV App — сборка и деплой
TV-часть — React/Enact WebOS приложение + Node.js сервис, упакованные в IPK. Исходники: `~/Developer/magic4pc/webos/`.
### Сборка
```bash
cd ~/Developer/magic4pc/webos
NODE_OPTIONS=--openssl-legacy-provider npm run build
```
**Питфолл:** `--openssl-legacy-provider` обязателен — старый webpack несовместим с Node.js 25+.
### Упаковка IPK
```bash
/Users/admin/webOS_TV_SDK/CLI/bin/ares-package dist/ service/ --outdir .
```
**Питфолл:** нужны оба аргумента `dist/` и `service/` — без `service/` Node.js сервис не попадает в IPK.
**Питфолл:** `npm run package` = `ares-package -n` (unsigned) — TV отклоняет неподписанные пакеты. Использовать SDK-команду напрямую.
### Деплой (deploy.sh)
```bash
cd ~/Developer/magic4pc/webos && ./deploy.sh
```
Скрипт: build → package → scp → close → remove → install → launch.
Для install (subscribe mode) — прямой `ssh+script` с polling на `"state":"installed"`.
**Питфолл:** `ares-install` / `ares-launch` ненадёжны — не ждут завершения. Использовать `luna-send dev/install` через script-враппер.
Версия в UI отображается как `1.1.0 (YYYY-MM-DD HH:MM)` — инжектируется webpack через `process.env.BUILD_DATE`.
## Auto-launch при включении / пробуждении TV
Magic4pc запускает настроенное приложение при включении или пробуждении TV.
| Файл | Расположение | Назначение |
|------|-------------|-----------|
| `magic4pc-settings` | PERSISTENT_DIR | ID выбранного приложения |
| `magic4pc-last-app` | PERSISTENT_DIR | Последнее активное приложение |
| `magic4pc-run-state` | `/tmp/` | `running` после первого запуска |
`PERSISTENT_DIR = /media/developer/apps/usr/palm/services/me.wouterdek.magic4pc.service`
Логика:
- **Boot/wake:** `/tmp` очищается → нет `run-state``freshStart=true` → запускает настроенное приложение
- **Ручной запуск:** `run-state=running` уже есть → auto-launch пропускается
`init.d` скрипт на TV (`/var/lib/webosbrew/init.d/magic4pc`) удаляет `run-state` при suspend — wake снова тригерит fresh launch. Редактировать только в репо (`tv-scripts/init.d-magic4pc.sh`), не напрямую на TV.
## WebOS Back Key + системная клавиатура
Когда системная клавиатура открыта, **первый Back** поглощается OS (закрывает клавиатуру) — `keydown` и `onButtonDown` **не стреляют**. Второй Back приходит нормально.
Фикс в `MainPanel.js` (флаг `_kbWasOpen`):
```js
// Input.onActivate:
this._kbWasOpen = true;
// onButtonDown на Back:
if (this.state.wolMacActive || this._kbWasOpen) {
this._kbWasOpen = false;
return; // подавить закрытие панели
}
```
Подходы, которые не работают: `Popup.noAutoDismiss`, timeout-эвристика, polling `document.activeElement` (клавиатура — системный оверлей, фокус не переходит на INPUT).
## Деплой и sudoers
На HTPC настроен sudo без пароля для systemctl:
+14
View File
@@ -40,6 +40,20 @@
Переменная `TV_HOST` переопределяет таргет (default: `root@LGwebOSTV`, alias `root@tv`, IP: `root@192.168.1.75`).
DNS резолвится через роутер (192.168.1.1), см. [[router-bishkek-asus]].
## Common Luna URIs
| URI | Назначение |
|-----|-----------|
| `.../applicationmanager/running` | Список запущенных приложений |
| `.../applicationmanager/closeByAppId` | Закрыть приложение по ID |
| `.../appInstallService/dev/install` | Установить IPK (subscribe) |
| `.../appInstallService/dev/remove` | Удалить приложение |
| `.../applicationManager/launch` | Запустить приложение |
| `.../applicationManager/getForegroundAppInfo` | Текущее активное приложение |
| `...magic4pc.service/query` | Статус сервиса magic4pc |
Полные префиксы: `com.webos.service.applicationmanager`, `com.webos.appInstallService`, `com.webos.applicationManager`.
## Ограничение
`luna-send -i` (subscribe, бесконечный) не работает через враппер. Для install (`dev/install`) используется прямой ssh+script с polling в deploy.sh.
+5
View File
@@ -94,3 +94,8 @@ ssh kraken "sudo wg show"
# Логи auto-connect Eagle
cat /var/log/wg-auto.log
```
## Связанные заметки
- [[kraken-network]] — SSH к Кракену, пути медиаволюмов
- [[personal-os-architecture]] — Eagle hardware, домашняя инфра
+150
View File
@@ -0,0 +1,150 @@
---
created: '2026-05-20'
updated: '2026-05-27'
status: active
tags:
- kraken
- watchlist
- automation
- movies
---
# Watchlist Automation — Полный Flow
Полная цепочка: как `family/documents/movies-watchlist.md` превращается в скачанный контент.
## Полная цепочка
```
[вс 09:00] watchlist-discover ← KP API топ фильмов 2024-2025
↓ добавляет в секцию "Новинки 👍/👎"
movies-watchlist.md
Alex ставит 👍 / 👎
[ежедн 09:00] watchlist-resolve ← SSH Кракен → resolve → commit
[ежедн 10:00] watchlist-sync-down
→ process-thumbs (перемещает 👍 → начало списка)
→ sync-down (добавляет батч в Radarr/Sonarr)
Radarr (7878) / Sonarr (8989)
→ Prowlarr (9696) → RuTracker / Kinozal(M) / NoNaMe / etc.
→ Transmission (9091)
→ /media/movies-radarr или /media/series-sonarr
router.py (Custom Script) → читает жанры из NFO/TMDb
→ symlink в /media/{movies,cartoons,documentaries,...}/
Jellyfin (8096) → rescan → виден контент
```
## Статусы в movies-watchlist.md
| Символ | Значение | Действие |
|--------|---------|---------|
| `[ ]` | не смотрел, в очереди | sync-down добавляет в Radarr/Sonarr |
| `[x]` | просмотрено | sync-up из Jellyfin watched history |
| `⬇️` | добавлено в Radarr/Sonarr | ждёт скачки |
| `👍` | нравится (новинка) | process-thumbs переносит в начало → попадёт в sync-down |
| `👎` | не хочу (новинка) | process-thumbs перемещает в `## Новинки👎` |
| `🗓️` | upcoming (ещё не вышел) | discover помечает, не скачивается |
| `❓` | не найдено / ambiguous | ждёт ручного уточнения |
| `🧟‍♀️` | horror (genre_id=27) | информационный маркер |
## Структура секций movies-watchlist.md
```
## Новинки - 👍/👎 ← discover добавляет сюда
## Фильмы ← основной список, отступ 2 пробела ( - [ ])
## Мультфильмы
## Аниме
## Новинки👎 ← без пробела перед 👎
## Связанные заметки
```
**Важно:** `process_thumbs` автоматически определяет отступ из `## Фильмы` и сохраняет при переносе. `SECTION_THUMBDN = "## Новинки👎"` (без пробела) — должно точно совпадать с заголовком.
## Cron Jobs (на Кракене с 2026-05-27)
Весь watchlist pipeline работает на Кракене (мигрировал с Eagle 2026-05-27).
| Job | Расписание | Скрипт |
|-----|-----------|--------|
| `watchlist-nightly` | ежедн. 01:00 | `~/.hermes/scripts/watchlist-nightly.sh` |
| `watchlist-discover` | вс 09:00 | `~/.hermes/scripts/watchlist-discover.sh` |
**watchlist-nightly.sh** (на Кракене):
1. `sync-vault.sh` (pull) → `process-thumbs --apply``sync-vault.sh` (push)
2. `resolve --recheck --apply``sync-down --apply --batch 5``sync-up --apply``sync-vault.sh` (push)
**Пути на Кракене (HDD UUID 49e8f586-3839-4c5d-a1e1-58bfc3579ade):**
- `/home/kraken/obsidian` → symlink на `/srv/dev-disk-by-uuid-.../obsidian`
- watchlist-sync: `/srv/dev-disk-by-uuid-.../Developer/watchlist-sync`
## Discover — Фильтрация
| Тип | Порог |
|-----|-------|
| Мировые | IMDb ≥ 7.0 или KP ≥ 7.0 |
| Российские | KP ≥ 8.5 (защита от накрутки) |
| Upcoming | год ≥ текущий−1 |
| Минимум голосов | IMDb ≥ 1000 или KP ≥ 500 |
KP API endpoint: `https://api.poiskkino.dev/v1.4/movie` (redirect с api.kinopoisk.dev).
## *arr Stack — Индексеры (Prowlarr)
| ID | Имя | Тип | Примечание |
|----|-----|-----|-----------|
| 1 | RuTracker | semi-private | блокирует при rate limit на сутки |
| 2 | RuTor | public | поиск по imdbid |
| 3 | Byrutor | public | |
| 4 | NoNaMe Club | semi-private | анонимный |
| 5 | Kinozal | semi-private | резерв |
| 6 | Kinozal (M) | semi-private | магнет ✅ — без grab limit, **предпочтительный** |
**Pi-hole питфолл:** блокирует `skyhook.sonarr.tv` → Sonarr/Radarr поиск молча не запускается. Фикс: `dns: [8.8.8.8]` в docker-compose.yml.
## Router Script — Маршрутизация по жанру
После импорта Sonarr/Radarr: `router.py --apply` создаёт symlinks:
- Animation (не R/18+) → `/media/cartoons/` или `/media/cartoons-series/`
- Documentary → `/media/documentaries/` или `/media/documentaries-series/`
- Прочее → `/media/movies/` или `/media/series/`
Копирует NFO + постер рядом с symlink (Jellyfin не видит метадату через symlink напрямую).
## watchlist-sync — Python CLI
Репо: `~/Developer/watchlist-sync` (GitHub: `mallexxx/watchlist-sync`).
```
watchlist-sync resolve — TMDB + KP API → ID, тип (movie/tv)
watchlist-sync sync-down — добавить батч (max 5) в Radarr/Sonarr, поставить ⬇️
watchlist-sync sync-up — Jellyfin watched → [x] в .md
```
**Резолвер:** TMDB `/search/multi` + KP fallback. Пороги: `min_rating: 6.0`, `min_score: 0.75`. При 2+ кандидатах → `❓` (LLM разрешает в cron каждые 6ч, нерешённые → уточнение в Zulip).
**Stage 2 (после ≥50 просмотров):** AI-curated recommendations — три списка (с женой / один / семья) на основе TMDB профиля, добавляются в конец watchlist как `## 🤖 Рекомендации (YYYY-WNN)`.
Jellyfin library mapping: Movies → `movies`, Cartoons → `mixed` (movies + episodes).
## Питфоллы
### KP Markdown Link Parsing Bug
Фильмы из Kinopoisk с синтаксисом `[Title](https://kinopoisk.ru/film/12345/) (2025)` передавались как есть в TMDB search → не находились → помечались `❓` навсегда (`not i.ambiguous` пропускает при следующем запуске). Фикс: commit `2db1ed9` — извлекать plain title из markdown link до передачи в TMDB. Ошибочно помеченные `❓` требуют ручного `--recheck`.
### KP API Endpoint
`api.kinopoisk.dev` редиректит на `api.poiskkino.dev/v1.4/movie`. Использовать destination redirect напрямую.
## Open Tasks (2026-05-20)
- 🟡 Передавать Transmission locations через router script при каждом импорте (сейчас вручную)
- 🔴 rsync невыполненных фильмов с HTPC на Кракен (`Фильмы не перенесенные с htpc на кракен.md`)
- 🟡 Watchlist sync-up: добавить перенесённые фильмы в нужные разделы
## Связанные заметки
- [[watchlist-discover]] — шаг discover: KP API, format, CLI команды
- [[watchlist-sync]] — основной проект (resolve, sync-down, sync-up)
- [[arr-stack-kraken]] — детальные питфоллы *arr стека
- [[jellyfin-transcode-rpi5]] — Jellyfin PGS/ASS питфоллы
+3 -3
View File
@@ -76,12 +76,12 @@ watchlist-sync process-thumbs --apply
---
## Cron jobs (Hermes)
## Cron jobs (Hermes, на Кракене с 2026-05-27)
| Job | Schedule | Действие |
|-----|----------|----------|
| `watchlist-discover` (`6aba6979b8c4`) | вс 09:00 | discover --apply + git commit |
| `watchlist-sync-down` (`7d12b6d48786`) | ежедн. 10:00 | process-thumbs --apply → sync-down --apply |
| `watchlist-discover` | вс 09:00 | discover --apply + git commit (Кракен) |
| `watchlist-nightly` | ежедн. 01:00 | process-thumbs → resolve → sync-down → sync-up (Кракен) |
---