# 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** — версия справа от статуса - **Input source** — выбор HDMI входа - **Enable / Disable** — старт/стоп сервиса - **Autostart** — регистрация в EIM (запуск при переключении на HDMI) - **Show Log / Hide Log** — лог событий и ошибок поверх видео ## Сборка WebOS app ```bash cd ~/Developer/magic4pc/webos NODE_OPTIONS=--openssl-legacy-provider npm run build ``` Требует `--openssl-legacy-provider` — старый webpack несовместим с Node 25. ## Деплой на TV (192.168.1.75) TV рутован, SSH без пароля: `ssh root@192.168.1.75` ### Деплой через 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 . # Деплой на TV scp me.wouterdek.magic4pc_1.1.0_all.ipk root@192.168.1.75:/tmp/magic4pc.ipk ssh root@192.168.1.75 " luna-send -n 1 'luna://com.webos.applicationManager/closeApp' '{\"id\":\"me.wouterdek.magic4pc\"}'; sleep 1 killall -9 node 2>/dev/null; sleep 1 mkdir -p /tmp/m4p_deploy && cd /tmp/m4p_deploy ar x /tmp/magic4pc.ipk mkdir -p data && tar xf data.tar.gz -C data cp data/usr/palm/applications/me.wouterdek.magic4pc/main.js /media/developer/apps/usr/palm/applications/me.wouterdek.magic4pc/ cp data/usr/palm/applications/me.wouterdek.magic4pc/main.css /media/developer/apps/usr/palm/applications/me.wouterdek.magic4pc/ cp data/usr/palm/services/me.wouterdek.magic4pc.service/m4p_service.js /media/developer/apps/usr/palm/services/me.wouterdek.magic4pc.service/ luna-send -n 1 'luna://com.webos.applicationManager/launch' '{\"id\":\"me.wouterdek.magic4pc\"}' echo deployed ok " ``` > ⚠️ `ares-package dist/ service/` — оба аргумента обязательны, иначе сервис не попадёт в IPK. > `killall -9 node` обязателен — WebOS кэширует Node.js сервис в памяти. > Распаковывать IPK в отдельную папку (`/tmp/m4p_deploy`) — иначе `ar x` конфликтует с существующим `debian-binary` в `/tmp`. ### Полная переустановка через ipk (если нужны новые ресурсы/appinfo) ```bash cd ~/Developer/magic4pc/webos /Users/admin/webOS_TV_SDK/CLI/bin/ares-package dist/ --outdir . scp me.wouterdek.magic4pc_1.0.0_all.ipk root@192.168.1.75:/tmp/ ssh root@192.168.1.75 " cd /tmp && ar x me.wouterdek.magic4pc_1.0.0_all.ipk mkdir -p /tmp/ipk_data tar xf data.tar.gz -C /tmp/ipk_data 2>/dev/null || tar xf data.tar.xz -C /tmp/ipk_data cp /tmp/ipk_data/usr/palm/applications/me.wouterdek.magic4pc/main.js \ /media/developer/apps/usr/palm/applications/me.wouterdek.magic4pc/ cp /tmp/ipk_data/usr/palm/services/me.wouterdek.magic4pc.service/m4p_service.js \ /media/developer/apps/usr/palm/services/me.wouterdek.magic4pc.service/ " ``` > ⚠️ `luna://com.webos.appInstallService/dev/install` требует Developer Mode. > TV рутован → прямая копия файлов надёжнее. ### Если изменения не видны (кэш WebOS) WebAppMgr кэширует JS. Помогает: закрыть+открыть через luna. Если нет — перезагрузка TV. ## Деплой 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-регистрация не помогает. Нет решения. - **WebOS кэш** — после scp деплоя иногда нужна перезагрузка TV