Greasy Fork is available in English.

Oh My Rockness Spotify Link

Add a spotify link to a band in the shows calander to make it easier to listen to them.

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name         Oh My Rockness Spotify Link
// @namespace    http://tampermonkey.net/
// @version      0.3
// @description  Add a spotify link to a band in the shows calander to make it easier to listen to them.
// @author       Kent Widman
// @match        https://*.ohmyrockness.com
// @match        https://*.ohmyrockness.com/shows*
// @match        https://open.spotify.com/search/*?autoplay
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    debugger;

    const svg = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgaGVpZ2h0PSI2MHB4IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2MCA2MCIgd2lkdGg9IjYwcHgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj48dGl0bGUvPjxkZWZzLz48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGlkPSJnbG9zcyIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiPjxnIGlkPSJTcG90aWZ5Ij48cGF0aCBkPSJNMzAsNjAgQzQ2LjU2ODU0MzMsNjAgNjAsNDYuNTY4NTQzMyA2MCwzMCBDNjAsMTMuNDMxNDU2NyA0Ni41Njg1NDMzLDAgMzAsMCBDMTMuNDMxNDU2NywwIDAsMTMuNDMxNDU2NyAwLDMwIEMwLDQ2LjU2ODU0MzMgMTMuNDMxNDU2Nyw2MCAzMCw2MCBaIiBmaWxsPSIjNTdCQjYzIi8+PHBhdGggZD0iTTUxLjIxMzIwMzcsOC43ODY3OTYyNiBDNTYuNjQyMTM1OCwxNC4yMTU3MjgzIDYwLDIxLjcxNTcyODMgNjAsMzAgQzYwLDQ2LjU2ODU0MzMgNDYuNTY4NTQzMyw2MCAzMCw2MCBDMjEuNzE1NzI4Myw2MCAxNC4yMTU3MjgzLDU2LjY0MjEzNTggOC43ODY3OTYyNiw1MS4yMTMyMDM3IEw1MS4yMTMyMDM3LDguNzg2Nzk2MjYgWiIgZmlsbD0iIzAwMDAwMCIgZmlsbC1vcGFjaXR5PSIwLjQwMDAwMDAwNiIgaWQ9InNwb3RpZnkiLz48cGF0aCBkPSJNMzguNjc2MTUyLDQxLjUzNzczODYgQzM4LjQ1OTI5NTQsNDEuNTMxMzc3IDM4LjI0MzEzMzksNDEuNDY3MDUzNyAzOC4wNDcxMjg5LDQxLjM0MzM1NSBDMzguMDQ1MDQzOCw0MS4zNDMzNTUgMzcuNzk0MTI5Niw0MS4xODE0ODY1IDM3LjI3OTA5NTIsNDAuOTAwODY3MiBDMzYuNzYzMzY1Nyw0MC42MTk1NDExIDM2LjAwMzY3MjYsNDAuMjMyMTg3NSAzNS4wNTcwMTAxLDM5LjgyNTc0OSBDMzMuMTY1NzcwNCwzOS4wMDcyMTczIDMwLjUxODMxMjksMzguMTAxMDM2MSAyNy41NTk0NzE1LDM3Ljc1MzI2NjIgQzI2LjY1MTAzNywzNy42NDcyMzg3IDI1Ljc3NjY2MDEsMzcuNTgyMjA4NiAyNC45NDA1MTExLDM3LjU1NDY0MTQgQzIxLjE4MDI3MzQsMzcuNDI4ODIyMiAxOC4yMjQ5MDczLDM3Ljk5NzgzNjEgMTcuMDIwMzgwMiwzOC4yNzkxNjIyIEMxNi42MTcyNDkzLDM4LjM3MzE3MzIgMTYuNDMxNjcwMSwzOC40MzA0MjggMTYuNDMwOTc1MSwzOC40MzA0MjggQzE1Ljc2MDI0ODgsMzguNjMwNDY2NCAxNS4wNTgyNDUsMzguMjM4MTY1IDE0Ljg2MDg0OTksMzcuNTU2NzYyIEMxNC42NjU1NCwzNi44NzM5NDUzIDE1LjA0OTIwOTQsMzYuMTU4NjEzNiAxNS43MTkyNDA2LDM1Ljk1OTI4MiBDMTUuODA0NzMyMiwzNS45MzQ1NDIzIDE5LjYxNzA5ODgsMzQuODA0Mjg5OSAyNS4wMjA0NDIyLDM0Ljk4MTcwOTEgQzI1LjkyMTIzMTIsMzUuMDEyODEwNSAyNi44Njg1ODg3LDM1LjA4MTM3NDkgMjcuODQ3MjIzNSwzNS4xOTY1OTE0IEMzNC40MTIwMDA4LDM1Ljk3NzY2MDEgMzkuMjk4MjI0NiwzOS4xMTI1Mzc4IDM5LjM4ODU4MTUsMzkuMTU5ODk2OCBDMzkuOTgyMTU3LDM5LjUzODA2MTMgNDAuMTYxNDgwNyw0MC4zMzI1NjAyIDM5Ljc5MDMyMjMsNDAuOTM0MDg5MSBDMzkuNTQ0MjczNSw0MS4zMzg0MDcxIDM5LjExMjY0NTQsNDEuNTUyNTgyNSAzOC42NzYxNTIsNDEuNTM3NzM4NiBaIE00My4yNzg3OTQyLDMzLjk0Njg4MTQgQzQyLjk2ODgwMDUsMzQuNDQ5NDUxNCA0Mi40MzA4MjkzLDM0LjcxOTQ2NzkgNDEuODg1MjEyNiwzNC43MDAzODMgQzQxLjYxNDE0MTgsMzQuNjkxMTkzOSA0MS4zNDM3NjYxLDM0LjYxMDYxMzEgNDEuMDk5MTA3NCwzNC40NTUxMDYyIEM0MS4wOTc3MTczLDM0LjQ1NzIyNjcgNDEuMDQyMTEzMSwzNC40MTgzNSA0MC44OTI2NzY2LDM0LjMyOTk5MzggQzQwLjc0MTg1MDEsMzQuMjQwOTMwOCA0MC41MTUyNjI3LDM0LjExMDE2MzYgNDAuMjIwNTYwMiwzMy45NDk3MDg4IEMzOS42MjY5ODQ4LDMzLjYyNTk3MTcgMzguNzU2Nzc4MiwzMy4xODA2NTY0IDM3LjY2NjIzOTgsMzIuNzEwNjAxNSBDMzUuNDkwNzIzMywzMS43Njk3ODQ3IDMyLjQ0NTY5NTQsMzAuNzMwNzE1OSAyOS4wNDQxMDUxLDMwLjMzMjA1MjggQzI4LjAwMjkxNTQsMzAuMjA5MDYwOSAyNi45OTU3ODM0LDMwLjEzNjI1NTQgMjYuMDMzMTM0NywzMC4xMDQ0NDcyIEMyMS43MDY0Mjg3LDI5Ljk1ODgzNjIgMTguMzA1NTMzNSwzMC42MTI2NzIgMTYuOTIzMDcyNywzMC45MzY0MDkxIEMxNi40NjE1NTc0LDMxLjA0NTI2NCAxNi4yNTIzNDY0LDMxLjEwNzQ2NjcgMTYuMjUwOTU2MywzMS4xMDk1ODczIEMxNS40MTM0MTcyLDMxLjM1Njk4NDYgMTQuNTMzNDc5OSwzMC44Njc4NDQ3IDE0LjI4ODgyMTIsMzAuMDE0Njc3MyBDMTQuMDQyNzcyNCwyOS4xNjA4MDMxIDE0LjUyMzA1NDEsMjguMjY2NjM4NCAxNS4zNjI2NzgzLDI4LjAyMDY1NDggQzE1LjQ2OTAyMTUsMjcuOTg3NDMyOCAxOS44ODEyMTkxLDI2LjY4MDQ2OCAyNi4xMzUzMDc1LDI2Ljg4ODI4MTggQzI3LjE3Nzg4NzMsMjYuOTIyOTE3NCAyOC4yNzE5MDEsMjcuMDAwNjcwOSAyOS40MDU1MzI4LDI3LjEzNDk3MjMgQzM3LjAxMjE5NDcsMjguMDQxMTUzNCA0Mi42NjcxNDc0LDMxLjY2NTE3MSA0Mi43Nzk3NDYsMzEuNzI5NDk0MyBDNDMuNTE4NTg3NSwzMi4yMDMwODM1IDQzLjc0Mzc4NDgsMzMuMTk0NzkzNCA0My4yNzg3OTQyLDMzLjk0Njg4MTQgWiBNNDcuMDE4MTgwMywyNi44NjM1NDIgQzQ2LjY0NDkzNjcsMjcuNDY3MTkxNiA0NS45OTcxNDcyLDI3Ljc4OTUxNSA0NS4zNDQ0OTIyLDI3Ljc2NzYwMjYgQzQ1LjAyMTI5MjUsMjcuNzU2OTk5OSA0NC42OTUzMTI2LDI3LjY2MTU3NTIgNDQuNDAyNjk1MiwyNy40NzM1NTMyIEM0NC40MDI2OTUyLDI3LjQ3MzU1MzIgNDQuMzM0NTgsMjcuNDI5NzI4NSA0NC4xNTgwMzY1LDI3LjMyNDQwNzkgQzQzLjk4Mjg4MzEsMjcuMjIxMjA3OSA0My43MTY2Nzc3LDI3LjA2NjQwNzkgNDMuMzY2MzcwOSwyNi44NzU1NTg1IEM0Mi42Njg1Mzc1LDI2LjQ5NzM5NCA0MS42NDE5NDM5LDI1Ljk3MzYxODUgNDAuMzU3NDg1NywyNS40MTgwMzQ3IEMzNy43OTI3Mzk0LDI0LjMxMDQwMTUgMzQuMjA1NTcsMjMuMDg0MDE3NSAzMC4xOTk5Nzg1LDIyLjYxMzk2MjYgQzI4Ljk3MTEyNDUsMjIuNDY5NzY1MyAyNy43ODMyNzg2LDIyLjM4NDk0MzMgMjYuNjUwMzQyLDIyLjM0ODE4NzEgQzIwLjcwMjc3MTksMjIuMTQ2MDI4MiAxNi4yNDA1MzA1LDIzLjIyNjgwMTEgMTUuMzA0MjkzOSwyMy40NzkxNDY0IEMxNS4xNzA4NDM3LDIzLjUxNDQ4ODkgMTUuMTIzNTgsMjMuNTI4NjI1OSAxNS4xMjM1OCwyMy41Mjg2MjU5IEMxNC4xMTc4MzgxLDIzLjgyNzYyMzIgMTMuMDY0MTM3NSwyMy4yMzk1MjQ0IDEyLjc2OTQzNDksMjIuMjE3NDIgQzEyLjQ3NDczMjQsMjEuMTkzOTAxOCAxMy4wNTAyMzY0LDIwLjEyMDE5NzQgMTQuMDU4MDYzNSwxOS44MjEyIEMxNC4xODU5NTMzLDE5Ljc4NTg1NzUgMTkuMzkzMjkxNywxOC4yNDIwOTgxIDI2Ljc3NDA2MTQsMTguNDg4MDgxOCBDMjguMDA1MDAwNiwxOC41MjgzNzIyIDI5LjI5NTAxOTMsMTguNjE4ODQ4OSAzMC42MzI5OTY3LDE4Ljc3NzE4MzIgQzM5LjYxNDQ3MzgsMTkuODQ4MDYwMyA0Ni4yODIxMTksMjQuMTIzNzkzMiA0Ni40MTc2NTQzLDI0LjIwMDgzOTggQzQ3LjMwNTIzNzIsMjQuNzY2MzE5NCA0Ny41NzQyMjI4LDI1Ljk2MDE4ODMgNDcuMDE4MTgwMywyNi44NjM1NDIgWiIgZmlsbD0iI0ZGRkZGRiIvPjwvZz48L2c+PC9zdmc+';
    var observerPage = null;
    var firstTime = true;

    // modifyPushState
    function modifyPushState() {
        var pushState = history.pushState;
        history.pushState = function () {
            pushState.apply(history, arguments);
            // todo fix this
            setTimeout(function(){
                //connectCbserver();
                addLinkToBand(document.body)
            }, 1000);
            // fireEvents('pushState', arguments);  // Some event-handling function
        };
    }

    // helper
    function insertAfter(el, referenceNode) {
        referenceNode.parentNode.insertBefore(el, referenceNode.nextSibling);
    }

    function addLinkToBand(target) {
        let bands = target.querySelectorAll('.bands a');
        if (bands !== null) {
            bands.forEach(function(band) {
                console.log(band);
                let bandName = band.textContent;
                let bandNameEncoded = encodeURI(bandName);

                // Create element
                let a = document.createElement('a');
                //let linkText = document.createTextNode("spotify");
                let img = document.createElement('img');
                //let linkText = document.createTextNode("spotify");
                img.src = svg;
                img.width = 18;
                img.height = 18;
                a.target = 'spotify_player';
                a.appendChild(img);
                a.href = "https://open.spotify.com/search/" + bandNameEncoded + '?autoplay';

                insertAfter(a, band);
            });
        }
    }

    // Callback function to execute when mutations are observed
    const callback = function(mutationsList, observer) {
        for(let mutation of mutationsList) {
            if (mutation.type === 'childList') {
                if (mutation.addedNodes.length > 0) {
                    for(let node of mutation.addedNodes) {
                        if (node.nodeType === 1){
                            addLinkToBand(node);
                        }
                    }
                }
                console.log('A child node has been added or removed.');
            }
            else if (mutation.type === 'attributes') {
                console.log('The ' + mutation.attributeName + ' attribute was modified.');
            }
        }
    };

    function connectCbserver() {
        if (observerPage !== null) {
            // stop observing
            observerPage.disconnect();
        }

        // Select the node that will be observed for mutations
        // const targetNode = document.getElementById('mainContainer');
        const targetNode = document.body ;

        // Options for the observer (which mutations to observe)
        const config = { attributes: true, childList: true, subtree: true };

        // Create an observer instance linked to the callback function
        observerPage = new MutationObserver(callback);

        // Start observing the target node for configured mutations
        observerPage.observe(targetNode, config);
    }

    function ohMyRockness() {
        modifyPushState();
        connectCbserver();
    }

    function autoPlay() {
        //find artist
        let showsListing = document.querySelector('.cover-art-playback');
        let artistLink = document.querySelector('.cover-art');
        if(!showsListing) {
            return;
        }

        setTimeout(function(){
            if (firstTime) {
                firstTime = false;
                showsListing.click();
                //artistLink.click();
            }
        }, 1000);
        observerPage.disconnect();
    }

    function spotify(){
        let body = document.querySelector('body');
        if(!body) {
            return;
        }

        observerPage = new MutationObserver(autoPlay);
        observerPage.observe(body, {
            'childList': true,
            'subtree': true
        });
    }

    if (window.location.hostname.match(/^([a-zA-Z0-9]+\.)?ohmyrockness.com$/i)) {
        ohMyRockness();
    } else if (window.location.hostname.match(/^([a-zA-Z0-9]+\.)?spotify.com$/i)) {
        spotify();
    }
})();