Commit Graph
2568 Commits
Author SHA1 Message Date
4gray ee4567696a fix(ci): declare fontconfig gperf generator 2026-07-17 22:56:47 +02:00
4gray c3a8694036 fix(e2e): satisfy fixture index signature typing 2026-07-17 22:42:37 +02:00
4gray 31dd4d1ecd style(embedded-mpv): format final validation inputs 2026-07-17 22:42:37 +02:00
4gray 0be95b002c test(embedded-mpv): smoke missing bundled libmpv 2026-07-17 22:42:37 +02:00
4gray 99cb0a4dd6 docs(packaging): clarify Linux source release gate 2026-07-17 22:42:37 +02:00
4gray 99e5731beb fix(packaging): strip VCS metadata from source bundle 2026-07-17 22:42:37 +02:00
4gray 0865fdf464 fix(release): gate Snap publish on public source release 2026-07-17 22:42:37 +02:00
4gray 6c74bf2743 fix(packaging): parse Snap trailing comments safely 2026-07-17 22:42:37 +02:00
4gray 28cea7fdb2 docs(embedded-mpv): document Linux runtime distribution 2026-07-17 22:42:37 +02:00
4gray 1477079509 feat(packaging): ship Linux runtime license notices 2026-07-17 22:42:37 +02:00
4gray 601501a4b0 fix(packaging): reject arbitrary Snap YAML aliases 2026-07-17 22:42:37 +02:00
4gray 809182ca06 fix(packaging): reject advanced Snap YAML semantics 2026-07-17 22:42:37 +02:00
4gray 406a20851b fix(embedded-mpv): prioritize trusted Snap GL 2026-07-17 22:42:37 +02:00
4gray 489c9dee89 fix(packaging): reject ambiguous Snap memory metadata 2026-07-17 22:42:37 +02:00
4gray 5b168866e4 fix(packaging): enforce private Snap memory semantics 2026-07-17 22:42:37 +02:00
4gray 4b2e60a0ff fix(embedded-mpv): sanitize Linux helper environment 2026-07-17 22:42:37 +02:00
4gray 08e92d4f27 fix(embedded-mpv): enable private Snap shared memory 2026-07-17 22:42:37 +02:00
4gray cc18cae320 test(packaging): harden Linux package probes 2026-07-17 22:42:37 +02:00
4gray f8794dd0a0 test(embedded-mpv): preserve packaged GL mode 2026-07-17 22:42:37 +02:00
4gray 22079a5986 test(embedded-mpv): harden packaged Linux smoke 2026-07-17 22:42:37 +02:00
4gray 5c49deb77a ci: verify Linux frame-copy packages 2026-07-17 22:42:37 +02:00
4gray 3387f7817d fix(embedded-mpv): harden Linux runtime capability gate 2026-07-17 22:42:37 +02:00
4gray 547291a7e9 docs(embedded-mpv): clarify Linux system runtime baseline 2026-07-17 22:42:36 +02:00
4gray 81918de8ec test(embedded-mpv): smoke packaged Linux frame-copy 2026-07-17 22:42:36 +02:00
4gray 456ba1574b feat(embedded-mpv): probe Linux frame-copy runtime 2026-07-17 22:42:36 +02:00
4gray 9bc8d74f35 docs(embedded-mpv): document Linux frame-copy packaging 2026-07-17 22:42:36 +02:00
4gray f9207a1884 fix(embedded-mpv): pin Linux display data 2026-07-17 22:42:36 +02:00
4gray e8903c86fb fix(packaging): enforce Linux frame-copy isolation 2026-07-17 22:42:36 +02:00
4gray d960997061 fix(embedded-mpv): verify Linux helper linkage 2026-07-17 22:42:36 +02:00
4gray 45c3ab86d6 feat(packaging): ship Linux frame-copy artifacts 2026-07-17 22:42:36 +02:00
4gray 904fc6d3ec fix(embedded-mpv): make Linux runtime portable 2026-07-17 22:42:36 +02:00
4gray 84ff8de04a fix(embedded-mpv): require bundled Linux runtime 2026-07-17 22:42:36 +02:00
4gray 0fb9ee2789 feat(embedded-mpv): build relocatable Linux helper 2026-07-17 22:42:36 +02:00
4gray 95349ec1cb fix(embedded-mpv): pin Linux runtime inputs 2026-07-17 22:42:36 +02:00
4gray e51fdc5286 feat(embedded-mpv): build LGPL Linux runtime 2026-07-17 22:42:36 +02:00
4gray d3a4d4dab8 fix(embedded-mpv): harden Linux runtime staging 2026-07-17 22:42:36 +02:00
4gray 064a72d256 fix(embedded-mpv): require Linux source packages 2026-07-17 22:42:36 +02:00
4gray f643a85eaf feat(embedded-mpv): validate staged Linux runtime 2026-07-17 22:42:36 +02:00
4gray cee65d0b2e fix(packaging): reject inherited profile names 2026-07-17 22:42:36 +02:00
4gray 81f970d281 feat(packaging): define Linux frame-copy profiles 2026-07-17 22:42:36 +02:00
4gray a3fbfb1bdc docs: plan Linux frame-copy packaging 2026-07-17 22:42:36 +02:00
4gray 2877ec59e5 docs: design Linux frame-copy packaging 2026-07-17 22:42:36 +02:00
4gray c6ed504723 feat(playback): add shared picture-in-picture controls (#1199)
* docs(playback): design shared web picture-in-picture

* docs(playback): keep picture-in-picture exit available

* docs(playback): plan shared web picture-in-picture

* feat(playback): add picture-in-picture controls contract

* feat(playback): add shared web picture-in-picture

* feat(playback): expose shared picture-in-picture action

* docs(playback): document shared web picture-in-picture

* test(playback): cover shared picture-in-picture flow

* test(playback): wait for PiP video in Electron E2E

* refactor(playback): extract picture-in-picture controller
2026-07-17 22:11:29 +02:00
4gray beb62db314 feat(settings): add shared web player controls toggle (#1198)
* docs(playback): design shared controls setting

* docs(playback): plan shared controls setting

* feat(settings): persist shared web controls preference

* test(settings): harden shared controls normalization coverage

* feat(settings): expose shared web controls toggle

* fix(settings): label shared controls toggle

* feat(playback): resolve shared controls from settings

* test(playback): cover shared controls setting

* docs(playback): document shared controls preference

* fix(playback): await settings before host creation

* fix(settings): normalize shared controls updates
2026-07-17 13:38:06 +02:00
4grayandLars Emig 48e3736460 feat(artplayer): add feature-flagged shared controls (#1196)
* 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>
2026-07-17 00:12:49 +02:00
4grayandLars Emig 4e572c60ca feat(videojs): add feature-flagged shared controls (#1195)
* 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>
2026-07-16 23:08:18 +02:00
4gray c49ea2f6a8 feat(html-player): add feature-flagged shared controls (#1194)
* feat(html-player): bridge engine state to shared controls

* fix(html-player): avoid HLS subtitle event reentry

* fix(html-player): restore delayed HLS default subtitles

* refactor(html-player): split controls bridge collaborators

* feat(html-player): add feature-flagged shared controls

* test(html-player): cover shared-controls source ownership

* feat(html-player): pass shared-controls playback metadata

* docs(player-controls): describe HTML5 shared-controls bridge

* docs(player-controls): clarify HTML5 rollout effect

* fix(html-player): reveal diagnostics from fullscreen

* fix(html-player): defer HLS event resolution

* refactor(html-player): isolate video element session
2026-07-16 21:30:41 +02:00
4gray f611ea3d7c feat(embedded-mpv): use shared controls for frame-copy (#1193)
* docs(embedded-mpv): plan frame-copy shared controls

* feat(embedded-mpv): adapt frame-copy sessions to shared controls

* fix(embedded-mpv): correlate recording control updates

* fix(embedded-mpv): accept recording ack before command resolve

* fix(embedded-mpv): serialize delayed recording commands

* fix(embedded-mpv): latch buffered recording outcomes

* feat(embedded-mpv): use shared controls for frame-copy

* fix(embedded-mpv): isolate recording ticks by engine

* fix(embedded-mpv): reset controls on engine handoff

* docs(embedded-mpv): document frame-copy shared controls

* docs(embedded-mpv): normalize shared-controls plans

* fix(embedded-mpv): isolate legacy feedback on handoff

* fix(player-controls): block toggles while stalled

* refactor(embedded-mpv): isolate controls timing

* fix(player-controls): reset recording feedback on handoff

* fix(embedded-mpv): preserve newer session snapshots
2026-07-16 18:47:32 +02:00
8f597b44cf refactor(embedded-mpv): split session controller into focused collaborators [2/7] (#1149)
* 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>
2026-07-16 14:13:13 +02:00
aa6ee85d3f feat(player-controls): add shared engine-agnostic controls layer (#1148)
* 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>
2026-07-16 12:56:30 +02:00