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> | 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> - ";
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, ''); };