</pre> </section> <!-- 下载区域 --> <div class="download-section"> <div class="download-buttons"> <button class="download-btn" onclick="downloadLyric('lrc')"> 📥 下载LRC歌词 </button> <button class="download-btn" style="background: linear-gradient(135deg, #81C784 0%, #66BB6A 100%);" onclick="downloadLyric('txt')"> 📄 下载TXT歌词 </button> </div> <p class="download-tip">支持卡拉OK同步显示,可用记事本编辑</p> </div> </div> <!-- 音频播放器 --> <div class="audio-player" id="audioPlayer"> <div class="player-header"> <div class="player-info" id="playerInfo"> 正在播放: 留给这世上我最爱的人 </div> <div class="player-actions"> <button class="player-action-btn" onclick="minimizePlayer()" title="最小化">➖</button> <button class="player-action-btn" onclick="togglePlayer()" title="关闭播放器">×</button> </div> </div> <div class="player-controls"> <button class="control-btn" onclick="togglePlay()" id="playPauseBtn">▶️</button> <div class="progress-bar" onclick="seekAudio(event)" id="progressBar"> <div class="progress" id="progress"></div> </div> <div class="time-display" id="timeDisplay">0:00 / 0:00</div> </div> <!-- 额外控制按钮 --> <div class="player-extra-controls"> <button class="extra-control-btn" onclick="toggleLoop()" id="loopBtn" title="循环播放"> 🔄 单曲循环 </button> <button class="extra-control-btn" onclick="toggleMute()" id="muteBtn" title="静音"> 🔊 音量 </button> </div> <!-- 歌词显示区域 --> <div class="lyrics-display" id="lyricsDisplay"> <div class="lyric-line">加载歌词中...</div> </div> <audio id="audioElement" preload="metadata"> <!-- 音频源将通过JavaScript设置 --> </audio> </div> <!-- 迷你播放条 --> <div class="mini-player" id="miniPlayer"> <div class="mini-player-info"> <div class="mini-player-title">留给这世上我最爱的人</div> <div class="mini-player-artist">杨千嬅</div> </div> <div class="mini-player-controls"> <button class="mini-player-btn" onclick="togglePlay()" id="miniPlayPauseBtn">▶️</button> <button class="mini-player-btn expand" onclick="expandPlayer()" title="展开播放器">⛶</button> </div> </div> <!-- 固定按钮组 --> <div class="fixed-buttons"> <button class="play-music-btn" onclick="togglePlayer()" id="playMusicBtn" title="播放音乐">🎵</button> <button class="back-to-top" onclick="scrollToTop()" title="返回顶部">↑</button> </div> <script> let a=null,p=!1,v=!1,l=[],c=-1,o=!1,m=!1,i=!1; function showLyric(e){document.querySelectorAll(".lyric-section").forEach(t=>{t.style.display="none"}),document.querySelectorAll(".switch-btn").forEach(t=>{t.classList.remove("active")});const t=document.getElementById(`${e}-lyric`);t&&(t.style.display="block",event.target.classList.add("active"))}async function copyLyric(e){const t=document.getElementById(e),n=t.querySelector(".lyric-content"),c=t.querySelector(".copy-btn"),l=c.innerHTML,r=n.innerText;try{await navigator.clipboard.writeText(r),c.innerHTML='<span>✅</span> 已复制',c.classList.add("copied"),setTimeout(()=>{c.innerHTML=l,c.classList.remove("copied")},2e3)}catch(e){console.error("复制失败:",e);const t=document.createElement("textarea");t.value=r,document.body.appendChild(t),t.select();try{document.execCommand("copy"),c.innerHTML='<span>✅</span> 已复制',c.classList.add("copied"),setTimeout(()=>{c.innerHTML=l,c.classList.remove("copied")},2e3)}catch(e){console.error("备用复制方法也失败:",e),alert("复制失败,请手动选择文本复制")}document.body.removeChild(t)}}function downloadLyric(e){let t="",n="";const c='留给这世上我最爱的人',l='杨千嬅';switch(e){case"lrc":t=document.querySelector("#lrc-lyric .lyric-content").innerText,n=`${c}-${l}.lrc`;break;case"txt":t=document.querySelector("#plain-lyric .lyric-content").innerText,n=`${c}-${l}.txt`;break;case"translated":t=document.querySelector("#translated-lyric .lyric-content").innerText,n=`${c}-${l}-翻译.txt`;break;default:return}const r=new Blob([t],{type:"text/plain;charset=utf-8"}),d=URL.createObjectURL(r),s=document.createElement("a");s.href=d,s.download=n,document.body.appendChild(s),s.click(),setTimeout(()=>{document.body.removeChild(s),URL.revokeObjectURL(d)},100)}function scrollToTop(){window.scrollTo({top:0,behavior:"smooth"})}window.addEventListener("scroll",function(){const e=document.querySelector(".back-to-top");window.pageYOffset>300?e.classList.add("show"):e.classList.remove("show")});function togglePlayer(){const e=document.getElementById("audioPlayer"),t=document.getElementById("miniPlayer");v?(e.classList.remove("show"),t.classList.remove("show"),v=!1,i=!1,a&&!a.paused&&togglePlay()):(e.classList.add("show"),v=!0,i=!1,initAudio())}function minimizePlayer(){const e=document.getElementById("audioPlayer"),t=document.getElementById("miniPlayer");e.classList.add("minimized"),t.classList.add("show"),i=!0,setTimeout(()=>{e.classList.remove("show")},300)}function expandPlayer(){const e=document.getElementById("audioPlayer"),t=document.getElementById("miniPlayer");t.classList.remove("show"),e.classList.remove("minimized"),e.classList.add("show"),i=!1}function toggleLoop(){a&&(o=!o,a.loop=o,document.getElementById("loopBtn").classList.toggle("active"))}function toggleMute(){a&&(m=!m,a.muted=m,document.getElementById("muteBtn").classList.toggle("active"))}function parseLRC(e){const t=e.split("n"),n=[];n.push({time:0,text:""});for(const e of t){const r=e.match(/[(d+):(d+)(?:.|:)(d+)]/g);if(r){const t=e.replace(/[.*?]/g,"").trim();if(t)for(const e of r){const r=e.match(/[(d+):(d+)(?:.|:)(d+)]/);if(r){let e=parseInt(r[1]),s=parseInt(r[2]),d=parseInt(r[3]);2===r[3].length&&(d*=10),n.push({time:60*e+s+d/1e3,text:t})}}}}return n.sort(((e,t)=>e.time-t.time)),n}function displayLyrics(){const e=document.querySelector("#lrc-lyric .lyric-content");if(e){const t=e.innerText;l=parseLRC(t);const n=document.getElementById("lyricsDisplay");n.innerHTML="",l.length>0?l.forEach((e,t)=>{const r=document.createElement("div");r.className="lyric-line",r.textContent=e.text||"♪",r.dataset.index=t,n.appendChild(r)}):n.innerHTML='<div class="lyric-line">暂无歌词数据</div>'}}function updateCurrentLyric(e){if(0!==l.length){let t=-1;for(let n=l.length-1;n>=0;n--)if(l[n].time<=e){t=n;break}if(t!==c){c=t,document.querySelectorAll(".lyric-line").forEach(e=>{e.classList.remove("active","past")}),document.querySelectorAll(".lyric-line").forEach((e,n)=>{n===c?(e.classList.add("active"),e.scrollIntoView({behavior:"smooth",block:"center"})):n<c&&e.classList.add("past")})}}}function seekAudio(e){if(a){const t=document.getElementById("progressBar"),n=t.getBoundingClientRect(),c=(e.clientX-n.left)/n.width;a.currentTime=c*a.duration}}function showPremiumNotice(){document.getElementById("playerInfo").textContent="付费歌曲,请支持正版",document.getElementById("playPauseBtn").disabled=!0,document.getElementById("playPauseBtn").textContent="🚫",document.getElementById("miniPlayPauseBtn").disabled=!0,document.getElementById("miniPlayPauseBtn").textContent="🚫",document.getElementById("lyricsDisplay").innerHTML='<div class="premium-notice"><span class="icon">🎵</span><div>此歌曲为付费内容</div><div>请大家支持正版音乐</div><div style="margin-top:10px;font-size:.8rem;color:var(--text-light)">购买正版专辑或订阅音乐平台以享受完整服务</div></div>'}function initAudio(){if(!a){a=document.getElementById("audioElement");const e=2164563055;fetch(`/api/proxy.php?id=${e}`).then(e=>{if(!e.ok)throw new Error("网络响应不正常");return e.json()}).then(e=>{if(e.url){a.src=e.url,a.addEventListener("loadeddata",function(){console.log("音频加载成功"),displayLyrics()}),a.addEventListener("error",function(e){console.error("音频加载失败:",e),showPremiumNotice()}),a.addEventListener("loadedmetadata",function(){updateTimeDisplay()}),a.addEventListener("timeupdate",function(){updateProgress(),updateTimeDisplay(),updateCurrentLyric(a.currentTime)}),a.addEventListener("ended",function(){a.loop||(p=!1,document.getElementById("playPauseBtn").textContent="▶️",document.getElementById("miniPlayPauseBtn").textContent="▶️",document.getElementById("playMusicBtn").classList.remove("playing"),c=-1,document.querySelectorAll(".lyric-line").forEach(e=>{e.classList.remove("active","past")}))}),a.load()}else showPremiumNotice()}).catch(e=>{console.error("获取音乐URL失败:",e),showPremiumNotice()})}}function togglePlay(){if(a&&a.src)if(p)a.pause(),document.getElementById("playPauseBtn").textContent="▶️",document.getElementById("miniPlayPauseBtn").textContent="▶️",document.getElementById("playMusicBtn").classList.remove("playing");else{a.play().catch(e=>{console.error("播放失败:",e),showPremiumNotice()}),document.getElementById("playPauseBtn").textContent="⏸️",document.getElementById("miniPlayPauseBtn").textContent="⏸️",document.getElementById("playMusicBtn").classList.add("playing")}p=!p}function updateProgress(){a&&(document.getElementById("progress").style.width=a.currentTime/a.duration*100+"%")}function updateTimeDisplay(){if(a){const e=formatTime(a.currentTime),t=formatTime(a.duration);document.getElementById("timeDisplay").textContent=`${e} / ${t}`}}function formatTime(e){return isNaN(e)?"0:00":(Math.floor(e/60)+":"+(Math.floor(e%60)<10?"0":"")+Math.floor(e%60))}document.addEventListener("DOMContentLoaded",function(){showLyric("plain")}); </script> <script src="/static/js/connJs.js"></script> </body></html>