From cb3fb65348cf21f4ccb6ca939ebbcd8e61e609c5 Mon Sep 17 00:00:00 2001 From: mtvpls Date: Fri, 22 May 2026 11:32:52 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9F=B3=E4=B9=90=E5=B0=81=E9=9D=A2=E6=9B=B4?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E9=BB=91=E8=83=B6=E7=95=99=E5=A3=B0=E6=9C=BA?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/music/page.tsx | 199 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 193 insertions(+), 6 deletions(-) diff --git a/src/app/music/page.tsx b/src/app/music/page.tsx index 7dc0b39..f51fdc8 100644 --- a/src/app/music/page.tsx +++ b/src/app/music/page.tsx @@ -183,6 +183,74 @@ function AudioSpectrumCanvas({ ); } + +const VINYL_NEEDLE_SVG = `url('data:image/svg+xml;utf8,')`; + +function VinylTurntable({ + cover, + title, + isPlaying, + className = '', +}: { + cover?: string; + title: string; + isPlaying: boolean; + className?: string; +}) { + return ( +
+
+
+
+
+
+ {cover ? ( + {title} { + e.currentTarget.style.display = 'none'; + }} + /> + ) : ( + + + + )} +
+
+
+
+ ); +} + // 扩展 Window 接口以支持 Document PiP API declare global { interface Window { @@ -216,6 +284,7 @@ export default function MusicPage() { const [showPlayer, setShowPlayer] = useState(false); const [loading, setLoading] = useState(false); const [showLyrics, setShowLyrics] = useState(false); + const [mobileLyricsView, setMobileLyricsView] = useState<'lyrics' | 'vinyl'>('lyrics'); const [musicProxyEnabled, setMusicProxyEnabled] = useState(() => { if (typeof window === 'undefined') return true; return (window as any).RUNTIME_CONFIG?.MUSIC_PROXY_ENABLED !== false; @@ -1928,7 +1997,99 @@ export default function MusicPage() { return (
<> -