YouTube Title Adder

By Smiths Last update Feb 21, 2009 — Installed 5,786 times. Daily Installs: 0, 1, 14, 2, 3, 2, 1, 2, 1, 0, 2, 3, 0, 1, 2, 1, 2, 0, 0, 3, 5, 0, 1, 2, 4, 0, 6, 2, 3, 4, 4, 0

There are 4 previous versions of this script.

// ==UserScript==
// @name           YouTube Title Adder
// @namespace      Smiths
// @description    Preloads any YouTube links and appends the title of the video to the link in the referring page
// @include        *
// @exclude        http://*.youtube.com/*
// @exclude        http://youtube.com/*
// @exclude        http://*.google.*/search?*
// ==/UserScript==
var v = "2.1r4";
var homepageURL = "http://userscripts.org/scripts/show/12113";
var ytcollapseimg = "data:image/gif,GIF89a%0B%00%0B%00%A2%00%00%00%00%00%FF%FF%FF%5C%AD%E0%B6%E3%FF%FF%A5%A5%CE%CE%CE%FF%FF%FF%00%00%00!%F9%04%01%00%00%06%00%2C%00%00%00%00%0B%00%0B%00%00%03%24h%B0%CC%3A0%8E%10%96%94%15%5Ci%1B%1B%1DA%05%04Pt%9E%B9%08C%E1%BE'%20%B0%DB%3A%D7J%BA%18%09%00%3B";
var ytexpandimg = "data:image/gif,GIF89a%0B%00%0B%00%A2%00%00%00%00%00%FF%FF%FF%5C%AD%E0%B6%E3%FF%FF%A5%A5%CE%CE%CE%FF%FF%FF%00%00%00!%F9%04%01%00%00%06%00%2C%00%00%00%00%0B%00%0B%00%00%03*h%B0%CC%3A0%8E%10Vd%B0%82K%40%81%16%A3m!A%05%5D%11.%A3%0A%08%60Z%B8%02%CC%7C%C3R%C33%0E(%8D%86!%01%00%3B";
var ytdisabled = "data:image/gif,GIF89a%0B%00%0B%00%A2%00%00%00%00%00%FF%FF%FF%5C%AD%E0%B6%E3%FF%FF%A5%A5%CE%CE%CE%FF%FF%FF%00%00%00!%F9%04%01%00%00%06%00%2C%00%00%00%00%0B%00%0B%00%00%03-h%B0%CC%3A0%8E%10%16%04%11W%0C%08(%DDg%0D%40U%15%20v%9D%05%A9%96p%BB%08!%E8%A5%02%8D%92%E8%9C%B7%10%99%A2%D10%24%00%00%3B";
var ytlinks = 1;
var ytimage = 0;
var ytembedimage = 1;
if (!GM_xmlhttpRequest) {
    alert('Please upgrade to the latest version of Greasemonkey to use the full features of this script.');
    return;
} else {
ytlinks = Number(GM_getValue('ytlinks', ytlinks));
ytimage = Number(GM_getValue('ytimage', ytimage));
ytembedimage = Number(GM_getValue('ytembedimage', ytembedimage));
GM_registerMenuCommand('YouTube Title Adder Options', showOptions);
}

function checkNew(version)
{
GM_xmlhttpRequest({
		method:"GET",
		url:homepageURL,
		headers:{"User-Agent":"monkeyagent"},
		onload:function(content){
		var upgrade = 0;
		var USversion = content.responseText.match(/ver:([^<]+)<p>/);
		vmain = version.split("."); //vmain[0].vsub[0]rvsub[1]
		vsub = vmain[1].split("r");
		USvmain = USversion[1].split("."); //USvmain[0].USvsub[0]rUSvsub[1]
		USvsub = USvmain[1].split("r");
		verstring = "Latest Version on Userscripts: <b>" + USvmain[0] + "." + USvsub[0] + "r" + USvsub[1] + "</b><br>Your Installed Version: <b>" + vmain[0] + "." + vsub[0] + "r" + vsub[1] + "</b>";
		if (USvmain[0] > vmain[0]) upgrade = 1;
		if ( (USvsub[0] > vsub[0]) && (USvmain[0] >= vmain[0]) ) upgrade = 1;
		if ( (USvsub[1] > vsub[1]) && (USvmain[0] >= vmain[0]) ) upgrade = 1;
		document.getElementById('versioncheck').innerHTML = "<br>" + verstring + "<br><b>" + (upgrade ? "<a href=\"" + homepageURL + "\" target=\"_blank\">UPGRADE AVAILABLE</a>" : "You have the latest release");
		}
	})
}

function setOptions()
{
	if (ytlinks) document.getElementById('linkon').checked = true;
		else document.getElementById('linkoff').checked = true;
	if (ytimage) document.getElementById('imageon').checked = true;
		else document.getElementById('imageoff').checked = true;
	if (ytembedimage) document.getElementById('embedon').checked = true;
		else document.getElementById('embedoff').checked = true;
}

