Youtube Advanced Stats

By Burn Last update Jan 17, 2012 — Installed 6,208 times.

There are 63 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.43
// @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';
if (DBG) {GM_log("getName: " + getName)};
var last_check = GM_getValue(getName);
if(!last_check) { GM_setValue(getName,time); }
var cversion = '0.9.93.43';

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;
    var Visualiz    = oldDeltas.visualizzazioni;
    var Prefs       = oldDeltas.preferiti;
    var ChanVisits  = oldDeltas.vis_canale;
    var Subscr      = oldDeltas.iscritti;
    
    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 {
        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";
      } catch(e) {
          GM_log(e.message);
      }
    if (DBG) {
        GM_log(vidcaric+" "+visualizz+" "+prefer+" "+viscanale+" "+iscriz);
        GM_log(typeof(vidcaric)+" "+typeof(visualizz)+" "+typeof(prefer)+" "+typeof(viscanale)+" "+typeof(iscriz));
    }

    var ora = DateNow.toString();
    GM_setValue(User+"_lastcheck", ora);

    var HTMLo = '<span style="color: darkgreen; font-size: 11px; font-weight: bold;">';
    var HTMLc = "</span>";
    var RE_final = /(<span style="color: darkgreen; 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?HTMLo+(vidcaric-LoadedVids)+HTMLc:" ";
    var diffVisualiz = (visualizz-Visualiz)>0?HTMLo+"+"+(visualizz-Visualiz)+HTMLc:" ";
    var diffPrefs = (prefer-Prefs)>0?HTMLo+"+"+(prefer-Prefs)+HTMLc:(prefer-Prefs)<0?HTMLo+(prefer-Prefs)+HTMLc:" ";
    var diffVisCan = (viscanale-ChanVisits)>0?HTMLo+"+"+(viscanale-ChanVisits)+HTMLc:" ";
    var diffSubscr = (iscriz-Subscr)>0?HTMLo+"+"+(iscriz-Subscr)+HTMLc:(iscriz-Subscr)<0?HTMLo+(iscriz-Subscr)+HTMLc:" ";
      
	diffVidCaricati = addCommas(diffVidCaricati);
    diffVisualiz = addCommas(diffVisualiz);
    diffPrefs = addCommas(diffPrefs);
    diffVisCan = addCommas(diffVisCan);
    diffSubscr = addCommas(diffSubscr);
    
    var ARR_strgen = new Array();
    ARR_strgen.push(diffVidCaricati);
    ARR_strgen.push(diffVisualiz);
    ARR_strgen.push(diffPrefs);
    ARR_strgen.push(diffVisCan);
    ARR_strgen.push(diffSubscr);
    
    if(DBG) {
        GM_log(ARR_strgen.join("|"));
    }
    
   
   if(spans[23]) {
        spans[23].parentNode.removeChild(spans[23]);
    }
    
    for (i=0,j=0;i<spans.length;i++) {
        if(spans[i].className == "grayText") {
            if (DBG) { 
                var RE = /(ipo)|(ype)/;
                if(RE.test(spans[i].innerHTML)) {
                    GM_log(spans[i].innerHTML);
                    GM_log("Channel type: Node #"+i);
                }
            }
            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)) {
            cont++;
            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: 216px !important');
            }
            var temp = "";
            divs[i].innerHTML = temp = divs[i].innerHTML.replace(RE_final,"$2$3 $1<br>");
            if (DBG){GM_log('OK : '+CN);GM_log(temp);}
            tot = i;
        }
    }
    
	
	var objGM_log = {
			username       : User,
        	videocaricati  : vidcaric,
            visualizzazioni: visualizz,
            preferiti      : prefer,
            vis_canale     : viscanale,
            iscritti       : iscriz
        };
      /* 
    var objGM_log = {
			username       : User,
        	videocaricati  : 0,
            visualizzazioni: 0,
            preferiti      : 0,
            vis_canale     : 0,
            iscritti       : 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><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 http://snippets.dzone.com/posts/show/701
String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); };