1
0
Fork 0
mirror of https://github.com/sussy-code/smov.git synced 2024-12-21 14:47:41 +01:00

Merge pull request #947 from movie-web/fix/#905

Extension: Prepare stream for all domains in a hls playlist
This commit is contained in:
chaos 2024-02-28 16:58:36 +02:00 committed by GitHub
commit cbb699b767
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 38 additions and 4 deletions

View file

@ -7359,6 +7359,7 @@ packages:
/workbox-google-analytics@7.0.0: /workbox-google-analytics@7.0.0:
resolution: {integrity: sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg==} resolution: {integrity: sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg==}
deprecated: It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained
dependencies: dependencies:
workbox-background-sync: 7.0.0 workbox-background-sync: 7.0.0
workbox-core: 7.0.0 workbox-core: 7.0.0

View file

@ -6,6 +6,11 @@ import {
import { isAllowedExtensionVersion } from "@/backend/extension/compatibility"; import { isAllowedExtensionVersion } from "@/backend/extension/compatibility";
import { ExtensionMakeRequestResponse } from "@/backend/extension/plasmo"; import { ExtensionMakeRequestResponse } from "@/backend/extension/plasmo";
export const RULE_IDS = {
PREPARE_STREAM: 1,
SET_DOMAINS_HLS: 2,
};
// for some reason, about 500 ms is needed after // for some reason, about 500 ms is needed after
// page load before the extension starts responding properly // page load before the extension starts responding properly
const isExtensionReady = new Promise<void>((resolve) => { const isExtensionReady = new Promise<void>((resolve) => {

View file

@ -1,6 +1,6 @@
import { Stream } from "@movie-web/providers"; import { Stream } from "@movie-web/providers";
import { setDomainRule } from "@/backend/extension/messaging"; import { RULE_IDS, setDomainRule } from "@/backend/extension/messaging";
function extractDomain(url: string): string | null { function extractDomain(url: string): string | null {
try { try {
@ -36,7 +36,7 @@ function buildHeadersFromStream(stream: Stream): Record<string, string> {
export async function prepareStream(stream: Stream) { export async function prepareStream(stream: Stream) {
await setDomainRule({ await setDomainRule({
ruleId: 1, ruleId: RULE_IDS.PREPARE_STREAM,
targetDomains: extractDomainsFromStream(stream), targetDomains: extractDomainsFromStream(stream),
requestHeaders: buildHeadersFromStream(stream), requestHeaders: buildHeadersFromStream(stream),
}); });

View file

@ -1,6 +1,11 @@
import fscreen from "fscreen"; import fscreen from "fscreen";
import Hls, { Level } from "hls.js"; import Hls, { Level } from "hls.js";
import {
RULE_IDS,
isExtensionActiveCached,
setDomainRule,
} from "@/backend/extension/messaging";
import { import {
DisplayInterface, DisplayInterface,
DisplayInterfaceEvents, DisplayInterfaceEvents,
@ -31,8 +36,8 @@ const levelConversionMap: Record<number, SourceQuality> = {
480: "480", 480: "480",
}; };
function hlsLevelToQuality(level: Level): SourceQuality | null { function hlsLevelToQuality(level?: Level): SourceQuality | null {
return levelConversionMap[level.height] ?? null; return levelConversionMap[level?.height ?? 0] ?? null;
} }
function qualityToHlsLevel(quality: SourceQuality): number | null { function qualityToHlsLevel(quality: SourceQuality): number | null {
@ -144,6 +149,24 @@ export function makeVideoElementDisplayInterface(): DisplayInterface {
if (!hls) return; if (!hls) return;
reportLevels(); reportLevels();
setupQualityForHls(); setupQualityForHls();
if (isExtensionActiveCached()) {
hls.on(Hls.Events.LEVEL_LOADED, async (_, data) => {
const chunkUrlsDomains = data.details.fragments.map(
(v) => new URL(v.url).hostname,
);
const chunkUrls = [...new Set(chunkUrlsDomains)];
await setDomainRule({
ruleId: RULE_IDS.SET_DOMAINS_HLS,
targetDomains: chunkUrls,
requestHeaders: {
...src.preferredHeaders,
...src.headers,
},
});
});
}
}); });
hls.on(Hls.Events.LEVEL_SWITCHED, () => { hls.on(Hls.Events.LEVEL_SWITCHED, () => {
if (!hls) return; if (!hls) return;

View file

@ -28,6 +28,7 @@ export function convertRunoutputToSource(out: {
return { return {
type: "hls", type: "hls",
url: out.stream.playlist, url: out.stream.playlist,
headers: out.stream.headers,
preferredHeaders: out.stream.preferredHeaders, preferredHeaders: out.stream.preferredHeaders,
}; };
} }
@ -50,6 +51,7 @@ export function convertRunoutputToSource(out: {
return { return {
type: "file", type: "file",
qualities, qualities,
headers: out.stream.headers,
preferredHeaders: out.stream.preferredHeaders, preferredHeaders: out.stream.preferredHeaders,
}; };
} }

View file

@ -14,6 +14,7 @@ export type SourceFileStream = {
export type LoadableSource = { export type LoadableSource = {
type: StreamType; type: StreamType;
url: string; url: string;
headers?: Stream["headers"];
preferredHeaders?: Stream["preferredHeaders"]; preferredHeaders?: Stream["preferredHeaders"];
}; };
@ -21,11 +22,13 @@ export type SourceSliceSource =
| { | {
type: "file"; type: "file";
qualities: Partial<Record<SourceQuality, SourceFileStream>>; qualities: Partial<Record<SourceQuality, SourceFileStream>>;
headers?: Stream["headers"];
preferredHeaders?: Stream["preferredHeaders"]; preferredHeaders?: Stream["preferredHeaders"];
} }
| { | {
type: "hls"; type: "hls";
url: string; url: string;
headers?: Stream["headers"];
preferredHeaders?: Stream["preferredHeaders"]; preferredHeaders?: Stream["preferredHeaders"];
}; };