PageRenderTime 51ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/extension/chrome/content/LiveTweeter.js

http://songbird-livetweeter.googlecode.com/
JavaScript | 636 lines | 461 code | 111 blank | 64 comment | 134 complexity | c0f68f01dfa344b3960556ed4b5eeffe MD5 | raw file
Possible License(s): GPL-3.0
  1. // Make a namespace.
  2. if (typeof livetweeter == 'undefined') {
  3. var livetweeter = {};
  4. }
  5. if (typeof Cc == 'undefined')
  6. var Cc = Components.classes;
  7. if (typeof Ci == 'undefined')
  8. var Ci = Components.interfaces;
  9. // Grab our preferences
  10. var prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch2);
  11. //Twitter
  12. var twitter_login = prefs.getCharPref("extensions.livetweeter.twitter.login");
  13. var twitter_password = prefs.getCharPref("extensions.livetweeter.twitter.password");
  14. var twitter_activate = prefs.getBoolPref("extensions.livetweeter.twitter.activate");
  15. var twitter_accountused = prefs.getCharPref("extensions.livetweeter.twitter.accountused");
  16. var twitter_messagebefore = prefs.getCharPref("extensions.livetweeter.twitter.messagebefore");
  17. var twitter_messageafter = prefs.getCharPref("extensions.livetweeter.twitter.messageafter");
  18. var twitter_info = prefs.getBoolPref("extensions.livetweeter.twitter.info");
  19. //Identi.ca
  20. var identica_login = prefs.getCharPref("extensions.livetweeter.identica.login");
  21. var identica_password = prefs.getCharPref("extensions.livetweeter.identica.password");
  22. var identica_activate = prefs.getBoolPref("extensions.livetweeter.identica.activate");
  23. var identica_accountused = prefs.getCharPref("extensions.livetweeter.identica.accountused");
  24. var identica_messagebefore = prefs.getCharPref("extensions.livetweeter.identica.messagebefore");
  25. var identica_messageafter = prefs.getCharPref("extensions.livetweeter.identica.messageafter");
  26. var identica_info = prefs.getBoolPref("extensions.livetweeter.identica.info");
  27. //Other
  28. var skype_activate = prefs.getBoolPref("extensions.livetweeter.skype.activate");
  29. var txtfile_activate = prefs.getBoolPref("extensions.livetweeter.txtfile.activate");
  30. var txtfile_path = prefs.getCharPref("extensions.livetweeter.txtfile.path");
  31. var order = prefs.getCharPref("extensions.livetweeter.order");
  32. var paused = prefs.getBoolPref("extensions.livetweeter.paused");
  33. /**
  34. * UI controller that is loaded into the main player window
  35. */
  36. livetweeter.Controller = {
  37. /**
  38. * Called when the window finishes loading
  39. */
  40. onLoad: function() {
  41. var myPrefObserver = {
  42. register: function() {
  43. // First we'll need the preference services to look for preferences.
  44. var prefService = Components.classes["@mozilla.org/preferences-service;1"]
  45. .getService(Components.interfaces.nsIPrefService);
  46. // For this._branch we ask that the preferences for extensions.myextension. and children
  47. this._branch = prefService.getBranch("extensions.livetweeter.");
  48. // Now we queue the interface called nsIPrefBranch2. This interface is described as:
  49. // "nsIPrefBranch2 allows clients to observe changes to pref values."
  50. this._branch.QueryInterface(Components.interfaces.nsIPrefBranch2);
  51. // Finally add the observer.
  52. this._branch.addObserver("", this, false);
  53. },
  54. unregister: function() {
  55. if (!this._branch) return;
  56. this._branch.removeObserver("", this);
  57. },
  58. observe: function(aSubject, aTopic, aData) {
  59. if(aTopic != "nsPref:changed") return;
  60. // aSubject is the nsIPrefBranch we're observing (after appropriate QI)
  61. // aData is the name of the pref that's been changed (relative to aSubject)
  62. switch (aData) {
  63. case "statusbar":
  64. if (prefs.getBoolPref("extensions.livetweeter.statusbar") == true) {
  65. document.getElementById("livetweeter-statusbar").setAttribute("hidden", "false");
  66. } else {
  67. document.getElementById("livetweeter-statusbar").setAttribute("hidden", "true");
  68. }
  69. break;
  70. case "toolbar":
  71. if (prefs.getBoolPref("extensions.livetweeter.toolbar") == true) {
  72. document.getElementById("livetweeter-toolbarbutton").setAttribute("hidden", "false");
  73. } else {
  74. document.getElementById("livetweeter-toolbarbutton").setAttribute("hidden", "true");
  75. }
  76. break;
  77. }
  78. }
  79. }
  80. myPrefObserver.register();
  81. const SONGBIRD_DATAREMOTE_CONTRACTID = "@songbirdnest.com/Songbird/DataRemote;1";
  82. var createDataRemote = new Components.Constructor( SONGBIRD_DATAREMOTE_CONTRACTID,
  83. Ci.sbIDataRemote, "init");
  84. // initialization code
  85. this._initialized = true;
  86. this._strings = document.getElementById("livetweeter-strings");
  87. // Make a local variable for this controller so that
  88. // it is easy to access from closures.
  89. var controller = this;
  90. // Perform extra actions the first time the extension is run
  91. if (Application.prefs.get("extensions.livetweeter.firstrun147").value) {
  92. Application.prefs.setValue("extensions.livetweeter.firstrun147", false);
  93. this._firstRunSetup147();
  94. }
  95. if (Application.prefs.get("extensions.livetweeter.firstrun150").value) {
  96. Application.prefs.setValue("extensions.livetweeter.firstrun150", false);
  97. this._firstRunSetup150();
  98. }
  99. },
  100. /**
  101. * Perform extra setup the first time the extension is run
  102. */
  103. _firstRunSetup147 : function() {
  104. Application.prefs.setValue("extensions.livetweeter.twitter.activate", false);
  105. },
  106. _firstRunSetup150 : function() {
  107. // Setting up the localized version of "I am listening to" message
  108. if (Application.prefs.get("extensions.livetweeter.identica.messagebefore").value == "I am listening to") {
  109. Application.prefs.setValue("extensions.livetweeter.identica.messagebefore", this._strings.getString("iamlisteningto"));
  110. }
  111. if (Application.prefs.get("extensions.livetweeter.twitter.messagebefore").value == "I am listening to") {
  112. Application.prefs.setValue("extensions.livetweeter.twitter.messagebefore", this._strings.getString("iamlisteningto"));
  113. }
  114. // Add the toolbar button to the default item set of the browser toolbar
  115. this._insertToolbarItem("nav-bar", "livetweeter-toolbarbutton", "subscription-button");
  116. },
  117. /**
  118. * Helper to add a toolbaritem within a given toolbar
  119. *
  120. * toolbar - the ID of a toolbar element
  121. * newItem - the ID of a toolbaritem element within the
  122. * associated toolbarpalette
  123. * insertAfter - ID of an toolbaritem after which newItem should appear
  124. */
  125. _insertToolbarItem: function(toolbar, newItem, insertAfter) {
  126. var toolbar = document.getElementById(toolbar);
  127. var list = toolbar.currentSet || "";
  128. list = list.split(",");
  129. // If this item is not already in the current set, add it
  130. if (list.indexOf(newItem) == -1)
  131. {
  132. // Add to the array, then recombine
  133. insertAfter = list.indexOf(insertAfter);
  134. if (insertAfter == -1) {
  135. list.push(newItem);
  136. } else {
  137. list.splice(insertAfter + 1, 0, newItem);
  138. }
  139. list = list.join(",");
  140. toolbar.setAttribute("currentset", list);
  141. toolbar.currentSet = list;
  142. document.persist(toolbar.id, "currentset");
  143. }
  144. },
  145. /**
  146. * Called when the window is about to close
  147. */
  148. onUnLoad: function() {
  149. LiveTweeter.quit();
  150. this._initialized = false;
  151. },
  152. };
  153. window.addEventListener("load", function(e) { livetweeter.Controller.onLoad(e); }, false);
  154. window.addEventListener("unload", function(e) { livetweeter.Controller.onUnLoad(e); }, false);
  155. try {
  156. var LiveTweeter = {
  157. frame: null,
  158. artistdataremote: null,
  159. titledataremote: null,
  160. timeout: null,
  161. on_artist_change: null,
  162. pIdx: 0,
  163. lasturl: "",
  164. showPrefs: function() {
  165. var windowMediator = Cc["@mozilla.org/appshell/window-mediator;1"]
  166. .getService(Ci.nsIWindowMediator);
  167. var window = windowMediator.getMostRecentWindow("Songbird:Main");
  168. window.SBOpenPreferences("paneLT");
  169. },
  170. getPlatform: function() {
  171. var platform;
  172. try {
  173. var sysInfo = Cc["@mozilla.org/system-info;1"].getService(Ci.nsIPropertyBag2);
  174. platform = sysInfo.getProperty("name");
  175. }
  176. catch (e) {
  177. dump("System-info not available, trying the user agent string.\n");
  178. var user_agent = navigator.userAgent;
  179. if (user_agent.indexOf("Windows") != -1)
  180. platform = "Windows_NT";
  181. else if (user_agent.indexOf("Mac OS X") != -1)
  182. platform = "Darwin";
  183. else if (user_agent.indexOf("Linux") != -1)
  184. platform = "Linux";
  185. else if (user_agent.indexOf("SunOS") != -1)
  186. platform = "SunOS";
  187. }
  188. return platform;
  189. },
  190. init: function() {
  191. var musicListener = {
  192. onMediacoreEvent: function(ev) {
  193. switch (ev.type) {
  194. case Ci.sbIMediacoreEvent.TRACK_CHANGE:
  195. var mediaItem = ev.data;
  196. LiveTweeter.onArtistChange();
  197. break;
  198. case Ci.sbIMediacoreEvent.STREAM_PAUSE:
  199. if (paused == true) {
  200. LiveTweeter.quit();
  201. }
  202. break;
  203. case Ci.sbIMediacoreEvent.STREAM_STOP:
  204. LiveTweeter.quit();
  205. break;
  206. case Ci.sbIMediacoreEvent.STREAM_START:
  207. if (paused == true) {
  208. //Disable the loadArtist to avoid spamming
  209. //LiveTweeter.loadArtist();
  210. }
  211. }
  212. }
  213. }
  214. gMM.addListener(musicListener);
  215. //this.timeout = setTimeout(function(obj) { obj.loadArtist(); }, 1000, this);
  216. //this.which = 0;
  217. },
  218. reset: function() {
  219. this.frame = null;
  220. if (this.timeout) {
  221. clearTimeout(this.timeout);
  222. this.timeout = null;
  223. }
  224. this.artistdataremote.unbind();
  225. this.artistdataremote = null;
  226. this.titledataremote.unbind();
  227. this.titledataremote = null;
  228. this.on_artist_change = null;
  229. },
  230. sendToImClient: function(exe, str) {
  231. var file = Cc["@mozilla.org/file/directory_service;1"]
  232. .getService(Ci.nsIProperties)
  233. .get("ProfD", Ci.nsIFile);
  234. file.append("extensions");
  235. file.append("LiveTweeter@geekshadow.com");
  236. file.append(exe);
  237. // check if the file exists in case of running the add-on in linked mode
  238. if (file.exists() == true) {
  239. // create an nsIProcess
  240. var process = Cc["@mozilla.org/process/util;1"]
  241. .createInstance(Ci.nsIProcess);
  242. process.init(file);
  243. var args = [str];
  244. process.run(false, args, args.length);
  245. }
  246. },
  247. toCharRefs: function(text) {
  248. var charRefs = [];
  249. var codePoint;
  250. for( var i = 0; i < text.length; i++ ) {
  251. codePoint = text.charCodeAt(i);
  252. //if is high surrogate
  253. if( 0xD800 <= codePoint && codePoint <= 0xDBFF ) {
  254. i++;
  255. codePoint = 0x2400 + ((codePoint - 0xD800) << 10) + text.charCodeAt(i);
  256. }
  257. var tmp = codePoint.toString(16);
  258. if (tmp.length == 2) {
  259. tmp = '00' + tmp;
  260. }
  261. if (tmp.length == 3) {
  262. tmp = '0' + tmp;
  263. }
  264. charRefs.push( '\\u' + tmp);
  265. }
  266. return charRefs.join('');
  267. },
  268. loadArtist: function(reset) {
  269. var platform = LiveTweeter.getPlatform();
  270. var url;
  271. var artist1 = unescape(encodeURIComponent(gMM.sequencer.currentItem.getProperty(SBProperties.artistName)));
  272. var album1 = unescape(encodeURIComponent(gMM.sequencer.currentItem.getProperty(SBProperties.albumName)));
  273. var title1 = unescape(encodeURIComponent(gMM.sequencer.currentItem.getProperty(SBProperties.trackName)));
  274. var artist = gMM.sequencer.currentItem.getProperty(SBProperties.artistName);
  275. var album = gMM.sequencer.currentItem.getProperty(SBProperties.albumName);
  276. var title = gMM.sequencer.currentItem.getProperty(SBProperties.trackName);
  277. var length = gMM.sequencer.currentItem.getProperty(SBProperties.contentLength);
  278. var duration = gMM.sequencer.currentItem.getProperty(SBProperties.duration);
  279. var imageUrl = gMM.sequencer.currentItem.getProperty(SBProperties.primaryImageURL);
  280. if (order == "artist-title") {
  281. var songtext = artist1+" - "+title1;
  282. }
  283. if (order == "title-artist") {
  284. var songtext = title1+" - "+artist1;
  285. }
  286. const nsIIOService = Cc["@mozilla.org/network/io-service;1"]
  287. .getService(Ci.nsIIOService);
  288. /*if (imageUrl == "") {
  289. var image = "";
  290. }
  291. if (imageUrl != "") {
  292. var image = nsIIOService.newURI(imageUrl, null, null).QueryInterface(Ci.nsIFileURL).file.path
  293. }
  294. //Show picture path + file
  295. //alert(image); */
  296. var keyword = "";
  297. this.timeout = null;
  298. if ((txtfile_activate == true) && (txtfile_path != "")) {
  299. var file = Cc["@mozilla.org/file/local;1"]
  300. .createInstance(Ci.nsILocalFile);
  301. file.initWithPath(txtfile_path);
  302. var foStream = Cc["@mozilla.org/network/file-output-stream;1"]
  303. .createInstance(Ci.nsIFileOutputStream);
  304. // 0x02 = PR_WRONLY (write only)
  305. // 0x08 = PR_CREATE_FILE (create file if the file doesn't exist)
  306. // 0x10 = PR_APPEND (append to file with each write)
  307. foStream.init(file, 0x02 | 0x08 | 0x20, 0666, 0);
  308. if (order == "artist-title") {
  309. var data = artist1+' - '+title1;
  310. }
  311. if (order == "title-artist") {
  312. var data = title1+' - '+artist1;
  313. }
  314. foStream.write(data, data.length);
  315. foStream.close();
  316. }
  317. if (skype_activate == true) {
  318. if (platform == "Linux") {
  319. if ((artist == "") && (title == "")) {
  320. this.sendToImClient("now-playing-x-skype.sh", ""); }
  321. else {
  322. if (order == "artist-title") {
  323. this.sendToImClient("now-playing-x-skype.sh", this.toCharRefs(artist) + " - " + this.toCharRefs(title));
  324. }
  325. if (order == "title-artist") {
  326. this.sendToImClient("now-playing-x-skype.sh", this.toCharRefs(title) + " - " + this.toCharRefs(artist));
  327. }
  328. }
  329. }
  330. }
  331. this._strings = document.getElementById("livetweeter-strings");
  332. Components.utils.import("resource://livetweeter/twitterHelper.jsm");
  333. var application_name = "LiveTweeter";
  334. if (twitter_accountused == "mainaccount") {
  335. if (twitter_activate == true) {
  336. if (twitter_login == "Twitter") {
  337. var message = this._strings.getString("twitterpref");
  338. alert(message);
  339. return false
  340. }
  341. else
  342. var twh = new TwitterHelper(twitter_login, twitter_password, document.getElementById("tool-livetweeter"), "twitter");
  343. if (artist == "") {
  344. return false
  345. }
  346. else
  347. if (order == "artist-title") {
  348. twh.statuses.update(null, null, null, "xml", twitter_messagebefore+" "+ songtext +" "+twitter_messageafter, null, application_name);
  349. }
  350. if (order == "title-artist") {
  351. twh.statuses.update(null, null, null, "xml", twitter_messagebefore+" "+ songtext +" "+twitter_messageafter, null, application_name);
  352. }
  353. }
  354. }
  355. if (identica_accountused == "mainaccount") {
  356. if (identica_activate == true) {
  357. if (identica_login == "Identi.ca") {
  358. var message = this._strings.getString("identicapref");
  359. alert(message);
  360. return false
  361. }
  362. else
  363. var twh = new TwitterHelper(identica_login, identica_password, document.getElementById("tool-livetweeter"), "identi.ca");
  364. if (artist == "") {
  365. return false
  366. }
  367. else
  368. if (order == "artist-title") {
  369. twh.statuses.update(null, null, null, "xml", identica_messagebefore+" "+ songtext +" "+identica_messageafter, null, application_name);
  370. }
  371. if (order == "title-artist") {
  372. twh.statuses.update(null, null, null, "xml", identica_messagebefore+" "+ songtext +" "+identica_messageafter, null, application_name);
  373. }
  374. }
  375. }
  376. },
  377. postTwitterWeb: function(reset) {
  378. var url;
  379. var artist = unescape(encodeURIComponent(gMM.sequencer.currentItem.getProperty(SBProperties.artistName)));
  380. var album = unescape(encodeURIComponent(gMM.sequencer.currentItem.getProperty(SBProperties.albumName)));
  381. var title = unescape(encodeURIComponent(gMM.sequencer.currentItem.getProperty(SBProperties.trackName)));
  382. var keyword = "";
  383. this.timeout = null;
  384. if (artist == "") {
  385. return false
  386. }
  387. else
  388. if (order == "artist-title") {
  389. //twh.statuses.update(null, null, null, "xml", twitter_messagebefore+" "+artist+" - "+title+" "+twitter_messageafter, null, application_name);
  390. gBrowser.loadOneTab("http://twitter.com/?status="+twitter_messagebefore+" "+artist+" - "+title+" "+twitter_messageafter);
  391. }
  392. if (order == "title-artist") {
  393. //twh.statuses.update(null, null, null, "xml", twitter_messagebefore+" "+title+" - "+artist+" "+twitter_messageafter, null, application_name);
  394. gBrowser.loadOneTab("http://twitter.com/?status="+twitter_messagebefore+" "+title+" - "+artist+" "+twitter_messageafter);
  395. }
  396. },
  397. postTwitter: function(reset) {
  398. function addNotification(aPriority, aMsg) {
  399. function notificationCallback(notificationElement, notifcationButton) {
  400. var url = "http://twitter.com/" + twitter_login;
  401. gBrowser.loadOneTab(url);
  402. }
  403. var mTop = gBrowser.getNotificationBox(gBrowser.selectedBrowser);
  404. var notificationImage = "http://a1.twimg.com/a/1261078355/images/favicon.ico";
  405. var notificationButtons = [{accessKey: null,
  406. callback: notificationCallback,
  407. label: "Go",
  408. popup: null}]
  409. mTop.removeAllNotifications(false);
  410. mTop.appendNotification(aMsg,
  411. aPriority,
  412. notificationImage,
  413. aPriority,
  414. notificationButtons);
  415. }
  416. var url;
  417. var artist = unescape(encodeURIComponent(gMM.sequencer.currentItem.getProperty(SBProperties.artistName)));
  418. var album = unescape(encodeURIComponent(gMM.sequencer.currentItem.getProperty(SBProperties.albumName)));
  419. var title = unescape(encodeURIComponent(gMM.sequencer.currentItem.getProperty(SBProperties.trackName)));
  420. var keyword = "";
  421. this.timeout = null;
  422. this._strings = document.getElementById("livetweeter-strings");
  423. if (twitter_login == "Twitter") {
  424. var message = this._strings.getString("twitterpref");
  425. alert(message);
  426. return false
  427. }
  428. else
  429. Components.utils.import("resource://livetweeter/twitterHelper.jsm");
  430. var application_name = "LiveTweeter";
  431. var twh = new TwitterHelper(twitter_login, twitter_password, document.getElementById("tool-livetweeter"), "twitter");
  432. if (artist == "") {
  433. return false
  434. }
  435. else
  436. if (order == "artist-title") {
  437. twh.statuses.update(null, null, null, "xml", twitter_messagebefore+" "+artist+" - "+title+" "+twitter_messageafter, null, application_name);
  438. }
  439. if (order == "title-artist") {
  440. twh.statuses.update(null, null, null, "xml", twitter_messagebefore+" "+title+" - "+artist+" "+twitter_messageafter, null, application_name);
  441. }
  442. addNotification(1,this._strings.getString("songposted") + " http://twitter.com/" + twitter_login);
  443. },
  444. postIdentica: function(reset) {
  445. function addNotification(aPriority, aMsg) {
  446. function notificationCallback(notificationElement, notifcationButton) {
  447. var url = "http://identi.ca/" + identica_login;
  448. gBrowser.loadOneTab(url);
  449. }
  450. var mTop = gBrowser.getNotificationBox(gBrowser.selectedBrowser);
  451. var notificationImage = "http://identi.ca/favicon.ico";
  452. var notificationButtons = [{accessKey: null,
  453. callback: notificationCallback,
  454. label: "Go",
  455. popup: null}]
  456. mTop.removeAllNotifications(false);
  457. mTop.appendNotification(aMsg,
  458. aPriority,
  459. notificationImage,
  460. aPriority,
  461. notificationButtons);
  462. }
  463. var url;
  464. var artist = unescape(encodeURIComponent(gMM.sequencer.currentItem.getProperty(SBProperties.artistName)));
  465. var album = unescape(encodeURIComponent(gMM.sequencer.currentItem.getProperty(SBProperties.albumName)));
  466. var title = unescape(encodeURIComponent(gMM.sequencer.currentItem.getProperty(SBProperties.trackName)));
  467. var keyword = "";
  468. this.timeout = null;
  469. this._strings = document.getElementById("livetweeter-strings");
  470. if (identica_login == "Identi.ca") {
  471. var message = this._strings.getString("identicapref");
  472. alert(message);
  473. return false
  474. }
  475. else
  476. Components.utils.import("resource://livetweeter/twitterHelper.jsm");
  477. var application_name = "LiveTweeter";
  478. var twh = new TwitterHelper(identica_login, identica_password, document.getElementById("tool-livetweeter"), "identi.ca");
  479. if (artist == "") {
  480. return false
  481. }
  482. else
  483. if (order == "artist-title") {
  484. twh.statuses.update(null, null, null, "xml", identica_messagebefore+" "+artist+" - "+title+" "+identica_messageafter, null, application_name);
  485. }
  486. if (order == "title-artist") {
  487. twh.statuses.update(null, null, null, "xml", identica_messagebefore+" "+title+" - "+artist+" "+identica_messageafter, null, application_name);
  488. }
  489. addNotification(1,this._strings.getString("songposted") + " http://identi.ca/" + identica_login);
  490. },
  491. quit: function(reset) {
  492. var platform = LiveTweeter.getPlatform();
  493. var url;
  494. var keyword = "";
  495. this.timeout = null;
  496. if ((txtfile_activate == true) && (txtfile_path != "")) {
  497. var file = Cc["@mozilla.org/file/local;1"]
  498. .createInstance(Ci.nsILocalFile);
  499. file.initWithPath(txtfile_path);
  500. var foStream = Cc["@mozilla.org/network/file-output-stream;1"]
  501. .createInstance(Ci.nsIFileOutputStream);
  502. // 0x02 = PR_WRONLY (write only)
  503. // 0x08 = PR_CREATE_FILE (create file if the file doesn't exist)
  504. // 0x10 = PR_APPEND (append to file with each write)
  505. foStream.init(file, 0x02 | 0x08 | 0x20, 0666, 0);
  506. var data = "";
  507. foStream.write(data, data.length);
  508. foStream.close();
  509. }
  510. if (skype_activate == true) {
  511. if (platform == "Linux") {
  512. this.sendToImClient("now-playing-x-skype.sh", "");
  513. }
  514. }
  515. },
  516. onArtistChange: function() {
  517. if (this.timeout) clearTimeout(this.timeout);
  518. this.timeout = setTimeout(function(obj) { obj.loadArtist(); },
  519. 1000, this);
  520. }
  521. }
  522. LiveTweeter.init();
  523. } catch (e) {
  524. }