From d62874d20d1b5fa3cc3d9b05406e4a538978fe97 Mon Sep 17 00:00:00 2001 From: tapframe Date: Wed, 18 Jun 2025 10:27:02 +0530 Subject: [PATCH] Add new dependencies and enhance VideoPlayer functionality This update introduces new dependencies including cheerio, cors, express, and puppeteer to support additional features. The VideoPlayer component has been enhanced to improve seeking behavior on Android, with a new AndroidVideoPlayer component for better performance. Additionally, state management for seeking has been refined, ensuring smoother playback and user experience across platforms. --- components/AndroidVideoPlayer.tsx | 119 ++ package.json | 4 + src/components/player/AndroidVideoPlayer.tsx | 1067 ++++++++++++++++++ src/components/player/VideoPlayer.tsx | 332 ++---- 4 files changed, 1302 insertions(+), 220 deletions(-) create mode 100644 components/AndroidVideoPlayer.tsx create mode 100644 src/components/player/AndroidVideoPlayer.tsx diff --git a/components/AndroidVideoPlayer.tsx b/components/AndroidVideoPlayer.tsx new file mode 100644 index 0000000..8865071 --- /dev/null +++ b/components/AndroidVideoPlayer.tsx @@ -0,0 +1,119 @@ +import React, { useEffect, useRef, useState } from 'react'; +import { Platform } from 'react-native'; +import Video, { VideoRef, SelectedTrack, BufferingStrategyType } from 'react-native-video'; + +interface VideoPlayerProps { + src: string; + paused: boolean; + volume: number; + currentTime: number; + selectedAudioTrack?: SelectedTrack; + selectedTextTrack?: SelectedTrack; + onProgress?: (data: { currentTime: number; playableDuration: number }) => void; + onLoad?: (data: { duration: number }) => void; + onError?: (error: any) => void; + onBuffer?: (data: { isBuffering: boolean }) => void; + onSeek?: (data: { currentTime: number; seekTime: number }) => void; + onEnd?: () => void; +} + +export const AndroidVideoPlayer: React.FC = ({ + src, + paused, + volume, + currentTime, + selectedAudioTrack, + selectedTextTrack, + onProgress, + onLoad, + onError, + onBuffer, + onSeek, + onEnd, +}) => { + const videoRef = useRef(null); + const [isLoaded, setIsLoaded] = useState(false); + const [isSeeking, setIsSeeking] = useState(false); + const [lastSeekTime, setLastSeekTime] = useState(0); + + // Only render on Android + if (Platform.OS !== 'android') { + return null; + } + + useEffect(() => { + if (isLoaded && !isSeeking && Math.abs(currentTime - lastSeekTime) > 1) { + setIsSeeking(true); + videoRef.current?.seek(currentTime); + setLastSeekTime(currentTime); + } + }, [currentTime, isLoaded, isSeeking, lastSeekTime]); + + const handleLoad = (data: any) => { + setIsLoaded(true); + onLoad?.(data); + }; + + const handleProgress = (data: any) => { + if (!isSeeking) { + onProgress?.(data); + } + }; + + const handleSeek = (data: any) => { + setIsSeeking(false); + onSeek?.(data); + }; + + const handleBuffer = (data: any) => { + onBuffer?.(data); + }; + + const handleError = (error: any) => { + console.error('Video playback error:', error); + onError?.(error); + }; + + const handleEnd = () => { + onEnd?.(); + }; + + return ( +