</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"> ÕýÔÚ²¥·Å: ±³ºóÅ®ÈË (TVB¾¢¸è½ðÇú) </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">±³ºóÅ®ÈË (TVB¾¢¸è½ðÇú)</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='±³ºóÅ®ÈË (TVB¾¢¸è½ðÇú)',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=2163654285;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>