mirror of
https://github.com/bytedream/stream-bypass.git
synced 2025-12-12 23:32:06 +01:00
48 lines
1.6 KiB
TypeScript
48 lines
1.6 KiB
TypeScript
import Hls from 'hls.js';
|
|
import { matches, MatchMediaType } from '~/lib/match';
|
|
import { UrlReferer } from '~/lib/settings';
|
|
|
|
async function playNative(url: string, domain: string, videoElem: HTMLVideoElement) {
|
|
await UrlReferer.set(new URL(url).hostname, domain);
|
|
|
|
videoElem.src = url;
|
|
}
|
|
|
|
async function playHls(url: string, domain: string, videoElem: HTMLVideoElement) {
|
|
if (videoElem.canPlayType('application/vnd.apple.mpegurl')) {
|
|
videoElem.src = url;
|
|
} else if (Hls.isSupported()) {
|
|
const hls = new Hls({
|
|
enableWorker: false,
|
|
xhrSetup: async (xhr: XMLHttpRequest, url: string) => {
|
|
await UrlReferer.set(new URL(url).hostname, domain);
|
|
xhr.open('GET', url);
|
|
}
|
|
});
|
|
hls.loadSource(url);
|
|
hls.attachMedia(videoElem);
|
|
} else {
|
|
throw 'Failed to play m3u8 video (hls is not supported). Try again or create a new issue <a href="https://github.com/ByteDream/stream-bypass/issues/new">here</a>';
|
|
}
|
|
}
|
|
|
|
export async function play(videoElem: HTMLVideoElement) {
|
|
const urlQuery = new URLSearchParams(window.location.search);
|
|
const id = urlQuery.get('id') as string;
|
|
const url = decodeURIComponent(urlQuery.get('url') as string);
|
|
const domain = urlQuery.get('domain') as string;
|
|
const type = urlQuery.get('type') as MatchMediaType;
|
|
|
|
const match = matches[id];
|
|
if (match === undefined) {
|
|
throw `Invalid id: ${id}. Please report this <a href="https://github.com/ByteDream/stream-bypass/issues">here</a>`;
|
|
}
|
|
document.title = `Stream Bypass (${domain})`;
|
|
|
|
if (type === MatchMediaType.Hls) {
|
|
await playHls(url, domain, videoElem);
|
|
} else if (type === MatchMediaType.Native) {
|
|
await playNative(url, domain, videoElem);
|
|
}
|
|
}
|