There are 15 previous versions of this script.
// ==UserScript==
// @author mallo
// @name Better Grooveshark
// @version 1.462
// @description Adds lyrics, hidden advertisements and adds tab titles to grooveshark
// @namespace BetterGS
// @include http://*grooveshark.com*
// ==/UserScript==
var BetterGSInsert = function($, window, undefined) {
BetterGS = {};
BetterGS.version = '1.462';
BetterGS.init = function() {
(function addOptionsMenu() {
if($('#header_account_group').length || $('#session_btn_signup').length) {
$('#userOptions').append('<li><button id="BetterGS-options-caller" type="button" class="btn btn_style1"><span class="label">BetterGS</span></button></li>');
$('#BetterGS-options-caller').bind('click', BetterGS.options.init);
} else {
window.setTimeout(function() {
addOptionsMenu();
}, 10);
}})();
if(typeof store.get('BetterGS') === 'undefined') {
BetterGS.options.init();
}
if(store.get('BetterGS').adremoval) {
BetterGS.hideAds.init();
}
if(store.get('BetterGS').lyrics) {
BetterGS.lyrics.init();
}
$.subscribe("gs.player.nowplaying", function(){
if(store.get('BetterGS').tabtitle) {
BetterGS.tabtitle.init();
}
if(store.get('BetterGS').lyrics) {
BetterGS.lyrics.fillInputs();
}
if(store.get('BetterGS').autosearch) {
BetterGS.lyrics.searchForResults();
}
});
};
/**
* Optionspanel
*/
BetterGS.options = {};
BetterGS.options.defaults = {'lyrics' : 1, 'autosearch' : 0, 'tabtitle' : 1, 'adremoval' : 1};
BetterGS.options.version = '1.0';
BetterGS.options.init = function() {
var conf = !!store.get('BetterGS') ? store.get('BetterGS') : store.set('BetterGS', BetterGS.options.defaults) || BetterGS.options.defaults,
styles =
'<style>' +
'#BetterGS-modal { width: 100%; height: 100%; position: absolute; left: 0px; top: 0px; z-index: 9898; background-color: rgba(0, 0, 0, 0.8); }' +
'#BetterGS-modal-close { position: absolute; right: 10px; top: 5px; font-size: 10px; border-bottom: 1px dotted; }' +
'#BetterGS-optionspanel { width: 450px; margin: -220px 0px 0px -225px; padding: 10px; border: 3px solid #4d96e6; background-color: #f8f8f8; color: #000; position: absolute; left: 50%; top: 50%; overflow: hidden; }' +
'#BetterGS-optionspanel h2 { margin-bottom: 10px; }' +
'#BetterGS-optionspanel h2 a { font-size: 14px; font-weight: bold; }' +
'#BetterGS-optionspanel h3 { margin-bottom: 6px; color: #4d96e6; font-weight: bold; }' +
'.BetterGS-option { border-bottom: 1px solid #b1b1b1; margin-bottom: 10px; padding-bottom: 5px; }' +
'.BetterGS-option label { display: inline-block; margin-bottom: 6px; vertical-align: text-top; }' +
'.BetterGS-option input[type=checkbox] { margin: 0px 6px 0px 0px; }' +
'#BetterGS-options-save { -moz-border-radius: 5px; -webkit-border-radius: 5px; float: right; padding: 4px; border: 1px solid #777; font-size: 10px; }' +
'</style>',
html =
'<div id="BetterGS-modal"><div id="BetterGS-optionspanel">' +
'<button id="BetterGS-modal-close">Close</button>' +
'<h2><a href="http://userscripts.org/scripts/show/93354">Better Grooveshark v'+ BetterGS.version +'</a></h2>' +
'<div class="BetterGS-option">' +
'<h3>Lyrics</h3>' +
'<div class="BetterGS-option-row">' +
'<input id="BetterGS-options-lyrics" type="checkbox" '+ (conf.lyrics ? 'checked' : '') +' /><label for="BetterGS-options-lyrics">Activate lyrics module</label>' +
'</div>' +
'<div class="BetterGS-option-row">' +
'<input id="BetterGS-options-autosearch" type="checkbox" '+ (conf.autosearch ? 'checked' : '') +' /><label for="BetterGS-options-autosearch">Activate automatic lyrics search</label>' +
'</div>' +
'</div>' +
'<div class="BetterGS-option">' +
'<h3>Current songtitle</h3>' +
'<div class="BetterGS-option-row">' +
'<input id="BetterGS-options-tabtitle" type="checkbox" '+ (conf.tabtitle ? 'checked' : '') +' /><label for="BetterGS-options-tabtitle">Show current songtitle as tabtitle</label>' +
'</div>' +
'</div>' +
'<div class="BetterGS-option">' +
'<h3>Ad removal</h3>' +
'<div class="BetterGS-option-row">' +
'<input id="BetterGS-options-adremoval" type="checkbox" '+ (conf.adremoval ? 'checked' : '') +' /><label for="BetterGS-options-adremoval">Removes the ads</label>' +
'</div>' +
'</div>' +
'<button id="BetterGS-options-save">Save and apply options</button>' +
'</div></div>';
if(!$('#BetterGS-modal').length) {
$('head').append(styles);
$('body').append(html);
} else {
$('#BetterGS-modal').toggle();
}
$('#BetterGS-modal-close').unbind().bind('click', function(){
$('#BetterGS-modal').toggle();
});
$('#BetterGS-options-save').unbind().bind('click', function() {
BetterGS.options.save();
alert('Options saved.');
location.reload();
});
},
BetterGS.options.save = function() {
var userconf = {
'lyrics' : +$('#BetterGS-options-lyrics').is(':checked'),
'autosearch' : +$('#BetterGS-options-autosearch').is(':checked'),
'tabtitle' : +$('#BetterGS-options-tabtitle').is(':checked'),
'adremoval' : +$('#BetterGS-options-adremoval').is(':checked')
},
extconf = $.extend({}, store.get('BetterGS'), userconf);
store.set('BetterGS', extconf);
};
/**
* Only hides the ads
*/
BetterGS.hideAds = {};
BetterGS.hideAds.version = '1.0';
BetterGS.hideAds.init = function() {
var styles = '<style> #capital { display: none !important; } #application { margin-right: 0px !important; } </style>';
$('head').append($(styles));
};
/**
* Shows title of the currently played song as tab title
*/
BetterGS.tabtitle = {};
BetterGS.tabtitle.version = '1.21';
BetterGS.tabtitle.init = function() {
BetterGS.tabtitle.setTabTitle();
};
BetterGS.tabtitle.getSongInfo = function() {
var currentSong = GS.player.currentSong || undefined;
return currentSong != undefined ? currentSong.SongName + ' by ' + currentSong.ArtistName : 'Grooveshark - Listen to Free Music Online';
};
BetterGS.tabtitle.setTabTitle = function() {
document.title = BetterGS.tabtitle.getSongInfo();
};
/**
* Shows aggregated lyrics
*/
BetterGS.lyrics = {};
BetterGS.lyrics.version = '1.1';
BetterGS.lyrics.init = function() {
BetterGS.lyrics.setTemplate();
BetterGS.lyrics.handleClicks();
$(window).bind('resize', function() {
BetterGS.lyrics.setContainerPos();
});
};
BetterGS.lyrics.styles =
'<style>' +
'#BetterGS-wrap { float: right; width: 300px; background-color: #2b2b2b; position: relative; }' +
'#BetterGS-content { padding: 9px 9px 9px 20px; }' +
'#BetterGS-head { width: 115px; padding: 4px; font-size: 13px; font-weight: bold; line-height: 1.3; }' +
'#BetterGS-head a { color: #fff; }' +
'.BetterGS-head.BetterGS-row { -moz-border-radius: 3px; -webkit-border-radius: 3px; background: -moz-linear-gradient(#111,#333); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #111),color-stop(1, #333)); margin-top: 0px; }' +
'.BetterGS-row { margin: 10px 0px; position: relative; }' +
'.BetterGS-row:after { content: "."; display: block; height: 0px; clear: both; visibility: hidden; }' +
'.BetterGS-row label, .BetterGS-row input, .BetterGS-row strong { width: 100%; display: block; }' +
'.BetterGS-row strong, .BetterGS-row label { margin-bottom: 3px; font-weight: bold; font-size: 11px; }' +
'.BetterGS-row input { width: 93%; padding: 3px; background: -moz-linear-gradient(#fff, #ddd); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #fff),color-stop(1, #ddd)); border: 1px solid #d1d2d3; }' +
'.BetterGS-50p { width: 49%; }' +
'.BetterGS-drop { border: 1px solid #d1d2d3; position: relative; }' +
'.BetterGS-drop li a { display: block; padding: 6px; background: -moz-linear-gradient(#fff, #efefef); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #fff),color-stop(1, #efefef)); font-size: 11px; font-weight: bold; color: #333; }' +
'.BetterGS-drop li a:active { background: -moz-linear-gradient(#fff, #ddd); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #fff),color-stop(1, #ddd)); }' +
'.BetterGS-drop ul { position: absolute; top: 24px; left: -1px; z-index: 10; width: 100%; border: 1px solid #d1d2d3; border-top: 0px; }' +
'.BetterGS-toggler, .BetterGS-toggler:active { width: 28px; height: 20px; position: absolute; right: 1px; top: 2px; color: #444; font-size: 10px; font-weight: bold; border-left: 1px solid #dedede; }' +
'#BetterGS-lyrics { padding: 10px; background-color: #f4f4f4; color: #444; overflow-y: auto; }' +
'#BetterGS-lyrics p { line-height: 1.2; }' +
'#BetterGS-startsearch { position: absolute; right: 0px; top: 0px; border: 1px solid #777; background: -moz-linear-gradient(#fff, #ccc); -moz-border-radius: 2px; background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #fff),color-stop(1, #ccc)); -webkit-border-radius: 2px; color: #000; padding: 6px 10px; font-size: 10px; font-weight: bold; }' +
'#BetterGS-startsearch:active { background: -moz-linear-gradient(#fff, #aaa); background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #fff),color-stop(1, #aaa)); }' +
'#BetterGS-resizer { position: absolute; left: 0px; top: 0px; z-index: 99; width: 15px; height: 100%; padding-left: 4px; cursor: pointer; display: table; }' +
'#BetterGS-resizer span { display: table-cell; vertical-align: middle; font-size: 10px; }' +
'</style>';
BetterGS.lyrics.template =
'<div id="BetterGS-wrap">' +
'<div id="BetterGS-resizer"><span id="BetterGS-resizer-target">▶</span></div>' +
'<div id="BetterGS-content">' +
'<div id="BetterGS-interact">' +
'<div class="BetterGS-row BetterGS-head">' +
'<a id="BetterGS-startsearch" href="#">Search ...</a>' +
'<h3 id="BetterGS-head"><a target="_blank" href="http://userscripts.org/scripts/show/93354">BetterGS Lyrics</a></h3>' +
'</div>' +
'<div class="BetterGS-row">' +
'<div class="BetterGS-50p" style="float: left;">' +
'<label for="BetterGS-artist">Artist:</label>' +
'<input id="BetterGS-artist" value="" />' +
'</div>' +
'<div class="BetterGS-50p" style="float: right;">' +
'<label for="BetterGS-song">Song:</label>' +
'<input id="BetterGS-song" value="" />' +
'</div>' +
'</div>' +
'<div class="BetterGS-row">' +
'<strong id="BetterGS-sites-label">Available sites ...</strong>' +
'</div>' +
'<div class="BetterGS-row">' +
'<strong id="BetterGS-results-label">No Results</strong>' +
'</div>' +
'</div>' +
'<div id="BetterGS-lyrics">' +
'No lyrics found.' +
'</div>' +
'</div>' +
'</div>';
BetterGS.lyrics.results = [];
BetterGS.lyrics.curLyricSite = 0;
BetterGS.lyrics.curLyrics = 0;
BetterGS.lyrics.lyricSites = [
{'id': 0, 'title': 'Lyric Wiki', 'url' : 'http://lyrics.wikia.com/', 'xpath' : '//div[@class=\'lyricbox\']//p', 'exclude' : false, 'charset' : 'utf-8' },
{'id': 1, 'title': 'golyr', 'url' : 'http://golyr.de/', 'xpath' : '//div[1]/div[3]//div[2]//table//div[2]//p', 'exclude' : 'a', 'charset' : 'iso-8859-1' },
{'id': 2, 'title': 'Astraweb Lyrics', 'url' : 'http://lyrics.astraweb.com/display/', 'xpath' : '//table[3]//td[3]//font', 'exclude' : false, 'charset' : 'iso-8859-1' }
];
BetterGS.lyrics.setTemplate = function() {
$('head').append($(BetterGS.lyrics.styles));
$('#mainContainer').parent().prepend($(BetterGS.lyrics.template));
BetterGS.lyrics.buildSitesMenu();
};
BetterGS.lyrics.setContainerPos = function() {
$('#BetterGS-wrap').height($(window).height());
$('#BetterGS-lyrics').height( ($('#BetterGS-wrap').height() - $('#BetterGS-interact').height() - 60) )
$('#mainContainer').css({
'margin-right' : $('#BetterGS-wrap').outerWidth() + 'px',
'width' : ( $(window).width() - $('#BetterGS-wrap').outerWidth()) + 'px'
});
};
BetterGS.lyrics.toggleButton = function() {
return '<button href="#" class="BetterGS-toggler">▼</button>';
};
BetterGS.lyrics.buildSitesMenu = function(current){
var cur = current || 0,
sites = BetterGS.lyrics.lyricSites,
html = '',
curHtml = '',
othersHtml = '';
BetterGS.lyrics.curLyricSite = cur;
for(var data in sites) {
if(sites[data].id === cur) {
curHtml += '<li><a id="BetterGS-curr-site" data-bgs-siteid="'+ sites[data].id +'" href="'+ sites[data].url +'">'+ sites[data].title +'</a>';
}
else {
othersHtml += '<li><a data-bgs-siteid="'+ sites[data].id +'" href="'+ sites[data].url +'">'+ sites[data].title +'</a></li>';
}
}
html += '<ul id="BetterGS-sites" class="BetterGS-drop">' + curHtml + BetterGS.lyrics.toggleButton() + '<ul style="display: none;">' + othersHtml + '</ul></li></ul>';
$('#BetterGS-sites').remove();
$('#BetterGS-sites-label').parent().append(html);
if($.trim( $('#BetterGS-artist').val() ) || $.trim( $('#BetterGS-song').val() )) {
BetterGS.lyrics.searchForResults();
}
};
BetterGS.lyrics.getCurrentSiteDefs = function() {
var id = BetterGS.lyrics.curLyricSite,
sites = BetterGS.lyrics.lyricSites;
for(var prop in sites) {
if(sites[prop].id == id) {
return sites[prop];
break;
}
}
// default
return sites[0];
};
BetterGS.lyrics.resultsQuery = function() {
var song = $.trim( $('#BetterGS-song').val() ) || 'Never Gonna Give You Up',
artist = $.trim( $('#BetterGS-artist').val() ) || 'Rick Astley',
site = BetterGS.lyrics.getCurrentSiteDefs();
return 'USE \'http://www.datatables.org/google/google.search.xml\' AS google.search; ' +
'SELECT unescapedUrl, titleNoFormatting FROM google.search ' +
'WHERE q="'+ artist +' '+ song +' site:'+ site.url +'";';
};
BetterGS.lyrics.searchForResults = function() {
BetterGS.lyrics.AJAXindicator();
$.ajax({
'url' : 'http://query.yahooapis.com/v1/public/yql?format=json',
'data' : {'q': BetterGS.lyrics.resultsQuery() },
'dataType' : 'jsonp',
'jsonp' : 'callback',
'jsonpCallback' : 'BetterGS.lyrics.processResults'
});
};
BetterGS.lyrics.processResults = function(res) {
var query = res.query,
results = query.results;
clearTimeout(BetterGS.lyrics.AJAXindicatorHandle);
$('#BetterGS-lyrics').html('');
$('#BetterGS-results-label').text(query.count + ' results.');
if(query.count < 1) {
$('#BetterGS-results').remove();
return;
}
BetterGS.lyrics.results = results.results.length ? results.results : [results.results];
for(var i = 0; i < query.count; i++) {
BetterGS.lyrics.results[i].id = i;
}
BetterGS.lyrics.buildResultsMenu();
};
BetterGS.lyrics.buildResultsMenu = function(current) {
var cur = current || 0,
results = BetterGS.lyrics.results,
html = '',
curHtml = '',
othersHtml = '';
for(var i = 0; i < results.length; i++) {
if(i == cur) {
curHtml += '<li><a data-bgs-resultid="'+ results[i].id +'" title="'+ results[i].titleNoFormatting +'" id="BetterGS-curr-result" href="'+ results[i].unescapedUrl +'">'+ results[i].titleNoFormatting.substr(0, 30) +' ...</a>'
}
else {
othersHtml += '<li><a data-bgs-resultid="'+ results[i].id +'" title="'+ results[i].titleNoFormatting +'" href="'+ results[i].unescapedUrl +'">'+ results[i].titleNoFormatting.substr(0, 30) +' ...</a></li>'
}
}
html += '<ul class="BetterGS-drop" id="BetterGS-results">' + curHtml + BetterGS.lyrics.toggleButton() + '<ul style="display: none;">' + othersHtml + '</ul></li></ul>';
$('#BetterGS-results').remove();
$('#BetterGS-results-label').parent().append($(html));
BetterGS.lyrics.getLyricsContent(results[cur].unescapedUrl);
};
BetterGS.lyrics.getLyricsQuery = function(href) {
return 'SELECT * FROM html WHERE url="' + href + '" AND xpath="'+ BetterGS.lyrics.getCurrentSiteDefs().xpath +'" AND charset="'+ BetterGS.lyrics.getCurrentSiteDefs().charset +'"';
};
BetterGS.lyrics.getLyricsContent = function(href) {
BetterGS.lyrics.AJAXindicator();
$.ajax({
'url' : 'http://query.yahooapis.com/v1/public/yql?format=xml',
'data' : {'q': BetterGS.lyrics.getLyricsQuery(href) },
'dataType' : 'jsonp',
'jsonp' : 'callback',
'jsonpCallback' : 'BetterGS.lyrics.processLyrics'
});
};
BetterGS.lyrics.processLyrics = function(res) {
var results = res.results[0];
BetterGS.curLyrics = results;
clearTimeout(BetterGS.lyrics.AJAXindicatorHandle);
$('#BetterGS-lyrics').html(results || 'No lyrics found.');
BetterGS.lyrics.getCurrentSiteDefs().exclude && $('#BetterGS-lyrics').find( BetterGS.lyrics.getCurrentSiteDefs().exclude ).remove();
BetterGS.lyrics.setContainerPos();
};
BetterGS.lyrics.AJAXindicator = function() {
var i = 0,
indicator = '';
try { clearTimeout(BetterGS.lyrics.AJAXindicatorHandle); } catch(er) {};
(function timer() {
BetterGS.lyrics.AJAXindicatorHandle = window.setTimeout(function(){
i = i + 1;
if(i < 4) {
indicator += '.';
}
else {
i = 0;
indicator = '';
}
$('#BetterGS-lyrics').html(indicator);
timer();
}, 500)
})();
};
BetterGS.lyrics.toggleLyrics = function(that, ev) {
if($('#BetterGS-wrap').data('oldwidth') == undefined) {
$('#BetterGS-wrap').data('oldwidth', $(that).width());
}
$('#BetterGS-resizer-target').html(function() {
return $(this).text() == String.fromCharCode('9664') ? '▶' : '◀';
});
$('#BetterGS-content').toggle();
$('#BetterGS-wrap').width(function() {
return ($(that).width() < $(that).data('oldwidth') ? $(that).data('oldwidth') : $(ev.target).closest('#BetterGS-resizer').outerWidth());
});
$(window).resize();
$(window).resize();
$(window).resize();
};
BetterGS.lyrics.handleClicks = function() {
$('#BetterGS-wrap').bind('click', function(ev) {
if($(ev.target).attr('href') == 'http://userscripts.org/scripts/show/93354') {
return true;
}
if($(ev.target).is('#BetterGS-startsearch')) {
BetterGS.lyrics.searchForResults();
return false;
}
if($(ev.target).is('.BetterGS-toggler')) {
$(ev.target).next().toggle();
return false;
}
if($(ev.target).parents('#BetterGS-sites').length && $(ev.target).is('a')) {
BetterGS.lyrics.buildSitesMenu($(ev.target).data('bgs-siteid'));
return false;
}
if($(ev.target).parents('#BetterGS-results').length && $(ev.target).is('a')) {
BetterGS.lyrics.buildResultsMenu($(ev.target).data('bgs-resultid'));
return false;
}
if($(ev.target).is('#BetterGS-resizer-target')) {
BetterGS.lyrics.toggleLyrics(this, ev);
return false;
}
});
};
BetterGS.lyrics.fillInputs = function() {
$('#BetterGS-song').val( GS.player.currentSong.SongName );
$('#BetterGS-artist').val( GS.player.currentSong.ArtistName );
};
BetterGS.init();
};
var script = document.createElement('script');
script.textContent = '(' + BetterGSInsert + ')(jQuery, window);';
document.body.appendChild(script);