Version checking + preparing streams

This commit is contained in:
mrjvs 2024-01-09 21:56:39 +01:00
parent f70d13f2c9
commit 421186cb54
6 changed files with 68 additions and 4 deletions

View File

@ -0,0 +1,5 @@
const allowedExtensionVersion = ["0.0.1"];
export function isAllowedExtensionVersion(version: string): boolean {
return allowedExtensionVersion.includes(version);
}

View File

@ -3,6 +3,8 @@ import {
sendToBackgroundViaRelay, sendToBackgroundViaRelay,
} from "@plasmohq/messaging"; } from "@plasmohq/messaging";
import { isAllowedExtensionVersion } from "@/backend/extension/compatibility";
let activeExtension = false; let activeExtension = false;
export interface ExtensionHello { export interface ExtensionHello {
@ -35,7 +37,14 @@ export async function sendExtensionRequest(
url: string, url: string,
ops: any, ops: any,
): Promise<ExtensionHello | null> { ): Promise<ExtensionHello | null> {
return sendMessage("proxy-request", { url, ...ops }); return sendMessage("make-request", { url, ...ops });
}
export async function setDomainRule(
domains: string[],
headers: Record<string, string>,
): Promise<ExtensionHello | null> {
return sendMessage("prepare-stream", { domains, headers });
} }
export async function extensionInfo(): Promise<ExtensionHello | null> { export async function extensionInfo(): Promise<ExtensionHello | null> {
@ -47,5 +56,9 @@ export function isExtensionActiveCached(): boolean {
} }
export async function isExtensionActive(): Promise<boolean> { export async function isExtensionActive(): Promise<boolean> {
return !!(await extensionInfo()); const info = await extensionInfo();
if (!info) return false;
const allowedVersion = isAllowedExtensionVersion(info.version);
if (!allowedVersion) return false;
return true;
} }

View File

@ -20,11 +20,11 @@ export type ExtensionRequestReply =
}; };
interface MmMetadata { interface MmMetadata {
"declarative-net-request": { "prepare-stream": {
req: PlasmoRequestBody; req: PlasmoRequestBody;
res: ExtensionRequestReply; res: ExtensionRequestReply;
}; };
"proxy-request": { "make-request": {
req: PlasmoRequestBody; req: PlasmoRequestBody;
res: ExtensionRequestReply; res: ExtensionRequestReply;
}; };

View File

@ -0,0 +1,40 @@
import { Stream } from "@movie-web/providers";
import { setDomainRule } from "@/backend/extension/messaging";
function extractDomain(url: string): string {
try {
const u = new URL(url);
return u.hostname;
} catch {
return url;
}
}
function extractDomainsFromStream(stream: Stream): string[] {
if (stream.type === "hls") {
return [extractDomain(stream.playlist)];
}
if (stream.type === "file") {
return Object.values(stream.qualities).map((v) => extractDomain(v.url));
}
return [];
}
function buildHeadersFromStream(stream: Stream): Record<string, string> {
const headers: Record<string, string> = {};
Object.entries(stream.headers ?? {}).forEach((entry) => {
headers[entry[0]] = entry[1];
});
Object.entries(stream.preferredHeaders ?? {}).forEach((entry) => {
headers[entry[0]] = entry[1];
});
return headers;
}
export async function prepareStream(stream: Stream) {
await setDomainRule(
extractDomainsFromStream(stream),
buildHeadersFromStream(stream),
);
}

View File

@ -5,6 +5,7 @@ import {
} from "@movie-web/providers"; } from "@movie-web/providers";
import { useAsyncFn } from "react-use"; import { useAsyncFn } from "react-use";
import { prepareStream } from "@/backend/extension/streams";
import { import {
connectServerSideEvents, connectServerSideEvents,
makeProviderUrl, makeProviderUrl,
@ -131,6 +132,7 @@ export function useSourceScraping(sourceId: string | null, routerId: string) {
]); ]);
if (result.stream) { if (result.stream) {
await prepareStream(result.stream[0]);
setCaption(null); setCaption(null);
setSource( setSource(
convertRunoutputToSource({ stream: result.stream[0] }), convertRunoutputToSource({ stream: result.stream[0] }),
@ -187,6 +189,7 @@ export function useSourceScraping(sourceId: string | null, routerId: string) {
]); ]);
setSourceId(sourceId); setSourceId(sourceId);
setCaption(null); setCaption(null);
await prepareStream(embedResult.stream[0]);
setSource( setSource(
convertRunoutputToSource({ stream: embedResult.stream[0] }), convertRunoutputToSource({ stream: embedResult.stream[0] }),
convertProviderCaption(embedResult.stream[0].captions), convertProviderCaption(embedResult.stream[0].captions),

View File

@ -5,6 +5,7 @@ import {
} from "@movie-web/providers"; } from "@movie-web/providers";
import { RefObject, useCallback, useEffect, useRef, useState } from "react"; import { RefObject, useCallback, useEffect, useRef, useState } from "react";
import { prepareStream } from "@/backend/extension/streams";
import { import {
connectServerSideEvents, connectServerSideEvents,
getCachedMetadata, getCachedMetadata,
@ -169,6 +170,7 @@ export function useScrape() {
conn.on("update", updateEvent); conn.on("update", updateEvent);
conn.on("discoverEmbeds", discoverEmbedsEvent); conn.on("discoverEmbeds", discoverEmbedsEvent);
const sseOutput = await conn.promise(); const sseOutput = await conn.promise();
if (sseOutput) await prepareStream(sseOutput.stream);
return getResult(sseOutput === "" ? null : sseOutput); return getResult(sseOutput === "" ? null : sseOutput);
} }
@ -184,6 +186,7 @@ export function useScrape() {
discoverEmbeds: discoverEmbedsEvent, discoverEmbeds: discoverEmbedsEvent,
}, },
}); });
if (output) await prepareStream(output.stream);
return getResult(output); return getResult(output);
}, },
[ [