Skip to content

fix: seek desync + TMDB worker + continue watching UX#8

Merged
ohugonnot merged 6 commits into
masterfrom
feature-loop/player-ux-plyr
Jun 24, 2026
Merged

fix: seek desync + TMDB worker + continue watching UX#8
ohugonnot merged 6 commits into
masterfrom
feature-loop/player-ux-plyr

Conversation

@ohugonnot

Copy link
Copy Markdown
Owner

Changements

player.js — bug seek (arrive au double du temps demandé)

  • Fix S.offset double-count en mode natif : pendant les 4 premières secondes (S.confirmed=null), la réponse keyframe écrasait S.offset avec la cible → realTime() = offset + currentTime = 2×
  • Condition && explicite pour couvrir S.confirmed et S.step indépendamment
  • Reset S.offset = 0 dans le chemin confirmed-native comme filet de sécurité
  • 5 améliorations UX player (patterns Plyr : seekbar hover, time tooltip, volume mémoire, raccourcis clavier, buffered indicator)

functions.php — TMDB worker silencieux

  • find_php_cli() priorise /usr/bin/php8.2 avant /usr/bin/php
  • Sur Debian multi-PHP, /usr/bin/php = PHP 8.4 sans pdo_sqlite → crash silencieux du worker

download.php — section "Reprendre" overflow horizontal

  • Tri par recency (plus récent en premier)
  • Limite à 6 items
  • flex-wrap:wrap à la place du scroll horizontal

tools/tmdb-worker.php — pollution base de données (~11 000 entrées parasites)

  • SKIP_DIRS : skip vendor, node_modules, cache, var, __pycache__ dans la traversée récursive
  • Media check : skip les dossiers sans vidéo ni sous-dossier (ebooks, comics, MP3)

Test plan

  • Seek sur une vidéo native : vérifier que 30 min → arrive à 30 min (pas 1h)
  • Section "Reprendre" : max 6 items, triés par date, pas de scroll horizontal
  • Worker TMDB : php8.2 tools/tmdb-worker.php → doit traiter sans crasher

root added 6 commits June 24, 2026 03:57
- Slide transition (translateY 100%) on fs-hidden controls — no phantom clicks
- Wheel volume at 2% steps with natural scroll inversion (webkitDirectionInvertedFromDevice)
- Auto-hide delay: 2s mouse / 3s touch
- aria-pressed on play/mute/fullscreen buttons, synced via volumechange listener
- Chapter markers (window.CHAPTER_MARKERS) rendered as .seek-marker on seekbar

Tests: 7/7 E2E, 3/3 red-checks confirmed
- player.js: corrige S.offset double-count en mode natif (seek → 2× la cible)
  condition &&-explicite pour couvrir les deux états confirmed/step indépendamment
- functions.php: find_php_cli() priorise le binaire versionné (/usr/bin/php8.2)
  évite de tomber sur /usr/bin/php (PHP 8.4 sans pdo_sqlite) sur Debian multi-PHP
- download.php: "Reprendre" — tri par récence, max 6 items, flex-wrap (no overflow)
- tmdb-worker: discover_folders filtre vendor/node_modules/__pycache__ et les
  dossiers sans vidéo ni sous-dossier (ebooks, comics, MP3 exclus)
… volume >100%

- Seekbar thumbnail preview: PHP endpoint ?keyframe_thumb=T extracts 160×90 JPEG
  via ffmpeg (timeout 8s, 204 on failure). JS debounce 100ms, 5s-rounded cache,
  AbortController, graceful fallback to timecode-only tooltip.

- Double-tap mobile zones: left/right halves ±10s via touchstart double-tap
  (250ms window), .dt-flash animation, no conflict with swipe seek or FS toggle.

- Speed keyboard shortcuts: '.' / '>' = +0.25×, ',' / '<' = −0.25× (range 0.5–2×),
  OSD + localStorage persist, added to keyboard help overlay.

- Volume >100% via WebAudio GainNode: lazy init on first user gesture, scroll wheel
  continues past 100% up to 200%, orange mute icon when amplifying, sb_volume_gain
  persisted in localStorage.
…iscriminant

- download.php : émet Content-Type/Cache-Control uniquement après proc_close,
  évite de cacher une 204 avec des headers image en cas d'échec ffmpeg
- player-ux.spec.ts : patch HTMLVideoElement.prototype.duration au lieu de
  l'instance (non-configurable en headless Chromium) pour rendre le test
  chapter markers réellement discriminant
@ohugonnot ohugonnot merged commit c21ea13 into master Jun 24, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant