Skip to content

Instantly share code, notes, and snippets.

@gkop
Created July 9, 2012 22:12
Show Gist options
  • Save gkop/3079365 to your computer and use it in GitHub Desktop.
Save gkop/3079365 to your computer and use it in GitHub Desktop.
NPR mp3 url decoder
NPR = {};
NPR.base64 = {};
// Code below belongs to NPR
NPR.base64.PADCHAR = '=';
NPR.base64.ALPHA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
NPR.base64.makeDOMException = function () {
var e, tmp;
try {
return new DOMException(DOMException.INVALID_CHARACTER_ERR);
} catch (tmp) {
var ex = new Error("DOM Exception 5");
ex.code = ex.number = 5;
ex.name = ex.description = "INVALID_CHARACTER_ERR";
ex.toString = function () {
return 'Error: ' + ex.name + ': ' + ex.message;
};
return ex;
}
}
NPR.base64.getbyte64 = function (s, i) {
var idx = NPR.base64.ALPHA.indexOf(s.charAt(i));
if (idx === -1) {
throw NPR.base64.makeDOMException();
}
return idx;
}
NPR.base64.decode = function (s) {
s = '' + s;
var getbyte64 = NPR.base64.getbyte64;
var pads, i, b10;
var imax = s.length
if (imax === 0) {
return s;
}
if (imax % 4 !== 0) {
throw NPR.base64.makeDOMException();
}
pads = 0
if (s.charAt(imax - 1) === NPR.base64.PADCHAR) {
pads = 1;
if (s.charAt(imax - 2) === NPR.base64.PADCHAR) {
pads = 2;
}
imax -= 4;
}
var x = [];
for (i = 0; i < imax; i += 4) {
b10 = (getbyte64(s, i) << 18) | (getbyte64(s, i + 1) << 12) | (getbyte64(s, i + 2) << 6) | getbyte64(s, i + 3);
x.push(String.fromCharCode(b10 >> 16, (b10 >> 8) & 0xff, b10 & 0xff));
}
switch (pads) {
case 1:
b10 = (getbyte64(s, i) << 18) | (getbyte64(s, i + 1) << 12) | (getbyte64(s, i + 2) << 6);
x.push(String.fromCharCode(b10 >> 16, (b10 >> 8) & 0xff));
break;
case 2:
b10 = (getbyte64(s, i) << 18) | (getbyte64(s, i + 1) << 12);
x.push(String.fromCharCode(b10 >> 16));
break;
}
return x.join('');
}
NPR.base64.getbyte = function (s, i) {
var x = s.charCodeAt(i);
if (x > 255) {
throw NPR.base64.makeDOMException();
}
return x;
}
NPR.base64.encode = function (s) {
if (arguments.length !== 1) {
throw new SyntaxError("Not enough arguments");
}
var padchar = NPR.base64.PADCHAR;
var alpha = NPR.base64.ALPHA;
var getbyte = NPR.base64.getbyte;
var i, b10;
var x = [];
s = '' + s;
var imax = s.length - s.length % 3;
if (s.length === 0) {
return s;
}
for (i = 0; i < imax; i += 3) {
b10 = (getbyte(s, i) << 16) | (getbyte(s, i + 1) << 8) | getbyte(s, i + 2);
x.push(alpha.charAt(b10 >> 18));
x.push(alpha.charAt((b10 >> 12) & 0x3F));
x.push(alpha.charAt((b10 >> 6) & 0x3f));
x.push(alpha.charAt(b10 & 0x3f));
}
switch (s.length - imax) {
case 1:
b10 = getbyte(s, i) << 16;
x.push(alpha.charAt(b10 >> 18) + alpha.charAt((b10 >> 12) & 0x3F) + padchar + padchar);
break;
case 2:
b10 = (getbyte(s, i) << 16) | (getbyte(s, i + 1) << 8);
x.push(alpha.charAt(b10 >> 18) + alpha.charAt((b10 >> 12) & 0x3F) + alpha.charAt((b10 >> 6) & 0x3f) + padchar);
break;
}
return x.join('');
}
NPR.unpack = function (s) {
return NPR.base64.decode(NPR.rot13(s));
}
NPR.rot13 = function (str) {
return (str + '').replace(/[a-z]/gi,
function (s) {
return String.fromCharCode(s.charCodeAt(0) + (s.toLowerCase() < 'n' ? 13 : -13));
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment