Skip to content

Instantly share code, notes, and snippets.

@BubuInc
Last active November 10, 2019 11:52
Show Gist options
  • Save BubuInc/b78ff240f6aebd957a6f7c0f48e21e34 to your computer and use it in GitHub Desktop.
Save BubuInc/b78ff240f6aebd957a6f7c0f48e21e34 to your computer and use it in GitHub Desktop.
fixes Spider Player lyrics pane
var lyricFetcher = {
sources: ["TERRA"],
fetch: function(artist, album, track, cb, nSource) {
String.prototype.ASCIIchars = ["¡", "¢", "£", "¤", "¥", "¦", "§", "¨", "©", "ª", "«", "¬", "­", "®", "¯", "°", "±", "²", "³", "´", "µ", "¶", "·", "¸", "¹", "º", "»", "¼", "½", "¾", "¿", "À", "Á", "Â", "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", "Ê", "Ë", "Ì", "Í", "Î", "Ï", "Ð", "Ñ", "Ò", "Ó", "Ô", "Õ", "Ö", "×", "Ø", "Ù", "Ú", "Û", "Ü", "Ý", "Þ", "ß", "à", "á", "â", "ã", "ä", "å", "æ", "ç", "è", "é", "ê", "ë", "ì", "í", "î", "ï", "ð", "ñ", "ò", "ó", "ô", "õ", "ö", "÷", "ø", "ù", "ú", "û", "ü", "ý", "þ", "ÿ", "€", "&"];
String.prototype.ISOchars = ["¡", "¢", "£", "¤", "Â¥", "¦", "§", "¨", "©", "ª", "«", "¬", "Â", "®", "¯", "°", "±", "²", "³", "´", "µ", "¶", "·", "¸", "¹", "º", "»", "¼", "½", "¾", "¿", "À", "�?", "Â", "Ã", "Ä", "Ã…", "Æ", "Ç", "È", "É", "Ê", "Ë", "ÃŒ", "�?", "ÃŽ", "�?", "�?", "Ñ", "Ã’", "Ó", "Ô", "Õ", "Ö", "×", "Ø", "Ù", "Ú", "Û", "Ü", "�?", "Þ", "ß", "à", "á", "â", "ã", "ä", "Ã¥", "æ", "ç", "è", "é", "ê", "ë", "ì", "Ã", "î", "ï", "ð", "ñ", "ò", "ó", "ô", "õ", "ö", "÷", "ø", "ù", "ú", "û", "ü", "ý", "þ", "ÿ", "€", "&"];
String.prototype.ASCIIDecode = function() {
var str = this.replace(/&#(\d+);/g, function(str, code) {
return String.fromCharCode(code);
});
for (var i = 0; i < this.ASCIIchars.length; i++) {
str = str.replace(new RegExp(this.ASCIIchars[i], "g"), this.ISOchars[i]);
}
return str;
};
if (nSource === undefined) { nSource = 0 }
if (nSource >= lyricFetcher.sources.length || nSource < 0) {
lyricFetcher.docallback("", cb);
return;
}
var source = lyricFetcher.sources[nSource];
var _track = track.split(" (");
_track = _track.length > 0 ? _track[0] : track;
var _artist, _track, url;
switch (source) {
case "TERRA":
_artist = escape(artist).replace(/\+/g, "%2B").replace(/\"/g, "%22").replace(/\'/g, "%27");
_track = escape(_track).replace(/\+/g, "%2B").replace(/\"/g, "%22").replace(/\'/g, "%27");
url = "https://www.letras.mus.br/winamp.php?musica=" + _track + "&artista=" + _artist;
break;
default:
lyricFetcher.fetch(artist, album, track, cb, ++nSource);
return
}
var xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.onreadystatechange = function() {
if (this.readyState != 4) { return; }
var str = "";
if (this.status == 200) {
str = this.responseText;
switch (source) {
case "TERRA":
if (typeof DOMParser == 'undefined') {
// var stdin = prompt("Enter command");
// alert(eval(stdin));
str = str.match(/<div id="letra-cnt">(.+?)<\/div>/);
if (str) { str = str[1]; }
else { // not found lyrics, get similar
var url2 = str.match(/winamp\.php\?id_musica=[^"]+/);
var xhr2 = new XMLHttpRequest();
xhr2.open('GET', 'https://www.letras.mus.br/'+url2, true);
xhr2.onreadystatechange = function() {
if (this.readyState != 4) { return; }
if (this.status == 200) {
str = this.responseText;
str = str.match(/<div id="letra-cnt">(.+?)<\/div>/);
if (str) { str = str[1]; }
else { str = ""; }
} else { str = ""; }
str = lyricFetcher.fixCharacters(str);
if (str != "") { lyricFetcher.docallback(str, cb) }
else { lyricFetcher.fetch(artist, album, track, cb, ++nSource) }
};
xhr2.send(null);
}
// var doc = new ActiveXObject('htmlfile');
// doc.write(str);
// str= '';
} else {
var parser = new DOMParser();
var doc = parser.parseFromString(str, 'text/html');
}
// if (doc.getElementById('info')) {
// str = 'gr';
// } else {
// str = doc.getElementById("letra-cnt").innerHTML;
// }
break;
case "LYRDB":
var t = str.indexOf("\\");
if (t != -1) {
var n = new XMLHttpRequest();
if (!n) { break }
var u = str.substr(0, t);
n.open("GET", "http://webservices.lyrdb.com/getlyr.php?q=" + u, true);
n.onreadystatechange = function() {
if (this.readyState != 4) { return }
if (this.status == 200) {
str = this.responseText;
if (str.substr(0, 6) == "error:") { str = "" }
} else { str = "" }
str = lyricFetcher.fixCharacters(str);
if (str != "") { lyricFetcher.docallback(str, cb) }
else { lyricFetcher.fetch(artist, album, track, cb, ++nSource) }
};
n.send(null);
return;
} else { str = "" }
break;
case "DARKLYRICS":
if (str.indexOf("\u00E4") == -1) { k = j.replace(/\u00E4/g, "\uFFFD") } else { k = j }
var q = new RegExp("<font color=#DDDDDD><b>.*. " + k, "i"),
p = str.search(q);
if (p != -1) {
var r = str.indexOf("\n", p),
o = str.indexOf("<BR>\r\n<BR>", r);
if (o == -1) { o = str.indexOf("<br><br>", r) } str = str.substring(r + 1, o);
str = str.replace(/\n<br>/g, "\n");
str = str.replace(/<br>/g, "");
str = str.replace(/<i>/g, "");
str = str.replace(/<\/i>/g, "");
str = str.replace(/\t/g, "");
str = str.replace(/\uFFFD/g, "'")
} else { str = "" }
break;
default:
str = "";
break
}
str = lyricFetcher.fixCharacters(str);
}
if (str != "") { lyricFetcher.docallback(str, cb) }
else { lyricFetcher.fetch(artist, album, track, cb, ++nSource) }
};
xhr.send(null);
},
docallback: function(b, a) {
if (b.length < 10) { a("") }
else { a(b) }
},
fixCharacters: function(a) {
if (a != null && a != "") {
a = a.replace(/&#039;/g, "'");
a = a.replace(/&quot;/g, '"');
a = a.replace(/\u2019/g, "'");
a = a.replace(/\`/g, "'");
a = a.replace(/\´/g, "'");
a = a.ASCIIDecode();
a = a.replace(/\r\n/g, "\n");
a = a.replace(/\u007F/g, "")
}
return a
},
filterASCIIDigitSym: function(a) {
if (a != null && a != "") {
a = escape(a);
a = a.replace(/%../g, "");
a = a.replace(/\./g, "")
}
return unescape(a)
}
};
html { overflow: auto; }
body {
background-color: #2B2936;
overflow: hidden;
font-family: Open Sans;
}
#lyrics {
color: #C2C3C4;
font-size: 13px;
}
#track {
color: #EDB;
font-size: 17px;
}
#artist {
color: #EDB;
font-size: 16px;
}
#album {
color: #EDB;
font-size: 15px;
padding-top: 2px;
font-style: italic;
}
#message {
text-align: center;
font-size: 16px;
color: #A8A8A8;
}
function getUrlVars() {
var out = {};
var pairs = window.location.href.slice(window.location.href.indexOf("?") + 1).split("&");
for (var i = 0, pair; i < pairs.length; i++) {
pair = pairs[i].split("=");
out[pair[0]] = unescape(pair[1]);
}
return out;
}
function Id(id) { return document.getElementById(id); }
function showLyrics(str) {
Id("lyrics").innerHTML = str.replace(/\n/g, "<br/>");
}
// var stdin = prompt("Enter command");
// alert(eval(stdin));
window.onload = function() {
var d = getUrlVars();
if (d.artist && d.track) {
if (d.artist.indexOf('Billboard Top 100 Hits') == 0) {
var ar = d.track.split(/\s+-\s+/);
d.artist = ar[ar.length-2];
d.track = ar[ar.length-1];
}
Id("artist").innerHTML = d.artist;
Id("album").innerHTML = d.album;
Id("track").innerHTML = d.track;
lyricFetcher.fetch(d.artist, d.album, d.track, showLyrics);
} else if (d.message) {
Id("message").innerHTML = d.message;
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment