b3f98a5d7d
ci / rust (push) Successful in 2m7s
ci / web (push) Successful in 26s
ci / docs-site (push) Successful in 29s
apple / swift (push) Successful in 1m15s
ci / bench (push) Successful in 1m35s
docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 5s
docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 5s
docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 4s
docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 4s
docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 4s
deb / build-publish (push) Successful in 2m20s
rpm / build-publish (bazzite, punktfunk-fedora-rpm) (push) Successful in 4m52s
docker / deploy-docs (push) Successful in 16s
rpm / build-publish (fedora-44, punktfunk-fedora44-rpm) (push) Successful in 4m23s
A Decky Loader plugin so a Steam Deck / SteamOS box can launch the punktfunk client from Gaming Mode using REAL Steam UI components (it runs inside Steam's CEF, so the panel is built from @decky/ui — the literal Big Picture primitives, not a replica). - Frontend (src/index.tsx, @decky/api + @decky/ui): a Quick Access Menu panel — Refresh → discover hosts, a native list (name, ip:port, pairing flag), tap to connect with a status toast, Disconnect. - Backend (main.py): discover() shells `avahi-browse -rpt _punktfunk._udp` and parses the host's advertised TXT keys (proto/fp/pair/id from discovery.rs), dedup by id preferring IPv4; connect() resolves + spawns `punktfunk-client --connect host:port` (gamescope composites its video like a game), tracking the child; disconnect() terminates it. - Mirrors the current official Decky template (the API moved to @decky/ui + @decky/api). Frontend builds clean (pnpm build → dist/index.js); main.py py_compiles. dist/ + node_modules gitignored — build on the Deck per README. Spike scope: launcher only, runtime untested (no Deck here). Next on this track: the in-stream Quick-Access overlay (volume/disconnect/stats over the running stream) and a fuller real-components UI. Client decode on the AMD Deck is the existing VAAPI path; the host-encode VAAPI gap is separate (NVIDIA host = NVENC). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
185 lines
4.9 KiB
Python
185 lines
4.9 KiB
Python
"""
|
|
This module exposes various constants and helpers useful for decky plugins.
|
|
|
|
* Plugin's settings and configurations should be stored under `DECKY_PLUGIN_SETTINGS_DIR`.
|
|
* Plugin's runtime data should be stored under `DECKY_PLUGIN_RUNTIME_DIR`.
|
|
* Plugin's persistent log files should be stored under `DECKY_PLUGIN_LOG_DIR`.
|
|
|
|
Avoid writing outside of `DECKY_HOME`, storing under the suggested paths is strongly recommended.
|
|
|
|
Some basic migration helpers are available: `migrate_any`, `migrate_settings`, `migrate_runtime`, `migrate_logs`.
|
|
|
|
A logging facility `logger` is available which writes to the recommended location.
|
|
"""
|
|
|
|
__version__ = '1.0.0'
|
|
|
|
import logging
|
|
|
|
from typing import Any
|
|
|
|
"""
|
|
Constants
|
|
"""
|
|
|
|
HOME: str
|
|
"""
|
|
The home directory of the effective user running the process.
|
|
Environment variable: `HOME`.
|
|
If `root` was specified in the plugin's flags it will be `/root` otherwise the user whose home decky resides in.
|
|
e.g.: `/home/deck`
|
|
"""
|
|
|
|
USER: str
|
|
"""
|
|
The effective username running the process.
|
|
Environment variable: `USER`.
|
|
It would be `root` if `root` was specified in the plugin's flags otherwise the user whose home decky resides in.
|
|
e.g.: `deck`
|
|
"""
|
|
|
|
DECKY_VERSION: str
|
|
"""
|
|
The version of the decky loader.
|
|
Environment variable: `DECKY_VERSION`.
|
|
e.g.: `v2.5.0-pre1`
|
|
"""
|
|
|
|
DECKY_USER: str
|
|
"""
|
|
The user whose home decky resides in.
|
|
Environment variable: `DECKY_USER`.
|
|
e.g.: `deck`
|
|
"""
|
|
|
|
DECKY_USER_HOME: str
|
|
"""
|
|
The home of the user where decky resides in.
|
|
Environment variable: `DECKY_USER_HOME`.
|
|
e.g.: `/home/deck`
|
|
"""
|
|
|
|
DECKY_HOME: str
|
|
"""
|
|
The root of the decky folder.
|
|
Environment variable: `DECKY_HOME`.
|
|
e.g.: `/home/deck/homebrew`
|
|
"""
|
|
|
|
DECKY_PLUGIN_SETTINGS_DIR: str
|
|
"""
|
|
The recommended path in which to store configuration files (created automatically).
|
|
Environment variable: `DECKY_PLUGIN_SETTINGS_DIR`.
|
|
e.g.: `/home/deck/homebrew/settings/decky-plugin-template`
|
|
"""
|
|
|
|
DECKY_PLUGIN_RUNTIME_DIR: str
|
|
"""
|
|
The recommended path in which to store runtime data (created automatically).
|
|
Environment variable: `DECKY_PLUGIN_RUNTIME_DIR`.
|
|
e.g.: `/home/deck/homebrew/data/decky-plugin-template`
|
|
"""
|
|
|
|
DECKY_PLUGIN_LOG_DIR: str
|
|
"""
|
|
The recommended path in which to store persistent logs (created automatically).
|
|
Environment variable: `DECKY_PLUGIN_LOG_DIR`.
|
|
e.g.: `/home/deck/homebrew/logs/decky-plugin-template`
|
|
"""
|
|
|
|
DECKY_PLUGIN_DIR: str
|
|
"""
|
|
The root of the plugin's directory.
|
|
Environment variable: `DECKY_PLUGIN_DIR`.
|
|
e.g.: `/home/deck/homebrew/plugins/decky-plugin-template`
|
|
"""
|
|
|
|
DECKY_PLUGIN_NAME: str
|
|
"""
|
|
The name of the plugin as specified in the 'plugin.json'.
|
|
Environment variable: `DECKY_PLUGIN_NAME`.
|
|
e.g.: `Example Plugin`
|
|
"""
|
|
|
|
DECKY_PLUGIN_VERSION: str
|
|
"""
|
|
The version of the plugin as specified in the 'package.json'.
|
|
Environment variable: `DECKY_PLUGIN_VERSION`.
|
|
e.g.: `0.0.1`
|
|
"""
|
|
|
|
DECKY_PLUGIN_AUTHOR: str
|
|
"""
|
|
The author of the plugin as specified in the 'plugin.json'.
|
|
Environment variable: `DECKY_PLUGIN_AUTHOR`.
|
|
e.g.: `John Doe`
|
|
"""
|
|
|
|
DECKY_PLUGIN_LOG: str
|
|
"""
|
|
The path to the plugin's main logfile.
|
|
Environment variable: `DECKY_PLUGIN_LOG`.
|
|
e.g.: `/home/deck/homebrew/logs/decky-plugin-template/plugin.log`
|
|
"""
|
|
|
|
"""
|
|
Migration helpers
|
|
"""
|
|
|
|
|
|
def migrate_any(target_dir: str, *files_or_directories: str) -> dict[str, str]:
|
|
"""
|
|
Migrate files and directories to a new location and remove old locations.
|
|
Specified files will be migrated to `target_dir`.
|
|
Specified directories will have their contents recursively migrated to `target_dir`.
|
|
|
|
Returns the mapping of old -> new location.
|
|
"""
|
|
|
|
|
|
def migrate_settings(*files_or_directories: str) -> dict[str, str]:
|
|
"""
|
|
Migrate files and directories relating to plugin settings to the recommended location and remove old locations.
|
|
Specified files will be migrated to `DECKY_PLUGIN_SETTINGS_DIR`.
|
|
Specified directories will have their contents recursively migrated to `DECKY_PLUGIN_SETTINGS_DIR`.
|
|
|
|
Returns the mapping of old -> new location.
|
|
"""
|
|
|
|
|
|
def migrate_runtime(*files_or_directories: str) -> dict[str, str]:
|
|
"""
|
|
Migrate files and directories relating to plugin runtime data to the recommended location and remove old locations
|
|
Specified files will be migrated to `DECKY_PLUGIN_RUNTIME_DIR`.
|
|
Specified directories will have their contents recursively migrated to `DECKY_PLUGIN_RUNTIME_DIR`.
|
|
|
|
Returns the mapping of old -> new location.
|
|
"""
|
|
|
|
|
|
def migrate_logs(*files_or_directories: str) -> dict[str, str]:
|
|
"""
|
|
Migrate files and directories relating to plugin logs to the recommended location and remove old locations.
|
|
Specified files will be migrated to `DECKY_PLUGIN_LOG_DIR`.
|
|
Specified directories will have their contents recursively migrated to `DECKY_PLUGIN_LOG_DIR`.
|
|
|
|
Returns the mapping of old -> new location.
|
|
"""
|
|
|
|
|
|
"""
|
|
Logging
|
|
"""
|
|
|
|
logger: logging.Logger
|
|
"""The main plugin logger writing to `DECKY_PLUGIN_LOG`."""
|
|
|
|
"""
|
|
Event handling
|
|
"""
|
|
# TODO better docstring im lazy
|
|
async def emit(event: str, *args: Any) -> None:
|
|
"""
|
|
Send an event to the frontend.
|
|
"""
|