Youtube Advanced Stats - please read script Summary!

By Burn Last update Apr 7, 2012 — Installed 6,758 times.

There are 64 previous versions of this script.

// Youtube Advanced Stats
// Copyright (C) 2007-2012 Burn - droidseven [at] libero [dot] it
//
// Released under the GPL license
// http://www.gnu.org/copyleft/gpl.html
//
// ==UserScript==
// @name           Youtube Advanced Stats
// @author         Burn
// @version        0.9.93.55
// @description    Shows delta values in Youtube Account page since last refresh
// @icon           http://img7.imageshack.us/img7/4506/yasicon.png
// @include        http://*youtube.com/account*
// @exclude        http://www.youtube.com/my_videos_*
// @exclude        http://www.youtube.com/account#customize*
// @exclude        http://www.youtube.com/account_*
// ==/UserScript==
//*/

// set true to enable GM_log entries in your Javascript Console
const DBG = false;

// set milliseconds to your needs: the faster your connection, the lower the value
const MSECS_DELAY = 1250; // to me this is just enough
	
var time = new Date().getTime() + '';
var getName = window.location.host + '.lastCheck';
var last_check = GM_getValue(getName);
if(!last_check) { var last_check = 0; GM_setValue(getName,time); }
var cversion = '0.9.93.55';
var ClassN = document.body.className.toString();
if (!ClassN) {
	var lang = "it_IT";
} else {
	if (DBG){GM_log(ClassN);}
	var RE_lang = /[a-z]{2}_[A-Z]{2}/;
	var lang = ClassN.match(RE_lang).toString();
}

window.setTimeout(YouTubeAdvancedStats, MSECS_DELAY);

