A playback and packaging release: a configurable external player, hard GStreamer dependencies on Linux, tiling window manager support, and frontend logging that survives release builds.
External player
- Added an External player setting. The selected application is launched directly rather than relying on the operating system's
.m3u8file association, which can route the playlist to an unrelated application (#228, ref #223). macOS app bundles and Windows/Linux executables are supported;System Defaultpreserves the previous behaviour - Configured player paths must be absolute, with inline validation errors in Settings
- Launching from a Linux AppImage strips the bundle's runtime environment (
LD_LIBRARY_PATH,GST_PLUGIN_PATH, and 13 related variables) so the external player does not inherit bundled libraries - macOS launches wait for
open -ato hand off and report a failing exit status; Unix children are reaped on a background thread instead of accumulating as zombies - In-app playback stops before the external launch on single-connection playlists, so the two players do not compete for the provider's only slot
Playback
- Xtream HLS, the WebView-native route, is attempted before the two MPEG-TS routes rather than after them, so startup no longer spends both MPEG-TS startup timeouts first
Linux
- gst-plugins-good, gst-plugins-bad, and gst-libav are now hard dependencies of the AUR package, and gstreamer1-plugins-good and gstreamer1-plugins-bad-free of the rpm. WebKitGTK's
createAudioSink()falls back toautoaudiosinkand hitsRELEASE_ASSERT(audioSink)when it is missing, aborting the whole web process on the first play attempt. Arch lists the plugins only as optdepends and Fedora only as weak deps, so either could be absent - Window decorations are hidden by default on tiling window managers (Hyprland, sway, i3), detected from the session's desktop identifiers, with a Linux-only Title bar setting (Automatic / Shown / Hidden) to override the detection in either direction (#226)
Logging
- Release builds no longer suppress frontend INFO and WARN entries, which had hidden expected output such as playlist loading and Xtream connection-limit warnings (#227, ref #224)
- Lifecycle summaries added for playlist loads, scans, quick checks, exports, and saved-playlist operations
- Transient UI notices are mirrored to the log at the severity they are displayed with
- Per-channel scan output consolidated into a single entry, retaining the full stream URL
- Entries emitted before the log window opens are buffered and replayed, so a late-opened window is no longer empty
- A saved playlist whose source fails to reload is reported as a reload warning instead of a save failure
Fixes
- Sorting or filtering scan results could leave virtualized rows keyed to the wrong channel. TanStack Virtual memoizes its key map by callback identity, so the key callback now changes with the ordered results
- Scan results are preserved across hook remounts, including Vite HMR
Settings
- New Advanced option to keep the detected Xtream max-connections notice visible until dismissed, instead of auto-dismissing after eight seconds
Internal
- CI no longer builds release bundles on every change
Full changelog: v1.8.1...v1.9.0