Force SABR unless is live

This commit is contained in:
WardPearce
2025-05-30 23:22:12 +12:00
parent 9e6bf5af73
commit fd5c516b80
5 changed files with 57 additions and 76 deletions
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "Materialious",
"version": "1.8.6",
"version": "1.8.7",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "Materialious",
"version": "1.8.6",
"version": "1.8.7",
"license": "MIT",
"dependencies": {
"@capacitor-community/electron": "^5.0.0",
+8 -8
View File
@@ -1,12 +1,12 @@
{
"name": "materialious",
"version": "1.8.6",
"version": "1.8.7",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "materialious",
"version": "1.8.6",
"version": "1.8.7",
"hasInstallScript": true,
"dependencies": {
"@capacitor-community/electron": "^5.0.1",
@@ -32,7 +32,7 @@
"media-captions": "^1.0.4",
"mousetrap": "^1.6.5",
"peerjs": "^1.5.4",
"shaka-player": "^4.13.0",
"shaka-player": "^4.11.7",
"sponsorblock-api": "^0.2.4",
"svelte-i18n": "^4.0.1",
"svelte-infinite-loading": "^1.4.0",
@@ -11379,15 +11379,15 @@
}
},
"node_modules/shaka-player": {
"version": "4.13.0",
"resolved": "https://registry.npmjs.org/shaka-player/-/shaka-player-4.13.0.tgz",
"integrity": "sha512-FZToyYl7IXvt1oMEWVbU0tjWJpJ+oSYpUibNMxSqVQx2pLfSBDfEuodGJV+pRgiydYQ58+VFLftAylDx/Qvfdw==",
"version": "4.11.7",
"resolved": "https://registry.npmjs.org/shaka-player/-/shaka-player-4.11.7.tgz",
"integrity": "sha512-jNsdQd4pa24w2QwXHGNBs8MQ33YajYiZclWaSuGt+dLJ7/D9+NG1LJQGnTrGd0G1aDdbEzmEpppG3ic4OsGpyw==",
"license": "Apache-2.0",
"dependencies": {
"eme-encryption-scheme-polyfill": "^2.2.0"
"eme-encryption-scheme-polyfill": "^2.1.5"
},
"engines": {
"node": ">=18"
"node": ">=14"
}
},
"node_modules/sharp": {
+2 -2
View File
@@ -63,7 +63,7 @@
"media-captions": "^1.0.4",
"mousetrap": "^1.6.5",
"peerjs": "^1.5.4",
"shaka-player": "^4.13.0",
"shaka-player": "^4.11.7",
"sponsorblock-api": "^0.2.4",
"svelte-i18n": "^4.0.1",
"svelte-infinite-loading": "^1.4.0",
@@ -71,4 +71,4 @@
"terser": "^5.34.1",
"youtubei.js": "^13.4.0"
}
}
}
@@ -1,31 +1,31 @@
diff --git a/node_modules/shaka-player/dist/shaka-player.compiled.d.ts b/node_modules/shaka-player/dist/shaka-player.compiled.d.ts
index 0971e58..9d5c515 100644
index 19c0930..cc0a3fd 100644
--- a/node_modules/shaka-player/dist/shaka-player.compiled.d.ts
+++ b/node_modules/shaka-player/dist/shaka-player.compiled.d.ts
@@ -5266,3 +5266,5 @@ declare namespace shaka.extern {
@@ -5117,3 +5117,5 @@ declare namespace shaka.extern {
declare namespace shaka.extern {
type TransmuxerPlugin = ( ) => shaka.extern.Transmuxer ;
}
+
+export default shaka;
diff --git a/node_modules/shaka-player/dist/shaka-player.ui.d.ts b/node_modules/shaka-player/dist/shaka-player.ui.d.ts
index 460e009..41bab00 100644
index 1618ca0..a6076c6 100644
--- a/node_modules/shaka-player/dist/shaka-player.ui.d.ts
+++ b/node_modules/shaka-player/dist/shaka-player.ui.d.ts
@@ -6011,3 +6011,5 @@ declare namespace shaka.extern {
declare namespace shaka.ui.Watermark {
type Options = { alpha : number , color : string , displayDuration : number , interval : number , position : string , size : number , skip : number , text : string , transitionDuration : number , type : string } ;
@@ -5830,3 +5830,5 @@ declare namespace shaka.extern {
declare namespace shaka.extern {
type UIVolumeBarColors = { base : string , level : string } ;
}
+
+export default shaka;
diff --git a/node_modules/shaka-player/index.d.ts b/node_modules/shaka-player/index.d.ts
new file mode 100644
index 0000000..79f4829
index 0000000..3ebfd96
--- /dev/null
+++ b/node_modules/shaka-player/index.d.ts
@@ -0,0 +1,2 @@
+<reference path="./dist/shaka-player.compiled.d.ts" />
+<reference path="./dist/shaka-player.ui.d.ts" />
+/// <reference path="./dist/shaka-player.compiled.d.ts" />
+/// <reference path="./dist/shaka-player.ui.d.ts" />
\ No newline at end of file
diff --git a/node_modules/shaka-player/ui.d.ts b/node_modules/shaka-player/ui.d.ts
new file mode 100644
@@ -35,4 +35,5 @@ index 0000000..84a3be0
@@ -0,0 +1,3 @@
+import shaka from 'shaka-player/dist/shaka-player.ui'
+export * from 'shaka-player/dist/shaka-player.ui'
+export default shaka;
+export default shaka;
\ No newline at end of file
+34 -54
View File
@@ -76,7 +76,6 @@
''
);
let isLive = false;
let isPostLiveDVR = false;
let videoPlaybackUstreamerConfig: string | undefined;
let serverAbrStreamingUrl: URL | undefined = undefined;
let drmParams: string | undefined;
@@ -186,16 +185,10 @@
enabled: true,
restrictions: {
maxWidth: 1920,
maxHeight: 1080,
maxBandwidth: data.video.ytjs
? Number(
data.video.ytjs?.video.page[0].player_config?.stream_selection_config.max_bitrate
)
: -1
maxHeight: 1080
}
},
streaming: {
autoLowLatencyMode: true,
bufferingGoal: 120,
rebufferingGoal: 0.01,
bufferBehind: 300,
@@ -262,7 +255,6 @@
if (data.video.fallbackPatch === 'youtubejs' && data.video.ytjs) {
isLive = !!data.video.ytjs.video.basic_info.is_live;
isPostLiveDVR = !!data.video.ytjs.video.basic_info.is_post_live_dvr;
if (
data.video.ytjs.rawApiResponse.data.streamingData &&
@@ -305,6 +297,11 @@
lastActionMs = Date.now();
});
player.addEventListener('error', (event) => {
const error = (event as CustomEvent).detail as shaka.util.Error;
console.error('Player error:', error);
});
const networkingEngine = player.getNetworkingEngine();
if (!networkingEngine) return;
@@ -337,10 +334,7 @@
type === shaka.net.NetworkingEngine.RequestType.SEGMENT &&
url.pathname.includes('videoplayback')
) {
const isUmp = url.searchParams.get('ump') === '1';
const isSabr = url.searchParams.get('sabr') === '1';
if (isSabr) {
if (!isLive) {
const currentFormat = formatList.find(
(format) =>
fromFormat(format) === (new URL(request.uris[0]).searchParams.get('___key') || '')
@@ -493,18 +487,9 @@
// @NOTE: Not a real header. See the http plugin code for more info.
request.headers['X-Streaming-Context'] = btoa(JSON.stringify(sabrStreamingContext));
delete headers.Range;
} else if (isUmp) {
if (!isLive && !isPostLiveDVR) {
url.searchParams.set('ump', '1');
url.searchParams.set('srfvp', '1');
if (headers.Range) {
url.searchParams.set('range', headers.Range?.split('=')[1]);
delete headers.Range;
}
} else {
url.pathname += '/ump/1';
url.pathname += '/srfvp/1';
}
} else {
url.pathname += '/ump/1';
url.pathname += '/srfvp/1';
request.headers['X-Streaming-Context'] = btoa(
JSON.stringify({
@@ -512,23 +497,11 @@
isSABR: false
})
);
url.pathname += '/pot/' + get(poTokenCacheStore);
}
request.method = 'POST';
if (!isSabr) {
request.body = new Uint8Array([120, 0]);
const poToken = get(poTokenCacheStore);
if (poToken) {
// Set Proof of Origin Token
if (isLive || isPostLiveDVR) {
url.pathname += '/pot/' + poToken;
} else {
url.searchParams.set('pot', poToken);
}
}
}
} else if (type == shaka.net.NetworkingEngine.RequestType.LICENSE) {
const wrapped = {} as Record<string, any>;
wrapped.context = data.video.ytjs?.innertube.session.context;
@@ -567,7 +540,7 @@
const sabrStreamingContext = response.headers['X-Streaming-Context'];
if (sabrStreamingContext) {
const { streamInfo, isSABR, format, byteRange } = JSON.parse(
const { streamInfo, format, byteRange } = JSON.parse(
atob(sabrStreamingContext)
) as SabrStreamingContext;
@@ -582,11 +555,8 @@
if (sabrRedirect?.url && !response.data.byteLength) {
let redirectUrl = new URL(sabrRedirect.url);
// For SABR, create a fake URL so we can identify it in the request filter.
if (isSABR) {
serverAbrStreamingUrl = redirectUrl;
redirectUrl = new URL(`https://sabr?___key=${fromFormat(format) || ''}`);
}
serverAbrStreamingUrl = redirectUrl;
redirectUrl = new URL(`https://sabr?___key=${fromFormat(format) || ''}`);
const retryParameters = player!.getConfiguration().streaming.retryParameters;
@@ -596,7 +566,7 @@
);
// Keep range so we can slice the response (only if it's the init segment).
if (isSABR && byteRange) {
if (typeof byteRange !== 'undefined') {
redirectRequest.headers['Range'] = `bytes=${byteRange.start}-${byteRange.end}`;
}
@@ -982,12 +952,6 @@
}
onDestroy(async () => {
HttpFetchPlugin.cacheManager.clearCache();
if (playerElementResizeObserver) {
playerElementResizeObserver.disconnect();
}
if (Capacitor.getPlatform() === 'android') {
if (originalOrigination) {
await StatusBar.setOverlaysWebView({ overlay: false });
@@ -1003,9 +967,25 @@
try {
savePlayerPos();
} catch (error) {}
await player.destroy();
await shakaUi.destroy();
playerPosSet = false;
HttpFetchPlugin.cacheManager.clearCache();
if (playerElementResizeObserver) {
playerElementResizeObserver.disconnect();
}
if (playerElement) {
playerElement.src = '';
playerElement.load();
}
if (player) {
player.destroy();
}
if (shakaUi) {
shakaUi.destroy();
}
});
</script>