You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
2.3 KiB
63 lines
2.3 KiB
import React from 'react' |
|
import Hls from 'hls.js' |
|
import { VideoPlaceholder } from './VideoPlaceholder' |
|
|
|
import './VideoElement.css' |
|
|
|
// streamUrl: string |
|
// loading: boolean |
|
// setProgress: (event: NativeEvent) => void |
|
// videoRef: useRef |
|
// startTime: number |
|
export function VideoElement({ streamUrl, loading, setProgress, videoRef, startTime, streamData }) { |
|
const [error, setError] = React.useState(false); |
|
|
|
function onLoad() { |
|
if (startTime) |
|
videoRef.current.currentTime = startTime; |
|
} |
|
|
|
React.useEffect(() => { |
|
if (!streamUrl.includes('.mp4')) { |
|
setError(false) |
|
if (!videoRef || !videoRef.current || !streamUrl || streamUrl.length === 0 || loading) return; |
|
|
|
const hls = new Hls(); |
|
|
|
if (!Hls.isSupported() && videoRef.current.canPlayType('application/vnd.apple.mpegurl')) { |
|
videoRef.current.src = streamUrl; |
|
return; |
|
} else if (!Hls.isSupported()) { |
|
setError(true) |
|
return; |
|
} |
|
|
|
hls.attachMedia(videoRef.current); |
|
hls.loadSource(streamUrl); |
|
} |
|
}, [videoRef, streamUrl, loading]); |
|
|
|
if (error) |
|
return (<VideoPlaceholder>Your browser is not supported</VideoPlaceholder>) |
|
|
|
if (loading) |
|
return <VideoPlaceholder>Loading episode...</VideoPlaceholder> |
|
|
|
if (!streamUrl || streamUrl.length === 0) |
|
return <VideoPlaceholder>No video selected</VideoPlaceholder> |
|
|
|
if (!streamUrl.includes('.mp4')) { |
|
return ( |
|
<video className="videoElement" ref={videoRef} controls autoPlay onProgress={setProgress} onLoadedData={onLoad}> |
|
{ streamData.subtitles && streamData.subtitles.map((sub, index) => <track key={index} kind="captions" label={sub.language} src={sub.file} />) } |
|
</video> |
|
) |
|
} else { |
|
return ( |
|
<video className="videoElement" ref={videoRef} controls autoPlay onProgress={setProgress} onLoadedData={onLoad}> |
|
{ streamData.subtitles && streamData.subtitles.map((sub, index) => <track key={index} kind="captions" label={sub.language} src={sub.file} />) } |
|
<source src={streamUrl} type="video/mp4" /> |
|
</video> |
|
) |
|
} |
|
}
|
|
|