Play All YouTube Videos Channel

Adds a button that lets you play all videos from this YouTube channel.

// ==UserScript==
// @name Play All YouTube Videos Channel
// @description Adds a button that lets you play all videos from this YouTube channel.
// @homepageURL https://github.com/DrakeRoxas/playyoutubechannel
// @author Drake Roxas
// @version 1.0.0
// @date 2016-01-13
// @include http://www.youtube.com/*
// @include https://www.youtube.com/*
// @exclude http://www.youtube.com/embed/*
// @exclude https://www.youtube.com/embed/*
// @match http://www.youtube.com/*
// @match https://www.youtube.com/*
// @match http://s.ytimg.com/yts/jsbin/html5player*
// @match https://s.ytimg.com/yts/jsbin/html5player*
// @match http://manifest.googlevideo.com/*
// @match https://manifest.googlevideo.com/*
// @match http://*.googlevideo.com/videoplayback*
// @match https://*.googlevideo.com/videoplayback*
// @match http://*.youtube.com/videoplayback*
// @match https://*.youtube.com/videoplayback*
// @grant GM_xmlhttpRequest
// @grant GM_getValue
// @run-at document-end
// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAB3RJTUUH2wMOCgIoGUYEAQAAAAlwSFlzAAALEgAACxIB0t1+/AAAAARnQU1BAACxjwv8YQUAAAGSUExURfi/JO/v797e3sbGxq2traWlpZSUlJycnNbW1oyEhIRaWow5OZQhIZwYGKUQEKUICK0ICJQxMYxKSoxzc4x7e4RCQpQYGKUAAK0AALUAAL0AAK0QEIxra5QpKa0YGIxSUsYAAKUhIZR7e87Ozr0ICJRSUr29vYxjY6U5OaUpKa0hIb21tZwAALUICO/Ozu/GxqUxMZSEhLUYGO/W1r0YGKVCQpQQEL0pKffe3vfW1pxra5Q5OcZCQvfn585CQr2trZx7e8ZSUs5SUq05Oc5jY9ZjY84AAKWMjM5zc957e60pKdaMjOelpbWcnLWUlLVCQsYYGMYICNbOzpQICMYhIbV7e5xaWt6cnPfv79bGxt6lpe+9vc5KSs6lpb0xMc6EhM69vbUxMbUhIb1aWs61tcZaWuecnMYxMb1KSsZjY96UlNa1td7W1r17e9a9vZwQEN6trb1jY8YQENZra+fOzr1zc85aWufe3t6MjMY5OdZaWt61tdZ7e+/n5+e9vc6MjMZra+/e3ue1tdalpd7GxrUpKalL4aAAAAABdFJOUwBA5thmAAACxklEQVR42uXX/1/SQBgH8NuAoEQ2ijgbBivJLznBAiUUKiyJSgOVAk0tKZKw75mRRt/7v4MBY8ezjW39Vs8v8rqHz/u1jbvbidC/XL8KmcpOqVT6nSjXjooGw8WfFd+QWGfE4oLbtbr++PdMOy0BDYLjEj/0xevfWIyVAI7b/aIj/9WHsRrA8Yf9bqSexVgD4Lic9kWE/LgPwPGfNfJHDO4P8Iuq+S2M9QD8oUp+nxEAcFCtfgIA/14x/9ElAKDQbNQAwN9VAiYEABy0OgsAWAnB/AcBAtVWawkAfJ4CD0BQADZavYcQgI9h3CCQjpD5PcEgwG+SwLRhIL0vz78SjAPEU3hrHODfyX4I6rUJIP0G3oExoNwFXpoB+HwXmDEFpF9IwKA5YK+Tp9fMAdUOsC6YA553gKcmgdTfAhV1oMQqADndQDmJ0AZLAsFnCIV3VYDHJLAjDkZKciAaFz/lCeBJB1glgXBrNLndBWLJ9uZGAI+keTBLANL8SnWAzWRniAC2pG+6lQF0hfjTqCIBrEvjDwiggFSLuIUoLY0vEwAbUcsnc/LlnO02HGvEz+hXEeJ5Yj+4L2vNkxOJDSnlQzliIq2synr3embiUBjmw0FyU83KX04Ob+9aAK/Ppd5deZloz4HFlCHzt3sX0x2a6LcvQb4ab8r7i+DVdqvnCq/D5ZzqdhfAcr5B9wD0PNwPEu0ZnLwK9oPgNfCQJ2fhhhITJ3E8BjeUOXA+QNQlBh5xLjemVCgKjzgzNIJFjWF4yJoKhafgIWt6VHGmjgR0HvMuTipPdWQJ6AImbBRSE8aY/sC4er5xFx5vHyB4YRRpFWUf0AL4c+dHkHZRFo9TDeB9Aa3Llwjr8FlFwB+wO/rHm0VbPae9mPini/O5h/XGxatw2I6fGHAOuhiGZVxO98lTdgutP94yaIvVdqxZdpvFYTT9X9UfqQQlTXlm8wkAAAAASUVORK5CYII=
// @namespace https://greasyfork.org/users/27155
// ==/UserScript==


