radio.min.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. (function(){
  2. var debug = false;
  3. // ***************************************************************************
  4. // Socket.io events
  5. // ***************************************************************************
  6. var socket = io.connect(window.location.host);
  7. // Connection established
  8. socket.on('connected', function (data) {
  9. console.log(data);
  10. // Get users connected to mainroom
  11. socket.emit('getUsersInRoom', {'room':'Lobby'});
  12. if (debug) {
  13. // Subscription to rooms
  14. socket.emit('subscribe', {'username':'sergio', 'rooms':['sampleroom']});
  15. // Send sample message to room
  16. socket.emit('newMessage', {'room':'sampleroom', 'msg':'Hellooooooo!'});
  17. // Auto-disconnect after 10 minutes
  18. setInterval(function() {
  19. socket.emit('unsubscribe', {'rooms':['sampleroom']});
  20. socket.disconnect();
  21. }, 600000);
  22. }
  23. });
  24. // Disconnected from server
  25. socket.on('disconnect', function (data) {
  26. var info = {'room':'Lobby', 'username':'Radio-bot', 'msg':'---- Lost connection ----'};
  27. addBotMessage(info);
  28. });
  29. // Reconnected to server
  30. socket.on('reconnect', function (data) {
  31. var info = {'room':'Lobby', 'username':'Radio-bot', 'msg':'---- Reconnected ----'};
  32. addBotMessage(info);
  33. });
  34. // Subscription to room confirmed
  35. socket.on('subscriptionConfirmed', function(data) {
  36. // Create room space in interface
  37. if (!roomExists(data.room)) {
  38. addRoomTab(data.room);
  39. addRoom(data.room);
  40. }
  41. // Close modal if opened
  42. $('#modal_joinroom').modal('hide');
  43. });
  44. // Unsubscription to room confirmed
  45. socket.on('unsubscriptionConfirmed', function(data) {
  46. // Remove room space in interface
  47. if (roomExists(data.room)) {
  48. removeRoomTab(data.room);
  49. removeRoom(data.room);
  50. }
  51. });
  52. // User joins room
  53. socket.on('userJoinsRoom', function(data) {
  54. console.log("userJoinsRoom: %s", JSON.stringify(data));
  55. // Log join in conversation
  56. addMessage(data);
  57. // Add user to connected users list
  58. addUser(data);
  59. });
  60. // User leaves room
  61. socket.on('userLeavesRoom', function(data) {
  62. console.log("userLeavesRoom: %s", JSON.stringify(data));
  63. // Log leave in conversation
  64. addMessage(data);
  65. // Remove user from connected users list
  66. removeUser(data);
  67. });
  68. // Message received
  69. socket.on('newMessage', function (data) {
  70. console.log("newMessage: %s", JSON.stringify(data));
  71. addMessage(data);
  72. // Scroll down room messages
  73. var room_messages = '#'+data.room+' #room_messages';
  74. $(room_messages).animate({
  75. scrollTop: $(room_messages).height()
  76. }, 300);
  77. });
  78. // Users in room received
  79. socket.on('usersInRoom', function(data) {
  80. console.log('usersInRoom: %s', JSON.stringify(data));
  81. _.each(data.users, function(user) {
  82. addUser(user);
  83. });
  84. });
  85. // User nickname updated
  86. socket.on('userNicknameUpdated', function(data) {
  87. console.log("userNicknameUpdated: %s", JSON.stringify(data));
  88. updateNickname(data);
  89. msg = '----- ' + data.oldUsername + ' is now ' + data.newUsername + ' -----';
  90. var info = {'room':data.room, 'username':'Radio-bot', 'msg':msg};
  91. addBotMessage(info);
  92. });
  93. // ***************************************************************************
  94. // Templates and helpers
  95. // ***************************************************************************
  96. var templates = {};
  97. var getTemplate = function(path, callback) {
  98. var source;
  99. var template;
  100. // Check first if we've the template cached
  101. if (_.has(templates, path)) {
  102. if (callback) callback(templates[path]);
  103. // If not we get and compile it
  104. } else {
  105. $.ajax({
  106. url: path,
  107. success: function(data) {
  108. source = data;
  109. template = Handlebars.compile(source);
  110. // Store compiled template in cache
  111. templates[path] = template;
  112. if (callback) callback(template);
  113. }
  114. });
  115. }
  116. }
  117. // Add room tab
  118. var addRoomTab = function(room) {
  119. getTemplate('js/templates/room_tab.handlebars', function(template) {
  120. $('#rooms_tabs').append(template({'room':room}));
  121. });
  122. };
  123. // Remove room tab
  124. var removeRoomTab = function(room) {
  125. var tab_id = "#"+room+"_tab";
  126. $(tab_id).remove();
  127. };
  128. // Add room
  129. var addRoom = function(room) {
  130. getTemplate('js/templates/room.handlebars', function(template) {
  131. $('#rooms').append(template({'room':room}));
  132. // Toogle to created room
  133. var newroomtab = '[href="#'+room+'"]';
  134. $(newroomtab).click();
  135. // Get users connected to room
  136. socket.emit('getUsersInRoom', {'room':room});
  137. });
  138. };
  139. // Remove room
  140. var removeRoom = function(room) {
  141. var room_id = "#"+room;
  142. $(room_id).remove();
  143. };
  144. // Add message to room
  145. var addMessage = function(msg) {
  146. getTemplate('js/templates/message.handlebars', function(template) {
  147. var room_messages = '#'+msg.room+' #room_messages';
  148. $(room_messages).append(template(msg));
  149. });
  150. };
  151. // Robot Add message to room
  152. var addBotMessage = function(msg) {
  153. getTemplate('js/templates/message-bot.handlebars', function(template) {
  154. var room_messages = '#'+msg.room+' #room_messages';
  155. $(room_messages).append(template(msg));
  156. });
  157. };
  158. // Add user to connected users list
  159. var addUser = function(user) {
  160. getTemplate('js/templates/user.handlebars', function(template) {
  161. var room_users = '#'+user.room+' #room_users';
  162. // Add only if it doesn't exist in the room
  163. var user_badge = '#'+user.room+' #'+user.id;
  164. if (!($(user_badge).length)) {
  165. $(room_users).append(template(user));
  166. }
  167. });
  168. }
  169. // Remove user from connected users list
  170. var removeUser = function(user) {
  171. var user_badge = '#'+user.room+' #'+user.id;
  172. $(user_badge).remove();
  173. };
  174. // Check if room exists
  175. var roomExists = function(room) {
  176. var room_selector = '#'+room;
  177. if ($(room_selector).length) {
  178. return true;
  179. } elseĀ {
  180. return false;
  181. }
  182. };
  183. // Get current room
  184. var getCurrentRoom = function() {
  185. return $('li[id$="_tab"][class="active"]').text();
  186. };
  187. // Get message text from input field
  188. var getMessageText = function() {
  189. var text = $('#message_text').val();
  190. $('#message_text').val("");
  191. return text;
  192. };
  193. // Get room name from input field
  194. var getRoomName = function() {
  195. var name = $('#room_name').val().trim();
  196. $('#room_name').val("");
  197. return name;
  198. };
  199. // Get nickname from input field
  200. var getNickname = function() {
  201. var nickname = $('#nickname').val();
  202. $('#nickname').val("");
  203. return nickname;
  204. };
  205. // Update nickname in badges
  206. var updateNickname = function(data) {
  207. var badges = '#'+data.room+' #'+data.id;
  208. $(badges).text(data.newUsername);
  209. };
  210. // ***************************************************************************
  211. // Events
  212. // ***************************************************************************
  213. // Send new message
  214. $('#b_send_message').click(function(eventObject) {
  215. eventObject.preventDefault();
  216. if ($('#message_text').val() != "") {
  217. socket.emit('newMessage', {'room':getCurrentRoom(), 'msg':getMessageText()});
  218. }
  219. });
  220. // Join new room
  221. $('#b_join_room').click(function(eventObject) {
  222. var roomName = getRoomName();
  223. if (roomName) {
  224. eventObject.preventDefault();
  225. socket.emit('subscribe', {'rooms':[roomName]});
  226. // Added error class if empty room name
  227. } else {
  228. $('#room_name').addClass('error');
  229. }
  230. });
  231. // Leave current room
  232. $('#b_leave_room').click(function(eventObject) {
  233. eventObject.preventDefault();
  234. var currentRoom = getCurrentRoom();
  235. if (currentRoom != 'Lobby') {
  236. socket.emit('unsubscribe', {'rooms':[getCurrentRoom()]});
  237. // Toogle to MainRoom
  238. $('[href="#Lobby"]').click();
  239. } else {
  240. console.log('Cannot leave Lobby, sorry');
  241. }
  242. });
  243. // Remove error style to hide modal
  244. $('#modal_joinroom').on('hidden.bs.modal', function (e) {
  245. if ($('#room_name').hasClass('error')) {
  246. $('#room_name').removeClass('error');
  247. }
  248. });
  249. // Set nickname
  250. $('#b_set_nickname').click(function(eventObject) {
  251. eventObject.preventDefault();
  252. socket.emit('setNickname', {'username':getNickname()});
  253. // Close modal if opened
  254. $('#modal_setnick').modal('hide');
  255. });
  256. })();
  257. /**** Radio Functions ****/
  258. /* Last-fm API */
  259. (function( $ ) {
  260. $.fn.lfmr = function(options){
  261. var urla = "https://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&user=windhamdavid&api_key=e12ea1d0253898ee9a93edfe42ffdeab&format=json&limit=100";
  262. var tracks = [];
  263. function isLoadedr (recentElement) {
  264. for (var i = 0; i < tracks.length; i++){
  265. var markup = $("<li class='list-group-item'>" + tracks[i].artist + " - <span class='artist'>" + tracks[i].title + " : " + tracks[i].album + "</li>");
  266. recentElement.append(markup);
  267. }
  268. }
  269. return this.each(function(){
  270. var $this = $(this);
  271. $.getJSON( urla, function(data){
  272. $(data.recenttracks.track).each(function(){
  273. tracks.push ({
  274. artist: this.artist["#text"],
  275. title: this.name,
  276. album: this.album["#text"]
  277. });
  278. });
  279. isLoadedr($this);
  280. });
  281. });
  282. };
  283. $('.recent').lfmr();
  284. $.fn.lfya = function(options){
  285. var urla = "https://ws.audioscrobbler.com/2.0/?method=user.gettopartists&user=windhamdavid&api_key=e12ea1d0253898ee9a93edfe42ffdeab&period=12month&format=json&limit=100";
  286. var artists = [];
  287. function isLoadeda (artistElement) {
  288. for (var i = 0; i < artists.length; i++){
  289. var markup = $("<li class='list-group-item'>" + artists[i].aname + "<span class='badge'>" + artists[i].played + "</span></li>");
  290. artistElement.append(markup);
  291. }
  292. }
  293. return this.each(function(){
  294. var $this = $(this);
  295. $.getJSON( urla, function(data){
  296. $(data.topartists.artist).each(function(){
  297. artists.push ({
  298. aname: this.name,
  299. played: this.playcount
  300. });
  301. });
  302. isLoadeda($this);
  303. });
  304. });
  305. };
  306. $('.artists').lfya();
  307. $.fn.lfyt = function(options){
  308. var urla = "https://ws.audioscrobbler.com/2.0/?method=user.gettoptracks&user=windhamdavid&api_key=e12ea1d0253898ee9a93edfe42ffdeab&period=12month&format=json&limit=100";
  309. var tracks = [];
  310. function isLoadedt (tracksElement) {
  311. for (var i = 0; i < tracks.length; i++){
  312. var markup = $("<li class='list-group-item'>" + tracks[i].artist + " - <span class='artist'>" + tracks[i].title + "</span><span class='badge'>" + tracks[i].played + "</span></li>");
  313. tracksElement.append(markup);
  314. }
  315. }
  316. return this.each(function(){
  317. var $this = $(this);
  318. $.getJSON( urla, function(data){
  319. $(data.toptracks.track).each(function(){
  320. tracks.push ({
  321. title: this.name,
  322. artist: this.artist.name,
  323. played: this.playcount,
  324. });
  325. });
  326. isLoadedt($this);
  327. });
  328. });
  329. };
  330. $('.tracks').lfyt();
  331. })( jQuery );
  332. amplitude_config = {
  333. // amplitude_songs: []
  334. "amplitude_songs": [{
  335. "url": "http://stream.davidawindham.com:8008/stream",
  336. "live": true
  337. }],
  338. "amplitude_volume": 90
  339. }
  340. function get_radio_tower() {return 'img/radio.gif';}
  341. function get_radio_none() {return 'img/none.svg';}
  342. function get_radio_eq() {return 'img/eq.gif';}
  343. function get_radio_eq_none() {return 'img/none.svg';}
  344. var interval = null;
  345. $(document).ready(function() {
  346. interval = setInterval(radioTitle,30000); // every 30 seconds
  347. });
  348. function radioTitle() {
  349. $('#radio').attr('src', get_radio_none()).fadeIn(300);
  350. $('#eq').attr('src', get_radio_eq_none()).fadeIn(300);
  351. var url = 'http://stream.davidawindham.com/status2.xsl';
  352. var mountpoint = '/stream';
  353. $.ajax({ type: 'GET',
  354. url: url,
  355. async: true,
  356. jsonpCallback: 'parseMusic',
  357. contentType: "application/json",
  358. dataType: 'jsonp',
  359. success: function (json) {
  360. $('#track').text(json[mountpoint].title);
  361. $('#listeners').text(json[mountpoint].listeners);
  362. $('#peak-listeners').text(json[mountpoint].peak_listeners);
  363. $('#bitrate').text(json[mountpoint].bitrate);
  364. $('#radio').attr('src', get_radio_tower()).fadeIn(300);
  365. $('#eq').attr('src', get_radio_eq()).fadeIn(300);
  366. },
  367. error: function(e){
  368. console.error('cannot connect to stream');
  369. $('#connection-error').modal('show');
  370. clearInterval(interval);
  371. $('#radio').attr('src', get_radio_none()).fadeIn(300);
  372. $('#eq').attr('src', get_radio_eq_none()).fadeIn(300);
  373. }
  374. });
  375. }
  376. $(document).ready(function() {
  377. function spectrum() {
  378. var randomColor = Math.floor(Math.random()*16777215).toString(16);
  379. $("span#user-label").css({ backgroundColor: '#' + randomColor });
  380. };
  381. $('ul.nav-tabs a').tooltip();
  382. });