function YouTubeAdvancedStats() {
    var divs         = document.getElementsByTagName('div');
    var spans        = document.getElementsByTagName('span');
    var links        = document.getElementsByTagName('a');
    var DateObj      = new Date();
    var DateNow      = DateObj.getTime();
    
    var User = GetUser(spans);
    var oldDeltas = deserialize("objJson_" + User);
    
    if (DBG) {
    	GM_log(oldDeltas.toSource());
    }
    var LoadedVids  = oldDeltas.videocaricati || 0;
    var Visualiz    = oldDeltas.visualizzazioni || 0;
    var Prefs       = oldDeltas.preferiti || 0;
    var ChanVisits  = oldDeltas.vis_canale || 0;
    var Subscr      = oldDeltas.iscritti|| 0;
    var Iscrizioni  = oldDeltas.iscrizioni || 0;
    
    var DateLastChk = GM_getValue(User+"_lastcheck", 0); 
    timeDelta(DateLastChk, DateNow, "page-name", User);

    var ARR_stats = new Array();
    var RE_nums   = /<\/span>\s+([a-z0-9]+)<br>/gi;
  
    for (var i=0,j=0;i<divs.length;i++) {
        var CN = divs[i].className.toString();
        if (CN.substring(0,9) == "statBlock") {
            if (DBG){GM_log('statBlock OK');}
            divs[i].innerHTML = divs[i].innerHTML.replace(/,/g,"");
            ARR_stats[j++] = new String(divs[i].innerHTML.match(RE_nums));
            
            divs[i].innerHTML = addCommas(divs[i].innerHTML);
            if (DBG){GM_log("dopo il match: _" + ARR_stats[(j-1)] + "_ posizione j-1:" + (j-1) + " - posizione i: " + i);}
            break;
        }
    }
    if(DBG){var unito = ARR_stats.join(" - "); GM_log("ARR_stats: " + unito);}
    var Stats0     = ARR_stats[0].replace(RE_nums,"$1");
    var ARR_Stats0 = Stats0.split(",");
    
    if (DBG) {GM_log("dopo il replace: " + ARR_Stats0.join(" "));}
    try {
    	if (lang == "it_IT") {
	        var vidcaric    = ARR_Stats0[0] != "undefined" ? ARR_Stats0[0] : "ERR";
	        var visualizz   = ARR_Stats0[1] != "undefined" ? ARR_Stats0[1] : "ERR";
	        var prefer      = ARR_Stats0[2] != "undefined" ? ARR_Stats0[2] : "ERR";
	        var viscanale   = ARR_Stats0[3] != "undefined" ? ARR_Stats0[3] : "ERR";
	        var iscriz      = ARR_Stats0[4] != "undefined" ? ARR_Stats0[4] : "ERR";
	        
	        if (DBG) {
        GM_log(vidcaric+" "+visualizz+" "+prefer+" "+viscanale+" "+iscriz);
        GM_log(typeof(vidcaric)+" "+typeof(visualizz)+" "+typeof(prefer)+" "+typeof(viscanale)+" "+typeof(iscriz));
    }

    	} else {
    		var vidcaric      = ARR_Stats0[0] != "undefined" ? ARR_Stats0[0] : "ERR";
	        var visualizz     = ARR_Stats0[1] != "undefined" ? ARR_Stats0[1] : "ERR";
	        var prefer        = ARR_Stats0[2] != "undefined" ? ARR_Stats0[2] : "ERR";
	        var subscriptions = ARR_Stats0[3] != "undefined" ? ARR_Stats0[3] : "ERR";
	        var viscanale     = ARR_Stats0[4] != "undefined" ? ARR_Stats0[4] : "ERR";
	        var iscriz        = ARR_Stats0[5] != "undefined" ? ARR_Stats0[5] : "ERR";
	        if (DBG) {
        GM_log(vidcaric+" "+visualizz+" "+prefer+" "+subscriptions + " " +viscanale+" "+iscriz);
        GM_log(typeof(vidcaric)+" "+typeof(visualizz)+" "+typeof(prefer)+" "+typeof(subscriptions)+" "+typeof(viscanale)+" "+typeof(iscriz));
    }

    	}
      } catch(e) {
          GM_log(e.message);
      }
    
    var ora = DateNow.toString();
    GM_setValue(User+"_lastcheck", ora);

    var HTMLo = '<span style="color: darkgreen; font-size: 11px; font-weight: bold;">';
    var HTMLoNeg = '<span style="color: darkred; font-size: 11px; font-weight: bold;">';
    var HTMLc = "</span>";
    var RE_final = /(<span style="color: (darkgreen|darkred); font-size: 11px; font-weight: bold;">[\+|-][\d\,]+<\/span>)(<\/span>)\s+([\d,]+)<br>/g;

    var diffVidCaricati = (vidcaric-LoadedVids)>0?HTMLo+"+"+(vidcaric-LoadedVids)+HTMLc:(vidcaric-LoadedVids)<0?HTMLoNeg+(vidcaric-LoadedVids)+HTMLc:" ";
    var diffVisualiz = (visualizz-Visualiz)>0?HTMLo+"+"+(visualizz-Visualiz)+HTMLc:" ";
    var diffPrefs = (prefer-Prefs)>0?HTMLo+"+"+(prefer-Prefs)+HTMLc:(prefer-Prefs)<0?HTMLoNeg+(prefer-Prefs)+HTMLc:" ";
    if (lang != "it_IT") {
    	var diffIscrizioni = (subscriptions-Iscrizioni)>0?HTMLo+"+"+(subscriptions-Prefs)+HTMLc:(subscriptions-Iscrizioni)<0?HTMLoNeg+(subscriptions-Iscrizioni)+HTMLc:" ";
    }
    var diffVisCan = (viscanale-ChanVisits)>0?HTMLo+"+"+(viscanale-ChanVisits)+HTMLc:" ";
    var diffSubscr = (iscriz-Subscr)>0?HTMLo+"+"+(iscriz-Subscr)+HTMLc:(iscriz-Subscr)<0?HTMLoNeg+(iscriz-Subscr)+HTMLc:" ";
      
	diffVidCaricati = addCommas(diffVidCaricati);
    diffVisualiz = addCommas(diffVisualiz);
    diffPrefs = addCommas(diffPrefs);
    diffVisCan = addCommas(diffVisCan);
    diffSubscr = addCommas(diffSubscr);
    if (lang != "it_IT") {
    	diffIscrizioni = addCommas(diffIscrizioni);
    }
    
    var ARR_strgen = new Array();
    ARR_strgen.push(diffVidCaricati);
    ARR_strgen.push(diffVisualiz);
    ARR_strgen.push(diffPrefs);
    if (lang != "it_IT") {
    	ARR_strgen.push(diffIscrizioni);
    }
    ARR_strgen.push(diffVisCan);
    ARR_strgen.push(diffSubscr);
    
    if(DBG) {
        GM_log(ARR_strgen.join("|"));
    }
    
    var REch = /(tipo)|(type)/i;
    var REid = /(ID)/;
    for (i=0,j=0;i<spans.length;i++) {
        if(spans[i].className == "grayText") {
                if(REch.test(spans[i].innerHTML)) {
                    if (DBG) GM_log(spans[i].innerHTML);
                    if (DBG) GM_log("Channel type: Node #"+i);
                    continue;
                }
                if (REid.test(spans[i].innerHTML)) {
                	if (DBG) GM_log(spans[i].innerHTML);
                    if (DBG) GM_log("Youtube User ID: Node #"+i);
                    continue;
                }
            spans[i].innerHTML +=  " " + ARR_strgen[j++];
        }
    }
    
    for (i=0,tot=0,cont=0;i<divs.length;i++) {
        CN = divs[i].className.toString();
        var RE_cols = /^ytg-[1-2]col$/g;
        if (RE_cols.test(CN)) {
            if (++cont <= 4	) {
                if (DBG) {
                    var prova = divs[i].innerHTML.match(RE_final);
                    GM_log("=<=");
                    GM_log(divs[i].innerHTML);
                    GM_log("=>=");
                    GM_log("last regexp: "+prova+" - tipo "+typeof(prova));
                }
            divs[i].setAttribute('style', 'width: 310px !important;margin:0 !important;padding:0 !important;');
            }
            var temp = "";
            divs[i].innerHTML = temp = divs[i].innerHTML.replace(RE_final,"$3$4 $1<br>");
            if (DBG){GM_log('OK : '+CN);GM_log(temp);GM_log("i: "+i+" - tot: "+tot)}
            tot = i;
        }
    }
    
	if (lang == "it_IT") {
	var objGM_log = {
			username       : User,
        	videocaricati  : vidcaric,
            visualizzazioni: visualizz,
            preferiti      : prefer,
            vis_canale     : viscanale,
            iscritti       : iscriz
        };
        /*
        objGM_log = {
			username       : User,
        	videocaricati  : 0,
            visualizzazioni: 0,
            preferiti      : 0,
            vis_canale     : 0,
            iscritti       : 0
        };
        */

	} else {
		var objGM_log = {
			username       : User,
        	videocaricati  : vidcaric,
            visualizzazioni: visualizz,
            iscrizioni     : subscriptions,
            preferiti      : prefer,
            vis_canale     : viscanale,
            iscritti       : iscriz
		};
		/*
		objGM_log = {
			username       : User,
        	videocaricati  : 0,
            visualizzazioni: 0,
            preferiti      : 0,
            vis_canale     : 0,
            iscritti       : 0,
            iscrizioni     : 0
        };
		*/	
	} 
    	
	
    serialize("objJson_" + User, objGM_log);
}

