import { formatDate, formatDuration, isIOS, isSafari, resizeImage, } from '@/web/utils/common' import { css, cx } from '@emotion/css' import Icon from '@/web/components/Icon' import dayjs from 'dayjs' import Image from './Image' import useIsMobile from '@/web/hooks/useIsMobile' import { memo, useEffect, useMemo, useRef } from 'react' import Hls from 'hls.js' import useVideoCover from '@/web/hooks/useVideoCover' import { motion } from 'framer-motion' import { ease } from '@/web/utils/const' import { injectGlobal } from '@emotion/css' import { useNavigate } from 'react-router-dom' injectGlobal` .plyr__video-wrapper, .plyr--video { background-color: transparent !important; } ` const VideoCover = ({ source }: { source?: string }) => { const ref = useRef(null) const hls = useRef(new Hls()) useEffect(() => { if (source && Hls.isSupported()) { const video = document.querySelector('#video-cover') as HTMLVideoElement hls.current.loadSource(source) hls.current.attachMedia(video) } }, [source]) return (
) } const Cover = memo( ({ album, playlist }: { album?: Album; playlist?: Playlist }) => { const isMobile = useIsMobile() const { data: videoCover } = useVideoCover({ id: album?.id, name: album?.name, artist: album?.artist.name, }) const cover = album?.picUrl || playlist?.coverImgUrl || '' return ( <>
{videoCover && ( {isSafari ? ( ) : ( )} )}
{/* Blur bg */} {!isMobile && ( )} ) } ) Cover.displayName = 'Cover' const TrackListHeader = ({ album, playlist, onPlay, }: { album?: Album playlist?: Playlist onPlay: () => void }) => { const navigate = useNavigate() const isMobile = useIsMobile() const albumDuration = useMemo(() => { const duration = album?.songs?.reduce((acc, cur) => acc + cur.dt, 0) || 0 return formatDuration(duration, 'en', 'hh[hr] mm[min]') }, [album?.songs]) return (
{/* Name */}
{album?.name || playlist?.name}
{/* Creator */}
{ if (album?.artist?.id) navigate(`/artist/${album?.artist?.id}`) }} className='text-24 font-medium transition-colors duration-300 dark:text-night-400 hover:dark:text-neutral-100 ' > {album?.artist.name || playlist?.creator.nickname}
{/* Extra info */}
{/* Album info */} {!!album && ( <> {album?.mark === 1056768 && ( )}{' '} {dayjs(album?.publishTime || 0).year()} · {album?.songs.length}{' '} tracks, {albumDuration} )} {/* Playlist info */} {!!playlist && ( <> Updated at {formatDate(playlist?.updateTime || 0, 'en')} ·{' '} {playlist.trackCount} tracks )}
{/* Description */} {!isMobile && (
{album?.description || playlist?.description}
)}
{/* Actions */}
) } export default TrackListHeader