// ==UserScript== // @name Apple Music Enhanced // @namespace http://tampermonkey.net/ // @version 1.8 // @description 增强Apple Music页面功能,添加ID复制、Telegram Bot下载和地区切换 // @match https://music.apple.com/* // @grant GM_setClipboard // @grant GM_addStyle // @license GNU GPLv3 // @downloadURL none // ==/UserScript== (function () { 'use strict'; const regions = [ { name: '🇭🇰', code: 'hk', fullName: 'Hongkong' }, { name: '🇯🇵', code: 'jp', fullName: 'Japan' }, { name: '🇺🇸', code: 'us', fullName: 'US' }, { name: '🇨🇳', code: 'cn', fullName: 'China' } ]; GM_addStyle(` .region-dropdown { appearance: none; background-color: #1c1c1e; border: none; color: white; font-size: 14px; font-family: inherit; padding: 8px 12px; width: 150px; border-radius: 4px; cursor: pointer; transition: background-color 0.3s; } .region-dropdown:hover { background-color: #2c2c2e; } .region-dropdown:focus { outline: none; } .region-dropdown option { background-color: #1c1c1e; color: white; } .custom-button { background-color: #1d1d1f; border: none; color: #fff; font-size: 14px; font-weight: bold; padding: 8px 16px; border-radius: 16px; cursor: pointer; margin-right: 10px; transition: background-color 0.3s, transform 0.1s; } .custom-button:hover { background-color: #2c2c2e; } .custom-button:active { transform: scale(0.95); } .feedback-message { position: fixed; bottom: 20px; left: 50%; transform: translateX(-50%); background-color: rgba(0, 0, 0, 0.7); color: white; padding: 10px 20px; border-radius: 5px; z-index: 9999; transition: opacity 0.3s; } `); function createButton(text, onClick, title) { const button = document.createElement('button'); button.textContent = text; button.className = 'custom-button'; button.addEventListener('click', onClick); if (title) button.title = title; return button; } function showFeedback(message) { const feedback = document.createElement('div'); feedback.textContent = message; feedback.className = 'feedback-message'; document.body.appendChild(feedback); setTimeout(() => { feedback.style.opacity = '0'; setTimeout(() => feedback.remove(), 300); }, 2000); } function getAlbumId(url) { const match = url.match(/\/album\/.*?\/(\d+)(?:\?i=\d+)?$/); return match ? match[1] : null; } function addAlbumButtons() { const existingButtons = document.querySelector('#album-buttons-container'); if (existingButtons) return; const previewButton = document.querySelector('button[data-testid="click-action"]'); if (!previewButton) return; const container = document.createElement('div'); container.id = 'album-buttons-container'; container.style.display = 'flex'; container.style.alignItems = 'center'; container.style.marginTop = '10px'; const copyIdButton = createButton('ID', function () { const albumId = getAlbumId(window.location.href); if (albumId) { GM_setClipboard(albumId); showFeedback('ID已复制'); } else { showFeedback('未找到ID'); } }, '复制专辑ID'); const searchCacheButton = createButton('搜索缓存', function () { const albumId = getAlbumId(window.location.href); if (albumId) { GM_setClipboard(albumId); showFeedback('ID已复制,正在打开搜索缓存'); window.location.href = 'tg://privatepost?channel=1841657952&post=184451'; } else { showFeedback('未找到ID'); } }, '复制ID并打开Telegram搜索缓存'); const TelegramBotName = 'BeatsRobot'; const downloadCacheButton = createButton('下载缓存', function () { const clipboardContent = prompt("请粘贴内容:"); if (clipboardContent) { const telegramUrl = `tg://resolve?domain=${TelegramBotName}&text=${encodeURIComponent(`/cache ${clipboardContent}`)}`; window.location.href = telegramUrl; showFeedback('正在发送到Telegram下载缓存'); } else { showFeedback('未获取到内容'); } }, '发送内容到Telegram下载缓存'); const directDownloadButton = createButton('直接下载', function () { const url = window.location.href.split('?')[0]; const telegramUrl = `tg://resolve?domain=${TelegramBotName}&text=${encodeURIComponent(`/dl ${url} 1`)}`; window.location.href = telegramUrl; showFeedback('正在打开Telegram进行下载'); }, '在Telegram中直接下载专辑'); container.appendChild(copyIdButton); container.appendChild(searchCacheButton); container.appendChild(downloadCacheButton); container.appendChild(directDownloadButton); regions.forEach(region => { const regionButton = createButton(region.name, function () { const currentUrl = window.location.href.split('?')[0]; const newUrl = currentUrl.replace(/\/\/music\.apple\.com\/[a-z]{2}/, `//music.apple.com/${region.code}`); GM_setClipboard(newUrl); showFeedback(`${region.fullName} 链接已复制`); }, `复制 ${region.fullName} 链接`); container.appendChild(regionButton); }); // 将地区下拉菜单添加到按钮容器的右侧 const dropdownContainer = document.createElement('div'); dropdownContainer.className = 'region-dropdown-container'; const dropdown = document.createElement('select'); dropdown.className = 'region-dropdown'; dropdown.innerHTML = `地区` + regions.map(region => ``).join(''); dropdown.addEventListener('change', function () { if (this.value) { const currentUrl = new URL(window.location.href); currentUrl.hostname = `music.apple.com/${this.value}`; currentUrl.pathname = currentUrl.pathname.replace(/\/[a-z]{2}\//, `/${this.value}/`); window.location.href = currentUrl.toString(); } }); dropdownContainer.appendChild(dropdown); container.appendChild(dropdownContainer); previewButton.parentNode.insertAdjacentElement('afterend', container); } function persistentlyAddButtons() { addAlbumButtons(); setTimeout(persistentlyAddButtons, 1000); } persistentlyAddButtons(); let lastUrl = location.href; new MutationObserver(() => { const url = location.href; if (url !== lastUrl) { lastUrl = url; setTimeout(addAlbumButtons, 1000); } }).observe(document, { subtree: true, childList: true }); })();