From ceeeeb70f6fd2ac09aed5bc7d544df54aeb96735 Mon Sep 17 00:00:00 2001 From: Viren070 Date: Sat, 28 Dec 2024 00:54:38 +0000 Subject: [PATCH] feat(frontend): only load valid values into the states from the url --- packages/addon/src/config.ts | 1 + packages/frontend/src/app/configure/page.tsx | 56 ++++++++++++++++---- 2 files changed, 47 insertions(+), 10 deletions(-) diff --git a/packages/addon/src/config.ts b/packages/addon/src/config.ts index d5726dd1..6b099158 100644 --- a/packages/addon/src/config.ts +++ b/packages/addon/src/config.ts @@ -2,6 +2,7 @@ import { Config } from '@aiostreams/types'; import { AddonDetail } from '@aiostreams/types'; export const allowedFormatters = ['gdrive', 'torrentio', 'torbox']; +export const allowedAddons = ['torrentio', 'torbox', 'gdrive', 'custom']; export const MAX_ADDONS = 10; export const MAX_SIZE = 150000000000; // 1500GB diff --git a/packages/frontend/src/app/configure/page.tsx b/packages/frontend/src/app/configure/page.tsx index e22389a1..47799324 100644 --- a/packages/frontend/src/app/configure/page.tsx +++ b/packages/frontend/src/app/configure/page.tsx @@ -19,6 +19,7 @@ import { Slide, ToastContainer, toast } from 'react-toastify'; import addonPackage from '../../../package.json'; import { formatSize } from '@aiostreams/formatters'; import { + allowedAddons, allowedFormatters, allowedLanguages, addonDetails, @@ -285,6 +286,41 @@ export default function Configure() { } }; + const loadValidValuesFromObject = (object: { [key: string]: boolean }[], validValues: { [key: string]: boolean }[]) => { + if (!object) { + return validValues; + } + return validValues.map((validValue) => { + const value = object.find((v) => Object.keys(v)[0] === Object.keys(validValue)[0]); + return value || validValue; + }); + + }; + + const validateValue = (value: string, validValues: string[]) => { + if (!value) { + return null; + } + return validValues.includes(value) ? value : null; + }; + + const loadValidServices = (services: Config['services']) => { + if (!services) { + return defaultServices; + } + return defaultServices.map((defaultService) => { + const service = services.find((s) => s.id === defaultService.id); + return service || defaultService; + }); + }; + + const loadValidAddons = (addons: Config['addons']) => { + if (!addons) { + return []; + } + return addons.filter((addon) => allowedAddons.includes(addon.id)); + }; + // Load config from the window path if it exists useEffect(() => { const path = window.location.pathname; @@ -293,19 +329,19 @@ export default function Configure() { if (configMatch) { const decodedConfig = JSON.parse(atob(configMatch[1])); - setResolutions(decodedConfig.resolutions || defaultResolutions); - setQualities(decodedConfig.qualities || defaultQualities); - setVisualTags(decodedConfig.visualTags || defaultVisualTags); - setAudioTags(decodedConfig.audioTags || defaultAudioTags); - setEncodes(decodedConfig.encodes || defaultEncodes); - setSortCriteria(decodedConfig.sortBy || defaultSortCriteria); + + setResolutions(loadValidValuesFromObject(decodedConfig.resolutions, defaultResolutions)); + setQualities(loadValidValuesFromObject(decodedConfig.qualities, defaultQualities)); + setVisualTags(loadValidValuesFromObject(decodedConfig.visualTags, defaultVisualTags)); + setAudioTags(loadValidValuesFromObject(decodedConfig.audioTags, defaultAudioTags)); + setEncodes(loadValidValuesFromObject(decodedConfig.encodes, defaultEncodes)); setOnlyShowCachedStreams(decodedConfig.onlyShowCachedStreams || false); - setPrioritiseLanguage(decodedConfig.prioritiseLanguage || null); - setFormatter(decodedConfig.formatter || 'gdrive'); - setAddons(decodedConfig.addons || []); - setServices(decodedConfig.services || defaultServices); + setPrioritiseLanguage(validateValue(decodedConfig.prioritiseLanguage, allowedLanguages) || null); + setFormatter(validateValue(decodedConfig.formatter, allowedFormatters) || 'gdrive'); + setServices(loadValidServices(decodedConfig.services)); setMaxSize(decodedConfig.maxSize || null); setMinSize(decodedConfig.minSize || null); + setAddons(loadValidAddons(decodedConfig.addons)); } } catch (error) { console.error('Failed to load config', error);