function saveOptions()
{
	if (document.getElementById('linkon').checked) GM_setValue('ytlinks', 1 );
		else GM_setValue('ytlinks', 0 );
	if (document.getElementById('imageon').checked) GM_setValue('ytimage', 1 );
		else GM_setValue('ytimage', 0 );
	if (document.getElementById('embedon').checked) GM_setValue('ytembedimage', 1 );
		else GM_setValue('ytembedimage', 0 );
}

function hideOptions()
{
	document.getElementById("optionsDiv").className="hidden";
	document.getElementById("modalDiv").className="hidden";
}

//full thanks to "Google Anonymizer" code for visual options - http://userscripts.org/scripts/review/10448
function showOptions()
{
	ytlinks = Number(GM_getValue('ytlinks', ytlinks));
	ytimage = Number(GM_getValue('ytimage', ytimage));
	ytembedimage = Number(GM_getValue('ytembedimage', ytembedimage));
	
	var div1=document.getElementById("modalDiv");
	if (div1==null)
	{
		GM_addStyle("#modalDiv{position:fixed; top:0px; left:0px; z-index:10; width:100%; height:100%; background-color:black; opacity:0.75;}");
		GM_addStyle(".hidden{display:none; visibility:hidden;}");
		
		div1=document.createElement("DIV");
		div1.id="modalDiv";
		div1.className="hidden";
		div1.title="Click to cancel and close";
		document.body.appendChild(div1);
		
		div1.addEventListener("click",hideOptions,false);
	}
	var div2=document.getElementById("optionsDiv");
	if (div2==null)
	{
		GM_addStyle("#optionsDiv{position:fixed; top:10%; left:20%; z-index:20; width:40%; height:50%; background-color:white; border:solid 3px #0033CC; overflow:auto;}");
		
		div2=document.createElement("DIV");
		div2.id="optionsDiv";
		div2.className="hidden";
		div2.setAttribute("style","text-align:justify;padding:10px");
		
		var text1="";
		text1+="<center><font size=\"+1\"><a href=\""+ homepageURL + "\" target=\"_blank\">YouTube Title Adder</a> Options</font><span id=\"versioncheck\" style=\"font-size:10px;\"><br><br>ver. " + v + " (Checking for updates...)</span></center>";
		text1+="<form id=\"YTTA\" name=\"titleform\"><ul>"
		text1+="<li>Names on YouTube Text Links:<br><input type=\"radio\" id=\"linkon\" name=\"textlinks\" value=\"1\"/> Enabled<br><input type=\"radio\" id=\"linkoff\" name=\"textlinks\" value=\"0\"/> Disabled<br>"
		text1+="<li>Names on YouTube Image Links:<br><input type=\"radio\" id=\"imageon\" name=\"imglinks\" value=\"1\"/> Enabled<br><input id=\"imageoff\" type=\"radio\" name=\"imglinks\" value=\"0\"/> Disabled<br>"
		text1+="<li>Embed Buttons for YouTube Links:<br><input type=\"radio\" id=\"embedon\" name=\"embed\" value=\"1\"/> Enabled<br><input type=\"radio\" id=\"embedoff\" name=\"embed\" value=\"0\"/> Disabled<br>"
		text1+="</ul><center><input type=\"button\" value=\"Ok\" id=\"okButton\" /><input type=\"button\" value=\"Cancel\" id=\"cancelButton\" /></center></form>";
		div2.innerHTML=text1;
		
		document.body.appendChild(div2);
		
		document.getElementById("okButton").addEventListener("click",function(){saveOptions();hideOptions();location.reload(true);},false);
		document.getElementById("cancelButton").addEventListener("click",function(){hideOptions();},false);
	}
	document.getElementById("optionsDiv").className="";
	document.getElementById("modalDiv").className="";
	setOptions();
	checkNew(v);
	div1.className="";
	div2.className="";
}

var allLinks, thisLink, thetitle, tubelink;

