// ==UserScript==
// @name Apple Music - iTunes Artwork Finder Lookup
// @namespace http://tampermonkey.net/
// @version 1.7.3
// @description Add a "🔎 iTunes Artwork Finder" button to Apple Music album pages. Clicking this button will capture the Album and Artist info from the page to the clipboard and open https://bendodson.com/projects/itunes-artwork-finder/, where you can paste the contents of the clipboard to search for high resolution album/cover art. Make sure to change the selectors for the "format" and "country" on iTAF to optimize your results!
// @match https://music.apple.com/*/album/*
// @match https://music.apple.com/*/library/albums/*
// @icon https://ptpimg.me/0r4nex.png
// @grant none
// @license MIT
// ==/UserScript==
(function () {
'use strict';
// Function to create the "🔎 iTunes Artwork Finder" button with SVG icon
function createButton(album, artist) {
const button = document.createElement('button');
button.className = 'custom-button';
button.style.cssText = 'background-color: var(--keyColorBG); color: white; border: none; padding: 0px 12px; cursor: pointer; border-radius: 6px; font: var(--body-emphasized); display: flex; align-items: center';
// Create the SVG element
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
svg.setAttribute('viewBox', '0 0 16 16');
svg.setAttribute('width', '13');
svg.setAttribute('height', '13');
svg.style.marginRight = '5px';
// Create the path element and set the new d attribute, fill color to white
const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
path.setAttribute('class', 'st0');
path.setAttribute('d', 'M0.9,16c-0.2,0-0.5-0.1-0.7-0.3C0.1,15.5,0,15.3,0,15.1s0.1-0.5,0.3-0.7l4.3-4.3c-0.4-0.5-0.7-1-0.9-1.6C3.4,7.8,3.3,7.1,3.3,6.4c0-0.6,0.1-1.2,0.2-1.7c0.2-0.5,0.4-1.1,0.6-1.5c0.3-0.5,0.6-0.9,1-1.3c0.4-0.4,0.8-0.7,1.3-1c0.5-0.3,1-0.5,1.5-0.6C8.5,0.1,9,0,9.6,0c0.6,0,1.2,0.1,1.7,0.2c0.5,0.1,1.1,0.4,1.5,0.6c0.5,0.3,0.9,0.6,1.3,1c0.4,0.4,0.7,0.8,1,1.3c0.3,0.5,0.5,1,0.6,1.5C15.9,5.2,16,5.8,16,6.4c0,0.6-0.1,1.2-0.2,1.7c-0.2,0.5-0.4,1.1-0.6,1.5c-0.3,0.5-0.6,0.9-1,1.3s-0.8,0.7-1.3,1c-0.5,0.3-1,0.5-1.5,0.6c-0.5,0.1-1.1,0.2-1.7,0.2c-0.7,0-1.5-0.1-2.2-0.4c-0.6-0.2-1.1-0.5-1.6-0.9l-4.3,4.3C1.4,15.9,1.2,16,0.9,16z M9.6,1.9C9.2,1.9,8.8,1.9,8.4,2C8.1,2.1,7.7,2.3,7.4,2.5C7,2.7,6.7,2.9,6.4,3.2C6.2,3.5,5.9,3.8,5.7,4.1C5.5,4.4,5.4,4.8,5.3,5.2C5.2,5.6,5.1,6,5.1,6.4c0,0.6,0.1,1.2,0.4,1.8c0.2,0.5,0.6,1,1,1.4c0.4,0.4,0.9,0.7,1.4,1c0.5,0.2,1.1,0.4,1.8,0.4c0.6,0,1.2-0.1,1.8-0.4c0.5-0.2,1-0.6,1.4-1c0.4-0.4,0.7-0.9,1-1.4C14,7.6,14.1,7,14.1,6.4c0-0.6-0.1-1.2-0.4-1.8c-0.2-0.5-0.6-1-1-1.4c-0.4-0.4-0.9-0.7-1.4-1C10.8,2,10.3,1.9,9.6,1.9z');
path.setAttribute('fill', '#FFFFFF');
// Append the path to the SVG
svg.appendChild(path);
// Create the text node for "iTunes Artwork Finder"
const buttonText = document.createTextNode(' iTunes Artwork Finder');
// Append SVG and text to the button
button.appendChild(svg);
button.appendChild(buttonText);
// Copy album and artist to clipboard
button.onclick = function () {
const textToCopy = `${album} ${artist}`;
navigator.clipboard.writeText(textToCopy).then(() => {
window.open('https://bendodson.com/projects/itunes-artwork-finder/', '_blank');
});
};
return button;
}
// Function to add the button to the primary actions section
function addButton() {
const albumElement = document.querySelector('h1.headings__title span[dir="auto"]');
const artistElement = document.querySelector('div.headings__subtitles');
const primaryActionsDiv = document.querySelector('div.primary-actions');
// Check if the button already exists to prevent adding it multiple times
if (albumElement && artistElement && primaryActionsDiv && !document.querySelector('#search-iTAF-button')) {
const album = albumElement.innerText;
const artist = artistElement.innerText;
// Create and append the "🔎 iTunes Artwork Findero" button
const button = createButton(album, artist);
button.id = 'search-iTAF-button'; // Assign an ID to the button to track its presence
primaryActionsDiv.appendChild(button);
}
}
// Keep checking for changes on the page and add the button once the elements are loaded
function persistentlyAddButton() {
addButton();
setTimeout(persistentlyAddButton, 1000); // Retry every 1 second
}
persistentlyAddButton(); // Start the loop to add the button
// Handle changes in the URL (e.g., if navigating between albums)
let lastUrl = location.href;
new MutationObserver(() => {
const url = location.href;
if (url !== lastUrl) {
lastUrl = url;
setTimeout(addButton, 1000); // Add button after the URL changes
}
}).observe(document, { subtree: true, childList: true });
})();