32dece149e
* yarn create next-app * create an upload show page * create upload page to handle in-progress upload and asset when it is ready * move things to a layout component * add some button styling * poll for updates intelligently by dynamically setting refreshInterval on SWR hook * better title * edit gitignore, add MIT license use next 'latest' based on feedback from https://github.com/zeit/next.js/pull/12723 * add some messages and spinner to make this a little nicer * update README with environment variables info and Mux account info * add .now to gitignore * cleaner uploading state - redirect to /v/:playback_id when complete * hardset image width in footer * remove unused styles * adjust title font size on mobile and adjust footer height on mobile * use upchunk 1.0.8 so we don't have to dynamically load it * cleaner error message handling * fix brief error from returning Router on the render * yarn lint-fix * update README with note about .env.local * add min height so the layout doesn't shift after selecting a file * set poster attribute at video element * use getStaticProps and fallback:true to render meta tags for social sharing * create a pages/asset/:id route that we can be on while in the preparing state * add copy about Mux, add twitter share widget * add flash message about video ready for playback * call it pre-rendered instead of server-side rendered * pre-rendering, not server-side rendering * Next.js not NextJS * handle asset creation errors in the UI * call hls.destroy() when the component is unmounted * Updated readme and renamed .env.local * Updated description * add suggested patch with links to source code https://github.com/zeit/next.js/pull/13120#issuecomment-632858572 * Added vercel.json * Updated some links * Removed Prerequisites Co-authored-by: Luis Alvarez <luis@vercel.com>
49 lines
1.1 KiB
JavaScript
49 lines
1.1 KiB
JavaScript
import { useEffect, useRef } from 'react'
|
|
import Hls from 'hls.js'
|
|
|
|
export default function VideoPlayer({ src, poster }) {
|
|
const videoRef = useRef(null)
|
|
|
|
useEffect(() => {
|
|
const video = videoRef.current
|
|
if (!video) return
|
|
|
|
video.controls = true
|
|
let hls
|
|
|
|
if (video.canPlayType('application/vnd.apple.mpegurl')) {
|
|
// This will run in safari, where HLS is supported natively
|
|
video.src = src
|
|
} else if (Hls.isSupported()) {
|
|
// This will run in all other modern browsers
|
|
hls = new Hls()
|
|
hls.loadSource(src)
|
|
hls.attachMedia(video)
|
|
} else {
|
|
console.error(
|
|
'This is an old browser that does not support MSE https://developer.mozilla.org/en-US/docs/Web/API/Media_Source_Extensions_API'
|
|
)
|
|
}
|
|
|
|
return () => {
|
|
if (hls) {
|
|
hls.destroy()
|
|
}
|
|
}
|
|
}, [src, videoRef])
|
|
|
|
return (
|
|
<>
|
|
<video ref={videoRef} poster={poster} />
|
|
<style jsx>{`
|
|
video {
|
|
width: 800px;
|
|
max-width: 100%;
|
|
cursor: pointer;
|
|
padding-top: 40px;
|
|
padding-bottom: 40px;
|
|
}
|
|
`}</style>
|
|
</>
|
|
)
|
|
}
|