allLinks = document.evaluate('//a[@href]', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
for (var i = 0; i < allLinks.snapshotLength; i++) {
		if (allLinks.snapshotItem(i).href.search('youtube.com/watch') > -1) {
		theURL = unescape(allLinks.snapshotItem(i).href);
		youtubelink = "http://www.youtube.com/watch?v=" + theURL.match(/youtube\.com\/watch\?.*v=([-_A-Za-z0-9]{11})/)[1];
		allLinks.snapshotItem(i).href = youtubelink;
		addtitle(allLinks.snapshotItem(i), i);
		}			
}

function addtitle(link, number) {

GM_xmlhttpRequest({
		method:"GET",
		url:link.href,
		headers:{"User-Agent":"monkeyagent"},
		onload:function(content){
			var videoembedcode = content.responseText.match(
			/<input id=\"embed_code\"([^<]+)value=\"([^<]+)\" o/m
			);		
			if (videoembedcode) var videoembed = unescapeHTML(videoembedcode[2]);
			var videoname = content.responseText.match(/<h1 id=\"video_title\">([^<]+)<\/h1>/);
			embeddedtag = document.createElement('div');
			btn = document.createElement('a');
			if (!videoname) { 
				videoname = content.responseText.match(/<div id=\"vidTitle\">([^<]+)<\/div>/); 
				}
			if (!videoname) {
				videoname = content.responseText.match(/<meta name=\"title\" content=\"([^<]+)\">/);
				}
			if (!videoname) {
				videoname = content.title.substr(10);
				}
			if (videoembed.substr(0,1) == "<")
			{
				alink = videoname[1] + number;
				btn.id = alink; embedid = alink + "embedded";
				embeddedtag.id = embedid;
				embeddedtag.style.display = 'none';
				embeddedtag.setAttribute("align", "center");
				embeddedtag.innerHTML = videoembed;
				btn.innerHTML = '<img src="' + ytexpandimg + '" align="top" border="0" title="Click to Show Video">';
				btn.addEventListener('click', function(){toggleembed(this.id,1);}, true);
			}
			if ((link.innerHTML.indexOf('<img') < 0) && (ytlinks == 1)) 
			{ 
				link.innerHTML = '<i>' + link.innerHTML + " (<b>YT: " + videoname[1] + "</b>)</i>";
				if (ytembedimage == 1)
				{
					link.parentNode.insertBefore(embeddedtag, link.nextSibling);
					link.parentNode.insertBefore(btn, link.nextSibling);
				}
			}
			if ((link.innerHTML.indexOf('<img') > -1) && (ytimage == 1)) 
			{ 
				link.innerHTML = '<i>' + link.innerHTML + " (<b>YT: " + videoname[1] + "</b>)</i>"; 
				if (ytembedimage == 1)
				{
					link.parentNode.insertBefore(embeddedtag, link.nextSibling);
					link.parentNode.insertBefore(btn, link.nextSibling);
				}
			}
			else
			{
				if (link.innerHTML.indexOf('<img') > -1)
				{
					theimg = link.getElementsByTagName('img');
					theimg[0].setAttribute('title', 'YouTube link: Video name = "' + videoname[1] + '"');
				}
				if ((videoembed.substr(0,1) == "<") && (ytembedimage == 1))
				{
					link.parentNode.insertBefore(embeddedtag, link.nextSibling);
					link.parentNode.insertBefore(btn, link.nextSibling);
				}
				else
				{
					if (ytembedimage == 1)
					{
						link2 = content.responseText.match(/\"video_id\": \"([^<]+)\", \"l\"/);
						videoembed = '<object width="425" height="373"><param name="movie" value="http://www.youtube.com/v/' +
							link2[1] + '&hl=en&rel=0&color1=0xFF0000&color2=0xFF0000&border=0"></param><param name="wmode"' +
							'value="transparent"></param><embed src="http://www.youtube.com/v/' + link2[1] + '&hl=en&rel=0&color1=0xFF0000&color2=0xFF0000&border=0" type="application/x-shockwave-flash" wmode="transparent" width="425" height="373"></embed></object>'
						alink = videoname[1] + number;
						btn.id = alink; embedid = alink + "embedded";
						embeddedtag.id = embedid;
						embeddedtag.style.display = 'none';
						embeddedtag.setAttribute("align", "center");
						embeddedtag.innerHTML = videoembed;
						btn.innerHTML = '<img src="' + ytdisabled + '" align="top" border="0" title="Embedding disabled for this video, click to see preview thumb">';
						btn.addEventListener('click', function(){toggleembed(this.id,0);}, true);
						link.parentNode.insertBefore(embeddedtag, link.nextSibling);
						link.parentNode.insertBefore(btn, link.nextSibling);
					}
				}
			}
			link.setAttribute('title', 'YouTube link: Video name = "' + videoname[1] + '"');
		}
	})
}

function toggleembed(id,embedable)
{
	embeddedid = id + "embedded";
	isembedded = document.getElementById(embeddedid);
	if (isembedded.style.display != 'none')
	{
		if (embedable == 1) document.getElementById(id).innerHTML = '<img src="' + ytexpandimg + '" align="top" border="0" title="Click to Show Video">';
		if (embedable == 0) document.getElementById(id).innerHTML = '<img src="' + ytdisabled + '" align="top" border="0" title="Embedding disabled for this video, click to see preview thumb">';
		isembedded.style.display = 'none';
	}
	else
	{
		document.getElementById(id).innerHTML = '<img src="' + ytcollapseimg + '" align="top" border="0" title="Click to Hide Video">';
		isembedded.style.display = '';
	}
	//alert(id + "\n" + embeddedid +"\n"+ isembedded.style.display);

}

function unescapeHTML(s)
{
	return s.replace(
	  /&(amp|[lg]t|quot);/g,
	  function(m, p1)
	  {
		var map = {
		  amp:  "&",
		  lt:   "<",
		  gt:   ">",
		  quot: '"'
		};

		return map[p1];
	  });
}