Add cdn replacements

This commit is contained in:
mrjvs 2023-12-27 23:39:32 +01:00
parent 8619fe9780
commit adddb84417
4 changed files with 27 additions and 4 deletions

View File

@ -12,6 +12,7 @@ import {
SourceQuality, SourceQuality,
getPreferredQuality, getPreferredQuality,
} from "@/stores/player/utils/qualities"; } from "@/stores/player/utils/qualities";
import { processCdnLink } from "@/utils/cdn";
import { import {
canChangeVolume, canChangeVolume,
canFullscreen, canFullscreen,
@ -101,7 +102,7 @@ export function makeVideoElementDisplayInterface(): DisplayInterface {
function setupSource(vid: HTMLVideoElement, src: LoadableSource) { function setupSource(vid: HTMLVideoElement, src: LoadableSource) {
if (src.type === "hls") { if (src.type === "hls") {
if (canPlayHlsNatively(vid)) { if (canPlayHlsNatively(vid)) {
vid.src = src.url; vid.src = processCdnLink(src.url);
vid.currentTime = startAt; vid.currentTime = startAt;
return; return;
} }
@ -151,12 +152,12 @@ export function makeVideoElementDisplayInterface(): DisplayInterface {
} }
hls.attachMedia(vid); hls.attachMedia(vid);
hls.loadSource(src.url); hls.loadSource(processCdnLink(src.url));
vid.currentTime = startAt; vid.currentTime = startAt;
return; return;
} }
vid.src = src.url; vid.src = processCdnLink(src.url);
vid.currentTime = startAt; vid.currentTime = startAt;
} }

View File

@ -8,6 +8,7 @@ import {
DisplayMeta, DisplayMeta,
} from "@/components/player/display/displayInterface"; } from "@/components/player/display/displayInterface";
import { LoadableSource } from "@/stores/player/utils/qualities"; import { LoadableSource } from "@/stores/player/utils/qualities";
import { processCdnLink } from "@/utils/cdn";
import { import {
canChangeVolume, canChangeVolume,
canFullscreen, canFullscreen,
@ -112,7 +113,7 @@ export function makeChromecastDisplayInterface(
metaData.title = meta.title; metaData.title = meta.title;
const mediaInfo = new chrome.cast.media.MediaInfo("video", type); const mediaInfo = new chrome.cast.media.MediaInfo("video", type);
(mediaInfo as any).contentUrl = source.url; (mediaInfo as any).contentUrl = processCdnLink(source.url);
mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED; mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED;
mediaInfo.metadata = metaData; mediaInfo.metadata = metaData;
mediaInfo.customData = { mediaInfo.customData = {

View File

@ -18,6 +18,7 @@ interface Config {
BACKEND_URL: string; BACKEND_URL: string;
DISALLOWED_IDS: string; DISALLOWED_IDS: string;
TURNSTILE_KEY: string; TURNSTILE_KEY: string;
CDN_REPLACEMENTS: string;
} }
export interface RuntimeConfig { export interface RuntimeConfig {
@ -32,6 +33,7 @@ export interface RuntimeConfig {
BACKEND_URL: string; BACKEND_URL: string;
DISALLOWED_IDS: string[]; DISALLOWED_IDS: string[];
TURNSTILE_KEY: string | null; TURNSTILE_KEY: string | null;
CDN_REPLACEMENTS: Array<string[]>;
} }
const env: Record<keyof Config, undefined | string> = { const env: Record<keyof Config, undefined | string> = {
@ -46,6 +48,7 @@ const env: Record<keyof Config, undefined | string> = {
BACKEND_URL: import.meta.env.VITE_BACKEND_URL, BACKEND_URL: import.meta.env.VITE_BACKEND_URL,
DISALLOWED_IDS: import.meta.env.VITE_DISALLOWED_IDS, DISALLOWED_IDS: import.meta.env.VITE_DISALLOWED_IDS,
TURNSTILE_KEY: import.meta.env.VITE_TURNSTILE_KEY, TURNSTILE_KEY: import.meta.env.VITE_TURNSTILE_KEY,
CDN_REPLACEMENTS: import.meta.env.VITE_CDN_REPLACEMENTS,
}; };
// loads from different locations, in order: environment (VITE_{KEY}), window (public/config.js) // loads from different locations, in order: environment (VITE_{KEY}), window (public/config.js)
@ -84,5 +87,9 @@ export function conf(): RuntimeConfig {
.split(",") .split(",")
.map((v) => v.trim()) .map((v) => v.trim())
.filter((v) => v.length > 0), // Should be comma-seperated and contain the media type and ID, formatted like so: movie-753342,movie-753342,movie-753342 .filter((v) => v.length > 0), // Should be comma-seperated and contain the media type and ID, formatted like so: movie-753342,movie-753342,movie-753342
CDN_REPLACEMENTS: getKey("CDN_REPLACEMENTS", "")
.split(",")
.map((v) => v.split(":").map((s) => s.trim()))
.filter((v) => v.length > 0), // The format is <beforeA>:<afterA>,<beforeB>:<afterB>
}; };
} }

14
src/utils/cdn.ts Normal file
View File

@ -0,0 +1,14 @@
import { conf } from "@/setup/config";
export function processCdnLink(url: string): string {
const parsedUrl = new URL(url);
const replacements = conf().CDN_REPLACEMENTS;
for (const [before, after] of replacements) {
if (parsedUrl.hostname.endsWith(before)) {
parsedUrl.host = after;
return parsedUrl.toString();
}
}
return url;
}