function timeDelta(FirstD, LastD, ObjRef, nickName) {
    var OldDate = parseInt(FirstD);
    var LastDate = parseInt(LastD);
    var aDay = 86400000;
    var anHour = 3600000;
    var aMin = 60000;
    var aSec = 1000;
    var diff = LastDate - OldDate;
    
    if(DBG){
    	var oldDateObj = new Date(OldDate);
    	var lastDateObj = new Date(LastDate);
    	GM_log("Date before: "+oldDateObj.toLocaleString()+ " || Date now: "+ lastDateObj.toLocaleString() + " || Diff: "+ diff);
    }
        var Str = "<a href=\"http://userscripts.org/scripts/show/19967\" target=\"_blank\">";
    Str += "Youtube Advanced Stats</a>&nbsp;|&nbsp;User: <b>"+nickName+"</b>";
    
    if(OldDate == 0) {
    	Str += "<br /><i style=\"color:black\">This is the first time you execute me. Have fun!</i>";
    } else {

	    Str += "<br />Previous page load: ";
	    var d = Math.floor(diff/aDay);
	    Str += (d==1) ? d+" day " : (d>1) ? d+" days " : "";
	    diff -= (d*aDay);
	    var h = Math.floor(diff/anHour);
	    Str += (h==1) ? h+" hour " : (h>1) ? h+" hours " : "";
	    diff -= (h*anHour);
	    var m = Math.floor(diff/aMin);
	    Str += (m==1) ? m+" minute and " : (m>1) ? m+" minutes and " : "";
	    diff -= (m*aMin);
	    var s = Math.floor(diff/aSec);
	    var theDate = new Date(OldDate);
	    Str += s+" seconds ago. ("+ theDate.toLocaleString()+")";
    }
    var sp = document.createElement('span');
    sp.setAttribute('id', 'yas-credits');
    sp.innerHTML = Str;

    document.getElementById(ObjRef).appendChild(sp);
    if (DBG) {
        var parID = document.getElementById(ObjRef).parentNode.getAttribute('id');
        GM_log("id genitore di " + ObjRef + " : " + parID);
    }
    GM_addStyle("#yas-credits {\
                background-color:#DFDFDF;\
                padding:4px;\
                text-align:right;\
                letter-spacing:0.05em;\
                margin-top:-8px;\
                margin-right:-6px;\
                float:right;\
                clear:both;\
                display:block;\
                color:#222;\
                font-size:11px;\
                z-index:1001;\
                display:block;}");

    // check for updates here... code pasted from http://userscripts.org/scripts/show/52398
    if (DBG) {
    	GM_log("Ora: " + time + " | last_check: " + last_check + " | diff: " + (time - last_check));
    }
    if((time - last_check) > aDay) {
        GM_setValue(getName,time);
        if (DBG) {GM_log(GM_getValue(getName));}
        window.setTimeout(function() {
            if(DBG) {GM_log("starting XHR...");}
            GM_xmlhttpRequest({
            method:                "GET",
            url:                "http://userscripts.org/scripts/source/19967.meta.js?sinc="+time,
            headers:            { Accept:"text/javascript; charset=UTF-8" },
            overrideMimeType:    "application/javascript; charset=UTF-8",
            onload:                function(response) { checkversion(response); }
            }, 500);
        });
        
    }
}

