* feat(artplayer): add feature-flagged shared controls
Co-authored-by: Lars Emig <lars.emig@pickware.de>
* fix(artplayer): align native type and signal inputs
---------
Co-authored-by: Lars Emig <lars.emig@pickware.de>
* feat(videojs): add feature-flagged shared controls
Rebuild the Video.js shared-controls integration on the current player lifecycle with Tech rebinds, source-scoped tracks, reset ordering, volume preservation, diagnostics gating, and default-off compatibility.
Credits and supersedes the stacked implementation proposed in #1153.
Co-authored-by: Lars Emig <lars.emig@pickware.de>
* fix(videojs): harden MPEG-TS reset lifecycle
---------
Co-authored-by: Lars Emig <lars.emig@pickware.de>
* refactor(embedded-mpv): split session controller into focused collaborators
Mechanical decomposition of the embedded-MPV session controller into
focused collaborators under embedded-mpv-player/:
- embedded-mpv-command-runner.ts: transport/track/recording IPC
delegators with guarded snapshot reconciliation
- embedded-mpv-session-factory.ts: pure placeholder-session factories
(loading/attaching/error) and the startup-paint wait
- embedded-mpv-stalled-tracker.ts: loading-stall timer and stalled flag
- embedded-mpv-compositor.ts: host bounds measurement (measureBounds),
re-exported from embedded-mpv-format.utils for existing imports
No behavior change. The existing embedded-mpv-player component is kept
untouched and keeps working against the controller's unchanged public
API (commands are now bound fields delegating to the runner).
Test coverage extended per Codecov patch report.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* refactor(embedded-mpv): drop superseded overlay hooks
* fix(embedded-mpv): guard async session races
* docs(embedded-mpv): document renderer collaborators
* fix(embedded-mpv): abort stale recording startup
* docs(embedded-mpv): clarify renderer safety details
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: 4gray <serega05@gmail.com>
* feat(player-controls): shared engine-agnostic controls layer (flag off)
Introduce a shared, engine-agnostic player-controls layer in libs/ui/playback
as pure additive library code with no consumers yet.
- Contract (player-controls.model.ts): PlayerControlsCapabilities,
PlayerControlsState, and PlayerControlsCommands make up the
PlayerController interface every engine adapter implements.
- Single presentation component (app-player-controls): one controls UI
binding purely to a PlayerController, with focused helpers for
visibility auto-hide, volume, fullscreen (built-in DOM path), menus,
keyboard shortcuts, seek/volume feedback, and the controls surface.
- Web-video adapter (web-video-controls.adapter.ts + host directive):
drives the contract from an HTMLVideoElement, including optional
HLS.js quality/audio-track integration and series episode navigation.
- Feature flag WEB_PLAYER_SHARED_CONTROLS (web-player-controls.flag.ts)
defaults to OFF; no player component consumes the new layer yet, so
runtime behavior is unchanged.
- docs/architecture/player-controls-contract.md documents the target
architecture (later PRs add the embedded-MPV adapter, immersive
overlay, and host-supplied fullscreen delegate).
Review-driven hardening: the web-video adapter now holds the host
series-navigation signal reactively (updates after setContext are
reflected); the shared controls template is fully localized via
ngx-translate (reusing the EMBEDDED_MPV.PLAYER.* keys); single click on
the viewport toggles play/pause deferred so a double-click still
fullscreens; keyboard shortcuts are shadow-DOM-safe (composedPath) and
guard against duplicate-instance double-execution (defaultPrevented);
and hidden controls now also disable shortcuts.
Test coverage extended per Codecov patch report.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(player-controls): harden shared controls foundation
* fix(player-controls): restore detached adapter state
* fix(player-controls): harden keyboard and adapter state
* fix(player-controls): refresh readiness and hide timers
* fix(player-controls): keep controls root inside surface
* fix(player-controls): hide seek controls for live streams
* fix(player-controls): harden multi-engine control state
* fix(player-controls): respect runtime interaction availability
* fix(player-controls): gate loading toggles and localize mute
* fix(player-controls): harden surface and error states
* fix(player-controls): preserve volume and cursor state
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: 4gray <serega05@gmail.com>