Permalink
Browse files

initial commit

  • Loading branch information...
0 parents commit 28407b5a4683969eb95d54419563c619e67affb6 @david-sabata committed Jun 14, 2010
Showing with 927 additions and 0 deletions.
  1. 0 README
  2. +4 −0 background.html
  3. BIN icon.png
  4. BIN icon128.png
  5. +154 −0 jquery-1.4.2.min.js
  6. +27 −0 manifest.json
  7. +207 −0 md5.js
  8. +60 −0 options.css
  9. +55 −0 options.html
  10. +29 −0 options.js
  11. +212 −0 scrobbler.js
  12. +9 −0 youtube.css
  13. +170 −0 youtube.js
0 README
No changes.
@@ -0,0 +1,4 @@
+<html>
+ <script type="text/javascript" src="md5.js"></script>
+ <script type="text/javascript" src="scrobbler.js"></script>
+</html>
BIN icon.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

Large diffs are not rendered by default.

Oops, something went wrong.
@@ -0,0 +1,27 @@
+{
+ "name": "Last.fm Scrobbler",
+ "version": "0.1",
+
+ "description": "Scrobble music videos all around the web!",
+ "icons": { "128": "icon128.png" },
+
+ "background_page": "background.html",
+ "options_page": "options.html",
+
+ "permissions": [
+ "tabs",
+ "http://ws.audioscrobbler.com/",
+ "http://post.audioscrobbler.com/",
+ "http://post2.audioscrobbler.com/",
+ "http://gdata.youtube.com/feeds/api/videos/"
+ ],
+
+ "content_scripts": [
+ {
+ "matches": ["http://www.youtube.com/watch*"],
+ "js": ["jquery-1.4.2.min.js", "youtube.js"],
+ "css": ["youtube.css"]
+ }
+ ]
+
+}
207 md5.js
@@ -0,0 +1,207 @@
+/**
+*
+* MD5 (Message-Digest Algorithm)
+* http://www.webtoolkit.info/
+*
+**/
+
+var MD5 = function (string) {
+
+ function RotateLeft(lValue, iShiftBits) {
+ return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));
+ }
+
+ function AddUnsigned(lX,lY) {
+ var lX4,lY4,lX8,lY8,lResult;
+ lX8 = (lX & 0x80000000);
+ lY8 = (lY & 0x80000000);
+ lX4 = (lX & 0x40000000);
+ lY4 = (lY & 0x40000000);
+ lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
+ if (lX4 & lY4) {
+ return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
+ }
+ if (lX4 | lY4) {
+ if (lResult & 0x40000000) {
+ return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
+ } else {
+ return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
+ }
+ } else {
+ return (lResult ^ lX8 ^ lY8);
+ }
+ }
+
+ function F(x,y,z) { return (x & y) | ((~x) & z); }
+ function G(x,y,z) { return (x & z) | (y & (~z)); }
+ function H(x,y,z) { return (x ^ y ^ z); }
+ function I(x,y,z) { return (y ^ (x | (~z))); }
+
+ function FF(a,b,c,d,x,s,ac) {
+ a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
+ return AddUnsigned(RotateLeft(a, s), b);
+ };
+
+ function GG(a,b,c,d,x,s,ac) {
+ a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
+ return AddUnsigned(RotateLeft(a, s), b);
+ };
+
+ function HH(a,b,c,d,x,s,ac) {
+ a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
+ return AddUnsigned(RotateLeft(a, s), b);
+ };
+
+ function II(a,b,c,d,x,s,ac) {
+ a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
+ return AddUnsigned(RotateLeft(a, s), b);
+ };
+
+ function ConvertToWordArray(string) {
+ var lWordCount;
+ var lMessageLength = string.length;
+ var lNumberOfWords_temp1=lMessageLength + 8;
+ var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
+ var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
+ var lWordArray=Array(lNumberOfWords-1);
+ var lBytePosition = 0;
+ var lByteCount = 0;
+ while ( lByteCount < lMessageLength ) {
+ lWordCount = (lByteCount-(lByteCount % 4))/4;
+ lBytePosition = (lByteCount % 4)*8;
+ lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount)<<lBytePosition));
+ lByteCount++;
+ }
+ lWordCount = (lByteCount-(lByteCount % 4))/4;
+ lBytePosition = (lByteCount % 4)*8;
+ lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
+ lWordArray[lNumberOfWords-2] = lMessageLength<<3;
+ lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
+ return lWordArray;
+ };
+
+ function WordToHex(lValue) {
+ var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;
+ for (lCount = 0;lCount<=3;lCount++) {
+ lByte = (lValue>>>(lCount*8)) & 255;
+ WordToHexValue_temp = "0" + lByte.toString(16);
+ WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);
+ }
+ return WordToHexValue;
+ };
+
+ function Utf8Encode(string) {
+ string = string.replace(/\r\n/g,"\n");
+ var utftext = "";
+
+ for (var n = 0; n < string.length; n++) {
+
+ var c = string.charCodeAt(n);
+
+ if (c < 128) {
+ utftext += String.fromCharCode(c);
+ }
+ else if((c > 127) && (c < 2048)) {
+ utftext += String.fromCharCode((c >> 6) | 192);
+ utftext += String.fromCharCode((c & 63) | 128);
+ }
+ else {
+ utftext += String.fromCharCode((c >> 12) | 224);
+ utftext += String.fromCharCode(((c >> 6) & 63) | 128);
+ utftext += String.fromCharCode((c & 63) | 128);
+ }
+
+ }
+
+ return utftext;
+ };
+
+ var x=Array();
+ var k,AA,BB,CC,DD,a,b,c,d;
+ var S11=7, S12=12, S13=17, S14=22;
+ var S21=5, S22=9 , S23=14, S24=20;
+ var S31=4, S32=11, S33=16, S34=23;
+ var S41=6, S42=10, S43=15, S44=21;
+
+ string = Utf8Encode(string);
+
+ x = ConvertToWordArray(string);
+
+ a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;
+
+ for (k=0;k<x.length;k+=16) {
+ AA=a; BB=b; CC=c; DD=d;
+ a=FF(a,b,c,d,x[k+0], S11,0xD76AA478);
+ d=FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
+ c=FF(c,d,a,b,x[k+2], S13,0x242070DB);
+ b=FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
+ a=FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
+ d=FF(d,a,b,c,x[k+5], S12,0x4787C62A);
+ c=FF(c,d,a,b,x[k+6], S13,0xA8304613);
+ b=FF(b,c,d,a,x[k+7], S14,0xFD469501);
+ a=FF(a,b,c,d,x[k+8], S11,0x698098D8);
+ d=FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
+ c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
+ b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
+ a=FF(a,b,c,d,x[k+12],S11,0x6B901122);
+ d=FF(d,a,b,c,x[k+13],S12,0xFD987193);
+ c=FF(c,d,a,b,x[k+14],S13,0xA679438E);
+ b=FF(b,c,d,a,x[k+15],S14,0x49B40821);
+ a=GG(a,b,c,d,x[k+1], S21,0xF61E2562);
+ d=GG(d,a,b,c,x[k+6], S22,0xC040B340);
+ c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);
+ b=GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
+ a=GG(a,b,c,d,x[k+5], S21,0xD62F105D);
+ d=GG(d,a,b,c,x[k+10],S22,0x2441453);
+ c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
+ b=GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
+ a=GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
+ d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);
+ c=GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
+ b=GG(b,c,d,a,x[k+8], S24,0x455A14ED);
+ a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
+ d=GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
+ c=GG(c,d,a,b,x[k+7], S23,0x676F02D9);
+ b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
+ a=HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
+ d=HH(d,a,b,c,x[k+8], S32,0x8771F681);
+ c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
+ b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
+ a=HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
+ d=HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
+ c=HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
+ b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
+ a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
+ d=HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
+ c=HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
+ b=HH(b,c,d,a,x[k+6], S34,0x4881D05);
+ a=HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
+ d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
+ c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
+ b=HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
+ a=II(a,b,c,d,x[k+0], S41,0xF4292244);
+ d=II(d,a,b,c,x[k+7], S42,0x432AFF97);
+ c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);
+ b=II(b,c,d,a,x[k+5], S44,0xFC93A039);
+ a=II(a,b,c,d,x[k+12],S41,0x655B59C3);
+ d=II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
+ c=II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
+ b=II(b,c,d,a,x[k+1], S44,0x85845DD1);
+ a=II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
+ d=II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
+ c=II(c,d,a,b,x[k+6], S43,0xA3014314);
+ b=II(b,c,d,a,x[k+13],S44,0x4E0811A1);
+ a=II(a,b,c,d,x[k+4], S41,0xF7537E82);
+ d=II(d,a,b,c,x[k+11],S42,0xBD3AF235);
+ c=II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
+ b=II(b,c,d,a,x[k+9], S44,0xEB86D391);
+ a=AddUnsigned(a,AA);
+ b=AddUnsigned(b,BB);
+ c=AddUnsigned(c,CC);
+ d=AddUnsigned(d,DD);
+ }
+
+ var temp = WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);
+
+ return temp.toLowerCase();
+}
@@ -0,0 +1,60 @@
+body {
+ background-color: #e3e3e3;
+ margin:0;
+}
+h1, h2, h3, h4, h5 {
+ color: #D51007;
+ font-family: "Lucida Grande",Arial,Helvetica,Verdana,sans-serif;
+}
+.gray {
+ color: #aaa;
+}
+div.container {
+ width: 380px;
+ margin-left: auto;
+ margin-right: auto;
+ margin-bottom: 10px;
+ border: 1px solid #ccc;
+ border-top: none;
+ background-color: white;
+ padding: 15px;
+}
+p {
+ font-family: "Lucida Grande",Arial,Helvetica,Verdana,sans-serif;
+ font-size: 12px;
+}
+
+/* FORM */
+form {
+ width:280px;
+}
+
+label {
+ display:block;
+ width:70px;
+ float:left;
+ margin-top:10px;
+ text-align: right;
+}
+
+input[type="text"], input[type="password"] {
+ background-color: white;
+ border: 1px solid #ddd;
+ padding: 8px;
+ float:left;
+}
+
+p#buttons{
+ padding-top:8px;
+ clear:both;
+}
+/* END FORM */
+
+p#status {
+ color: #D51007;
+ border: 1px dotted #ccc;
+ width: 100%;
+ font-weight: bold;
+ font-size:18px;
+ display:none;
+}
@@ -0,0 +1,55 @@
+<html>
+<head>
+ <title>Options for Chrome Scrobbler</title>
+ <script type="text/javascript" src="md5.js"></script>
+ <script type="text/javascript" src="options.js"></script>
+ <link rel="stylesheet" type="text/css" href="options.css" />
+</head>
+<body onload="getCurrentUser()">
+<div class="container">
+ <h1>Chrome Scrobbler</h1>
+ <form action="#" onSubmit="saveOptions();return false;">
+ <p>
+ <label for="username">Username:</label>
+ <input type="text" id="username">
+ </p>
+ <p>
+ <label for="password">Password:</label>
+ <input type="password" id="password">
+ </p>
+ <p id="buttons">
+ <input type="submit" onclick="saveOptions()" value="Save" />
+ <input type="button" onclick="deleteOptions()" value="Delete" />
+ </p>
+ </form>
+ <p id="status">&nbsp;</p>
+ <p>
+ Enter yout last.fm username and password, and then press save.
+ </p>
+ <p>
+ To permanently delete your saved username/password, press the delete button.
+ </p>
+</div>
+
+<div class="container">
+ <h1>About</h1>
+ <p>
+ Last.fm Scrobbler for Chrome was created for people who listen to music
+ online through their browser, and would like to keep an updated playback
+ history using last.fm's scrobbling service.
+ </p>
+ <h4>By now the only supported website is YouTube</h4>
+ <p>
+ As I don't visit many other websites with video content, the development of
+ <i>connectors</i> for other websites will be mostly up to you. Feel free to
+ send a pull request at <a href="http://github.com/david-sabata/Chrome-Last.fm-Scrobbler">GitHub</a>.
+ </p>
+ <br />
+ <p class="gray">
+ The core of this extension is based on <b>mortenfriis</b>'s work which unfortunately
+ doesn't seem to be working right now and original author is not responding
+ to commits or even worse - the website code updates, making the extension useless.
+ </p>
+</div>
+</body>
+</html>
@@ -0,0 +1,29 @@
+function saveOptions() {
+ localStorage.username = document.getElementById("username").value;
+ localStorage.password = MD5(document.getElementById("password").value);
+ chrome.extension.sendRequest({type: "newSession"});
+
+ //Update status box in options page to let user know their username and pass has been taken.
+ updateStatus("Will now scrobble using "+localStorage.username+".");
+ return false;
+}
+
+function deleteOptions() {
+ localStorage.clear();
+ chrome.extension.sendRequest({type: "newSession"});
+
+ updateStatus("Account deleted.");
+}
+
+
+function updateStatus(msg) {
+ // Updates the status box
+ document.getElementById("status").style.display="block";
+ document.getElementById("status").innerHTML=msg;
+}
+
+function getCurrentUser() {
+ if (localStorage.username != null) {
+ updateStatus('Using '+localStorage.username+' to scrobble.')
+ }
+}
Oops, something went wrong.

0 comments on commit 28407b5

Please sign in to comment.