function GetUser(ObjR) {
    var tmpU = null;
    for (var i=0;i<ObjR.length; i++) {
            if (ObjR[i].className == "yt-uix-expander-head yt-rounded") {
                tmpU = new String(ObjR[i].textContent);
                if (tmpU != "") {
                    if(DBG){GM_log('user found: '+tmpU.trim());}
                    return tmpU.trim();
                    break;
            } else {
                tmpU = "default";
                return tmpU;
                break;
            }
        }
    }
    if (!tmpU && DBG) {
        GM_log("GetUser: error");    
    }
} 

function checkversion(response) {
    var availableVersion;
    var Thediv = document.getElementById('yas-credits');
    var oldHTML = Thediv.innerHTML;
    if (response.status == 200) {
        if(DBG) GM_log("XHR ok... controllo versione");
        var resReg = /\/\/ @version\s+(\d+\.\d+\.\d+\.\d+)/.exec(response.responseText);
        if (resReg != null) {
            availableVersion = resReg[1];
            if(DBG) GM_log("Risultati regexp versione: "+resReg.join(" | "));
            if(DBG) GM_log("Versione corrente: " + cversion + " | Versione disponibile: " + availableVersion);
            if(availableVersion!=cversion) {
                if(DBG) GM_log("nuova versione disponibile!");
                var newHTML = ""; //"<a href='http://userscripts.org/scripts/source/19967.user.js'><b>NEW VERSION AVAILABLE</b></a>&nbsp;-&nbsp;";
                Thediv.innerHTML = newHTML + oldHTML;
            }
            
        }
    } else {
        if(DBG) GM_log("XHR ko: " + response.status);
        availableVersion = cversion;
        Thediv.innerHTML = "Updates check failed! - " + oldHTML;
    }
}

// serialize / deserialize functions
// taken from wiki.greasespot.net
function deserialize(name, def) {
  return eval(GM_getValue(name, (def || '({})')));
}

function serialize(name, val) {
  GM_setValue(name, uneval(val));
}

// addCommas
// found on http://www.mredkj.com/javascript/nfbasic.html
function addCommas(nStr) {
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}

// trim
// found on http://snippets.dzone.com/posts/show/701
String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); };