From 9ba2688a137abc36ab2564d1e03dba714378794f Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Fri, 29 May 2026 15:36:34 +0600 Subject: [PATCH] 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) --- family/how-to/htpc-magic4pc.md | 72 ++++++++++++ family/how-to/tv-luna-send.md | 14 +++ family/how-to/wireguard-vpn.md | 5 + family/projects/watchlist-automation.md | 150 ++++++++++++++++++++++++ family/projects/watchlist-discover.md | 6 +- 5 files changed, 244 insertions(+), 3 deletions(-) create mode 100644 family/projects/watchlist-automation.md diff --git a/family/how-to/htpc-magic4pc.md b/family/how-to/htpc-magic4pc.md index 5e89bb4c..db2a8397 100644 --- a/family/how-to/htpc-magic4pc.md +++ b/family/how-to/htpc-magic4pc.md @@ -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: diff --git a/family/how-to/tv-luna-send.md b/family/how-to/tv-luna-send.md index ee90a1dc..c4a10c05 100644 --- a/family/how-to/tv-luna-send.md +++ b/family/how-to/tv-luna-send.md @@ -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. diff --git a/family/how-to/wireguard-vpn.md b/family/how-to/wireguard-vpn.md index e54d1a42..40536ab6 100644 --- a/family/how-to/wireguard-vpn.md +++ b/family/how-to/wireguard-vpn.md @@ -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, домашняя инфра diff --git a/family/projects/watchlist-automation.md b/family/projects/watchlist-automation.md new file mode 100644 index 00000000..b3ac4813 --- /dev/null +++ b/family/projects/watchlist-automation.md @@ -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 питфоллы diff --git a/family/projects/watchlist-discover.md b/family/projects/watchlist-discover.md index 3e0d5702..7d3b6606 100644 --- a/family/projects/watchlist-discover.md +++ b/family/projects/watchlist-discover.md @@ -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 (Кракен) | ---