diff --git a/src/components/player/KSPlayerCore.tsx b/src/components/player/KSPlayerCore.tsx index 1cad96f9..7259813c 100644 --- a/src/components/player/KSPlayerCore.tsx +++ b/src/components/player/KSPlayerCore.tsx @@ -67,6 +67,7 @@ interface PlayerRouteParams { year?: number; streamProvider?: string; streamName?: string; + videoType?: string; id: string; type: string; episodeId?: string; @@ -92,6 +93,42 @@ const KSPlayerCore: React.FC = () => { initialPosition: routeInitialPosition } = params; + const videoType = (params as any)?.videoType as string | undefined; + + useEffect(() => { + if (!__DEV__) return; + const headerKeys = Object.keys(headers || {}); + logger.log('[KSPlayerCore] route params', { + uri: typeof uri === 'string' ? uri.slice(0, 240) : uri, + id, + type, + episodeId, + imdbId, + title, + episodeTitle, + season, + episode, + quality, + year, + streamProvider, + streamName, + videoType, + headersKeys: headerKeys, + headersCount: headerKeys.length, + }); + }, [uri, episodeId]); + + useEffect(() => { + if (!__DEV__) return; + const headerKeys = Object.keys(headers || {}); + logger.log('[KSPlayerCore] source update', { + uri: typeof uri === 'string' ? uri.slice(0, 240) : uri, + videoType, + headersCount: headerKeys.length, + headersKeys: headerKeys, + }); + }, [uri, headers, videoType]); + // --- Hooks --- const playerState = usePlayerState(); const { @@ -399,6 +436,17 @@ const KSPlayerCore: React.FC = () => { // Handlers const onLoad = (data: any) => { + if (__DEV__) { + logger.log('[KSPlayerCore] onLoad', { + uri: typeof uri === 'string' ? uri.slice(0, 240) : uri, + duration: data?.duration, + audioTracksCount: Array.isArray(data?.audioTracks) ? data.audioTracks.length : 0, + textTracksCount: Array.isArray(data?.textTracks) ? data.textTracks.length : 0, + videoType, + headersKeys: Object.keys(headers || {}), + }); + } + setDuration(data.duration); if (data.audioTracks) tracks.setKsAudioTracks(data.audioTracks); if (data.textTracks) tracks.setKsTextTracks(data.textTracks); @@ -482,6 +530,18 @@ const KSPlayerCore: React.FC = () => { } catch (e) { msg = 'Error parsing error details'; } + + if (__DEV__) { + logger.error('[KSPlayerCore] onError', { + msg, + uri: typeof uri === 'string' ? uri.slice(0, 240) : uri, + videoType, + streamProvider, + streamName, + headersKeys: Object.keys(headers || {}), + rawError: error, + }); + } modals.setErrorDetails(msg); modals.setShowErrorModal(true); }; @@ -525,6 +585,17 @@ const KSPlayerCore: React.FC = () => { modals.setShowSourcesModal(false); return; } + + if (__DEV__) { + logger.log('[KSPlayerCore] switching stream', { + fromUri: typeof uri === 'string' ? uri.slice(0, 240) : uri, + toUri: typeof newStream?.url === 'string' ? newStream.url.slice(0, 240) : newStream?.url, + newStreamHeadersKeys: Object.keys(newStream?.headers || {}), + newProvider: newStream?.addonName || newStream?.name || newStream?.addon || 'Unknown', + newName: newStream?.name || newStream?.title || 'Unknown', + }); + } + modals.setShowSourcesModal(false); setPaused(true); @@ -559,6 +630,19 @@ const KSPlayerCore: React.FC = () => { setPaused(true); const ep = modals.selectedEpisodeForStreams; + if (__DEV__) { + logger.log('[KSPlayerCore] switching episode stream', { + toUri: typeof stream?.url === 'string' ? stream.url.slice(0, 240) : stream?.url, + streamHeadersKeys: Object.keys(stream?.headers || {}), + ep: { + season: ep?.season_number, + episode: ep?.episode_number, + name: ep?.name, + stremioId: ep?.stremioId, + }, + }); + } + const newQuality = stream.quality || (stream.title?.match(/(\d+)p/)?.[0]); const newProvider = stream.addonName || stream.name || stream.addon || 'Unknown'; const newStreamName = stream.name || stream.title || 'Unknown Stream'; diff --git a/src/screens/streams/useStreamsScreen.ts b/src/screens/streams/useStreamsScreen.ts index 993cfdb6..de3299b1 100644 --- a/src/screens/streams/useStreamsScreen.ts +++ b/src/screens/streams/useStreamsScreen.ts @@ -25,7 +25,6 @@ import { getQualityNumeric, detectMkvViaHead, inferVideoTypeFromUrl, - filterHeadersForVidrock, sortStreamsByQuality, } from './utils'; import { @@ -356,11 +355,17 @@ export const useStreamsScreen = () => { // Navigate to player const navigateToPlayer = useCallback( async (stream: Stream, options?: { headers?: Record }) => { - const finalHeaders = filterHeadersForVidrock(options?.headers || (stream.headers as any)); + const optionHeaders = options?.headers; + const streamHeaders = (stream.headers as any) as Record | undefined; + const proxyHeaders = ((stream as any)?.behaviorHints?.proxyHeaders?.request || undefined) as + | Record + | undefined; + const streamProvider = stream.addonId || (stream as any).addonName || stream.name; + const finalHeaders = optionHeaders || streamHeaders || proxyHeaders; const streamsToPass = selectedEpisode ? episodeStreams : groupedStreams; const streamName = stream.name || stream.title || 'Unnamed Stream'; - const streamProvider = stream.addonId || stream.addonName || stream.name; + const resolvedStreamProvider = streamProvider; // Save stream to cache try { @@ -393,6 +398,22 @@ export const useStreamsScreen = () => { } } catch { } + if (__DEV__) { + const finalHeaderKeys = Object.keys(finalHeaders || {}); + + logger.log('[StreamsScreen][navigateToPlayer] stream selection', { + url: typeof stream.url === 'string' ? stream.url.slice(0, 240) : stream.url, + addonId: stream.addonId, + addonName: (stream as any).addonName, + name: stream.name, + title: stream.title, + inferredVideoType: videoType, + optionHeadersKeys: Object.keys(optionHeaders || {}), + streamHeadersKeys: Object.keys(streamHeaders || {}), + finalHeadersKeys: finalHeaderKeys, + }); + } + const playerRoute = Platform.OS === 'ios' ? 'PlayerIOS' : 'PlayerAndroid'; navigation.navigate(playerRoute as any, { @@ -403,7 +424,7 @@ export const useStreamsScreen = () => { episode: (type === 'series' || type === 'other') ? currentEpisode?.episode_number : undefined, quality: (stream.title?.match(/(\d+)p/) || [])[1] || undefined, year: metadata?.year, - streamProvider, + streamProvider: resolvedStreamProvider, streamName, headers: finalHeaders, id, @@ -424,6 +445,24 @@ export const useStreamsScreen = () => { try { if (!stream.url) return; + if (__DEV__) { + const streamHeaders = (stream.headers as any) as Record | undefined; + const proxyHeaders = ((stream as any)?.behaviorHints?.proxyHeaders?.request || undefined) as + | Record + | undefined; + + logger.log('[StreamsScreen][handleStreamPress] pressed stream', { + url: typeof stream.url === 'string' ? stream.url.slice(0, 240) : stream.url, + addonId: stream.addonId, + addonName: (stream as any).addonName, + name: stream.name, + title: stream.title, + streamHeadersKeys: Object.keys(streamHeaders || {}), + proxyHeadersKeys: Object.keys(proxyHeaders || {}), + inferredVideoType: inferVideoTypeFromUrl(stream.url), + }); + } + // Block magnet links if (typeof stream.url === 'string' && stream.url.startsWith('magnet:')) { openAlert('Not supported', 'Torrent streaming is not supported yet.');