Files
obsidian-vault/family/how-to/magic4pc-webos.md
T

135 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Magic4PC — WebOS Client
Управление LG MagicRemote как мышью/клавиатурой на HTPC через Bazzite.
## Архитектура
- **TV (WebOS)** — app `me.wouterdek.magic4pc` + JS-сервис `me.wouterdek.magic4pc.service`
- App: React/Enact UI, слушает кнопки пульта, отправляет в сервис через luna
- Сервис: Node.js, бродкастит UDP, принимает подключение от Go-клиента на HTPC
- **HTPC (Bazzite)** — Go-клиент `~/magic4pc/`, сервис `magic4pc.service`
- Получает UDP-пакеты от TV, инжектирует ввод через `/dev/uinput`
- `inputBackKey()` → Esc в gamescope, x1 в KDE
- Репо: https://github.com/mallexxx/magic4pc_altclient (ветка `main`)
## Исходники
| Компонент | Путь |
|-----------|------|
| WebOS UI | `~/Developer/magic4pc/webos/src/views/MainPanel.js` |
| WebOS сервис | `~/Developer/magic4pc/webos/service/m4p_service.js` |
| Go клиент | `~/Developer/magic4pc_altclient/` |
| HTPC бинарник | `~/magic4pc/magic4pc` |
| HTPC сервис | `~/.config/systemd/user/magic4pc.service` (HTPC) |
| run.sh | `~/magic4pc/run.sh` (HTPC) |
## Кнопки пульта (keyCode)
| Код | Кнопка | Действие |
|-----|--------|----------|
| 406 | 🔵 Синяя | Открыть панель настроек |
| 461 | Back | Esc (gamescope) / x1 (KDE) |
| 458 | Guide | системный (не перехватывается) |
| 403 | 🔴 Красная | передаётся на HTPC |
| 415 | Play | передаётся на HTPC |
| 19 | Pause | передаётся на HTPC |
## Панель настроек (синяя кнопка)
- **Статус** — Connected to IP:port / Waiting / Service disabled
- **v1.1.0 (YYYY-MM-DD HH:MM)** — версия + дата сборки справа от статуса
- **Input source** — выбор HDMI входа
- **Enable / Disable** — старт/стоп сервиса
- **Default app on exit** — приложение которое запускается при выходе из magic4pc (None / Last used / конкретное)
- **Show Log / Hide Log** — лог событий и ошибок поверх видео
## Версия сборки
Версия отображается как `1.1.0 (YYYY-MM-DD HH:MM)` — дата инжектируется webpack автоматически при каждой сборке:
```js
// config/webpack.config.js
'process.env.BUILD_DATE': JSON.stringify(new Date().toISOString().slice(0, 16).replace('T', ' '))
```
## Сборка WebOS app
```bash
cd ~/Developer/magic4pc/webos
NODE_OPTIONS=--openssl-legacy-provider npm run build
```
Требует `--openssl-legacy-provider` — старый webpack несовместим с Node 25.
## Сборка IPK
```bash
cd ~/Developer/magic4pc/webos
NODE_OPTIONS=--openssl-legacy-provider npm run build
/Users/admin/webOS_TV_SDK/CLI/bin/ares-package dist/ service/ --outdir .
# Создаёт me.wouterdek.magic4pc_1.1.0_all.ipk
```
> ⚠️ `ares-package dist/ service/` — оба аргумента обязательны, иначе сервис не попадёт в IPK.
> `npm run package` = `ares-package -n` (без подписи) — **не использовать**, TV отклоняет IPK.
## Деплой на TV (192.168.1.75)
TV рутован, SSH без пароля: `ssh root@192.168.1.75`
> ⚠️ `luna-send` через SSH не выводит ответ в stdout — нужен PTY через `script`:
> `ssh root@192.168.1.75 "script -q -c \"luna-send -n 1 -f luna://...\" /tmp/o.txt; cat /tmp/o.txt"`
```bash
# 1. Скопировать IPK на TV
scp me.wouterdek.magic4pc_1.1.0_all.ipk root@192.168.1.75:/tmp/magic4pc.ipk
# 2. Закрыть приложение
ssh root@192.168.1.75 "script -q -c \"luna-send -n 1 -f luna://com.webos.service.applicationmanager/closeByAppId '{\\\"id\\\":\\\"me.wouterdek.magic4pc\\\"}'\" /tmp/o.txt; cat /tmp/o.txt"
# 3. Удалить старую версию
ssh root@192.168.1.75 "script -q -c \"luna-send -n 1 -f luna://com.webos.appInstallService/dev/remove '{\\\"id\\\":\\\"me.wouterdek.magic4pc\\\"}'\" /tmp/o.txt; cat /tmp/o.txt"
# 4. Установить новую (подписанный IPK от ares-package SDK)
ssh root@192.168.1.75 "luna-send -i -f luna://com.webos.appInstallService/dev/install '{\"id\":\"me.wouterdek.magic4pc\",\"ipkUrl\":\"/tmp/magic4pc.ipk\",\"subscribe\":true}' > /tmp/install.txt 2>&1"
sleep 10 && ssh root@192.168.1.75 "cat /tmp/install.txt"
# Ждать state: "installed" в выводе
# 5. Запустить
ssh root@192.168.1.75 "script -q -c \"luna-send -n 1 -f luna://com.webos.applicationManager/launch '{\\\"id\\\":\\\"me.wouterdek.magic4pc\\\"}'\" /tmp/o.txt; cat /tmp/o.txt"
```
### Проверка логов сервиса
```bash
ssh root@192.168.1.75 "script -q -c \"luna-send -n 1 -f luna://me.wouterdek.magic4pc.service/query '{}'\" /tmp/o.txt; cat /tmp/o.txt"
```
Ожидаемый результат: `serviceActive: true`, `broadcastAdsActive: true` (или `isConnected: true` если HTPC подключён), в логах — `listApps: returned N apps`.
## Деплой Go-клиента на HTPC
```bash
cd ~/Developer/magic4pc_altclient
GOOS=linux GOARCH=amd64 go build -o magic4pc_new .
scp magic4pc_new bazzite@192.168.1.86:~/magic4pc/
ssh bazzite@192.168.1.86 "
systemctl --user stop magic4pc
mv ~/magic4pc/magic4pc_new ~/magic4pc/magic4pc
systemctl --user start magic4pc
"
```
## HTPC сервис
```bash
ssh bazzite@192.168.1.86 "systemctl --user status magic4pc"
ssh bazzite@192.168.1.86 "systemctl --user restart magic4pc"
```
> `enable` не используется — autostart через EIM на стороне TV.
## Известные проблемы
- **Guide (458)** — перехватывается WebOS системно, EIM-регистрация не помогает. Нет решения.
- **listApps** — `applicationManager/dev/listApps` недоступен без dev mode. Используется `applicationManager/listApps`.