From b21f13c2839f9fd3da2e4e93435d916767cd0f4c Mon Sep 17 00:00:00 2001 From: tapframe Date: Sun, 3 Aug 2025 12:42:23 +0530 Subject: [PATCH] testing --- local-scrapers-repo | 2 +- package-lock.json | 17 ++--- package.json | 2 +- src/components/player/AndroidVideoPlayer.tsx | 53 ++++++++++++++- src/components/player/VideoPlayer.tsx | 22 +++++- src/utils/httpInterceptor.ts | 71 ++++++++++++++++++++ 6 files changed, 154 insertions(+), 13 deletions(-) create mode 100644 src/utils/httpInterceptor.ts diff --git a/local-scrapers-repo b/local-scrapers-repo index ff60b52..cfd669d 160000 --- a/local-scrapers-repo +++ b/local-scrapers-repo @@ -1 +1 @@ -Subproject commit ff60b52232d79636656476b4057bbd7b479cd6c7 +Subproject commit cfd669df2258d217c90c58ce9455676c60abd1ac diff --git a/package-lock.json b/package-lock.json index 473022f..2daad36 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "@sentry/react-native": "^6.15.1", "@types/lodash": "^4.17.16", "@types/react-native-video": "^5.0.20", - "axios": "^1.10.0", + "axios": "^1.11.0", "axios-cookiejar-support": "^6.0.4", "cheerio-without-node-native": "^0.20.2", "date-fns": "^4.1.0", @@ -5321,13 +5321,13 @@ "optional": true }, "node_modules/axios": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", - "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", + "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, @@ -5386,14 +5386,15 @@ } }, "node_modules/axios/node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { diff --git a/package.json b/package.json index 781aa15..bff8c85 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "@sentry/react-native": "^6.15.1", "@types/lodash": "^4.17.16", "@types/react-native-video": "^5.0.20", - "axios": "^1.10.0", + "axios": "^1.11.0", "axios-cookiejar-support": "^6.0.4", "cheerio-without-node-native": "^0.20.2", "date-fns": "^4.1.0", diff --git a/src/components/player/AndroidVideoPlayer.tsx b/src/components/player/AndroidVideoPlayer.tsx index 80dedd8..cac8186 100644 --- a/src/components/player/AndroidVideoPlayer.tsx +++ b/src/components/player/AndroidVideoPlayer.tsx @@ -15,6 +15,7 @@ import { useTraktAutosync } from '../../hooks/useTraktAutosync'; import { useTraktAutosyncSettings } from '../../hooks/useTraktAutosyncSettings'; import { useMetadata } from '../../hooks/useMetadata'; import { useSettings } from '../../hooks/useSettings'; +import { testVideoStreamUrl } from '../../utils/httpInterceptor'; import { DEFAULT_SUBTITLE_SIZE, @@ -497,6 +498,17 @@ const AndroidVideoPlayer: React.FC = () => { const onLoad = (data: any) => { try { + // Enhanced HTTP response logging + console.log('\nāœ… [AndroidVideoPlayer] HTTP RESPONSE SUCCESS:'); + console.log('šŸ“ URL:', currentStreamUrl); + console.log('šŸ“Š Status: 200 OK (Video Stream Loaded)'); + console.log('šŸ“ŗ Duration:', data?.duration ? `${data.duration.toFixed(2)}s` : 'Unknown'); + console.log('šŸ“ Resolution:', data?.naturalSize ? `${data.naturalSize.width}x${data.naturalSize.height}` : 'Unknown'); + console.log('šŸŽµ Audio Tracks:', data?.audioTracks?.length || 0); + console.log('šŸ“ Text Tracks:', data?.textTracks?.length || 0); + console.log('ā° Response Time:', new Date().toISOString()); + console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'); + if (DEBUG_MODE) { logger.log('[AndroidVideoPlayer] Video loaded:', data); } @@ -619,7 +631,7 @@ const AndroidVideoPlayer: React.FC = () => { NativeModules.StatusBarManager.setHidden(true); } } catch (error) { - console.log('Immersive mode error:', error); + // Immersive mode error - silently handled } } }; @@ -712,6 +724,16 @@ const AndroidVideoPlayer: React.FC = () => { const handleError = (error: any) => { try { + // Enhanced HTTP error response logging + console.log('\nāŒ [AndroidVideoPlayer] HTTP RESPONSE ERROR:'); + console.log('šŸ“ URL:', currentStreamUrl); + console.log('šŸ“Š Status:', error?.error?.code ? `${error.error.code} (${error.error.domain || 'Unknown Domain'})` : 'Unknown Error Code'); + console.log('šŸ’¬ Error Message:', error?.error?.localizedDescription || error?.message || 'Unknown error'); + console.log('šŸ” Error Type:', error?.error?.domain || 'Unknown'); + console.log('šŸ“‹ Full Error Object:', JSON.stringify(error, null, 2)); + console.log('ā° Error Time:', new Date().toISOString()); + console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'); + logger.error('AndroidVideoPlayer error: ', error); // Early return if component is unmounted to prevent iOS crashes @@ -1046,6 +1068,24 @@ const AndroidVideoPlayer: React.FC = () => { } }, [pendingSeek, isPlayerReady, isVideoLoaded, duration]); + // HTTP stream testing with logging + useEffect(() => { + if (currentStreamUrl && currentStreamUrl.trim() !== '') { + const testStream = async () => { + try { + console.log('\nšŸ” [AndroidVideoPlayer] Testing video stream URL...'); + const isValid = await testVideoStreamUrl(currentStreamUrl, headers || {}); + console.log(`āœ… [AndroidVideoPlayer] Stream test result: ${isValid ? 'VALID' : 'INVALID'}`); + } catch (error) { + console.log('āŒ [AndroidVideoPlayer] Stream test failed:', error); + } + }; + + // Test the stream URL when it changes + testStream(); + } + }, [currentStreamUrl, headers]); + const handleSelectStream = async (newStream: any) => { if (newStream.url === currentStreamUrl) { setShowSourcesModal(false); @@ -1247,7 +1287,16 @@ const AndroidVideoPlayer: React.FC = () => { headers: headers } : { uri: currentStreamUrl }; - console.log('[AndroidVideoPlayer] FORCEFULLY using headers from route params:', headers); + // Enhanced HTTP request logging + console.log('\n🌐 [AndroidVideoPlayer] HTTP REQUEST DETAILS:'); + console.log('šŸ“ URL:', currentStreamUrl); + console.log('šŸ”§ Method: GET (Video Stream)'); + console.log('šŸ“‹ Headers:', headers ? JSON.stringify(headers, null, 2) : 'No headers'); + console.log('šŸŽ¬ Stream Provider:', currentStreamProvider || 'Unknown'); + console.log('šŸ“ŗ Stream Name:', currentStreamName || 'Unknown'); + console.log('šŸŽÆ Quality:', currentQuality || 'Unknown'); + console.log('ā° Timestamp:', new Date().toISOString()); + console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'); return sourceWithHeaders; })()} diff --git a/src/components/player/VideoPlayer.tsx b/src/components/player/VideoPlayer.tsx index 8df9c0d..c3744db 100644 --- a/src/components/player/VideoPlayer.tsx +++ b/src/components/player/VideoPlayer.tsx @@ -567,6 +567,7 @@ const VideoPlayer: React.FC = () => { const onLoad = (data: any) => { try { + if (DEBUG_MODE) { logger.log('[VideoPlayer] Video loaded:', data); } @@ -796,6 +797,16 @@ const VideoPlayer: React.FC = () => { }; const handleError = (error: any) => { + // Enhanced HTTP error response logging + console.log('\nāŒ [VideoPlayer] HTTP RESPONSE ERROR:'); + console.log('šŸ“ URL:', currentStreamUrl); + console.log('šŸ“Š Status:', error?.error?.code ? `${error.error.code} (${error.error.domain || 'Unknown Domain'})` : 'Unknown Error Code'); + console.log('šŸ’¬ Error Message:', error?.error?.localizedDescription || error?.message || 'Unknown error'); + console.log('šŸ” Error Type:', error?.error?.domain || 'Unknown'); + console.log('šŸ“‹ Full Error Object:', JSON.stringify(error, null, 2)); + console.log('ā° Error Time:', new Date().toISOString()); + console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'); + logger.error('[VideoPlayer] Playback Error:', error); // Format error details for user display @@ -1270,7 +1281,16 @@ const VideoPlayer: React.FC = () => { headers: headers } : { uri: currentStreamUrl }; - console.log('[VideoPlayer] FORCEFULLY using headers from route params:', headers); + // Enhanced HTTP request logging + console.log('\n🌐 [VideoPlayer] HTTP REQUEST DETAILS:'); + console.log('šŸ“ URL:', currentStreamUrl); + console.log('šŸ”§ Method: GET (Video Stream)'); + console.log('šŸ“‹ Headers:', headers ? JSON.stringify(headers, null, 2) : 'No headers'); + console.log('šŸŽ¬ Stream Provider:', currentStreamProvider || streamProvider || 'Unknown'); + console.log('šŸ“ŗ Stream Name:', currentStreamName || streamName || 'Unknown'); + console.log('šŸŽÆ Quality:', currentQuality || quality || 'Unknown'); + console.log('ā° Timestamp:', new Date().toISOString()); + console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'); return sourceWithHeaders; })()} diff --git a/src/utils/httpInterceptor.ts b/src/utils/httpInterceptor.ts new file mode 100644 index 0000000..1933adf --- /dev/null +++ b/src/utils/httpInterceptor.ts @@ -0,0 +1,71 @@ +import { logger } from './logger'; + +// Enhanced HTTP logging function specifically for AndroidVideoPlayer +export const logHttpRequest = async (url: string, options: RequestInit = {}): Promise => { + const method = options.method || 'GET'; + const headers = options.headers || {}; + + // Log HTTP request + console.log('\n🌐 [AndroidVideoPlayer] HTTP REQUEST:'); + console.log('šŸ“ URL:', url); + console.log('šŸ”§ Method:', method); + console.log('šŸ“‹ Headers:', JSON.stringify(headers, null, 2)); + console.log('ā° Request Time:', new Date().toISOString()); + console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'); + + const startTime = Date.now(); + + try { + // Make the actual request + const response = await fetch(url, options); + const endTime = Date.now(); + const duration = endTime - startTime; + + // Log HTTP response success + console.log('\nāœ… [AndroidVideoPlayer] HTTP RESPONSE SUCCESS:'); + console.log('šŸ“ URL:', url); + console.log('šŸ“Š Status:', `${response.status} ${response.statusText}`); + console.log('šŸ“‹ Response Headers:', JSON.stringify(Object.fromEntries(response.headers.entries()), null, 2)); + console.log('ā±ļø Duration:', `${duration}ms`); + console.log('šŸ“¦ Content-Type:', response.headers.get('content-type') || 'Unknown'); + console.log('šŸ“ Content-Length:', response.headers.get('content-length') || 'Unknown'); + console.log('šŸ”’ CORS:', response.headers.get('access-control-allow-origin') || 'Not specified'); + console.log('ā° Response Time:', new Date().toISOString()); + console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'); + + return response; + } catch (error: any) { + const endTime = Date.now(); + const duration = endTime - startTime; + + // Log HTTP response error + console.log('\nāŒ [AndroidVideoPlayer] HTTP RESPONSE ERROR:'); + console.log('šŸ“ URL:', url); + console.log('šŸ“Š Status: Network Error'); + console.log('šŸ’¬ Error Message:', error.message || 'Unknown error'); + console.log('šŸ” Error Type:', error.name || 'Unknown'); + console.log('ā±ļø Duration:', `${duration}ms`); + console.log('šŸ“‹ Full Error:', JSON.stringify(error, null, 2)); + console.log('ā° Error Time:', new Date().toISOString()); + console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'); + + throw error; + } +}; + +// Test function to validate video stream URLs with HTTP logging +export const testVideoStreamUrl = async (url: string, headers: Record = {}): Promise => { + try { + const response = await logHttpRequest(url, { + method: 'HEAD', + headers: { + 'Range': 'bytes=0-1', + ...headers + } + }); + + return response.ok || response.status === 206; // 206 for partial content + } catch (error) { + return false; + } +}; \ No newline at end of file