You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
New Log window accessible from View → Log or Alt+Cmd+L (Ctrl+Alt+L on 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_provider detection (≥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_rate field, 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_bitrate setting
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_presence ffprobe functions replaced by collect_probe_snapshot
Cached compiled regexes: All regex patterns in the ffmpeg stderr parser use LazyLock for 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: formatArgs in the logger handles Error objects (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 #EXTM3U in response body, not just URL/content-type