CCCPaste

download album's covers from bandcamp

/*
HOW TO USE
1. go to the artist's page on bandcamp (e.g., https://artistname.bandcamp.com/album/...)
2. use this script via console (F12 to open)
3. CTRL+C generated commands
4. open powershell and go to the folder wich you want to storage covers
5. CTRL+V generated commands and press enter
*/



// Script to generate PowerShell commands for downloading covers from Bandcamp
(function() {
    'use strict';

    // Function to sanitize a filename by removing invalid characters
    function sanitizeFilename(filename) {
        // Remove invalid characters, leaving letters, numbers, spaces, hyphens, and underscores
        const cleaned = filename.replace(/[^a-z0-9\s\-_]/gi, '').trim();
        // Replace multiple spaces with a single one and then with an underscore
        return cleaned.replace(/\s+/g, '_');
    }

    // Function to get the URL of the image in maximum quality
    function getFullSizeImageUrl(url) {
        // _10 is usually one of the largest versions. _0 is the original, but may not be available.
        return url.replace(/_\d+\.jpg/, '_0.jpg');
    }

    // --- Main function ---
    function generatePowerShellCommands() {
        console.log('🎵 Starting to gather information to generate commands...');

        const musicItems = document.querySelectorAll('#music-grid .music-grid-item');

        if (musicItems.length === 0) {
            console.error('❌ No music items found on the page.');
            return;
        }

        const covers = [];
        musicItems.forEach(item => {
            const imgElement = item.querySelector('.art img');
            const titleElement = item.querySelector('.title');

            if (imgElement && titleElement) {
                const imageUrl = imgElement.src || imgElement.getAttribute('data-original');
                const title = titleElement.textContent.trim();
                
                covers.push({
                    fullSizeUrl: getFullSizeImageUrl(imageUrl),
                    filename: `${sanitizeFilename(title)}.jpg`
                });
            }
        });

        if (covers.length === 0) {
            console.error('❌ Failed to extract cover data.');
            return;
        }
        
        console.log(`✅ Found ${covers.length} covers.`);
        console.log('--------------------------------------------------');
        console.log('⬇️ COPY THE ENTIRE COMMAND BLOCK BELOW AND PASTE IT INTO POWERSHELL ⬇️');
        console.log('--------------------------------------------------');

        // Generate one large string with all the commands
        const commands = covers.map(cover => {
            // Use the native PowerShell command Invoke-WebRequest
            return `Invoke-WebRequest -Uri "${cover.fullSizeUrl}" -OutFile "${cover.filename}"`;
        }).join('\n');

        // Output the entire block to the console for easy copying
        console.log(commands);

        console.log('--------------------------------------------------');
        console.log('⬆️ END OF COMMAND BLOCK ⬆️');
        console.log('\n✅ Done! Now open PowerShell in the desired folder and paste the copied commands.');
    }

    // Start the generation
    generatePowerShellCommands();
})();