Watch
1
0
Fork
You've already forked SouveraineOS
0
SouveraineOS/docs/tasks/20-player-video-agent.md
Fimeg adce4441cc tasks: log 07-21 findings (culver A/B/D/E, mic wedge, overview, keyboard); add 19-23
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).
2026-07-24 10:21:44 -04:00

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.