Pop YouTube Video Into Sidebar

By ucnv Last update Feb 25, 2008 — Installed 367 times. Daily Installs: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0
// ==UserScript==
// @name           Pop YouTube Video Into Sidebar
// @namespace      http://userscripts.org/users/40991
// @description    Adds a button to open the YouTube video in sidebar.
// @include        *
// ==/UserScript==

if(window != window.parent) return;

var xpath = './/embed|.//a';
getElementsByXPath(xpath).forEach(insertLink);
document.addEventListener('DOMNodeInserted', function(e) {
    if(!e.target) return;
    window.setTimeout(function() {
        getElementsByXPath(xpath, e.target).forEach(insertLink);
    }, 0);
}, false);

function insertLink(e) {
    var src = e.src;
    if(!src && e.href) {
        if(new RegExp('^' + location.href.replace('?', '\\?')).test(e.href)) return;
        if(/^http:\/\/[^\.]+\.youtube\.com\/watch\?v=([^&]+)[^#]*$/.test(e.href)) {
            src = 'http://www.youtube.com/v/' + RegExp.$1;
        }
    }
    if(!/^http:\/\/www\.youtube\.com/.test(src)) return;
    var span = document.createElement('span');
    var link = document.createElement('a');
    link.setAttribute('href', src + '&autoplay=1');
    link.setAttribute('target', '_search');
    link.setAttribute('title', 'open in sidebar');
    var img = document.createElement('img');
    img.src = getIcon();
    img.setAttribute('alt', 'open in sidebar');
    span.style.cssText = 'text-align:left;vertical-align:top;';
    img.style.cssText = link.style.cssText = 'border:0;margin:0;padding:0;';
    link.appendChild(img);
    span.appendChild(link);
    e.parentNode.insertBefore(span, e);
}

function getIcon() {
    return ["data:image/png,",
    "%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0B%00%00%00%0B%08%0",
    "2%00%00%00%26%CE%E0q%00%00%00%06tRNS%00%00%00%FF%00%FF%FD%3C%DC",
    "%F1%00%00%00%7CIDATx%9Cu%90Q%0E%C30%08C%9D%AA%F7%82%9B%95%DC%CC",
    "%9C%CC%FB%F0%C4%DAM%F3%17%82g%93%B0%20%01%00P%7B%E3Gu%5D%CBD%ED",
    "%9D%99%11%01%A0%BB%01DDw%93%3C%C6%3Dc%92%0Ep%E7%B0%DB-%8F'%CC%3",
    "A%CD%92%1C7I%17v%9E%C3%DA%F7%95A%F2C%DC%A1%A9%1F%19%DD%1D%11%F7",
    "%17%F8So%223g%FD%E4%FB%1E%A8*%92z%8AdUA%82%B4%20%FD%BB%A6%8B%17",
    "%1E%E2f%F8%A9%0F%7C%01%00%00%00%00IEND%AEB%60%82"].join('');
}

function getElementsByXPath(xpath, context) {
    var nodes = [], context = context || document;
    try {
        var r = document.evaluate(xpath, context, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
        for(var i = 0; i < r.snapshotLength; nodes.push(r.snapshotItem(i++)));
    } catch(e) { log(e) }
    return nodes;
};

function log(s) { console && console.log(s) }