135 lines
6.1 KiB
Markdown
135 lines
6.1 KiB
Markdown
# 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`.
|