Play direct feed video tap-to-play in the Reader #39

Closed
opened 2026-08-03 18:57:12 +00:00 by TheAnachronism · 2 comments

Parent

Part of #30

Implements docs/specs/reader-media.md.

What to build

In the Reader, play direct remote video files from HTML <video> and from promoted video/* enclosures with tap-to-play, always-on controls, and no autoplay (ignore HTML autoplay). Show a poster when present before the user taps play. Unwrap image-proxy wrappers (e.g. images.weserv.nl / wsrv.nl) when the underlying target is a direct video file so playback uses the real media URL. Dispose/pause players when leaving a Reader page/widget so swipe paging does not keep decoding or playing neighbors. Failed video shows Open media + Open original. Audio enclosures stay chips.

Acceptance criteria

  • HTML <video src> for a direct file appears as an in-app tap-to-play player with controls and no autoplay
  • Poster (when present) shows before first tap; playback does not start on article open or neighbor prefetch
  • Image-proxy-wrapped MP4/WebM URLs unwrap to the underlying video URL before play
  • Leftover video/* enclosures promote to the same tap-to-play UX after the body; consumed/deduped chips stay suppressed
  • Leaving the Reader page / swiping away disposes or pauses the player (no orphaned playback)
  • Horizontal article swipe and vertical scroll still work around the video surface
  • Video failure shows Open media + Open original
  • Audio and other non-video attachments remain chips only

Blocked by

  • Blocked by: #38 Prefer full-res images/GIFs and promote leftover image enclosures in the Reader
## Parent Part of #30 Implements [`docs/specs/reader-media.md`](https://git.anachronis.dev/TheAnachronism/tt-rss-viewer/src/branch/master/docs/specs/reader-media.md). ## What to build In the **Reader**, play direct remote video files from HTML `<video>` and from promoted `video/*` enclosures with **tap-to-play**, always-on controls, and **no autoplay** (ignore HTML `autoplay`). Show a poster when present before the user taps play. Unwrap image-proxy wrappers (e.g. `images.weserv.nl` / `wsrv.nl`) when the underlying target is a direct video file so playback uses the real media URL. Dispose/pause players when leaving a Reader page/widget so swipe paging does not keep decoding or playing neighbors. Failed video shows Open media + Open original. Audio enclosures stay chips. ## Acceptance criteria - [ ] HTML `<video src>` for a direct file appears as an in-app tap-to-play player with controls and no autoplay - [ ] Poster (when present) shows before first tap; playback does not start on article open or neighbor prefetch - [ ] Image-proxy-wrapped MP4/WebM URLs unwrap to the underlying video URL before play - [ ] Leftover `video/*` enclosures promote to the same tap-to-play UX after the body; consumed/deduped chips stay suppressed - [ ] Leaving the Reader page / swiping away disposes or pauses the player (no orphaned playback) - [ ] Horizontal article swipe and vertical scroll still work around the video surface - [ ] Video failure shows Open media + Open original - [ ] Audio and other non-video attachments remain chips only ## Blocked by - Blocked by: #38 Prefer full-res images/GIFs and promote leftover image enclosures in the Reader
Author
Owner

Resolution

Implemented on master (8e7db3e):

  • Planner: unwrap images.weserv.nl / wsrv.nl video wrappers; promote leftover video/* enclosures; dedupe against HTML <video>
  • UI: lib/reader/reader_video.dart — poster → tap-to-play via video_player, progress scrubber, no autoplay, pause on deactivate + dispose on leave; failure card with Open media / Open original
  • Wired via flutter_html <video> TagExtension + promoted video widgets in the Reader body
  • Tests extended in test/reader/reader_media_plan_test.dart
## Resolution Implemented on `master` (`8e7db3e`): - Planner: unwrap `images.weserv.nl` / `wsrv.nl` video wrappers; promote leftover `video/*` enclosures; dedupe against HTML `<video>` - UI: [`lib/reader/reader_video.dart`](https://git.anachronis.dev/TheAnachronism/tt-rss-viewer/src/branch/master/lib/reader/reader_video.dart) — poster → tap-to-play via `video_player`, progress scrubber, no autoplay, pause on deactivate + dispose on leave; failure card with Open media / Open original - Wired via `flutter_html` `<video>` TagExtension + promoted video widgets in the Reader body - Tests extended in [`test/reader/reader_media_plan_test.dart`](https://git.anachronis.dev/TheAnachronism/tt-rss-viewer/src/branch/master/test/reader/reader_media_plan_test.dart)
Author
Owner

Correction: shipped as 0483947 (amended after dropping unused extractVideoPoster).

Correction: shipped as `0483947` (amended after dropping unused `extractVideoPoster`).
Sign in to join this conversation.
No description provided.