import Hls from "hls.js"; import { HTMLProps, useEffect, useMemo, useRef, useState } from "react"; export enum VideoStatus { Online = "online", Offline = "offline" } export function LiveVideoPlayer(props: HTMLProps & { stream?: string }) { const video = useRef(null); const streamCached = useMemo(() => props.stream, [props.stream]); const [status, setStatus] = useState(); useEffect(() => { if (streamCached && video.current && !video.current.src && Hls.isSupported()) { const hls = new Hls(); hls.loadSource(streamCached); hls.attachMedia(video.current); hls.on(Hls.Events.ERROR, (event, data) => { console.debug(event, data); const errorType = data.type; if (errorType === Hls.ErrorTypes.NETWORK_ERROR) { hls.stopLoad(); hls.detachMedia(); setStatus(VideoStatus.Offline); } }) hls.on(Hls.Events.MANIFEST_PARSED, () => { setStatus(VideoStatus.Online); }) return () => hls.destroy(); } }, [video, streamCached]); return (
{status}
); }