sudo-archive/src/components/VideoElement.js

43 lines
1.3 KiB
JavaScript
Raw Normal View History

2021-07-13 22:31:37 +00:00
import React from 'react'
import Hls from 'hls.js'
import './VideoElement.css'
2021-07-15 16:07:40 +00:00
import { VideoPlaceholder } from './VideoPlaceholder'
2021-07-13 22:31:37 +00:00
// streamUrl: string
2021-07-14 22:09:42 +00:00
// loading: boolean
2021-07-15 18:34:25 +00:00
export function VideoElement({ streamUrl, loading, setProgress }) {
2021-07-13 22:31:37 +00:00
const videoRef = React.useRef(null);
2021-07-13 23:17:34 +00:00
const [error, setError] = React.useState(false);
2021-07-13 22:31:37 +00:00
React.useEffect(() => {
2021-07-13 23:17:34 +00:00
setError(false)
2021-07-14 22:09:42 +00:00
if (!videoRef || !videoRef.current || !streamUrl || streamUrl.length === 0 || loading) return;
2021-07-13 22:31:37 +00:00
const hls = new Hls();
if (!Hls.isSupported() && videoRef.current.canPlayType('application/vnd.apple.mpegurl')) {
videoRef.current.src = streamUrl;
return;
} else if (!Hls.isSupported()) {
2021-07-13 23:17:34 +00:00
setError(true)
return;
2021-07-13 22:31:37 +00:00
}
hls.attachMedia(videoRef.current);
hls.loadSource(streamUrl);
2021-07-14 22:09:42 +00:00
}, [videoRef, streamUrl, loading])
2021-07-13 23:17:34 +00:00
if (error)
return (<VideoPlaceholder>Your browser is not supported</VideoPlaceholder>)
2021-07-13 23:17:34 +00:00
2021-07-14 22:09:42 +00:00
if (loading)
2021-07-15 16:21:42 +00:00
return <VideoPlaceholder>Loading episode...</VideoPlaceholder>
2021-07-14 22:09:42 +00:00
if (!streamUrl || streamUrl.length === 0)
2021-07-15 16:41:51 +00:00
return <VideoPlaceholder>No video selected</VideoPlaceholder>
2021-07-14 22:09:42 +00:00
2021-07-13 22:31:37 +00:00
return (
2021-07-15 18:34:25 +00:00
<video className="videoElement" ref={videoRef} controls autoPlay onProgress={setProgress} />
2021-07-13 22:31:37 +00:00
)
}