Soundsnap Downloader

Add download link to Soundsnap previews.

// ==UserScript==
// @name        Soundsnap Downloader
// @namespace   https://github.com/Enchoseon/enchos-assorted-userscripts/raw/main/soundsnap-downloader.user.js
// @version     1.1.0
// @description Add download link to Soundsnap previews.
// @author      Enchoseon
// @include     *soundsnap.com/search/audio?*
// @grant       none
// @run-at      document-start
// ==/UserScript==

(function() {
    "use strict";
    // =================
    // Mutation Observer
    // =================
    const observer = new MutationObserver(function(mutations_list) {
        mutations_list.forEach(function(mutation) {
            mutation.addedNodes.forEach(function(added_node) {
                if (added_node.classList && added_node.classList.contains("ojoo-teaser")) {
                    start();
                }
            });
        });
    });
    observer.observe(document, { subtree: true, childList: true });
    function start() {
        // =========================
        // Intercept Download Button
        // =========================
        document.querySelectorAll("div.ojoo-teaser").forEach((track) => {
            if (track.dataset.processed) return;
            track.dataset.processed = "true";
            const downloadButton = track.querySelector("a.button-icon.teaser-icons.primary.ojoo-icon-download");
            console.log(downloadButton);
            downloadButton.removeAttribute("href");
            downloadButton.addEventListener("click", () => {
                var event = new MouseEvent("mouseover", {
                    "bubbles": true,
                    "cancelable": true
                });
                track.querySelector("span.ojoo-play").dispatchEvent(event);
                downloadTrack(track.querySelector("audio").src, track.querySelector("div.audio-description").innerHTML);
            });
        });
        // =================
        // Download Function
        // =================
        function downloadTrack(url, name) {
            console.log("Downloading: " + name + " (" + url + ")");
            window.open(url);
        }
    }
})();