Source for "Last.fm: Play Statistics"

By Joe S
Has 1 other script.


// ==UserScript==
// @name          Last.fm: Play Statistics
// @description   Displays more detailed play statistics (tracks per hour, day, ..., year)
// @include       http://www.last.fm/user/*
// ==/UserScript==

/*
BEGIN LICENSE BLOCK
Copyright (C) 2005 Arvid Jakobsson arvid.jakobsson@gmail.com

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You can download a copy of the GNU General Public License at
http://www.gnu.org/licenses/gpl.html
or get a free printed copy by writing to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
END LICENSE BLOCK
*/

/*
** Updated 20 Dec 2006 Joe Shamah <joe@mrsomeone.com>
** Updated 12 Feb 2007 Joe Shamah <joe@mrsomeone.com>
 */

   function xpath(query, context)
   {
      return document.evaluate(query, context, null,
      XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
   }

   function addSeparatorsNF(nStr, inD, outD, sep) /* http://www.mredkj.com/javascript/nfbasic.html */
   {
      nStr += '';
      var dpos = nStr.indexOf(inD);
      var nStrEnd = '';
      if (dpos != -1) {
         nStrEnd = outD + nStr.substring(dpos + 1, nStr.length);
         nStr = nStr.substring(0, dpos);
      }
      var rgx = /(\d+)(\d{3})/;
      while (rgx.test(nStr)) {
         nStr = nStr.replace(rgx, '$1' + sep + '$2');
      }
      return nStr + nStrEnd;
   }

   var panel = document.getElementById("avatarPanel");
   var tracksplayed = panel.innerHTML.match(/Tracks played:[^\d]+([\d\,]+)/)[1];
   tracksplayed = tracksplayed.replace(/,/g,'');

   if (panel.innerHTML.match(/\(reset on (.*)\)/)) {
      var reg_date = panel.innerHTML.match(/\(reset on (.*)\)/)[1];
   }
   else {
      var reg_date = panel.innerHTML.match(/Registered:<\/strong>(.*)/)[1];
   }
   var reg_date_ms = Date.parse(reg_date);
   var now = new Date();
   var diff = Math.round(now - reg_date_ms)/1000;

   var hours = diff / (60*60);
   var days = diff / (60*60*24);
   var weeks = diff / (60*60*24*7);
   var months = diff / (60*60*24*31);
   var years = diff / (60*60*24*365);

   var tracks_per_hour = tracksplayed / hours;
   var tracks_per_day = tracksplayed / days;
   var tracks_per_week = tracksplayed / weeks;
   var tracks_per_month = tracksplayed / months;
   var tracks_per_year = tracksplayed / years;
   var tph = Math.round(tracks_per_hour*1000)/1000;
   var tpd = Math.round(tracks_per_day*1000)/1000;
   var tpw = Math.round(tracks_per_week*1000)/1000;
   var tpm = Math.round(tracks_per_month*1000)/1000;
   var tpy = Math.round(tracks_per_year);

   var paragraphs = xpath(".//DIV[@class='c']/P", panel);
   for (var i = 0; i < paragraphs.snapshotLength; i++)
   {
      var paragraph = paragraphs.snapshotItem(i);
      if (paragraph.innerHTML.match(/Tracks played:/))
      {
         var beg = "Tracks ";
         var p = new Array();
         p[0] = document.createElement("span");
         p[0].innerHTML = "<strong class=\"lfmlight\">" + beg + "per year:</strong> " + addSeparatorsNF(tpy, '.', '.', ',') + " <br /> ";
         p[1] = document.createElement("span");
         p[1].innerHTML = "<strong class=\"lfmlight\">" + beg + "per month:</strong> " + addSeparatorsNF(tpm.toFixed(1), '.', '.', ',') + " <br /> ";
         p[2] = document.createElement("span");
         p[2].innerHTML = "<strong class=\"lfmlight\">" + beg + "per week:</strong> " + addSeparatorsNF(tpw.toFixed(1), '.', '.', ',') + " <br /> ";
         p[3] = document.createElement("span");
         p[3].innerHTML = "<strong class=\"lfmlight\">" + beg + "per day:</strong> " + addSeparatorsNF(tpd.toFixed(1), '.', '.', ',') + " <br /> ";
         p[4] = document.createElement("span");
         p[4].innerHTML = "<strong class=\"lfmlight\">" + beg + "per hour:</strong> " + addSeparatorsNF(tph.toFixed(1), '.', '.', ',') + " <br /> ";

         for (var ii = 0; ii < 5; ii++)
         {
            paragraph.insertBefore(p[ii], paragraph.childNodes[4]);
         }
      }
   }