diff --git a/viewer/src/components/Player.tsx b/viewer/src/components/Player.tsx deleted file mode 100644 index 21b8edb..0000000 --- a/viewer/src/components/Player.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { useRouter } from 'next/router'; -import WebVttPlayer from "./WebVttPlayer/WebVttPlayer"; - -// functional component PlayerReact that uses ReactPlayer -// TODO: better parameterize video source and VTT source with props (general spec for 3rd party use!). must define spec. -export default function Player() { - - const router = useRouter(); - - const videoUrl = '/data/MIT Regressions intro video.mp4' // BIZARRE BUG: react-player component only works when I live-reload URL to valid path. if Chrome loads directly, then returns "failed to load media". - const audioUrl = router.asPath + 'data/MIT Regressions intro audio.mp3' - const transcriptUrl = router.asPath + "data/MIT Regressions intro captions.vtt" - const metadataUrl = router.asPath + "data/MIT Regressions intro metadata.vtt" - - return ( - <> - - - ); -} diff --git a/viewer/src/components/WebVttPlayer/MetadataPoint.tsx b/viewer/src/components/WebVttPlayer/MetadataPoint.tsx index b6e8bdb..abcc2d7 100644 --- a/viewer/src/components/WebVttPlayer/MetadataPoint.tsx +++ b/viewer/src/components/WebVttPlayer/MetadataPoint.tsx @@ -198,7 +198,7 @@ const VideoSourceCard: React.FC = ({videoSource}) => { // TODO: fix typing const SongCard: React.FC = ({song}) => { return ( -
+

{song.title}

{song.artist}

diff --git a/viewer/src/components/WebVttPlayer/WebVttPlayer.tsx b/viewer/src/components/WebVttPlayer/WebVttPlayer.tsx index 8724f33..4fca560 100644 --- a/viewer/src/components/WebVttPlayer/WebVttPlayer.tsx +++ b/viewer/src/components/WebVttPlayer/WebVttPlayer.tsx @@ -29,40 +29,57 @@ interface NativePlayerRef { play: () => void; } +//Write a fetcher function to wrap the native fetch function and return the result of a call to url in json format +// const fetcher = (url: string) => fetch(url).then((res) => res.json()); + export default function WebVttPlayer(props: WebVttPlayerProps) { const [trackLoaded, setTrackLoaded] = useState(false); const [metatrackLoaded, setMetatrackLoaded] = useState(false); const [query, setQuery] = useState(''); // TODO: determine if these should be set - const [currentTime, setCurrentTime] = useState(0); - const [seeking, setSeeking] = useState(false); - const [played, setPlayed] = useState(new Float64Array(0)); const [playing, setPlaying] = useState(false); - const trackRef = useRef(null); - const metatrackRef = useRef(null); + const trackRef = useRef(null); + const metatrackRef = useRef(null); const reactPlayerRef = useRef(null); const nativePlayerRef = useRef(null); const preload = props.preload ? "true" : "false" - useLayoutEffect(() => { + //There are 3 possible states: (1) loading when data is null (2) ready when the data is returned (3) error when there was an error fetching the data + // const { data, error } = useSWR('/api/staticdata', fetcher); + //Handle the error state + // if (error) console.log("Failed to load from SWR!"); //return
Failed to load
; + //Handle the loading state + // if (!data) console.log("Loading with SWR...")// return
Loading...
; + + useEffect(() => { // Get a reference to the track and metatrack elements - const track = trackRef.current; - const metatrack = metatrackRef.current; - - // Check if the tracks are fully loaded - if (track && track.track && track.track.cues && track.track.cues.length > 0) { - setTrackLoaded(true); - } - if (metatrack && metatrack.track && metatrack.track.cues && metatrack.track.cues.length > 0) { - setMetatrackLoaded(true); + // TODO: this manual timeout is extremely gross! figure out how to conditionally rendder and according to loading of these refs without this awful hard-coded thing. NextJs certainly supports something better for on-time ref loading (SWR? getProps?) + function checkIfLoaded(tries = 0) { + tries += 1 + const track = trackRef.current; + const metatrack = metatrackRef.current; + if (track && track.track && track.track.cues && track.track.cues.length > 0) { + setTrackLoaded(true); + } + if (metatrack && metatrack.track && metatrack.track.cues && metatrack.track.cues.length > 0) { + setMetatrackLoaded(true); + } + else if (!metatrackLoaded || !trackLoaded) { + const wait = 25 * Math.pow(tries, 2) + setTimeout(() => checkIfLoaded(tries), wait); + } } + checkIfLoaded(); - }, [trackLoaded, metatrackLoaded]); + + + + }, []); diff --git a/viewer/src/pages/index.tsx b/viewer/src/pages/index.tsx index c857d29..ffedb86 100644 --- a/viewer/src/pages/index.tsx +++ b/viewer/src/pages/index.tsx @@ -1,19 +1,28 @@ import React, { useRef } from "react"; import { type NextPage } from "next"; import Head from "next/head"; +import { useRouter } from 'next/router'; import { signIn, signOut, useSession } from "next-auth/react"; import { trpc } from "../utils/trpc"; import { useTheme } from 'next-themes' -import Player from '../components/Player' +import WebVttPlayer from "../components/WebVttPlayer/WebVttPlayer"; const Home: NextPage = () => { const hello = trpc.example.hello.useQuery({ text: "from tRPC" }); const { theme, setTheme } = useTheme() + const router = useRouter(); + + const videoUrl = '/data/MIT Regressions intro video.mp4' // BIZARRE BUG: react-player component only works when I live-reload URL to valid path. if Chrome loads directly, then returns "failed to load media". + const audioUrl = router.asPath + 'data/MIT Regressions intro audio.mp3' + const transcriptUrl = router.asPath + "data/MIT Regressions intro captions.vtt" + const metadataUrl = router.asPath + "data/MIT Regressions intro metadata.vtt" + + return ( <> @@ -34,9 +43,14 @@ const Home: NextPage = () => {

current film: MIT: REGRESSIONS intro   |   metadata source

{/*

metadata file source (VTT): MIT: REGRESSIONS intro

*/}
- - + {/*