Preloads any YouTube (and LiveLink!) links and appends the title of the video to the link in the referring page
// ==UserScript== // @name YouTube Title Adder // @namespace Smiths // @description Preloads any YouTube (and LiveLink!) links and appends the title of the video to the link in the referring page // @include * // @exclude http://*.youtube.com/* // @exclude https://*.youtube.com/* // @exclude http://*.liveleak.com/* // @exclude http://youtube.com/* // @exclude http://liveleak.com/* // @exclude http://*.google.*/search?* // @exclude http://google.*/search?* // @exclude https://google.*/search?* // @exclude https://*.google.*/search?* // @version 3.4.2 // @grant GM_getValue // @grant GM_setValue // @grant GM_addStyle // @grant GM_log // @grant GM_xmlhttpRequest // @grant GM_registerMenuCommand // @attribution changes [d:03.15.13][u:<ul><li>Finally fixed long-standing oversight on my part that did not even try to define the size of the expand/collapse icon. This led to some sites having some huge Plus/Minus pictures.</li><li>Per suggestion on script's forum (and something I made another script to do manually), this now will automatically append YT/LL titles to Twitter/Tweetdeck posts that use the "data-full/expanded" et al tags.</li><li>If tweets don't use those tags (some inline twitter things on certain websites always just use the URL shortener without any indication of what the real page is) I recommend <a href="http://userscripts.org/scripts/show/140411">My URL Unshortener</a> script</li></ul>] // ==/UserScript== //note to self: gotta make sure to update the one in the metadata too! var v = "3.4.2"; var scriptNum = "12113"; var scriptName = "YouTube Title Adder"; //<--Updater Stuff var isFireFox = navigator.userAgent.indexOf("Firefox") > -1 || navigator.userAgent.indexOf("Iceweasel") > -1; GM_addStyle("#smgm_bgdiv{ text-align: center;position:fixed;top:0px;left:0px;z-index:9991;width:100%;height:100%;background-color:black;opacity:0.7;display:block;visibility:visible;}"); GM_addStyle("#smgm_dialogbox { vertical-align:middle;left:40px;top:15px;border:3px solid #000 !important;text-align:center !important;background-color:#fff !important;color:#000 !important;font-family:arial,verdana !important;z-Index:9999;position:fixed;width:18%;height:50%;margin-left:auto;margin-right:auto;display:block;visibility:visible;}"); GM_addStyle(".smgm_buttons { color:#000 !important;font: 90% 'arial','trebuchet ms',helvetica,sans-serif !important;background-color:#B2CCFF !important;border:2px solid !important;border-color: #E0EBFF #000 #000 #E0EBFF !important;vertical-align: top !important;}"); GM_addStyle(".smgm_table { margin-bottom:10px !important;border:0px !important;border-collapse:collapse !important;margin-left:auto;margin-right:auto; }"); var remindLaterV = GM_getValue('remindLaterV', remindLaterV); if (!remindLaterV) { remindLaterV = 0; GM_setValue('remindLaterV',remindLaterV); } var homepageURL = "http://userscripts.org/scripts/show/" + scriptNum ; var metaURL = "http://userscripts.org/scripts/source/" + scriptNum + ".meta.js"; var scriptJSURL = "http://userscripts.org/scripts/source/" + scriptNum + ".user.js"; function doremindLater(clicked,span) { if (clicked) remindLaterV = span; else remindLaterV--; GM_setValue('remindLaterV',remindLaterV); } function hideUpdate() { document.body.removeChild(document.getElementById('smgm_bgdiv')); document.body.removeChild(document.getElementById('smgm_dialogbox')); } function checkNew(version) { var upgrade = 0; var verstring = ""; var theHTML = ""; GM_xmlhttpRequest({ method:"GET", url:metaURL, onload:function(content){ var aResponse = content.responseText; var USversion = aResponse.match(/@version.*?(\d[^<]+?)\n/); aResponse = aResponse.replace(/ \/>/g,'>'); aResponse = aResponse.replace(/\n/g,''); var changeDate = aResponse.match(/\[d:([0-9]+?\.[0-9]+?\.[0-9]+?)\]/i)[1]; var theChanges = aResponse.match(/\[u:(.*?)\]/i)[1]; vSplit = version.split("."); vmain = Number(vSplit[0]); vvsub = Number(vSplit[1]); vrsub = Number(vSplit[2]); USsplit = USversion[1].split("."); USvmain = Number(USsplit[0]); USvsub = Number(USsplit[1]); USrsub = Number(USsplit[2]); verstring = "<div style='padding:5px;border-bottom:1px dotted #000;'>Latest Version on Userscripts: <a href='" + homepageURL + "' target='_new' title='Click to visit script's page'><b>" + USvmain + "." + USvsub + "." + USrsub + "</b></a><br>Your Installed Version: <b>" + vmain + "." + vvsub + "." + vrsub + "</b></div>"; if (USvmain > vmain) upgrade = 1; if ( (USvsub > vvsub) && (USvmain >= vmain) ) upgrade = 1; if ( (USrsub > vrsub) && (USvsub == vvsub) && (USvmain >= vmain) ) upgrade = 1; if (upgrade == 1) //upgrade available, pop a box { theHTML += "<div style='padding:5px;border-bottom:1px dotted #000;'>New version of " + scriptName + " available.</div>"; theHTML += verstring + "<p>"; theHTML += "<table class='smgm_table'><tr><td><input type='button' class='smgm_buttons' id='smgm_installButton' onMouseUp=\"document.location.href=\'" + scriptJSURL + "\';\" value='Install'></td>"; theHTML += "<td style='width:25px;'> </td><td><input style='' class='smgm_buttons' type='button' id='smgm_remindButton' value='Remind Me Later'></td>"; theHTML += "</tr></table><div style='background-color:white !important;overflow:auto !important;height:50%;text-align:left;border-top:1px dotted #000;padding:7px;' colspan='5'>Changes (" + changeDate.replace(/\./g,"/") + "):<br><span style='font-style:italic;'>" + theChanges + "</span></div>"; div1 = document.createElement('div'); div1.id = 'smgm_dialogbox'; div1.style.display = "none"; div1.innerHTML = theHTML; document.body.appendChild(div1); div2 = document.createElement('div'); div2.id = 'smgm_bgdiv'; div2.style.display = "none"; div2.addEventListener("click",function(){doremindLater(true,15);hideUpdate();},false); document.body.appendChild(div2); document.getElementById('smgm_bgdiv').style.display='block'; document.getElementById('smgm_dialogbox').style.display='block'; document.getElementById('smgm_remindButton').addEventListener("click", function(){doremindLater(true,60);hideUpdate();},false); document.getElementById('smgm_installButton').addEventListener("click", function(){hideUpdate();},false); } } }) } if (isFireFox) //only do update on FFox, Chrome/Tampermonkey are weird { doremindLater(false); if (remindLaterV < 1) checkNew(v); } //end updater stuff--> 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 closeIcon = "data:image/gif;base64,R0lGODlhCgAKAIABAAAAAP///yH5BAEAAAEALAAAAAAKAAoAAAIWhI8WyxfA3oOyqnVno9piyElONCVJAQA7"; var ytlinks = 1; var ytimage = 0; var ytembedimage = 1; var ytlowbw = 0; var ytsize = 1; var playerV=3; var playerAN=3; 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)); ytlowbw = Number(GM_getValue('ytlowbw', ytlowbw)); ytsize = Number(GM_getValue('ytsize', ytsize)); playerAN = Number(GM_getValue('playerAN', playerAN)); GM_registerMenuCommand('YouTube Title Adder Options', smgm_yt_showOptions); } var dw = 425; var dh = 320; var vw,vh; //h/w * nw = nh if (ytsize==0) vw = dw; else if (ytsize==1) vw = 560; else if (ytsize==2) vw = 750; else vw = dw; vh = dh/dw * vw; function checkNew2(version) { GM_xmlhttpRequest({ method:"GET", url:metaURL, headers:{"User-Agent":"monkeyagent"}, onload:function(content){ var upgrade = 0; var USversion = content.responseText.match(/@version.*?(\d[^<]+?)\n/); content.responseText = content.responseText.replace(/ \/>/g,'>'); content.responseText = content.responseText.replace(/\n/g,''); var changeDate = content.responseText.match(/\[d:([0-9]+?\.[0-9]+?\.[0-9]+?)\]/i)[1]; var theChanges = content.responseText.match(/\[u:(.*?)\]/i)[1]; vSplit = version.split("."); vmain = Number(vSplit[0]); vvsub = Number(vSplit[1]); vrsub = Number(vSplit[2]); USsplit = USversion[1].split("."); USvmain = Number(USsplit[0]); USvsub = Number(USsplit[1]); USrsub = Number(USsplit[2]); verstring = "<div style='padding:5px;border-bottom:1px dotted #000;'>Latest Version on Userscripts: <a href='" + homepageURL + "' target='_new' title='Click to visit script's page'><b>" + USvmain + "." + USvsub + "." + USrsub + "</b></a><br>Your Installed Version: <b>" + vmain + "." + vvsub + "." + vrsub + "</b></div>"; if (USvmain > vmain) upgrade = 1; if ( (USvsub > vvsub) && (USvmain >= vmain) ) upgrade = 1; if ( (USrsub > vrsub) && (USvsub == vvsub) && (USvmain >= vmain) ) 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; if (ytlowbw == 0) document.getElementById('lowbw0').checked = true; else if (ytlowbw == 1) document.getElementById('lowbw1').checked = true; else document.getElementById('lowbw2').checked = true; if (ytsize == 0) document.getElementById('vid0').checked = true; else if (ytsize == 1) document.getElementById('vid1').checked = true; else document.getElementById('vid2').checked = true; if (playerAN==1) document.getElementById('playerANon').checked = true; else document.getElementById('playerANoff').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 ); if (document.getElementById('lowbw1').checked) GM_setValue('ytlowbw', 1 ); else if (document.getElementById('lowbw2').checked) GM_setValue('ytlowbw', 2 ); else GM_setValue('ytlowbw', 0 ); if (document.getElementById('vid1').checked) GM_setValue('ytsize', 1 ); else if (document.getElementById('vid2').checked) GM_setValue('ytsize', 2 ); else GM_setValue('ytsize', 0 ); if (document.getElementById('playerANon').checked) GM_setValue('playerAN', 1 ); else GM_setValue('playerAN', 3 ); } function hideOptions() { document.body.removeChild(document.getElementById("smgm_optionsDiv")); document.body.removeChild(document.getElementById("smgm_modalDiv")); } //full thanks to "Google Anonymizer" code for visual options - http://userscripts.org/scripts/review/10448 function smgm_yt_showOptions() { ytlinks = Number(GM_getValue('ytlinks', ytlinks)); ytimage = Number(GM_getValue('ytimage', ytimage)); ytembedimage = Number(GM_getValue('ytembedimage', ytembedimage)); var div1=document.getElementById("smgm_modalDiv"); if (div1==null) { GM_addStyle("#smgm_modalDiv{position:fixed; top:0px; left:0px; z-index:200; width:100%; height:100%; background-color:black; opacity:0.75;}"); GM_addStyle(".smgm_hidden{display:none; visibility:hidden;}"); div1=document.createElement("DIV"); div1.id="smgm_modalDiv"; div1.className="smgm_hidden"; div1.title="Click to cancel and close"; document.body.appendChild(div1); div1.addEventListener("click",hideOptions,false); } var div2=document.getElementById("smgm_optionsDiv"); if (div2==null) { GM_addStyle(".smgm_optionsTable{vertical-align:middle !important;border-spacing: 2px !important; border: 1px solid #000 !important; border-collapse: collapse !important;padding-left:10px !important;margin-bottom:3px !important;color:#000 !important;}"); GM_addStyle("#smgm_optionsDiv{overflow:auto;position:fixed !important; top:3%; left:20%; z-index:210; width:50%; height:60%; background-color:white !important; border:solid 3px #0033CC !important;}"); div2=document.createElement("DIV"); div2.id="smgm_optionsDiv"; div2.className="smgm_hidden"; div2.setAttribute("style","text-align:justify !important;padding:10px !important;font-family:verdana,arial !important;font-size:10pt !important;"); 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/LiveLeak Text Links:<br><input type=\"radio\" id=\"linkon\" name=\"textlinks\" value=\"1\"/><label for=\"linkon\"> Enabled</label><br><input type=\"radio\" id=\"linkoff\" name=\"textlinks\" value=\"0\"/><label for=\"linkoff\"> Disabled</label><br>"; text1+="<li>Names on YouTube/LiveLeak Image Links:<br><input type=\"radio\" id=\"imageon\" name=\"imglinks\" value=\"1\"/><label for=\"imageon\"> Enabled</label><br><input id=\"imageoff\" type=\"radio\" name=\"imglinks\" value=\"0\"/><label for=\"imageoff\"> Disabled</label><br>"; text1+="<li>Embed Buttons for YouTube/LiveLeak Links:<br><input type=\"radio\" id=\"embedon\" name=\"embed\" value=\"1\"/><label for=\"embedon\"> Enabled</label><br><input type=\"radio\" id=\"embedoff\" name=\"embed\" value=\"0\"/><label for=\"embedoff\"> Disabled</label><br>"; text1+="<li>Default Embedded Video Size:<br><input type=\"radio\" id=\"vid0\" name=\"vidsize\" value=\"0\"/><label for=\"vid0\"> Small (Default since script began)</label><br><input type=\"radio\" id=\"vid1\" name=\"vidsize\" value=\"1\"/><label for=\"vid1\"> Medium</label><br><input type=\"radio\" id=\"vid2\" name=\"vidsize\" value=\"2\"/><label for=\"vid2\"> Large</label><br>"; text1+="<li>Bandwidth Version:<br><input type=\"radio\" id=\"lowbw0\" name=\"lowbw\" value=\"0\"/><label for=\"lowbw0\"> Full (Complete Error Descriptions)</label><br><input type=\"radio\" id=\"lowbw1\" name=\"lowbw\" value=\"1\"/><label for=\"lowbw1\"> Medium (Uses mobile site, less error descriptions)</label><br><input type=\"radio\" id=\"lowbw2\" name=\"lowbw\" value=\"2\"/><label for=\"lowbw2\"> Lowest (uses Meta, very minimal error messages)</label><br>"; text1+="<li>Enable Video Annotations by Default:<br><input type=\"radio\" id=\"playerANon\" name=\"playerAN\" value=\"1\"/><label for=\"playerANon\"> Enabled</label><br><input type=\"radio\" id=\"playerANoff\" name=\"playerAN\" value=\"0\"/><label for=\"playerANoff\"> Disabled</label><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("smgm_optionsDiv").className=""; document.getElementById("smgm_modalDiv").className=""; setOptions(); checkNew2(v); div1.className=""; div2.className=""; } GM_addStyle(".smgm_ytTitle{border:none !important; padding:0px !important; margin:none !important; margin-left:2px !important;}"); GM_addStyle(".smgm_ytButton{height:11px !important;width:11px !important;}"); function makeStart(time) { var h=0;var m=0;var s=0; if (time.match(/h/)) h=time.match(/(\d+)h/)[1]; if (time.match(/m/)) m=time.match(/(\d+)m/)[1]; if (time.match(/s/)) s=time.match(/(\d+)s/)[1]; time = parseInt(h)*3600+parseInt(m)*60+parseInt(s); return time; } var allLinks, thisLink, thetitle, tubelink; function addtitle(link, number,vidlink) { var requestURL; if (ytlowbw==0) requestURL = link.href; else if (ytlowbw==1) requestURL = "http://m.youtube.com/watch?v=" + vidlink; else if (ytlowbw==2) requestURL = "http://gdata.youtube.com/feeds/api/videos/" + vidlink; GM_xmlhttpRequest({ method:"GET", url:requestURL, onload:function(content){ var isAgeVerify; var verifyHTML = ""; var ageString = ""; var color1 = "0x000000"; var color2 = "0x7c7c7c"; var embedid, alink; var linkOK = ""; var videoname = ""; var extra = link.hash; var aResponse = content.responseText; if(extra.length>0) extra = makeStart(extra); if (ytlowbw==0) { var videoembedcode = aResponse.match(/(http:\/\/youtu\.be\/)([^<]+?)\"/); if (videoembedcode) { linkOK = videoembedcode[1]; var videoembed = unescapeHTML(videoembedcode[2].replace(/\\/g,"")); videoNumber = videoembed;} aResponse = aResponse.replace(/\\'/g,"'"); videoname = aResponse.match(/meta property=\"og:title\" content=\"([^<]+?)\"/); if (!videoname) { videoname = aResponse.match(/<div id=\"vidTitle\">([^<]+)<\/div>/); } if (!videoname) { videoname = aResponse.match(/<meta name=\"title\" content=\"([^<]+)\">/); } if (!videoname) { //at this point it's an error page on YouTube (login page, etc) //let's see if its an age verification isAgeVerify = aResponse.match(/desktop_uri=%2Fverify_age%3Fnext_url%3Dhttp%253A%2F%2Fwww.youtube.com%2Fwatch%253Fv%253D([^<]+?)&/); if (isAgeVerify) { var videoembed = unescapeHTML(isAgeVerify[1].replace(/\\/g,"")); var videoNumber = videoembed; linkOK = "http"; //we know it's legit videoname = aResponse.match(/alt="Thumbnail" class="" title=\"([^<]+?)\"/); ageString = " [age restr]"; var color1 = "0xFF9900"; var color2 = "0xCC5200"; GM_xmlhttpRequest({ method: "GET", url: "http://www.youtube.com/watch?v=" + videoNumber, onload: function( response ) { verifyHTML = response.responseText; } }); } else //who knows, video not found, whatever { if (aResponse.match(/<div id=\"unavailable-message\"/i)) { theError = aResponse.match(/<div id=\"unavailable-message\".*?>[ \t]+(.*?)\n/i)[1] videoname = ["Error",theError.substr(0,theError.length-1).replace(/<.*?>/g,'')]; } else videoname = ["Error","Video Not Found"]; } } }else if (ytlowbw==1){ if (aResponse.match(/<title>YouTube - Broadcast Yourself.<\/title>/)) //error { if (aResponse.match(/border-bottom:1px dashed #FF0000"><\/div>/)) //just a bunch of dashes videoname = ["Error","Removed by Youtube"]; else if (aResponse.match(/border-bottom:1px dashed #FF0000">/)) //there an error on mobile site { theError = aResponse.match(/border-bottom:1px dashed #FF0000">(.*?)<\/div>/)[1]; videoname = ["Error",theError.substr(0,theError.length-1).replace(/<.*?>/g,'')]; } else videoname = ["Error","Other (age rest./etc.)"]; } else { linkOK = "http"; videoname = aResponse.match(/<title>(.*?)<\/title>/); videoNumber = vidlink; } }else if (ytlowbw==2){ if (aResponse.match(/<media:title/) == null) //error { if (aResponse.match(/<error>/)) videoname = ["Error",aResponse.match(/<code>(.*?)<\/code>/)[1]]; else videoname = ["Error",aResponse]; } else { linkOK = "http"; videoname = aResponse.match(/<media:title.*?>(.*?)<\/media:title>/); videoNumber = vidlink; } } embeddedtag = document.createElement('div'); embeddedtag.className = "smgm_ytTitle"; btn = document.createElement('a'); btn.className = "smgm_ytTitle"; if (linkOK.substr(0,4).toLowerCase() == "http") { alink = vidlink + number; btn.id = alink; embedid = alink + "embedded"; embeddedtag.id = embedid; embeddedtag.style.display = 'none'; embeddedtag.setAttribute("align", "center"); objectHTML = '<object><param name="movie" value="http://www.youtube.com/v/' + videoNumber + '?version='+playerV+'&fs=1&hl=en_US&disablekb=1&rel=0&color1=' + color1 + '&color2=' + color2 + '&border=0&iv_load_policy='+playerAN+'&modestbranding=1&autohide=1&start='+extra+'"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param>' + '<embed id="'+embedid+'_v" src="http://www.youtube.com/v/' + videoNumber + '?version='+playerV+'&fs=1&hl=en_US&disablekb=1&rel=0&color1=' + color1 + '&color2=' + color2 + '&modestbranding=1&border=0&iv_load_policy='+playerAN+'&autohide=1&start='+extra+'" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="'+vw+'" height="'+vh+'"></embed></object>' + ''; embeddedtag.innerHTML = objectHTML; btn.innerHTML = '<img class="smgm_ytTitle smgm_ytButton" src="' + ytexpandimg + '" align="top" border="0" title="Click to Show Video">'; btn.addEventListener('click', function(){toggleembed(this.id,1);drawvidoptions(this.id);}, true); } if ((link.innerHTML.indexOf('<img') < 0) && (ytlinks == 1)) { link.innerHTML = (videoname[0] != "Error") ? '<i style="background:none !important;">' + link.innerHTML + " (<b>YT: " + unescapeHTML(videoname[1]) + ageString + "</b>)</i>" : '<i style="background:none !important;">' + link.innerHTML + " (<b>Error: " + unescapeHTML(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 = (videoname[0] != "Error") ? '<i style="background:none !important;">' + link.innerHTML + " (<b>YT: " + unescapeHTML(videoname[1]) + ageString + "</b>)</i>" : '<i style="background:none !important;">' + link.innerHTML + " (<b>Error: " + unescapeHTML(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'); if (videoname[0] != "Error") theimg[0].setAttribute('title', 'YouTube link: Video name = "' + unescapeHTML(videoname[1]) + ageString + '"'); else theimg[0].setAttribute('title', 'YouTube Error: ' + unescapeHTML(videoname[1])); } if ((linkOK.substr(0,4) == "http") && (ytembedimage == 1)) { link.parentNode.insertBefore(embeddedtag, link.nextSibling); link.parentNode.insertBefore(btn, link.nextSibling); } else { if (ytembedimage == 1) { objectHTML = '<object ><param name="movie" value="http://www.youtube.com/v/' + videoNumber + '?version='+playerV+'fs=1&hl=en_US&disablekb=1&rel=0&color1=' + color1 + '&color2=' + color2 + '&border=0&iv_load_policy='+playerAN+'&modestbranding=1&autohide=1&start='+extra+'"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param>' + '<embed src="http://www.youtube.com/v/' + videoNumber + '?version='+playerV+'fs=1&hl=en_US&disablekb=1&rel=0&color1=' + color1 + '&color2=' + color2 + '&border=0&modestbranding=1&iv_load_policy='+playerAN+'&autohide=1&start='+extra+'" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="'+vw+'" height="'+vh+'"></embed></object>'; alink = vidlink + number; btn.id = alink; embedid = alink + "embedded"; embeddedtag.id = embedid; embeddedtag.style.display = 'none'; embeddedtag.setAttribute("align", "center"); embeddedtag.innerHTML = objectHTML; if (videoname[0] != "Error") { 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);drawvidoptions(this.id);}, true); } else btn.innerHTML = '<img src="' + ytdisabled + '" align="top" border="0" title="YouTube Error: ' + unescapeHTML(videoname[1]) + '">'; link.parentNode.insertBefore(embeddedtag, link.nextSibling); link.parentNode.insertBefore(btn, link.nextSibling); } } } (videoname[0] != "Error") ? link.setAttribute('title', 'YouTube link: Video name = "' + unescapeHTML(videoname[1]) + ageString + '"') : link.setAttribute('title', 'YouTube Error: ' + unescapeHTML(videoname[1])); } }) } //LiveLeak function addtitleLL(link, number, vidlink) { GM_xmlhttpRequest({ method:"GET", url:link.href, onload:function(content){ var embedid, alink; var aResponse = content.responseText; var videoembedcode = aResponse.match(/<!--share_item_(.*?)_menu-->/); aResponse = aResponse.replace(/\\'/g,"'"); var videoname = aResponse.match(/<span class="section_title" st.*?>([^<]+?)<\/span>/); embeddedtag = document.createElement('div'); embeddedtag.className = "smgm_ytTitle"; btn = document.createElement('a'); btn.className = "smgm_ytTitle"; if (!videoname) videoname = "Video Not Found"; alink = vidlink + number; btn.id = alink; embedid = alink + "embedded"; embeddedtag.id = embedid; embeddedtag.style.display = 'none'; embeddedtag.setAttribute("align", "center"); objectHTML = '<object width="425" height="373"><param name="movie" value="http://www.liveleak.com/e/' + videoembedcode[1] + '"></param><param name="wmode" value="transparent"></param><param name="allowscriptaccess" value="never">' + '</param><embed id="'+embedid+'_v" src="http://www.liveleak.com/e/' + videoembedcode[1] + '" type="application/x-shockwave-flash" wmode="transparent" allowscriptaccess="never" width="450" height="370"></embed></object>'; embeddedtag.innerHTML = objectHTML; btn.innerHTML = '<img class="smgm_ytTitle smgm_ytButton" src="' + ytexpandimg + '" align="top" border="0" title="Click to Show Video">'; btn.addEventListener('click', function(){toggleembed(this.id,1);drawvidoptions(this.id);}, true); if ((link.innerHTML.indexOf('<img') < 0) && (ytlinks == 1)) { link.innerHTML = '<i style="background:none !important;">' + link.innerHTML + " (<b>LL: " + unescapeHTML(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 style="background:none !important;">' + link.innerHTML + " (<b>LL: " + unescapeHTML(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', 'LiveLeak link: Video name = "' + unescapeHTML(videoname[1]) + '"'); } if (ytembedimage == 1) { link.parentNode.insertBefore(embeddedtag, link.nextSibling); link.parentNode.insertBefore(btn, link.nextSibling); } } link.setAttribute('title', 'Liveleak link: Video name = "' + unescapeHTML(videoname[1]) + '"'); } }) } function toggleembed(id,embedable) { embeddedid = id + "embedded"; embeddedDIV = document.getElementById(embeddedid); if (embeddedDIV.style.display != 'none') { if (embedable == 1) document.getElementById(id).innerHTML = '<img class="smgm_ytTitle smgm_ytButton" src="' + ytexpandimg + '" align="top" border="0" title="Click to Show Video">'; if (embedable == 0) document.getElementById(id).innerHTML = '<img class="smgm_ytTitle smgm_ytButton" src="' + ytdisabled + '" align="top" border="0" title="Embedding disabled for this video, click to see preview thumb">'; embeddedDIV.innerHTML = embeddedDIV.innerHTML; embeddedDIV.style.display = 'none'; } else { document.getElementById(id).innerHTML = '<img class="smgm_ytTitle smgm_ytButton" src="' + ytcollapseimg + '" align="top" border="0" title="Click to Hide Video">'; embeddedDIV.style.display = ''; } } function unescapeHTML(s) { return s.replace('&', '&').replace('<',"<").replace('>','>').replace('"','"').replace(''','\''); } function drawvidoptions(id) { vid = id + "embedded_v"; var pos = findPos(document.getElementById(id)); if (document.getElementById("smgm_ytvidsize" + id)) document.body.removeChild(document.getElementById("smgm_ytvidsize" + id)); else { var highlighttag = document.createElement('div'); highlighttag.id = "smgm_ytvidsize" + id; highlighttag.setAttribute('style','padding:0px !important;margin:2px !important;color:#000;text-align:center;border:1px solid #000;background-color:#B6E3FF;z-index:175;position:absolute;top:'+(pos[1]-30)+'px;left:'+(pos[0]+20)+'px;-moz-box-shadow:2px 2px 4px #333;-webkit-box-shadow:2px 2px 4px #333;box-shadow:2px 2px 4px #333;'); var close = document.createElement('span'); close.id = vid + "sizebox"; close.addEventListener('click',function(){toggleembed(this.id.substr(0,this.id.length-17),1);drawvidoptions(this.id.substr(0,this.id.length-17));},false); close.setAttribute('style','margin-left:4px;vertical-align:middle;cursor:pointer;font-size:6pt;'); close.setAttribute('title','Click to Hide Video'); close.innerHTML = "<img alt='[x]' src='" + closeIcon + "'>"; var ytsizetable = document.createElement('table'); ytsizetable.setAttribute('style','font-family:verdana,arial !important;font-size:9pt !important;border-collapse:collapse;color:#000 !important;margin:0px !important; padding:2px !important;text-align:center !important;border:none !important;'); aTR1 = document.createElement('tr'); aTR1.setAttribute('style','background:#5CADE0;'); headerTD = document.createElement('td'); headerTD.setAttribute('colspan',3); headerTD.setAttribute('style','border-bottom:1px dotted #000;font-size:9pt;text-align:center;padding:1px !important;'); headerTD.innerHTML = "Video Size"; headerTD.appendChild(close); aTR1.appendChild(headerTD); ytsizetable.appendChild(aTR1); aTR2 = document.createElement('tr'); aTR2.setAttribute('style','padding:2px !important;margin:0px !important;'); var newTD = document.createElement('td'); newTD.innerHTML = '<a style="text-decoration:none !important;color:#000 !important;" title="Small" onclick="javascript:(function(){document.getElementById("'+vid+'").width="425";document.getElementById("'+vid+'").height="320";})();" href="javascript:void(0);">S</a>'; newTD.setAttribute('style','font-family:verdana,arial !important;font-size:9pt !important;text-align:center !important;padding:1px !important;margin:0px !important;border:none !important;'); aTR2.appendChild(newTD); var newTD = document.createElement('td'); newTD.innerHTML = '<a style="text-decoration:none !important;color:#000 !important;" title="Medium" onclick="javascript:(function(){document.getElementById("'+vid+'").width="560";document.getElementById("'+vid+'").height="420";})();" href="javascript:void(0);">M</a>'; newTD.setAttribute('style','font-family:verdana,arial !important;font-size:9pt !important;text-align:center !important;padding:1px !important;margin:0px !important;border:none !important;'); aTR2.appendChild(newTD); var newTD = document.createElement('td'); newTD.innerHTML = '<a style="text-decoration:none !important;color:#000 !important;" title="Large" onclick="javascript:(function(){document.getElementById("'+vid+'").width="750";document.getElementById("'+vid+'").height="563";})();" href="javascript:void(0);">L</a>'; newTD.setAttribute('style','font-family:verdana,arial !important;font-size:9pt !important;text-align:center !important;padding:1px !important;margin:0px !important;border:none !important;'); aTR2.appendChild(newTD); ytsizetable.appendChild(aTR2); highlighttag.appendChild(ytsizetable); highlighttag.addEventListener('click',function(){var p=findPos(document.getElementById(this.id.substr(14)));document.getElementById(this.id).style.top=(p[1]-30)+"px";document.getElementById(this.id).style.left=(p[0]+20)+"px";},false); document.body.appendChild(highlighttag); } } function findPos(obj){ var curleft = curtop = 0; if (obj.offsetParent){ do{ curleft += obj.offsetLeft; curtop += obj.offsetTop; }while (obj = obj.offsetParent); } return [curleft,curtop]; } var vc=0; document.addEventListener('DOMNodeInserted',function(e){ window.setTimeout(function(){ var newLinks = document.querySelectorAll('a[data-full-url*="youtu.be/"],a[data-full-url*="youtube.com/watch"],a[data-expanded-url*="youtu.be/"],a[data-expanded-url*="youtube.com/watch"],a[href*="liveleak.com/view"],a[href*="youtu.be/"],a[href*="youtube.com/watch"]'); if (newLinks.length > 0) { for (var i = 0; i < newLinks.length; i++) { if (newLinks[i].className.match(/\bsmgm_ytTitle\b/) == null) { vc++; var theURL; if (newLinks[i].href.match('/t.co/') && newLinks[i].getAttribute("data-expanded-url") != null) theURL = unescape(newLinks[i].getAttribute("data-expanded-url")); else if (newLinks[i].href.match('/t.co/') && newLinks[i].getAttribute("data-full-url") != null) theURL = unescape(newLinks[i].getAttribute("data-full-url")); else theURL = unescape(newLinks[i].href); (newLinks[i].className == "") ? newLinks[i].className = "smgm_ytTitle" : newLinks[i].className = newLinks[i].className + " smgm_ytTitle"; if (!theURL.match(/liveleak/i)) { vidlink = theURL.match(/youtube\.com\/watch/) ? theURL.match(/youtube\.com\/watch.*?\?.*v=([-_A-Za-z0-9]{11})/)[1] : theURL.match(/youtu\.be\/([-_A-Za-z0-9]{11})/)[1]; youtubelink = "http://www.youtube.com/watch?v=" + vidlink; if (theURL.match(/#(.*?)$/)) youtubelink += '#' + theURL.match(/#(.*?)$/)[1]; newLinks[i].href = youtubelink; addtitle(newLinks[i], vc, vidlink); } else //liveleak { vidlink = theURL.match(/view\?i=([-_A-Za-z0-9]{14})/)[1]; addtitleLL(newLinks[i],vc,vidlink); } } } } }, 200);} , false);