import { PlaybackControls } from "./PlaybackControls"; import { RealtimeWaveform } from "./RealtimeWaveform"; import { useAudio } from "@/hooks/useAudio"; import { useAppStore } from "@/stores/app"; export function PlayerPage() { const audio = useAudio(); const progressPercent = () => { const d = audio.duration(); if (d <= 0) return 0; return Math.min(100, Math.round((audio.position() / d) * 100)); }; const formatTime = (seconds: number) => { const m = Math.floor(seconds / 60); const s = Math.floor(seconds % 60); return `${m}:${String(s).padStart(2, "0")}`; }; return ( Now Playing {formatTime(audio.position())} / {formatTime(audio.duration())} ( {progressPercent()}%) {audio.error() && {audio.error()}} {audio.currentEpisode()?.title} {audio.currentEpisode()?.description} { const viz = useAppStore().state().settings.visualizer; return { bars: viz.bars, noiseReduction: viz.noiseReduction, lowCutOff: viz.lowCutOff, highCutOff: viz.highCutOff, }; })()} /> audio.seek(0)} onNext={() => audio.seek(audio.currentEpisode()?.duration ?? 0)} //TODO: get next chronological(if feed) or episode(if MyShows) onSpeedChange={(s: number) => audio.setSpeed(s)} onVolumeChange={(v: number) => audio.setVolume(v)} /> Space play/pause | Left/Right seek 10s | Up/Down volume | S speed | Esc back ); }