Log Window
- New Log window accessible from View → Log or
Alt+Cmd+L(Ctrl+Alt+Lon Windows/Linux) - Shows live application logs from both the Rust backend and frontend in real-time
- Level filter pills (Debug, Info, Warn, Error) to focus on what matters
- Text search, auto-scroll with scroll-to-bottom FAB, and clear button
- Virtualized rendering for performance with 10k+ entries
- Frontend logger calls (
logger.info,.warn,.error) are now bridged to the Rust log system, so all app activity is visible in one place
In-App Player Reliability
- Xtream HLS conversion: MPEG-TS URLs from Xtream servers are automatically converted to their HLS variant (
/live/user/pass/id.m3u8) for reliable playback via hls.js - Localhost streaming proxy: For MPEG-TS streams that can't use the URI scheme proxy (infinite body), a lightweight TCP server on localhost streams bytes through without buffering — works as a fallback when HLS conversion fails
- Stream proxy improvements: URI scheme proxy now drops idle connections immediately (
pool_max_idle_per_host=0) to avoid blocking single-connection IPTV servers - Better error reporting: All playback methods (native HLS, hls.js, mpegts.js, Xtream conversion, streaming proxy) are logged with which method was tried and why it failed
- Stop button fix: Player UI no longer shows as "playing" after a timeout or all-methods-failed error
Scan Diagnostics
- Single-connection diagnostics: For single-provider playlists (Xtream, Stalker), all diagnostics (metadata, screenshot, bitrate profiling) are consolidated into a single ffmpeg process — eliminates 5XX rejections from connection-limited IPTV servers
- Mixed-provider optimization: Multi-host playlists keep the faster parallel flow (ffprobe + screenshot concurrent, then bitrate profiling) since they have no connection limits
- Automatic detection: The approach is selected automatically via
single_providerdetection (≥90% of channels share the same host) - Connection pool management: Scan client disables connection pooling for single-provider playlists so HTTP connections don't linger and block ffmpeg
Bitrate Improvements
- Video stream bitrate from ffprobe: Now extracted from the video stream's
bit_ratefield, not just the format-level bitrate - Always-on format bitrate fallback: Format-level bitrate from ffprobe is used as a fallback regardless of the
profile_bitratesetting - ffmpeg stderr parser: New regex-based parser extracts codec, resolution, fps, audio info, and bitrate from ffmpeg verbose output — used by the combined diagnostics path
Scan Logging
- Per-channel scan log: Each scanned channel now logs
[Scan] #N channel_name → status (bitrate, latency)for easy monitoring in the Log window - Player error logging: External player launch success/failure and in-app playback timeouts are logged
- Playlist loading log: Frontend logs immediately when a playlist starts loading
Code Quality
- Dead code removal: Removed unused
get_stream_info,get_audio_info,get_stream_track_presenceffprobe functions replaced bycollect_probe_snapshot - Cached compiled regexes: All regex patterns in the ffmpeg stderr parser use
LazyLockfor one-time compilation - SSRF protection: Both the URI scheme proxy and localhost streaming proxy validate upstream URLs against private IP ranges
- URL redaction: Xtream credentials and sensitive URL parameters are redacted from logs
- Error formatting:
formatArgsin the logger handlesErrorobjects (stack traces) and circular references gracefully
Other Fixes
- Single-provider playlist detection: Skip scan concurrency warning for mixed-provider playlists
- HLS bitrate profiling: Sum all Statistics lines for HLS streams (playlist + segments)
- Arrow key navigation: Skip auto-play on arrow key navigation during active scan
- Diagnostics semaphore: Clamped to 1 for single-provider playlists to prevent parallel ffmpeg sessions
- HLS manifest detection: Proxy now sniffs
#EXTM3Uin response body, not just URL/content-type