* fix(xtream): open correct channel and category from Ctrl+F live search
Three bugs prevented a live channel clicked from global search (Ctrl+F)
from playing and highlighting correctly in the sidebar:
1. Component reuse on same-route navigation: when the user was already
on the /live route, Angular reused LiveStreamLayoutComponent without
re-running the constructor, so openXtreamLiveItemId was never read
from history state. Fixed by subscribing to NavigationEnd and calling
checkPendingAutoOpenFromState() on every navigation.
2. Early effect firing with wrong content type: the auto-open effect
could fire before syncRouteState set selectedContentType to 'live',
causing the channel to be searched in VOD streams, not found, and
the pending ID cleared. Fixed by guarding on selectedContentType()
=== 'live' before processing.
3. Category filter blocking channel lookup: getVisibleChannels() only
returned channels in the currently selected category, so a channel
from a different category was never found. Fixed by switching to
getAllLiveStreams() (raw liveStreams signal) for the auto-open lookup.
Also sets selectedCategoryId to the opened channel's category so the
sidebar scrolls to the right category and highlights the channel.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(xtream): address PR review feedback on live search auto-open
- Remove redundant constructor call: rely solely on NavigationEnd
subscription to read openXtreamLiveItemId from history state, which
fires after component creation for both initial and re-navigation
- Add explicit setSelectedItem call after auto-open so EPG loading and
remote-control status reflect the playing channel independently of
the constructStreamUrl side-effect
- Add 6 regression tests covering: initial NavigationEnd, category
highlighting, content-type guard, lazy liveStreams loading, missing
channel, and component-reuse re-navigation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds experimental embedded MPV support for Windows and Linux, expands packaging/runtime validation, and updates CI coverage for the cross-platform native addon.
Split EPG IPC orchestration, worker lifecycle, and query logic into focused services. Harden clear-worker lifecycle after review with timeout/exit handling and regression coverage.
Split the Electron external-player IPC monolith into focused launch-context, playback-request, runtime, MPV session, and VLC session modules. Includes Greptile follow-up fixes for Homebrew Cask VLC path resolution and VLC spawn-error promise handling, with regression coverage.