web: force hls.js archive playback on chromium
This commit is contained in:
parent
cc5cf0be3b
commit
1b300d2e1e
2 changed files with 33 additions and 1 deletions
|
|
@ -219,6 +219,17 @@ async function ensureHlsPlayerCtor() {
|
||||||
return hlsModulePromise;
|
return hlsModulePromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function shouldUseNativeHls(video) {
|
||||||
|
const ua = navigator.userAgent || "";
|
||||||
|
const vendor = navigator.vendor || "";
|
||||||
|
const isIos = /iPhone|iPad|iPod/i.test(ua);
|
||||||
|
const isSafari =
|
||||||
|
/Safari/i.test(ua) &&
|
||||||
|
/Apple/i.test(vendor) &&
|
||||||
|
!/CriOS|FxiOS|EdgiOS|OPiOS|Chrome|Chromium/i.test(ua);
|
||||||
|
return (isIos || isSafari) && Boolean(video.canPlayType("application/vnd.apple.mpegurl"));
|
||||||
|
}
|
||||||
|
|
||||||
async function mountArchivePlayer(name) {
|
async function mountArchivePlayer(name) {
|
||||||
clearPlayerSignals();
|
clearPlayerSignals();
|
||||||
destroyArchivePlayer();
|
destroyArchivePlayer();
|
||||||
|
|
@ -241,7 +252,7 @@ async function mountArchivePlayer(name) {
|
||||||
mount.appendChild(video);
|
mount.appendChild(video);
|
||||||
|
|
||||||
const archiveUrl = `/api/archive/${encodeURIComponent(name)}/master.m3u8`;
|
const archiveUrl = `/api/archive/${encodeURIComponent(name)}/master.m3u8`;
|
||||||
if (video.canPlayType("application/vnd.apple.mpegurl")) {
|
if (shouldUseNativeHls(video)) {
|
||||||
video.src = archiveUrl;
|
video.src = archiveUrl;
|
||||||
void video.play().catch(() => {});
|
void video.play().catch(() => {});
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
21
evolution/proposals/ECP-0074-archive-hls-engine-selection.md
Normal file
21
evolution/proposals/ECP-0074-archive-hls-engine-selection.md
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
# ECP-0074: Archive HLS Engine Selection For Chromium
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
Archive mode currently chooses native HLS whenever `video.canPlayType("application/vnd.apple.mpegurl")` is non-empty.
|
||||||
|
|
||||||
|
Chromium may report support but still fail to actually play event-style fMP4 HLS in this path, leaving the player stuck at `readyState = 0`.
|
||||||
|
|
||||||
|
## Decision
|
||||||
|
|
||||||
|
Use native HLS only on Safari/iOS user agents. For all other browsers (including Chromium), force `hls.js` playback.
|
||||||
|
|
||||||
|
## Why
|
||||||
|
|
||||||
|
- Restores archive playback on Chrome/Chromium.
|
||||||
|
- Keeps Safari native path where it is reliable.
|
||||||
|
- Preserves a single URL and UI flow (`/api/archive/.../master.m3u8`).
|
||||||
|
|
||||||
|
## Reversibility
|
||||||
|
|
||||||
|
Revert the UA gate and return to the previous `canPlayType`-only check.
|
||||||
Loading…
Add table
Add a link
Reference in a new issue