import { getUrl, getNextVod, getPreviousVod, getLocalizedDate } from '@/app/lib/vods'; import { IVod } from '@/app/lib/vods'; import Link from 'next/link'; import { VideoInteractive } from './video-interactive'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faChevronLeft, faChevronRight, faGlobe, faImage, faLink } from "@fortawesome/free-solid-svg-icons"; import { notFound } from 'next/navigation'; import { IpfsCid } from './ipfs-cid'; import LinkableHeading from './linkable-heading'; import Image from "next/legacy/image"; import Thumbnail from './thumbnail'; export function getVodTitle(vod: IVod): string { // console.log('lets getVodTitle, ey?') // console.log(JSON.stringify(vod, null, 2)) return vod.title || vod.announce_title || `VOD ${vod.id}` // return vod.title || vod.announceTitle || (vod?.date2 && vod?.vtuber?.display_name) ? `${vod.vtuber.display_name} ${vod.date_2}` : `VOD ${vod.id}`; } export function buildMuxUrl(playbackId: string, token: string) { return `https://stream.mux.com/${playbackId}.m3u8?token=${token}` } export function buildMuxSignedPlaybackId(playbackId: string, token: string) { return `${playbackId}?token=${token}` } export function buildMuxThumbnailUrl(playbackId: string, token: string) { return `https://image.mux.com/${playbackId}/storyboard.vtt?token=${token}` } export default async function VodPage({vod}: { vod: IVod }) { if (!vod) notFound(); if (!vod.vtuber) { throw new Error(`vod.vtuber was falsy.`) } const slug = vod.vtuber.slug; const previousVod = await getPreviousVod(vod); const nextVod = await getNextVod(vod); // return <pre><code>{JSON.stringify(previousVod, null, 2)}</code></pre> // return <p>{slug} VOD @todo previousVod={previousVod.title} nextVod={nextVod?.title}</p> return ( <div className="container"> <div className="section pt-0"> <VideoInteractive vod={vod}></VideoInteractive> {/* <pre><code>{JSON.stringify(vod, null, 2)}</code></pre> */} {(vod.thumbnail) && (<div className='mb-5'> <LinkableHeading text="Thumbnail Image" slug="thumb" icon={faImage}></LinkableHeading> <Thumbnail url={vod.thumbnail.cdn_url}></Thumbnail> </div>)} {(vod.ipfs_cid) && ( <> <LinkableHeading text="IPFS Content IDs" slug="ipfs" icon={faGlobe}></LinkableHeading> {vod.ipfs_cid && ( <IpfsCid label="Source" cid={vod.ipfs_cid}></IpfsCid> )} </> )} <nav className="level mt-5"> <div className='level-left'> <div className='level-item'> {!!previousVod && ( <Link className='button' href={getUrl(previousVod, slug, previousVod.date_2)}> <FontAwesomeIcon icon={faChevronLeft} className='fas faChevronLeft' ></FontAwesomeIcon> <span className="ml-2">Prev VOD {getLocalizedDate(previousVod)}</span> </Link> )} </div> </div> <div className='level-center'> <div className='level-item'> {/* <p className='has-text-grey-darker'>UUID {vod.uuid}</p> UUID is too long for this space! */} <p className='has-text-grey-darker'>ID {vod.id}</p> </div> </div> <div className='level-right'> <div className='level-item'> {!!nextVod && ( <Link className='button' href={getUrl(nextVod, slug, nextVod.date_2)}> <span className="mr-2">Next VOD {getLocalizedDate(nextVod)}</span> <FontAwesomeIcon icon={faChevronRight} className='fas faChevronRight' ></FontAwesomeIcon> </Link> )} </div> </div> </nav> </div> </div> ); }