NPR Download As MP3

By ed420 Last update Dec 14, 2010 — Installed 1,852 times.

There are 4 previous versions of this script.

// ==UserScript==
// @name           NPR Download As MP3
// @namespace      http://edpad.com/npr-mp3/
// @description    This adds a link to NPR story pages so that you can right-click and download the story MP3 file (instead of being forced to play their files through the Flash player). Please support your local NPR station!
// @include        http://*.npr.org/templates/story/story.php*
// @include        http://*.npr.org/templates/player/mediaPlayer.html*
// @include        http://*.npr.org/2010/*
// @include        http://*.npr.org/2011/*
// @version 0.5.1
// ==/UserScript==
var sPath = window.location.pathname;
var sPage = sPath.substring(sPath.lastIndexOf('/') + 1);
if(sPage != 'mediaPlayer') {
	var con = document.getElementById("storybody").innerHTML;
	var i = con.indexOf("NPR.Player.openPlayer");
	var t = con.indexOf("(",i);
	var j = con.indexOf(",",t);
	var k = con.indexOf(",",j+1);
	var id1 = con.substring(t+1,j);
	var id2 = con.substring(j+2,k);
	
	 	
	 GM_xmlhttpRequest({
   method:"GET",
   url:"http://api.npr.org/query?fields=show,audio,multimedia,titles,dates,song,album&apiKey=MDAzMzQ2MjAyMDEyMzk4MTU1MDg3ZmM3MQ010&id=" + id1 +"&m="+id2+ "&t=1",    
   headers:{
     "User-Agent": navigator.userAgent,       
     "Accept":"text/xml"
   },
   onload:function(response) {

var xmlobject = (new DOMParser()).parseFromString(response.responseText, "text/xml");
var root = xmlobject.getElementsByTagName('audio');
for(var i=0; i<root.length; i++) { 
		var ids = root[i].getAttribute("id");
		
		//var tRoot = root[i].getElementsByTagName('title');
		//var tDesc = tRoot[0].firstChild.nodeValue;
		var mRoot = root[i].getElementsByTagName('mp3');
		if (mRoot[0].getAttribute("type") == 'mp3') {
		var desc = mRoot[0].firstChild.nodeValue;
		var altdesc = desc.replace ("pd","download");
		downloadDiv = document.createElement('li');
		downloadDiv.innerHTML = '<a class="download" href="' + desc + '" style=""><span>Download</span></a> <a href="' + altdesc + '" style="padding-left:0px;">(Alt)</a>';
		var link = document.getElementById("res" + ids).getElementsByTagName('ul')[0];
		//insertAfter(downloadDiv, link);
		link.insertBefore(downloadDiv,link.firstChild);
		//link.insertBefore(downloadDiv2,link.firstChild);
	}
		
	}
   }
 });
}
else {
//media player page
	function gup( name )
	{
	  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
	  var regexS = "[\\?&]"+name+"=([^&#]*)";
	  var regex = new RegExp( regexS );
	  var results = regex.exec( window.location.href );
	  if( results == null )
		return "";
	  else
		return results[1];
	}
	id1 = gup("id");
	id2 = gup("m");
		 GM_xmlhttpRequest({
   method:"GET",
   url:"http://api.npr.org/query?fields=show,audio,multimedia,titles,dates,song,album&apiKey=MDAzMzQ2MjAyMDEyMzk4MTU1MDg3ZmM3MQ010&id=" + id1 +"&m=" + id2 + "&t=1",    
   headers:{
     "User-Agent": navigator.userAgent,       
     "Accept":"text/xml"
   },
   onload:function(response) {
   var xmlobject = (new DOMParser()).parseFromString(response.responseText, "text/xml");

var root = xmlobject.getElementsByTagName('mp3');
var desc = root[0].firstChild.nodeValue

var altdesc = desc.replace ("pd","download");
downloadDiv = document.createElement('div');
		downloadDiv.innerHTML = '<a class="download" href="' + desc + '" style=""><span>Download</span></a> <a href="' + altdesc + '" style="padding-left:0px;">(Alternate)</a>';
var link = document.getElementById("homepageFlash");
link.insertBefore(downloadDiv,link.firstChild);
			}
		
	});
}
//===============================================================================
//			- Weekly Auto-Update Check -
//===============================================================================

var script_title = "NPR Download As MP3";
var source_location = "http://edpad.com/npr-mp3/nprmp3.user.js";
var current_version = "0.5.1";
var latest_version = " ";
var gm_updateparam = "nprmp3_lastupdatecheck";
var lastupdatecheck = GM_getValue(gm_updateparam, "never");

// a google document is used to store the latest version number (If the version in that file does not match the current_version variable, an update will be triggered)
var version_holder = "http://edpad.com/npr-mp3/latest.txt";

//Add a command to the menu in case someone wants to manually check for an update.
GM_registerMenuCommand("NPRMP3: Check for update", CheckVersion);

//Initiate the download of the new script version.
function GetNewVersion() {
        var today = new Date();
        GM_setValue(gm_updateparam, String(today));
        window.location = source_location;
}

//Verify if it's time to update
function CheckForUpdate()
{	
	var today = new Date();
	var one_day = 24 * 60 * 60 * 1000; //One day in milliseconds

	if(lastupdatecheck != "never")
	{
		today = today.getTime(); //Get today's date
		var interval = (today - lastupdatecheck.getTime()) / one_day; //Find out how much days have passed		

		//If a week has passed since the last update check, check if a new version is available
		if(interval >= 7)			
			CheckVersion();
	}
	else
		CheckVersion();
}

//Make sure we don't have the latest version
function CheckVersion()
{
	GM_xmlhttpRequest({
		    method: 'GET',
		    url: version_holder,
		    headers: {'Content-type':'application/x-www-form-urlencoded'},		    
		    onload: function(responseDetails)
			{
				var line = String(responseDetails.responseText.match(/version=[0-9].[0-9]?[0-9].[0-9]?[0-9]/));				
				
				if(line != null)
				{
					var strSplit = new Array();
					strSplit = line.split('=');					
					latest_version = strSplit[1];

					if(current_version != latest_version && latest_version != "undefined")
					{
						if(confirm("A more recent version of " + script_title + " (" + latest_version + ") has been found.\r\nWould you like to get it now?"))
							GetNewVersion();
						else
							AskForReminder();
					} 
					else if(current_version == latest_version)
						alert("You have the latest version of " + script_title + ".");
				}
				else
				{
					alert("Could not locate the version holder file.\r\nThis should be reported to the script author.\r\nThank you!");
					SkipWeeklyUpdateCheck();
				}
					
		    }
		});
}

//Ask the user to be reminded in 24 hours or only next week.
function AskForReminder()
{
	if(confirm("Would you like to be reminded in 24 hours ?\r\n(Cancel to be reminded next week only)"))
	{
		var today = new Date();
		today = today.getTime();		
		var sixdays_ms = 6 * 24 * 60 * 60 * 1000;
		var sda_ms = today - sixdays_ms;		
		var sixdaysago = new Date(sda_ms)

		//Since we check for updates after 7 days, just make it seem like the last check was 6 days ago.
		GM_setValue(gm_updateparam, String(sixdaysago));
	}
	else
		SkipWeeklyUpdateCheck();
}

//Set the next update check in seven days
function SkipWeeklyUpdateCheck()
{
	var today = new Date();
	//As if we've just updated the script, the next check will only be next week.
	GM_setValue(gm_updateparam, String(today));
}
//===============================================================================
//			- Weekly Auto-Update Check -
//===============================================================================