• v0.2.6 fe82836f4d

    Media Server v0.2.6
    Lint & Test / test (push) Has been skipped
    Release / create-release (push) Successful in 3s
    Release / build-linux (push) Successful in 30s
    Release / build-windows (push) Successful in 55s
    Stable

    alexei.dolgolyov released this 2026-05-18 03:19:07 +03:00 | 12 commits to master since this release

    v0.2.6 (2026-05-18)

    Features

    • Foreground-window tracker (cross-platform): New /api/foreground endpoint plus live foreground / foreground_update messages on the existing WebSocket feed. Windows uses a ctypes GetForegroundWindow probe with HANDLE-correct argtypes so 64-bit window handles aren't truncated; macOS uses AppKit's NSWorkspace.frontmostApplication; Linux uses Xlib's _NET_ACTIVE_WINDOW (Wayland sessions return a structured "unavailable" so the UI can render gracefully). Each platform has a TTL cache and per-platform fallbacks. (61cdce9)
    • Browser page-title surfacing: When the foreground process is a recognised browser, the window title is stripped of the trailing browser-name suffix and exposed as browser_page_title alongside is_browser. Optional UIA-based URL extraction sits behind the MEDIA_SERVER_BROWSER_UIA env flag (off by default — Chromium browsers keep their accessibility tree dormant unless something asks, and enabling it has a measurable cost). (61cdce9)
    • Foreground card in the Web UI: New editorial card under the monitor list on the Display tab renders process name, window title, fullscreen / minimized / monitor chips, the browser block when applicable, exe path, PID, started-ago, geometry, and platform. 16px inter-section gap matches the Settings cadence. 25 new i18n keys added to both en.json and ru.json. (61cdce9)
    • WebSocket integration: The existing 1s status loop now polls foreground every tick, broadcasts foreground on connect, and emits foreground_update only when user-visible fields actually change — geometry deltas alone don't spam the channel. (61cdce9)

    Security

    • Loopback-by-default in the shipped config: config.example.yaml now defaults host: 127.0.0.1. The server still refuses to bind a non-loopback interface without either api_tokens configured or an explicit allow_lan_without_auth: true opt-in — this hardens fresh installs where a user copies the example config verbatim. (0cf49de)

    Reliability

    • Diagnosable silent boot failures: Pre-uvicorn fatal errors (config parse failures, port conflicts, missing dependencies on Windows) are now mirrored to startup-errors.log in the config directory. Previously, launches via wscript/pythonw (the hidden Startup-folder shortcut path) had no console attached, so any startup crash was effectively invisible — the user just saw "nothing happened". (0cf49de)

    Development / Internal

    • Lint cleanup: Sorted the Xlib import in foreground_service.py so ruff check is clean. Same module, no behaviour change.

    All Commits
    Hash Message Author
    61cdce9 feat(foreground): track topmost process + browser page title alexei.dolgolyov
    0cf49de fix(config): secure-by-default loopback bind and startup-error logging alexei.dolgolyov

    Downloads

    Platform File
    Windows (installer) MediaServer-v0.2.6-setup.exe
    Windows (portable) MediaServer-v0.2.6-win-x64.zip
    Linux MediaServer-v0.2.6-linux-x64.tar.gz
    Downloads