Youtube Advanced Stats

By Burn Last update Jul 8, 2009 — Installed 3,317 times. Daily Installs: 0, 0, 0, 0, 0, 1, 2, 3, 1, 1, 0, 0, 0, 0, 3, 1, 0, 1, 1, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 2, 3

There are 32 previous versions of this script.

// Youtube Advanced Stats
// v0.9.9.82
//
// Copyright (C)2007-2009 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 - droidseven at libero dot it
// @version        0.9.9.82
// @description    Shows differences in Youtube Account and My Videos pages since last refresh
// @include        http://*youtube.com/account*
// @include        http://*youtube.com/my_videos*
// @exclude        http://www.youtube.com/my_videos_* 
// ==/UserScript==


if (/my_videos/.test(window.location)) {
	VideosAdvancedStats(0);   // the only argument is : 1 for Debug Mode, 0 for no Debug
} else {
	window.setTimeout(YouTubeAdvancedStats, 1500); // adjust milliseconds to your needs
}

function YouTubeAdvancedStats() {
	
	var Debug        = 0; // set Debug = 1 to enable GM_log entries in your Javascript Console
	var divs         = document.getElementsByTagName('div');
	var spans        = document.getElementsByTagName('span');
	var ClassBody    = document.getElementsByTagName('body')[0].className;
	var DateObj      = new Date();
	var DateNow      = DateObj.getTime();
	var SpanToRemove = /^en/.test(ClassBody) ? 24: 24;
	if (Debug) {GM_log(ClassBody+" : "+SpanToRemove);}
	
	var User = GetUser(spans, Debug);
  
	var SeenVids    = GM_getValue(User+"_videoguardati", 0);
	var LoadedVids  = GM_getValue(User+"_videocaricati", 0);
	var Visualiz    = GM_getValue(User+"_visualizzazioni", 0);
	var Prefs       = GM_getValue(User+"_preferiti", 0);
	var ChanVisits  = GM_getValue(User+"_vis_canale", 0);
	var Subscr      = GM_getValue(User+"_iscritti", 0);
	
	var DateLastChk = GM_getValue(User+"_lastcheck", 0); 
	TimeShift(DateLastChk, DateNow, "page-name", Debug);
	
	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 (Debug){GM_log('statBlock OK');}
			divs[i].innerHTML = divs[i].innerHTML.replace(",","").replace(",","");
			ARR_stats[j++] = new String(divs[i].innerHTML.match(RE_nums));
			if (Debug){GM_log(ARR_stats[(j-1)]);};
		}
	}
  
	var Stats1     = ARR_stats[0].replace(RE_nums,"$1");
	var ARR_Stats1 = Stats1.split(",");
	var Stats2     = ARR_stats[1].replace(RE_nums,"$1");
	var ARR_Stats2 = Stats2.split(",");
	
	var vidvisti  = ARR_Stats1[0] != "undefined" ? ARR_Stats1[0] : "ERR";
	var vidcaric  = ARR_Stats1[1] != "undefined" ? ARR_Stats1[1] : "ERR";
	var visualizz = ARR_Stats1[2] != "undefined" ? ARR_Stats1[2] : "ERR";
	var prefer    = ARR_Stats1[3] != "undefined" ? ARR_Stats1[3] : "ERR";
	var viscanale = ARR_Stats2[0] != "undefined" ? ARR_Stats2[0] : "ERR";
	var iscriz    = ARR_Stats2[1] != "undefined" ? ARR_Stats2[1] : "ERR";
  
	if (Debug) {
		GM_log(vidvisti+" "+vidcaric+" "+visualizz+" "+prefer+" "+viscanale+" "+iscriz);
		GM_log(typeof(vidvisti)+ " "+typeof(vidcaric)+" "+typeof(visualizz)+" "+typeof(prefer)+" "+typeof(viscanale)+" "+typeof(iscriz));
	}
    
	GM_setValue(User+"_videoguardati", vidvisti);
	GM_setValue(User+"_videocaricati", vidcaric);
	GM_setValue(User+"_visualizzazioni", visualizz);
	GM_setValue(User+"_preferiti", prefer);
	GM_setValue(User+"_vis_canale", viscanale);
	GM_setValue(User+"_iscritti", iscriz);
  
	var ora = DateNow.toString();
	GM_setValue(User+"_lastcheck", ora);

	var HTMLo = "<span style='color: darkgreen; font-size: 11px'>";
	var HTMLc = "</span>";
	var RE_final = /(<span style="color: darkgreen; font-size: 11px;">[\+|-]\d+<\/span>)(<\/span>)\s+(\d+)<br>/g;
	
	var diffVidVisti = (vidvisti-SeenVids)>0?HTMLo+"+"+(vidvisti-SeenVids)+HTMLc:" ";
	var diffVidCaricati = (vidcaric-LoadedVids)>0?HTMLo+"+"+(vidcaric-LoadedVids)+HTMLc:(vidcaric-LoadedVids)<0?HTMLo+(vidvcaric-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:" ";
  
	var str_gen = new String(diffVidVisti+"_"+diffVidCaricati+"_"+diffVisualiz+"_"+diffPrefs+"_"+diffVisCan+"_"+diffSubscr);
	
	var ARR_strgen = new Array();
	ARR_strgen = str_gen.split("_");
	
	spans[SpanToRemove].parentNode.removeChild(spans[SpanToRemove]);
  
	for (i=0,j=0;i<spans.length;i++) {
		if(spans[i].className == "grayText") {
			if (Debug) { 
				GM_log('grayText OK : '+spans[i].className);
				var RE = /(canale)|(ype)/i;
				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();
		if (CN.substring(0,9) == "statBlock") {
			if (Debug){
				var prova = divs[i].innerHTML.match(RE_final);
				GM_log("last regexp: "+prova+" - tipo "+typeof(prova));
			}
			cont++;
			if (cont<=2) {
				divs[i].setAttribute('style', 'width: 216px !important');
			} else {
				divs[i].setAttribute('style', 'width: 110px !important');
				break;
			}
			var temp = "";
			divs[i].innerHTML = temp = divs[i].innerHTML.replace(RE_final,"$2$3 $1<br>");
			if (Debug){GM_log('OK : '+CN);GM_log(divs[i].innerHTML);GM_log(temp);}
				tot = i;
		}
	}  
}

function TimeShift(FirstD, LastD, ObjRef, isDebug) {
	var OldDate = parseInt(FirstD);
	var LastDate = parseInt(LastD);
	var aDay = 86400000;
	var anHour = 3600000;
	var aMin = 60000;
	var aSec = 1000;
	if(isDebug){GM_log("Date before: "+OldDate+ "|| Date now: "+ LastDate);}
	var diff = LastDate - OldDate;
	var Str = "Last page refresh was ";
	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('style','float:right;margin-top:-24px;margin-bottom:4px;color:gray;font-size:10px;');
	sp.innerHTML = Str;
	if(isDebug){GM_log(sp.innerHTML);}
	document.getElementById(ObjRef).appendChild(sp);
}

function GetUser(ObjR, isDebug) {
	var RE_usern = /">(\w+)<\/a>/i; // "
	for (var k=0;k<ObjR.length;k++) {
		if (ObjR[k].getAttribute('class') == "util-item first") {
			var tmpU = new String(ObjR[k].parentNode.innerHTML.match(RE_usern));
			if (tmpU != "") {
				tmpU = tmpU.replace(RE_usern,"").replace(",","");
				if(isDebug){GM_log('user OK: '+tmpU);}
				return tmpU;
				break;
			} else {
				tmpU = "default";
				return tmpU;
			}
		}
	}
	if (!tmpU && isDebug) {
	GM_log("GetUser: error");	
	}
} 

function VideosAdvancedStats(Dbg) {
	var divs      = document.getElementsByTagName('div');
  	var spans     = document.getElementsByTagName('span');
	var User      = GetUser(spans, Dbg);
	var RE_det    = /\d+/g;
	var RE_comm   = />(\d+)<\/a>/;
	var RE_resp   = />(\d+)<\/a>/;
	var ARR_det   = Array();
	var ARR_comm  = Array();
	var ARR_resp  = Array();
	var ARR_tmpComm = Array();
	var ARR_tmpResp = Array();

	var ArrDiffsViews = Array();
	var ArrDiffsComments = Array();
	var ArrDiffsResponses = Array();
	var DateObj      = new Date();
  	var DateNow      = DateObj.getTime();
	var DateLastChk = GM_getValue(User+"_vidlastcheck", 0); 
  	TimeShift(DateLastChk, DateNow, "my-account-header", Dbg);

    for (var i=0,j=0,k=0,w=0;i<spans.length;i++) {
    var CN = spans[i].className.toString();
    if(CN == "stat-views") {
    	if (Dbg){GM_log('stat-views: '+spans[i].innerHTML);}
    	spans[i].innerHTML = spans[i].innerHTML.replace(",","").replace(",","");
		ARR_det[j++] = new String(spans[i].innerHTML.match(RE_det));
      if (Dbg){GM_log("vecchio valore stats: "+ARR_det[(j-1)]);};
    }
    if(CN == "stat-comments") {
  	  if (Dbg){GM_log('stat-comments OK: '+spans[i].innerHTML);}
    	spans[i].innerHTML = spans[i].innerHTML.replace(",","").replace(",","");
    	ARR_tmpComm = spans[i].innerHTML.match(RE_comm);
		ARR_comm[k++] = new String(ARR_tmpComm[ARR_tmpComm.length-1]);
      	if (Dbg){GM_log("vecchio valore comments: "+ARR_comm[(k-1)]);};
    }
    if(CN == "stat-responses") {
    	if (Dbg){GM_log('stat-responses OK: '+spans[i].innerHTML);}
    	spans[i].innerHTML = spans[i].innerHTML.replace(",","").replace(",","");
    	ARR_tmpResp = spans[i].innerHTML.match(RE_resp);
		ARR_resp[w++] = new String(ARR_tmpResp[ARR_tmpResp.length-1]);
      	if (Dbg){GM_log("vecchio valore responses: "+ARR_resp[(w-1)]);};
    }
  }
  
	var TmpOldViews = GM_getValue(User+"_detailedViews", 0);
	var TmpOldComments = GM_getValue(User+"_detailedComments", 0);
	var TmpOldResponses = GM_getValue(User+"_detailedResponses", 0);
	if (Dbg) {
		GM_log("Old video views: "+TmpOldViews);
		GM_log("Old video comments: "+TmpOldComments);
		GM_log("Old video responses: "+TmpOldResponses);
	}	
	TmpOldViews = TmpOldViews.toString();
	TmpOldComments = TmpOldComments.toString();
	TmpOldResponses = TmpOldResponses.toString();
	
	var ArrOldViews = TmpOldViews.split(",");
	if (ArrOldViews.length == 1) {
		for (i=1;i<ARR_det.length;i++) {
			ArrOldViews.push(0);
		}
	}
	var ArrOldComments = TmpOldComments.split(",");
	if (ArrOldComments.length == 1) {
		for (i=1;i<ARR_comm.length;i++) {
			ArrOldComments.push(0);
		}
	}var ArrOldResponses = TmpOldResponses.split(",");
	if (ArrOldResponses.length == 1) {
		for (i=1;i<ARR_resp.length;i++) {
			ArrOldResponses.push(0);
		}
	}

	for(i=0;i<ARR_det.length;i++) {
		ArrDiffsViews[i] = ARR_det[i]-ArrOldViews[i];
		if (Dbg) {GM_log(ARR_det[i]+"-"+ArrOldViews[i]+"="+ArrDiffsViews[i]);}
	}
	for(i=0;i<ARR_comm.length;i++) {
		ArrDiffsComments[i] = ARR_comm[i]-ArrOldComments[i];
		if (Dbg) {GM_log(ARR_comm[i]+"-"+ArrOldComments[i]+"="+ArrDiffsComments[i]);}
	}
	for(i=0;i<ARR_resp.length;i++) {
		ArrDiffsResponses[i] = ARR_resp[i]-ArrOldResponses[i];
		if (Dbg) {GM_log(ARR_resp[i]+"-"+ArrOldResponses[i]+"="+ArrDiffsResponses[i]);}
	}
  
	var StrNewViews = ARR_det.join(",");
	GM_setValue(User+"_detailedViews",StrNewViews);
	var StrNewComments = ARR_comm.join(",");
	GM_setValue(User+"_detailedComments",StrNewComments);
	var StrNewResponses = ARR_resp.join(",");
	GM_setValue(User+"_detailedResponses",StrNewResponses);
	var ora = DateNow.toString();
	GM_setValue(User+"_vidlastcheck", ora);
	if(Dbg) {GM_log("New video stats: "+ StrNewViews);}
	
	var HTMLo = "<span style='color: darkgreen; font-size: 11px'>";
	var HTMLc = "</span>";
  
	for (i=0,j=0,k=0,w=0;i<spans.length;i++) {
		CN = spans[i].className.toString();
		if(CN == "stat-views") {
			spans[i].innerHTML += (ArrDiffsViews[j]>0)?" "+HTMLo+"+"+ ArrDiffsViews[j] + HTMLc:"";
			j++;
		}
		if(CN == "stat-comments") {
			spans[i].innerHTML += (ArrDiffsComments[k]>0)?" "+HTMLo+"+"+ ArrDiffsComments[k] + HTMLc:"";
			k++;
		}
		if(CN == "stat-responses") {
			spans[i].innerHTML += (ArrDiffsResponses[w]>0)?" "+HTMLo+"+"+ ArrDiffsResponses[w] + HTMLc:"";
			w++;
		}
	}
}