Records what the 2026-07-21/22 sessions actually found and shipped, so the ledger matches reality: - TASK-16: A, B, D landed; C (contact card) implemented, phone acceptance pending; new unit E (history-fill boot amnesia) done. - TASK-08: shell-side state projection exists; add the maintenance- lease requirement so a deploy can never race the idle lock again (root cause of the 19:29 auto-lock-during-deploy crash). - TASK-09: stale-lock incident — panel/IRQ alive, session-lock routing stale; capture both in the resume test. - TASK-14: expand to the Auxo-style running-app surface and an unconditional Home tap; folds in the GLES OpacityMask and workspace-ratchet findings. - TASK-17: pin the iOS-like keyboard target and the Hyprland key-safety hammer test. - Mic trace path corrected to its new home. New: TASK-19 (settings control center), TASK-20 (player video + agent control), TASK-21 (reboot-to-Android confirmation), TASK-22 (settings/fullscreen tweaks), TASK-23 (culver locked-notification nudge).
2.6 KiB
TASK 20 — Souveraine Player: video + first-class agent control
Status: open. Repo: ~/Projects/souveraine-player.
Goal
Grow the existing music/Navidrome player into a VLC-class local/network media app without regressing its library, queue, downloads, MPRIS, equalizer or session history. The same first-class app surface must let the agent read live progress, issue guarded controls, and capture the exact decoded frame as an explicit artifact.
What exists
- GStreamer
playbin, audio sink/filter chain, play/pause/seek/volume and a 250ms position/duration poll. - QML now-playing bridge, queue/library/server browsing and MPRIS.
src/manifest.rsmaintains a useful in-processManifestStatewith guarded commands, butmain.rsonly constructs anArc; it is not published over IPC or D-Bus, so it is substrate, not an agent surface.- No video sink/view, subtitles, chapters, stream selection or snapshots.
Work units
A. Video pipeline and QML surface
Give playbin a video sink integrated with Qt/Wayland, prefer hardware decode when available, and keep one source model for local files and authenticated HTTP streams. Handle orientation, aspect fit/fill, fullscreen and audio-only background behavior.
B. Media UX
Timeline/scrub preview, subtitle enable/track/file, audio-track selection, chapters, playback speed, resume position, files/URLs/playlists, rotation and picture modes. Surface buffering/errors instead of leaving the spinner alive.
C. Real app/agent manifest
Publish the existing manifest through the ecosystem's explicit IPC/D-Bus seam.
Report current media, play state, position/duration, buffering, selected
audio/subtitle/chapter, capabilities and last command result. Commands are
guarded and auditable; an in-process Arc alone does not satisfy this unit.
D. Exact frame snapshot
Use an appsink/tee or equivalent decoded-frame path, not screen scraping. Snapshot records media identity, playback timestamp and output artifact path; conversion/encoding must not stall playback. A locked session refuses personal content egress, and agent-triggered capture follows step-up/consent policy.
E. Acceptance matrix
Local + HTTP H.264/H.265 and device-supported codecs, audio-only, subtitle file/embedded tracks, audio switching, chapter/seek, rotation/fullscreen, resume and snapshot timestamp correctness. Verify live manifest cadence and locked/refused behavior on the Pixel 3 as well as desktop.
Connects to
docs/FIRST_CLASS_APPS.md, lock content policy/step-up, TASK-15 network fetcher
and idle behavior, Souveraine shell media card.