Skip to content

Instantly share code, notes, and snippets.

@luizen
Created May 14, 2025 15:51
Show Gist options
  • Save luizen/234f3b6089fb7d8557f291cc4da084be to your computer and use it in GitHub Desktop.
Save luizen/234f3b6089fb7d8557f291cc4da084be to your computer and use it in GitHub Desktop.
Beatport playlist extractor

Beatport Playlist Extractor

Execute this in the browser console while visiting a playlist page like https://www.beatport.com/genre/techno-raw-deep-hypnotic/92/top-100

// Find all .container elements
const containers = document.querySelectorAll('.container');

// Collect details (song, artist, and additional info) from each container
const details = Array.from(containers).map(container => {
    // Find the first and second <a> elements with a title attribute inside the container
    const titleLinks = container.querySelectorAll('a[title]');
    const titles = Array.from(titleLinks).map(link => link.title);
    
    // Find the additional info in <span>
    const additionalSpan = container.querySelector('span span'); // Adjust selector if needed
    const additionalInfo = additionalSpan ? additionalSpan.textContent.trim() : null;

    // Ensure there are at least two titles and include the additional info
    return titles.length >= 2 ? { song: titles[0], artist: titles[1], additionalInfo } : null;
}).filter(detail => detail); // Remove null entries in case some containers are incomplete

// Create the output in "artist - song (additional info)" format
const output = details.map(detail => {
    return `${detail.artist} - ${detail.song}${detail.additionalInfo ? ` (${detail.additionalInfo})` : ''}`;
}).join('\n');

// Copy the output to the clipboard
function copyToClipboard(text) {
    const textarea = document.createElement('textarea');
    textarea.value = text;
    document.body.appendChild(textarea);
    textarea.select();
    try {
        document.execCommand('copy');
        console.log('Copied to clipboard:');
        console.log(text);
    } catch (err) {
        console.error('Failed to copy:', err);
    }
    document.body.removeChild(textarea);
}

// Use the fallback method
copyToClipboard(output);

A bookmarklet can be used as well.

javascript: (function () {
    const containers = document.querySelectorAll('.container');
    const details = Array.from(containers).map(container => {
        const titleLinks = container.querySelectorAll('a[title]');
        const titles = Array.from(titleLinks).map(link => link.title);
        const additionalSpan = container.querySelector('span span');
        const additionalInfo = additionalSpan ? additionalSpan.textContent.trim() : null;
        return titles.length >= 2 ? { song: titles[0], artist: titles[1], additionalInfo } : null;
    }).filter(detail => detail);

    const output = details.map(detail => {
        return `${detail.artist} - ${detail.song}${detail.additionalInfo ? ` (${detail.additionalInfo})` : ''}`;
    }).join('\n');

    function copyToClipboard(text) {
        const textarea = document.createElement('textarea');
        textarea.value = text;
        document.body.appendChild(textarea);
        textarea.select();
        try {
            document.execCommand('copy');
            console.log('Copied to clipboard:');
            console.log(text);
        } catch (err) {
            console.error('Failed to copy:', err);
        }
        document.body.removeChild(textarea);
    }

    copyToClipboard(output);
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment