From eb410ecffed7b141f070d7b69b87f2c211efce70 Mon Sep 17 00:00:00 2001 From: Denis Skripchenko Date: Sun, 25 Oct 2026 23:37:27 +0300 Subject: [PATCH 1/2] feat(media): UidVideo, UidAudio, useMediaController and the @dskripchenko/ui/hls adapter - useMediaController: normalised state, commands, hotkeys, one active player per page, resume position, readable localised errors (404 told apart). - UidVideo: sources with fallback and quality menu, scrub bar with buffered ranges, chapters and sprite thumbnails, subtitles drawn by the player, speed/quality/captions menus inside the player (sheet in small players), full screen with the iOS fallback, picture-in-picture, touch gestures, auto-hiding controls. - UidAudio: compact row, mini variant, in-browser waveform (chunked, cached, size-capped, lazy) or precomputed peaks, playlist with auto-advance and Media Session. - @dskripchenko/ui/hls (lazy entry): native HLS where available, otherwise MSE with fMP4/CMAF and MPEG-TS (built-in H.264/AAC transmuxer), AES-128, live playlists, discontinuities, ABR and manual quality, retries. - Real-browser checks (scripts/media-check), docs in en/ru/de/zh, stories. Co-Authored-By: Claude Opus 5.5 --- .changeset/media-players.md | 5 + .gitignore | 1 + README.md | 7 +- docs/de/README.md | 7 +- docs/de/audio.md | 74 ++ docs/de/i18n.md | 3 +- docs/de/video.md | 141 ++++ docs/en/audio.md | 74 ++ docs/en/i18n.md | 3 +- docs/en/video.md | 141 ++++ docs/ru/README.md | 7 +- docs/ru/audio.md | 74 ++ docs/ru/i18n.md | 3 +- docs/ru/video.md | 141 ++++ docs/zh/README.md | 7 +- docs/zh/audio.md | 74 ++ docs/zh/i18n.md | 3 +- docs/zh/video.md | 141 ++++ package.json | 8 + scripts/media-check/app/index.html | 12 + scripts/media-check/app/main.ts | 74 ++ scripts/media-check/check.mjs | 326 ++++++++ scripts/media-check/fixtures.sh | 67 ++ scripts/media-check/screens.mjs | 67 ++ scripts/media-check/server.mjs | 121 +++ src/components/Audio/UidAudio.css | 409 +++++++++ src/components/Audio/UidAudio.spec.ts | 119 +++ src/components/Audio/UidAudio.stories.ts | 80 ++ src/components/Audio/UidAudio.vue | 502 +++++++++++ src/components/Audio/index.ts | 2 + src/components/Media/UidMedia.css | 509 ++++++++++++ src/components/Media/UidMediaMenu.vue | 245 ++++++ src/components/Media/UidMediaScrubber.vue | 299 +++++++ src/components/Media/__testing__/fakeMedia.ts | 41 + src/components/Media/index.ts | 12 + src/components/Media/mediaUtils.spec.ts | 84 ++ src/components/Media/mediaUtils.ts | 153 ++++ .../Media/useMediaController.spec.ts | 164 ++++ src/components/Media/useMediaController.ts | 506 ++++++++++++ src/components/Media/useMediaLocale.ts | 14 + src/components/Media/waveform.spec.ts | 55 ++ src/components/Media/waveform.ts | 153 ++++ src/components/Video/UidVideo.css | 351 ++++++++ src/components/Video/UidVideo.spec.ts | 181 ++++ src/components/Video/UidVideo.stories.ts | 100 +++ src/components/Video/UidVideo.vue | 778 ++++++++++++++++++ src/components/Video/index.ts | 2 + src/hls/__fixtures__/tiny-init.mp4 | Bin 0 -> 1352 bytes src/hls/__fixtures__/tiny-seg.m4s | Bin 0 -> 5750 bytes src/hls/__fixtures__/tiny-ts.bin | Bin 0 -> 11656 bytes src/hls/abr.spec.ts | 57 ++ src/hls/abr.ts | 76 ++ src/hls/aes.ts | 33 + src/hls/engine.ts | 699 ++++++++++++++++ src/hls/index.ts | 14 + src/hls/mp4.spec.ts | 132 +++ src/hls/mp4.ts | 156 ++++ src/hls/playlist.spec.ts | 111 +++ src/hls/playlist.ts | 261 ++++++ src/hls/transmux.ts | 34 + src/hls/ts/adts.ts | 54 ++ src/hls/ts/demux.ts | 150 ++++ src/hls/ts/h264.ts | 185 +++++ src/hls/ts/mp4mux.ts | 175 ++++ src/hls/ts/transmuxer.ts | 198 +++++ src/index.ts | 40 +- src/locales/en.ts | 43 + src/locales/index.ts | 2 +- src/locales/ru.ts | 43 + src/locales/types.ts | 47 ++ tsconfig.build.json | 2 +- vite.config.ts | 1 + 72 files changed, 8838 insertions(+), 15 deletions(-) create mode 100644 .changeset/media-players.md create mode 100644 docs/de/audio.md create mode 100644 docs/de/video.md create mode 100644 docs/en/audio.md create mode 100644 docs/en/video.md create mode 100644 docs/ru/audio.md create mode 100644 docs/ru/video.md create mode 100644 docs/zh/audio.md create mode 100644 docs/zh/video.md create mode 100644 scripts/media-check/app/index.html create mode 100644 scripts/media-check/app/main.ts create mode 100644 scripts/media-check/check.mjs create mode 100755 scripts/media-check/fixtures.sh create mode 100644 scripts/media-check/screens.mjs create mode 100644 scripts/media-check/server.mjs create mode 100644 src/components/Audio/UidAudio.css create mode 100644 src/components/Audio/UidAudio.spec.ts create mode 100644 src/components/Audio/UidAudio.stories.ts create mode 100644 src/components/Audio/UidAudio.vue create mode 100644 src/components/Audio/index.ts create mode 100644 src/components/Media/UidMedia.css create mode 100644 src/components/Media/UidMediaMenu.vue create mode 100644 src/components/Media/UidMediaScrubber.vue create mode 100644 src/components/Media/__testing__/fakeMedia.ts create mode 100644 src/components/Media/index.ts create mode 100644 src/components/Media/mediaUtils.spec.ts create mode 100644 src/components/Media/mediaUtils.ts create mode 100644 src/components/Media/useMediaController.spec.ts create mode 100644 src/components/Media/useMediaController.ts create mode 100644 src/components/Media/useMediaLocale.ts create mode 100644 src/components/Media/waveform.spec.ts create mode 100644 src/components/Media/waveform.ts create mode 100644 src/components/Video/UidVideo.css create mode 100644 src/components/Video/UidVideo.spec.ts create mode 100644 src/components/Video/UidVideo.stories.ts create mode 100644 src/components/Video/UidVideo.vue create mode 100644 src/components/Video/index.ts create mode 100644 src/hls/__fixtures__/tiny-init.mp4 create mode 100644 src/hls/__fixtures__/tiny-seg.m4s create mode 100644 src/hls/__fixtures__/tiny-ts.bin create mode 100644 src/hls/abr.spec.ts create mode 100644 src/hls/abr.ts create mode 100644 src/hls/aes.ts create mode 100644 src/hls/engine.ts create mode 100644 src/hls/index.ts create mode 100644 src/hls/mp4.spec.ts create mode 100644 src/hls/mp4.ts create mode 100644 src/hls/playlist.spec.ts create mode 100644 src/hls/playlist.ts create mode 100644 src/hls/transmux.ts create mode 100644 src/hls/ts/adts.ts create mode 100644 src/hls/ts/demux.ts create mode 100644 src/hls/ts/h264.ts create mode 100644 src/hls/ts/mp4mux.ts create mode 100644 src/hls/ts/transmuxer.ts diff --git a/.changeset/media-players.md b/.changeset/media-players.md new file mode 100644 index 0000000..7637fc4 --- /dev/null +++ b/.changeset/media-players.md @@ -0,0 +1,5 @@ +--- +"@dskripchenko/ui": minor +--- + +Media players without dependencies. `UidVideo` — native `