(function () {
    function getChannelId() {
        var metas = document.getElementsByTagName('meta');

        for (i = 0; i < metas.length; i++) {
            if (metas[i].getAttribute("itemprop") == "channelId") {
                return metas[i].getAttribute("content").slice(2);
            }
        }

        return "";
    }

    var CHANNEL_ID = getChannelId();
    var BUTTON_TEXT = {'en':'Play All','fr':'Tout Ecouter'};
    var BUTTON_TOOLTIP = {'en':'Play all videos from this channel','fr':'Ecouter toutes les vidéos de cette chaine'};

    start();

    function makeButton(url, margin) {
        var language=document.documentElement.getAttribute('lang');
        var buttonText=(BUTTON_TEXT[language])?BUTTON_TEXT[language]:BUTTON_TEXT.en;
        var buttonLabel=(BUTTON_TOOLTIP[language])?BUTTON_TOOLTIP[language]:BUTTON_TOOLTIP.en;
        
        var node = document.createElement("a");
        node.href = url;
        var html = '<button class="yt-uix-button yt-uix-button-size-default yt-uix-button-subscribe-branded yt-uix-button-has-icon no-icon-markup yt-uix-subscription-button yt-can-buffer yt-uix-tooltip" data-tooltip-text="'+buttonLabel+'" type="button" style="height: 22px; float: right;';
        if (margin) html += ' margin: 8px 8px 0px 0px;';
        html += '"><span class="yt-uix-button-content"><span class="subscribe-label">'+buttonText+'</span></span></button>';
        node.innerHTML = html;
        return node;
    }


    function start() {
        var pagecontainer=document.getElementById('page-container');
        if (!pagecontainer || !CHANNEL_ID) return;
        run();       
        var isAjax=/class[\w\s"'-=]+spf\-link/.test(pagecontainer.innerHTML);
        var logocontainer=document.getElementById('logo-container');  
        if (logocontainer && !isAjax) { // fix for blocked videos
            isAjax=(' '+logocontainer.className+' ').indexOf(' spf-link ')>=0;
        }
        var content=document.getElementById('content');
        if (isAjax && content) { // Ajax UI
            var mo=window.MutationObserver||window.WebKitMutationObserver;
            if(typeof mo!=='undefined') {
                var observer=new mo(function(mutations) {
                    mutations.forEach(function(mutation) {
                        if(mutation.addedNodes!==null) {
                            for (var i=0; i<mutation.addedNodes.length; i++) {
                                if (mutation.addedNodes[i].id=='watch7-content' || 
                                    mutation.addedNodes[i].id=='watch7-main-container' || 
                                    mutation.addedNodes[i].className=='branded-page-v2-container branded-page-base-bold-titles branded-page-v2-container-flex-width branded-page-v2-has-top-row branded-page-v2-secondary-column-hidden' ||
                                    mutation.addedNodes[i].className=='branded-page-v2-container branded-page-base-bold-titles branded-page-v2-container-flex-width branded-page-v2-has-top-row') { // old value: movie_player
                                    run();
                                    break;
                                }
                            }
                        }
                    });
                });
                observer.observe(content, {childList: true, subtree: true}); // old value: pagecontainer
            } else { // MutationObserver fallback for old browsers
                pagecontainer.addEventListener('DOMNodeInserted', onNodeInserted, false);
            }
        }
    }

    function onNodeInserted(e) { 
        if (e && e.target && (e.target.id=='watch7-content' || 
                              e.target.id=='watch7-main-container' ||
                              e.target.className=='branded-page-v2-container branded-page-base-bold-titles branded-page-v2-container-flex-width branded-page-v2-has-top-row branded-page-v2-secondary-column-hidden' ||
                              e.target.className=='branded-page-v2-container branded-page-base-bold-titles branded-page-v2-container-flex-width branded-page-v2-has-top-row')) { // old value: movie_player
            run();
        }
    }

    function run() {
        if (/^https?:\/\/www\.youtube.com\/watch\?/.test(window.location.href)) addInWatch(); 
        if (/^https?:\/\/www\.youtube.com\/user\//.test(window.location.href) || /^https?:\/\/www\.youtube.com\/channel\//.test(window.location.href)) addInUser();
    }

    function addInWatch() {
        var url = window.location.href;
        console.log(url);
        index = url.indexOf('list=');
        if (index > -1) {
            endIndex = url.indexOf('&', index);
            if (endIndex > -1) {
                url = url.replace(url.substr(index, endIndex), "list=UU" + CHANNEL_ID);
            } else {
                url = url.slice(0, index) + "list=UU" + CHANNEL_ID;
            }
        } else {
            url += "&list=UU" + CHANNEL_ID;
        }
        console.log(url);

        if (url == window.location.href) return;

        var content = document.getElementById("watch7-content");
        var infos = content.getElementsByClassName('yt-user-info');
        for (i = 0; i < infos.length; i++) {
            infos[i].appendChild(makeButton(url));
        }
    }

    function addInUser() {
        var url = "https://www.youtube.com/playlist?list=UU" + CHANNEL_ID;
        console.log(url);

        var content = document.getElementById('channel-subheader');
        content.appendChild(makeButton(url, true));
        content = document.getElementById('appbar-nav');
        content.appendChild(makeButton(url, true));
    }

})();