diff --git a/Dockerfile b/Dockerfile index cc9b84be..12b13f98 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,6 +8,38 @@ COPY package.json ./ COPY pnpm-lock.yaml ./ RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile +ARG PWA_ENABLED="false" +ARG GA_ID +ARG APP_DOMAIN +ARG OPENSEARCH_ENABLED="false" +ARG TMDB_READ_API_KEY +ARG CORS_PROXY_URL +ARG DMCA_EMAIL +ARG NORMAL_ROUTER="false" +ARG BACKEND_URL +ARG HAS_ONBOARDING="false" +ARG ONBOARDING_CHROME_EXTENSION_INSTALL_LINK +ARG ONBOARDING_PROXY_INSTALL_LINK +ARG DISALLOWED_IDS +ARG CDN_REPLACEMENTS +ARG TURNSTILE_KEY + +ENV VITE_PWA_ENABLED=${PWA_ENABLED} +ENV VITE_GA_ID=${GA_ID} +ENV VITE_APP_DOMAIN=${APP_DOMAIN} +ENV VITE_OPENSEARCH_ENABLED=${OPENSEARCH_ENABLED} +ENV VITE_TMDB_READ_API_KEY=${TMDB_READ_API_KEY} +ENV VITE_CORS_PROXY_URL=${CORS_PROXY_URL} +ENV VITE_DMCA_EMAIL=${DMCA_EMAIL} +ENV VITE_NORMAL_ROUTER=${NORMAL_ROUTER} +ENV VITE_BACKEND_URL=${BACKEND_URL} +ENV VITE_HAS_ONBOARDING=${HAS_ONBOARDING} +ENV VITE_ONBOARDING_CHROME_EXTENSION_INSTALL_LINK=${ONBOARDING_CHROME_EXTENSION_INSTALL_LINK} +ENV VITE_ONBOARDING_PROXY_INSTALL_LINK=${ONBOARDING_PROXY_INSTALL_LINK} +ENV VITE_DISALLOWED_IDS=${DISALLOWED_IDS} +ENV VITE_CDN_REPLACEMENTS=${CDN_REPLACEMENTS} +ENV VITE_TURNSTILE_KEY=${TURNSTILE_KEY} + COPY . ./ RUN pnpm run build diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 00000000..c3745fdd --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,26 @@ +version: "3.8" + +services: + + movieweb: + build: + context: . + # args: + # PWA_ENABLED: "false" + # GA_ID: "" + # APP_DOMAIN: "" + # OPENSEARCH_ENABLED: "false" + # TMDB_READ_API_KEY: "" + # CORS_PROXY_URL: "" + # DMCA_EMAIL: "" + # NORMAL_ROUTER: "false" + # BACKEND_URL: "" + # HAS_ONBOARDING: "false" + # ONBOARDING_CHROME_EXTENSION_INSTALL_LINK: "" + # ONBOARDING_PROXY_INSTALL_LINK: "" + # DISALLOWED_IDS: "" + # CDN_REPLACEMENTS: "" + # TURNSTILE_KEY: "" + ports: + - "80:80" + restart: unless-stopped diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 35e43c3c..cb5bd3b7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7378,6 +7378,7 @@ packages: /workbox-google-analytics@7.0.0: 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: workbox-background-sync: 7.0.0 workbox-core: 7.0.0 diff --git a/src/backend/extension/messaging.ts b/src/backend/extension/messaging.ts index 3204d541..c280f9bd 100644 --- a/src/backend/extension/messaging.ts +++ b/src/backend/extension/messaging.ts @@ -6,6 +6,11 @@ import { import { isAllowedExtensionVersion } from "@/backend/extension/compatibility"; 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 // page load before the extension starts responding properly const isExtensionReady = new Promise((resolve) => { diff --git a/src/backend/extension/streams.ts b/src/backend/extension/streams.ts index 588718af..af535f38 100644 --- a/src/backend/extension/streams.ts +++ b/src/backend/extension/streams.ts @@ -1,6 +1,6 @@ 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 { try { @@ -36,7 +36,7 @@ function buildHeadersFromStream(stream: Stream): Record { export async function prepareStream(stream: Stream) { await setDomainRule({ - ruleId: 1, + ruleId: RULE_IDS.PREPARE_STREAM, targetDomains: extractDomainsFromStream(stream), requestHeaders: buildHeadersFromStream(stream), }); diff --git a/src/components/player/display/base.ts b/src/components/player/display/base.ts index 9b163363..a12661ab 100644 --- a/src/components/player/display/base.ts +++ b/src/components/player/display/base.ts @@ -1,6 +1,11 @@ import fscreen from "fscreen"; import Hls, { Level } from "hls.js"; +import { + RULE_IDS, + isExtensionActiveCached, + setDomainRule, +} from "@/backend/extension/messaging"; import { DisplayInterface, DisplayInterfaceEvents, @@ -31,8 +36,8 @@ const levelConversionMap: Record = { 480: "480", }; -function hlsLevelToQuality(level: Level): SourceQuality | null { - return levelConversionMap[level.height] ?? null; +function hlsLevelToQuality(level?: Level): SourceQuality | null { + return levelConversionMap[level?.height ?? 0] ?? null; } function qualityToHlsLevel(quality: SourceQuality): number | null { @@ -144,6 +149,24 @@ export function makeVideoElementDisplayInterface(): DisplayInterface { if (!hls) return; reportLevels(); 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, () => { if (!hls) return; diff --git a/src/components/player/utils/convertRunoutputToSource.ts b/src/components/player/utils/convertRunoutputToSource.ts index f54c5396..3fd07232 100644 --- a/src/components/player/utils/convertRunoutputToSource.ts +++ b/src/components/player/utils/convertRunoutputToSource.ts @@ -28,6 +28,7 @@ export function convertRunoutputToSource(out: { return { type: "hls", url: out.stream.playlist, + headers: out.stream.headers, preferredHeaders: out.stream.preferredHeaders, }; } @@ -50,6 +51,7 @@ export function convertRunoutputToSource(out: { return { type: "file", qualities, + headers: out.stream.headers, preferredHeaders: out.stream.preferredHeaders, }; } diff --git a/src/stores/player/utils/qualities.ts b/src/stores/player/utils/qualities.ts index e5140d53..afd90d25 100644 --- a/src/stores/player/utils/qualities.ts +++ b/src/stores/player/utils/qualities.ts @@ -14,6 +14,7 @@ export type SourceFileStream = { export type LoadableSource = { type: StreamType; url: string; + headers?: Stream["headers"]; preferredHeaders?: Stream["preferredHeaders"]; }; @@ -21,11 +22,13 @@ export type SourceSliceSource = | { type: "file"; qualities: Partial>; + headers?: Stream["headers"]; preferredHeaders?: Stream["preferredHeaders"]; } | { type: "hls"; url: string; + headers?: Stream["headers"]; preferredHeaders?: Stream["preferredHeaders"]; };