diff --git a/package.json b/package.json index 11e6eaea..2390656b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "movie-web", - "version": "3.2.4", + "version": "3.2.5", "private": true, "homepage": "https://movie-web.app", "dependencies": { diff --git a/src/setup/config.ts b/src/setup/config.ts index a7d9067b..b4fd63d5 100644 --- a/src/setup/config.ts +++ b/src/setup/config.ts @@ -7,6 +7,7 @@ interface Config { TMDB_READ_API_KEY: string; CORS_PROXY_URL: string; NORMAL_ROUTER: boolean; + DISALLOWED_IDS: string; } export interface RuntimeConfig { @@ -16,6 +17,7 @@ export interface RuntimeConfig { TMDB_READ_API_KEY: string; NORMAL_ROUTER: boolean; PROXY_URLS: string[]; + DISALLOWED_IDS: string[]; } const env: Record = { @@ -25,6 +27,7 @@ const env: Record = { DISCORD_LINK: undefined, CORS_PROXY_URL: import.meta.env.VITE_CORS_PROXY_URL, NORMAL_ROUTER: import.meta.env.VITE_NORMAL_ROUTER, + DISALLOWED_IDS: import.meta.env.VITE_DISALLOWED_IDS, }; // loads from different locations, in order: environment (VITE_{KEY}), window (public/config.js) @@ -61,5 +64,8 @@ export function conf(): RuntimeConfig { .split(",") .map((v) => v.trim()), NORMAL_ROUTER: getKey("NORMAL_ROUTER", "false") === "true", + DISALLOWED_IDS: getKey("DISALLOWED_IDS", "") + .split(",") + .map((v) => v.trim()), // Should be comma-seperated and contain the media type and ID, formatted like so: movie-753342,movie-753342,movie-753342 }; } diff --git a/src/views/media/MediaView.tsx b/src/views/media/MediaView.tsx index 6e1659a6..1575ee73 100644 --- a/src/views/media/MediaView.tsx +++ b/src/views/media/MediaView.tsx @@ -15,10 +15,12 @@ import { } from "@/backend/metadata/types/mw"; import { IconPatch } from "@/components/buttons/IconPatch"; import { Icons } from "@/components/Icon"; +import { ErrorMessage } from "@/components/layout/ErrorBoundary"; import { Loading } from "@/components/layout/Loading"; import { useGoBack } from "@/hooks/useGoBack"; import { useLoading } from "@/hooks/useLoading"; import { SelectedMediaData, useScrape } from "@/hooks/useScrape"; +import { conf } from "@/setup/config"; import { useWatchedItem } from "@/state/watched"; import { MetaController } from "@/video/components/controllers/MetaController"; import { ProgressListenerController } from "@/video/components/controllers/ProgressListenerController"; @@ -53,6 +55,31 @@ function MediaViewLoading(props: { onGoBack(): void }) { ); } +function MediaVIewNotAllowed(props: { onGoBack(): void }) { + const { t } = useTranslation(); + + return ( +
+ + {t("videoPlayer.got")} + +
+ +
+
+ +
+
+ ); +} + interface MediaViewScrapingProps { onStream(stream: MWStream): void; onGoBack(): void; @@ -240,6 +267,14 @@ export function MediaView() { }); }, [exec, history, params]); + const disallowedEntries = conf().DISALLOWED_IDS.map((id) => id.split("-")); + if ( + disallowedEntries.find( + (entry) => meta?.tmdbId === entry[1] && meta?.meta?.type === entry[0] + ) + ) + return ; + if (loading) return ; if (error) return ; if (!meta || !selected)