v0.2.2 — postertime, Folder Playlist, Encrypted Hardening
Highlights
postertimeattribute — generate a native-resolution poster from any timestamp ("10%","5","1:30","0:01:30") with no explicitposterURL. Isolated thumbnail pipeline, rotation-aware, race-guarded againstsrcswaps.dispose()+ clean playlist flows — tears down the internal player and resets transient UI on everysrcchange, so playlist-style flows never leak state between sources.- Folder Playlist (web demo app) — File System Access API (with
webkitdirectoryfallback), YouTube-style items with thumbnail, duration, HDR chip, codec/quality/size, watched-progress bar, autoplay-next, drag-and-drop multi-file. - Encrypted playback hardening —
EncryptedHttpSourcerewritten: prefetch tuning, concurrent-stream cap, accurate read-cursor reporting, parent position kept in sync. Encrypted-server ported to the new protocol. - Worker security — Referer allowlist on
/proxyand/eproxy, plus magic-byte validation on/proxyresponses to mitigate MIME confusion.
Added
postertimeattribute (timestamp-based poster generation).dispose()method — auto-called on everysrcchange.playinggetter — read-only boolean, precise inverse ofpaused.MoviElement.cleanVideoTitle(filename)static utility.- Folder playlist UI in the web demo app.
Changed
play()queues intent duringisLoadingand flushes on init — matchesHTMLMediaElementbehavior.- Software-decoder fallback no longer sticks across
srcchanges. - Encrypted playback protocol rewritten end-to-end.
- Runtime buffer tuning via the existing
buffersizeattribute (value is megabytes, not seconds — applies to HTTP and encrypted sources). - Production bundles re-enable terser
drop_console+drop_debugger. app:releasescript ties build + R2 upload + worker deploy into one command.
Fixed
- Post-seek A/V sync: cap audio gap at 200ms; sync to video and drop stale audio when first frame arrives late (sparse keyframes / slow HEVC+HDR).
- Pre-play seek position no longer resets to 0 — first-play poster-seek reads
clock.getTime(). - Buffered range reports full duration when the file is fully cached.
- Buffer indicator: collapsed seek-race scan sweep that drew phantom buffered ranges.
- Encrypted thumbnails share the main source instead of opening a parallel session.
- Worker
/proxyretries empty 206 responses before streaming. - Worker probe failures no longer misreported as
415. - TMDb title parser detects TV shows when episode title trails the
SxxExxcode.
Security
- Worker
/proxyand/eproxygated by Referer allowlist. - Worker
/proxyvalidates magic bytes against expected media types.
📦 npm: movi-player@0.2.2
📖 Changelog: CHANGELOG.md