// ==UserScript== // @name Apple Music 歌词增强 // @namespace https://github.com/akashiwest/AML-Enhancer // @version 1.050 // @description 为 Windows 端网页版 Apple Music 提供歌词翻译,数据来源为网易云音乐 // @author Akashi // @license GNU GPL 3.0 // @match https://*.music.apple.com/* // @grant GM_xmlhttpRequest // @downloadURL none // ==/UserScript== (function() { 'use strict'; function createLyricsDisplay() { const lyricsDiv = document.createElement('div'); lyricsDiv.id = 'lyrics-display'; Object.assign(lyricsDiv.style, { position: 'fixed', right: '20px', top: '60px', width: '50vw', minHeight: '60px', overflow: 'auto', borderRadius: '15px', backdropFilter: 'saturate(200%) blur(23px)', background: 'rgba(250,250, 250, 0.72)', zIndex: '9999', padding: '20px 30px', fontSize: '28px', color: '#565656', lineHeight: '1.4', textAlign: 'center', display: 'inline-block', boxShadow: '0 5px 30px rgba(0, 0, 0, 0.4)', fontWeight: 'bold', msOverflowStyle: 'none', scrollbarWidth: 'none', WebkitScrollbar: 'none', }); lyricsDiv.innerHTML = 'Apple Music 歌词增强 1.05'; document.body.appendChild(lyricsDiv); lyricsDiv.onmousedown = dragMouseDown; // 拖动功能 let pos3 = 0, pos4 = 0; function dragMouseDown(e) { e.preventDefault(); pos3 = e.clientX; pos4 = e.clientY; document.onmouseup = closeDragElement; document.onmousemove = elementDrag; } function elementDrag(e) { e.preventDefault(); const pos1 = pos3 - e.clientX; const pos2 = pos4 - e.clientY; pos3 = e.clientX; pos4 = e.clientY; lyricsDiv.style.top = `${lyricsDiv.offsetTop - pos2}px`; lyricsDiv.style.left = `${lyricsDiv.offsetLeft - pos1}px`; } function closeDragElement() { document.onmouseup = null; document.onmousemove = null; } return lyricsDiv; } // 获取歌曲ID function getSongId(lyricsDisplay) { const audioPlayer = document.getElementById('apple-music-player'); if (!audioPlayer) { console.log('当前页面未找到音频播放器'); return; } let title = audioPlayer.title; const secondDashIndex = title.indexOf('-', title.indexOf('-') + 1); if (secondDashIndex !== -1) { title = title.substring(0, secondDashIndex).trim(); } lyricsDisplay.innerText = title; const apiUrl = `https://music.163.com/api/search/pc?s=${title}&offset=0&limit=1&type=1`; GM_xmlhttpRequest({ method: "GET", url: apiUrl, responseType: "json", onload: function(response) { if (response.status === 200) { const data = response.response; if (data.result && data.result.songs && data.result.songs.length > 0) { const firstSongId = data.result.songs[0].id; getLyrics(firstSongId, lyricsDisplay); console.log(apiUrl, 'ID - ' + firstSongId); } else { lyricsDisplay.innerText = "未找到歌曲"; } } else { lyricsDisplay.innerText = "请求失败"; } }, onerror: function() { console.error("未知错误"); } }); } // 获取歌词 function getLyrics(songId, lyricsDisplay) { const apiUrl = `https://music.163.com/api/song/lyric?lv=1&kv=1&tv=-1&id=${songId}`; lyricsDisplay.innerText = '... 加载中 ...'; GM_xmlhttpRequest({ method: "GET", url: apiUrl, responseType: "json", onload: function(response) { if (response.status === 200) { const data = response.response; const lyricsTransLines = data.tlyric.lyric; const lyricsLines = data.lrc.lyric; const lyricss = parseLyrics(lyricsLines); const tlyricss = parseLyrics(lyricsTransLines); const audioPlayer = document.getElementById('apple-music-player'); audioPlayer.dataset.songId = songId; document.addEventListener('timeupdate', function(event) { const audioPlayer = event.target; if (audioPlayer.id === 'apple-music-player') { const currentTime = audioPlayer.currentTime; const currentLyric = findCurrentLyric(currentTime, lyricss); const currentTLyric = findCurrentLyric(currentTime, tlyricss); updateLyricsDisplay(currentLyric, currentTLyric, lyricsDisplay); } }, true); } else { lyricsDisplay.innerText = '... 歌词获取失败 ...'; } }, onerror: function(err) { console.error(err); } }); } // 解析歌词 function parseLyrics(lyricsText) { return lyricsText.split('\n').filter(line => line.trim() !== '').map(line => { const matches = line.match(/\[(\d{2}):(\d{2})(?:\.(\d{1,3}))?\](.*)/); if (matches) { const minutes = parseInt(matches[1]); const seconds = parseInt(matches[2]); let milliseconds = matches[3] ? parseInt(matches[3]) : 0; // 补充毫秒位为三位数 if (milliseconds < 100 && milliseconds >= 10) { milliseconds *= 10; } const text = matches[4].trim(); const totalSeconds = minutes * 60 + seconds + milliseconds / 1000; return { startTime: totalSeconds, text: text }; } }).filter(Boolean); } // 查找当前歌词 function findCurrentLyric(currentTime, lyrics) { return lyrics.find((lyric, i) => currentTime >= lyric.startTime && (i === lyrics.length - 1 || currentTime < lyrics[i + 1].startTime) ) || null; } // 更新歌词 function updateLyricsDisplay(currentLyric, currentTLyric, lyricsDisplay) { lyricsDisplay.innerText = '... 加载中 ...'; if (currentLyric) { const lyricHTML = `${currentLyric.text}
${currentTLyric ? currentTLyric.text : ''}`; lyricsDisplay.innerHTML = lyricHTML; } else { lyricsDisplay.innerText = '... ...'; } } const lyricsDisplay = createLyricsDisplay(); // 检测切歌 setInterval(function() { const audioPlayer = document.getElementById('apple-music-player'); if (audioPlayer) { let title = audioPlayer.title; if (title) { const secondDashIndex = title.indexOf('-', title.indexOf('-') + 1); if (secondDashIndex !== -1) { title = title.substring(0, secondDashIndex).trim(); } if (title !== audioPlayer.dataset.lastTitle) { audioPlayer.dataset.lastTitle = title; lyricsDisplay.innerText = '... 加载中 ...'; getSongId(lyricsDisplay); } } } }, 1000); })();