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).
62 lines
2.6 KiB
Markdown
62 lines
2.6 KiB
Markdown
# 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.rs` maintains a useful in-process `ManifestState` with guarded
|
|
commands, but `main.rs` only constructs an `Arc`; 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.
|