Thumb

Hype Machine download links

By tonyskn Last update Nov 18, 2009 — Installed 8,585 times. Daily Installs: 13, 14, 16, 12, 16, 19, 20, 13, 8, 20, 16, 21, 20, 13, 22, 27, 14, 10, 12, 18, 27, 11, 23, 17, 17, 31, 22, 74, 91, 60, 66, 68

There are 2 previous versions of this script.

// ==UserScript==
// @name           Hype Machine direct download links (new!)
// @author         tonyskn_at_gmail.com
// @description	   Add download links next to tracks on The Hype Machine.
// @include        http://hypem.com/*
// ==/UserScript==

// GM_log("fired");

var iconHtml = '<img src="data:image/gif;base64,R0lGODlhCgAKAMZbAC5fpjNoujppqj5qq0Rtq0RwsFF/w1d+u1N/wVSBxFWDxliEw12Ev1uGx12IyGCJyWGKx2GLyWKLyGWNymWNzGiL02yLzWiOzW6K122L2mmQzWyN3G6TzHCP4W6X1HGY0HOZ0XOa1HWa0Hmc1Xee2Xie2Huc3Xue1Hif2Hmf23mg2Xqg2Xuh3Hyj232j3oKk1n6l3YWi3YCm3YS/UYS/VIGn4YGn4oWo3Yyv5JK15pjJb5nJcZe26pq275m46qG/6p7A76G/77PH47DN87rO78fuh8fujNf0otf2oubw7+Xx7ebx7ebx7+jz6un05Orz8+318/H4//f7//r7/f//3fr8/f//4Pv8/fv8/vz9/v39/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH5BAEKAH8ALAAAAAAKAAoAAAdkgB4nHy8XGiIgEn8UQ1tCW5BbPw8NQFsckFJROBAOQVVYWllTVzcIEz4wMi0rKiglDBE5NjUuLCkkIQcJPE9LTElKUCMFBj1NMzo7NE4mAgpEVEVHSEZWMQMBCxUdGxkYFgQAgQA7" width="10" height="10">';
var TrackList;
var TrackElements;
var SelectedTrack;

function injectCSS(cssdata) {
	head = document.getElementsByTagName("head" )[0];
    style = document.createElement("style" );
	style.setAttribute("type", 'text/css');
	style.innerHTML = cssdata;
	head.appendChild(style);
}

function addLinks() {
	// GM_log('addLinks');
	TrackList = unsafeWindow.trackList[document.location.href];
	if (TrackList == undefined || TrackList.length < 1) {
		GM_log('delay');
		unsafeWindow.setTimeout(addLinks, 1000);
	} else {
		// Check if this particular page has been processed
		// through a previous call
		if (unsafeWindow.$$('.gmlink').length < 1) {
			// GM_log("here we go! "+document.location.href);
			// Update some global variables than add links
			TrackElements = unsafeWindow.$$('div.section-track');
			SelectedTrack = 0;
			var index = 0;
			var tracks = unsafeWindow.$$('div.section-track .track_name');
			//TODO Fix the selectors for the Twitter page
			tracks.each(function(element, index) {
				var trackId = TrackList[index].id;
				var trackKey = TrackList[index].key;
				// GM_log(index + " - " + trackId + " - " + trackKey);
				if (trackKey) {
					unsafeWindow.Element.insert(element, "<a class='gmlink' href='/serve/play/"+trackId+"/"+trackKey+"'>&nbsp;"+iconHtml+"</a>");
				}		
				index++;
			});
		}
	}
}

injectCSS('div.selectedTrackGM {background: #EDF7FC none repeat scroll 0 0;}');
addLinks();

// Display links after an Ajax update is complete
unsafeWindow.Ajax.Responders.register({
	onComplete: function() {
		// GM_log("ajax url: "+document.location.href);
		addLinks();
	}
})



/**
 * Hotkeys:
 *   /: activate search field
 *   p: play previous track in the current playlist
 *   n: play next track in the current playlist
 *   k: select previous displayed track
 *   j: select next displayed track
 *   o: play selected track
 *   v: open selected blog post in new tab
 *   s: toogle Favorite for the currently playing track
**/
var HotKeys = {
	activateSearch: function(event) {
		unsafeWindow.$('q').activate();
	},
	
	deactivateSearch: function(event) {
		unsafeWindow.$('q').blur();
	},
	
	playPrev: function(event) {
		unsafeWindow.prevTrack(unsafeWindow);
	}, 
	
	playNext: function(event) {
		unsafeWindow.nextTrack(unsafeWindow);
	},
	
	selectPrev: function(event) {
		if (SelectedTrack > 0) {
			TrackElements[SelectedTrack].removeClassName('selectedTrackGM');
			TrackElements[SelectedTrack-1].addClassName('selectedTrackGM');
			// TrackElements[SelectedTrack-1].scrollTo();
			SelectedTrack--;
		}
	},
	
	selectNext: function(event) {
		if (SelectedTrack < TrackElements.length-1) {
			TrackElements[SelectedTrack].removeClassName('selectedTrackGM');
			TrackElements[SelectedTrack+1].addClassName('selectedTrackGM');
			// TrackElements[SelectedTrack+1].scrollTo();
			SelectedTrack++;
		}
	},
	
	playSelected: function(event) {
		unsafeWindow.togglePlayByFileid(TrackList[SelectedTrack].id);
	},
	
	openBlog: function(event) {
		unsafeWindow.open('/go/track/'+TrackList[SelectedTrack].id, '_blank');
	},
	
	toggleFavorite: function(event) {
		// GM_log('favorite: '+unsafeWindow.currentTrack+' '+unsafeWindow.trackList[unsafeWindow.activeList][unsafeWindow.currentTrack].id);
		unsafeWindow.toggle_favorite('track', unsafeWindow.trackList[unsafeWindow.activeList][unsafeWindow.currentTrack].id);
	},
	
	bindings: new Array(),
	keyBindings: new Array()
}
HotKeys.bindings['/'] = HotKeys.activateSearch;
HotKeys.bindings['p'] = HotKeys.playPrev;
HotKeys.bindings['n'] = HotKeys.playNext;
HotKeys.bindings['k'] = HotKeys.selectPrev;
HotKeys.bindings['j'] = HotKeys.selectNext;
HotKeys.bindings['o'] = HotKeys.playSelected;
HotKeys.bindings['v'] = HotKeys.openBlog;
HotKeys.bindings['s'] = HotKeys.toggleFavorite;	

HotKeys.keyBindings[27] /*ESC*/ = HotKeys.deactivateSearch;

unsafeWindow.document.observe("keypress", function(event) {
	// don't do anything on inputs and textareas
    var element = event.element();
    if (element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') {
        if (event.keyCode == 0) return;
    }
	if (HotKeys.keyBindings[event.keyCode]) {
		HotKeys.keyBindings[event.keyCode].apply(event);
	} else {
		var character = String.fromCharCode(event.charCode);
		if (HotKeys.bindings[character]) {
			HotKeys.bindings[character].apply(event);}
		}
	}
);