From 9d0163b4eba106a78b51c772eff5a9ce50eafa36 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Wed, 21 Jan 2026 16:25:09 +0530 Subject: [PATCH] removed the stream/MKV/URL-validation HEAD probes; --- .../player/android/hooks/usePlayerSetup.ts | 7 +--- src/hooks/useMetadataAssets.ts | 42 ------------------- src/hooks/useSettings.ts | 2 - src/screens/PluginsScreen.tsx | 20 --------- src/screens/streams/useStreamsScreen.ts | 32 -------------- src/screens/streams/utils.ts | 25 ----------- src/services/pluginService.ts | 7 ---- src/services/streamCacheService.ts | 20 --------- src/utils/playerSelection.ts | 1 - 9 files changed, 1 insertion(+), 155 deletions(-) diff --git a/src/components/player/android/hooks/usePlayerSetup.ts b/src/components/player/android/hooks/usePlayerSetup.ts index f5f1d211..88a4167d 100644 --- a/src/components/player/android/hooks/usePlayerSetup.ts +++ b/src/components/player/android/hooks/usePlayerSetup.ts @@ -116,12 +116,7 @@ export const usePlayerSetup = ( const restoreBrightness = async () => { try { if (Platform.OS === 'android') { - if (originalSystemBrightnessModeRef.current !== null) { - await (Brightness as any).setSystemBrightnessModeAsync?.(originalSystemBrightnessModeRef.current); - } - if (originalSystemBrightnessRef.current !== null) { - await (Brightness as any).setSystemBrightnessAsync?.(originalSystemBrightnessRef.current); - } + } if (originalAppBrightnessRef.current !== null) { await Brightness.setBrightnessAsync(originalAppBrightnessRef.current); diff --git a/src/hooks/useMetadataAssets.ts b/src/hooks/useMetadataAssets.ts index 16ad53e4..d5639941 100644 --- a/src/hooks/useMetadataAssets.ts +++ b/src/hooks/useMetadataAssets.ts @@ -3,48 +3,6 @@ import { logger } from '../utils/logger'; import { TMDBService } from '../services/tmdbService'; import { isTmdbUrl } from '../utils/logoUtils'; import FastImage from '@d11/react-native-fast-image'; -import { mmkvStorage } from '../services/mmkvStorage'; - -// Cache for image availability checks -const imageAvailabilityCache: Record = {}; - -// Helper function to check image availability with caching -const checkImageAvailability = async (url: string): Promise => { - // Check memory cache first - if (imageAvailabilityCache[url] !== undefined) { - return imageAvailabilityCache[url]; - } - - // Check AsyncStorage cache - try { - const cachedResult = await mmkvStorage.getItem(`image_available:${url}`); - if (cachedResult !== null) { - const isAvailable = cachedResult === 'true'; - imageAvailabilityCache[url] = isAvailable; - return isAvailable; - } - } catch (error) { - // Ignore AsyncStorage errors - } - - // Perform actual check - try { - const response = await fetch(url, { method: 'HEAD' }); - const isAvailable = response.ok; - - // Update caches - imageAvailabilityCache[url] = isAvailable; - try { - await mmkvStorage.setItem(`image_available:${url}`, isAvailable ? 'true' : 'false'); - } catch (error) { - // Ignore AsyncStorage errors - } - - return isAvailable; - } catch (error) { - return false; - } -}; export const useMetadataAssets = ( metadata: any, diff --git a/src/hooks/useSettings.ts b/src/hooks/useSettings.ts index 32489de2..c285a1de 100644 --- a/src/hooks/useSettings.ts +++ b/src/hooks/useSettings.ts @@ -49,7 +49,6 @@ export interface AppSettings { scraperRepositoryUrl: string; // URL to the scraper repository enableLocalScrapers: boolean; // Enable/disable local scraper functionality scraperTimeout: number; // Timeout for scraper execution in seconds - enableScraperUrlValidation: boolean; // Enable/disable URL validation for scrapers streamDisplayMode: 'separate' | 'grouped'; // How to display streaming links - separately by provider or grouped under one name streamSortMode: 'scraper-then-quality' | 'quality-then-scraper'; // How to sort streams - by scraper first or quality first showScraperLogos: boolean; // Show scraper logos next to streaming links @@ -138,7 +137,6 @@ export const DEFAULT_SETTINGS: AppSettings = { scraperRepositoryUrl: '', enableLocalScrapers: true, scraperTimeout: 60, // 60 seconds timeout - enableScraperUrlValidation: true, // Enable URL validation by default streamDisplayMode: 'separate', // Default to separate display by provider streamSortMode: 'scraper-then-quality', // Default to current behavior (scraper first, then quality) showScraperLogos: true, // Show scraper logos by default diff --git a/src/screens/PluginsScreen.tsx b/src/screens/PluginsScreen.tsx index c87326bd..626fe0c7 100644 --- a/src/screens/PluginsScreen.tsx +++ b/src/screens/PluginsScreen.tsx @@ -1443,10 +1443,6 @@ const PluginsScreen: React.FC = () => { } }; - const handleToggleUrlValidation = async (enabled: boolean) => { - await updateSetting('enableScraperUrlValidation', enabled); - }; - const handleToggleQualityExclusion = async (quality: string) => { const currentExcluded = settings.excludedQualities || []; const isExcluded = currentExcluded.includes(quality); @@ -1971,22 +1967,6 @@ const PluginsScreen: React.FC = () => { colors={colors} styles={styles} > - - - {t('plugins.enable_url_validation')} - - {t('plugins.url_validation_desc')} - - - - - {t('plugins.group_streams')} diff --git a/src/screens/streams/useStreamsScreen.ts b/src/screens/streams/useStreamsScreen.ts index 90164c11..6af075b5 100644 --- a/src/screens/streams/useStreamsScreen.ts +++ b/src/screens/streams/useStreamsScreen.ts @@ -23,7 +23,6 @@ import { filterStreamsByQuality, filterStreamsByLanguage, getQualityNumeric, - detectMkvViaHead, inferVideoTypeFromUrl, sortStreamsByQuality, } from './utils'; @@ -37,7 +36,6 @@ import { TMDBEpisodeOverride, AlertAction, } from './types'; -import { MKV_HEAD_TIMEOUT_MS } from './constants'; // Cache for scraper logos const scraperLogoCache = new Map(); @@ -469,36 +467,6 @@ export const useStreamsScreen = () => { return; } - // iOS MKV detection - if (Platform.OS === 'ios' && settings.preferredPlayer === 'internal') { - const lowerUrl = (stream.url || '').toLowerCase(); - const isMkvByPath = - lowerUrl.includes('.mkv') || - /[?&]ext=mkv\b/i.test(lowerUrl) || - /format=mkv\b/i.test(lowerUrl) || - /container=mkv\b/i.test(lowerUrl); - const isHttp = lowerUrl.startsWith('http://') || lowerUrl.startsWith('https://'); - - if (!isMkvByPath && isHttp) { - try { - const mkvDetected = await Promise.race([ - detectMkvViaHead(stream.url, (stream.headers as any) || undefined), - new Promise(res => setTimeout(() => res(false), MKV_HEAD_TIMEOUT_MS)), - ]); - if (mkvDetected) { - const mergedHeaders = { - ...(stream.headers || {}), - 'Content-Type': 'video/x-matroska', - } as Record; - navigateToPlayer(stream, { headers: mergedHeaders }); - return; - } - } catch (e) { - logger.warn('[StreamsScreen] MKV detection failed:', e); - } - } - } - // iOS external player if (Platform.OS === 'ios' && settings.preferredPlayer !== 'internal') { try { diff --git a/src/screens/streams/utils.ts b/src/screens/streams/utils.ts index 751cf764..e531ca08 100644 --- a/src/screens/streams/utils.ts +++ b/src/screens/streams/utils.ts @@ -1,5 +1,4 @@ import { Stream } from '../../types/metadata'; -import { MKV_HEAD_TIMEOUT_MS } from './constants'; /** * Language variations for filtering @@ -150,30 +149,6 @@ export const sortStreamsByQuality = (streams: Stream[]): Stream[] => { }); }; -/** - * Detect MKV format via HEAD request - */ -export const detectMkvViaHead = async ( - url: string, - headers?: Record -): Promise => { - const controller = new AbortController(); - const timeout = setTimeout(() => controller.abort(), MKV_HEAD_TIMEOUT_MS); - try { - const res = await fetch(url, { - method: 'HEAD', - headers, - signal: controller.signal as any, - } as any); - const contentType = res.headers.get('content-type') || ''; - return /matroska|x-matroska/i.test(contentType); - } catch (_e) { - return false; - } finally { - clearTimeout(timeout); - } -}; - /** * Infer video type from URL */ diff --git a/src/services/pluginService.ts b/src/services/pluginService.ts index 538210b4..d68859ef 100644 --- a/src/services/pluginService.ts +++ b/src/services/pluginService.ts @@ -1164,10 +1164,6 @@ class LocalScraperService { private async executePlugin(code: string, params: any, consoleOverride?: any): Promise { try { - const settingsData = await mmkvStorage.getItem('app_settings'); - const settings = settingsData ? JSON.parse(settingsData) : {}; - const urlValidationEnabled = settings.enableScraperUrlValidation ?? true; - const allScraperSettingsRaw = await mmkvStorage.getItem(this.SCRAPER_SETTINGS_KEY); const allScraperSettings = allScraperSettingsRaw ? JSON.parse(allScraperSettingsRaw) : {}; let perScraperSettings = (params && params.scraperId && allScraperSettings[params.scraperId]) @@ -1299,7 +1295,6 @@ class LocalScraperService { 'params', 'PRIMARY_KEY', 'TMDB_API_KEY', - 'URL_VALIDATION_ENABLED', 'SCRAPER_SETTINGS', 'SCRAPER_ID', ` @@ -1311,7 +1306,6 @@ class LocalScraperService { globalScope.TMDB_API_KEY = TMDB_API_KEY; globalScope.SCRAPER_SETTINGS = SCRAPER_SETTINGS; globalScope.SCRAPER_ID = SCRAPER_ID; - globalScope.URL_VALIDATION_ENABLED = URL_VALIDATION_ENABLED; } else { logger.error('[Plugin Sandbox] Could not find global scope to inject settings'); } @@ -1346,7 +1340,6 @@ class LocalScraperService { params, MOVIEBOX_PRIMARY_KEY, MOVIEBOX_TMDB_API_KEY, - urlValidationEnabled, perScraperSettings, params?.scraperId ); diff --git a/src/services/streamCacheService.ts b/src/services/streamCacheService.ts index 73c7c57d..c2496b21 100644 --- a/src/services/streamCacheService.ts +++ b/src/services/streamCacheService.ts @@ -149,26 +149,6 @@ class StreamCacheService { return episodeId ? `${baseKey}:${episodeId}` : baseKey; } - /** - * Validate if a stream URL is still accessible - */ - private async validateStreamUrl(url: string): Promise { - try { - const controller = new AbortController(); - const timeout = setTimeout(() => controller.abort(), 3000); // 3 second timeout - - const response = await fetch(url, { - method: 'HEAD', - signal: controller.signal as any, - } as any); - - clearTimeout(timeout); - return response.ok; - } catch (error) { - return false; - } - } - /** * Get cache info for debugging */ diff --git a/src/utils/playerSelection.ts b/src/utils/playerSelection.ts index 81dbcda3..27e3ae5d 100644 --- a/src/utils/playerSelection.ts +++ b/src/utils/playerSelection.ts @@ -4,7 +4,6 @@ */ import { Platform } from 'react-native'; -import { isMkvStream } from './mkvDetection'; export interface PlayerSelectionOptions { uri: string;