movie-web/src/components/VideoElement.js

64 lines
2.4 KiB
JavaScript
Raw Normal View History

2021-07-14 00:31:37 +02:00
import React from 'react'
import Hls from 'hls.js'
2021-07-15 18:07:40 +02:00
import { VideoPlaceholder } from './VideoPlaceholder'
2021-07-14 00:31:37 +02:00
2021-07-20 19:28:21 +02:00
import './VideoElement.css'
2021-07-14 00:31:37 +02:00
// streamUrl: string
2021-07-15 00:09:42 +02:00
// loading: boolean
2021-08-07 22:19:01 +02:00
// setProgress: (event: NativeEvent) => void
// videoRef: useRef
// startTime: number
2021-09-13 20:27:14 +02:00
export function VideoElement({ streamUrl, loading, setProgress, videoRef, startTime, streamData }) {
2021-07-14 01:17:34 +02:00
const [error, setError] = React.useState(false);
2021-07-14 00:31:37 +02:00
2021-08-07 22:19:01 +02:00
function onLoad() {
if (startTime)
videoRef.current.currentTime = startTime;
}
2021-07-14 00:31:37 +02:00
React.useEffect(() => {
2021-12-30 20:23:15 +01:00
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);
2021-07-14 00:31:37 +02:00
}
2021-08-07 21:27:22 +02:00
}, [videoRef, streamUrl, loading]);
2021-07-14 01:17:34 +02:00
if (error)
return (<VideoPlaceholder>Your browser is not supported</VideoPlaceholder>)
2021-07-14 01:17:34 +02:00
2021-07-15 00:09:42 +02:00
if (loading)
2021-07-15 18:21:42 +02:00
return <VideoPlaceholder>Loading episode...</VideoPlaceholder>
2021-07-15 00:09:42 +02:00
if (!streamUrl || streamUrl.length === 0)
2021-07-15 18:41:51 +02:00
return <VideoPlaceholder>No video selected</VideoPlaceholder>
2021-07-15 00:09:42 +02:00
2021-12-30 20:23:15 +01:00
if (!streamUrl.includes('.mp4')) {
return (
<video crossOrigin="anonymous" className="videoElement" ref={videoRef} controls autoPlay onProgress={setProgress} onLoadedData={onLoad}>
2021-09-13 22:28:23 +02:00
{ streamData.subtitles && streamData.subtitles.map((sub, index) => <track key={index} kind="captions" label={sub.language} src={`${process.env.REACT_APP_CORS_PROXY_URL}https://lookmovie.io${sub.file}` } />) }
2021-09-13 20:27:14 +02:00
</video>
)
} else {
return (
<video crossOrigin="anonymous" className="videoElement" ref={videoRef} controls autoPlay onProgress={setProgress} onLoadedData={onLoad}>
2021-09-13 22:28:23 +02:00
{ streamData.subtitles && streamData.subtitles.map((sub, index) => <track key={index} kind="captions" label={sub.language} src={`${process.env.REACT_APP_CORS_PROXY_URL}https://lookmovie.io${sub.file}` } />) }
2021-07-20 19:28:21 +02:00
<source src={streamUrl} type="video/mp4" />
</video>
)
}
2021-07-14 00:31:37 +02:00
}