radio.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. /*global amplitude_config:true */
  2. /* Radio Funtions */
  3. /**** Last-fm API ****/
  4. (function( $ ) {
  5. $.fn.lfya = function(){
  6. var urla = "https://ws.audioscrobbler.com/2.0/?method=user.gettopartists&user=windhamdavid&api_key=e12ea1d0253898ee9a93edfe42ffdeab&period=12month&format=json&limit=200";
  7. var artists = [];
  8. function isLoadeda (artistElement) {
  9. for (var i = 0; i < artists.length; i++){
  10. var markup = $("<li class='list-group-item'>" + artists[i].aname + "<span class='badge'>" + artists[i].played + "</span></li>");
  11. artistElement.append(markup);
  12. }
  13. }
  14. return this.each(function(){
  15. var $this = $(this);
  16. $.getJSON( urla, function(data){
  17. $(data.topartists.artist).each(function(){
  18. artists.push ({
  19. aname: this.name,
  20. played: this.playcount
  21. });
  22. });
  23. isLoadeda($this);
  24. });
  25. });
  26. };
  27. $('.artists').lfya();
  28. $.fn.lfyt = function(){
  29. var urla = "https://ws.audioscrobbler.com/2.0/?method=user.gettoptracks&user=windhamdavid&api_key=e12ea1d0253898ee9a93edfe42ffdeab&period=12month&format=json&limit=200";
  30. var tracks = [];
  31. function isLoadedt (tracksElement) {
  32. for (var i = 0; i < tracks.length; i++){
  33. 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>");
  34. tracksElement.append(markup);
  35. }
  36. }
  37. return this.each(function(){
  38. var $this = $(this);
  39. $.getJSON( urla, function(data){
  40. $(data.toptracks.track).each(function(){
  41. tracks.push ({
  42. title: this.name,
  43. artist: this.artist.name,
  44. played: this.playcount,
  45. });
  46. });
  47. isLoadedt($this);
  48. });
  49. });
  50. };
  51. $('.tracks').lfyt();
  52. $.fn.lfm = function(){
  53. var url = "https://ws.audioscrobbler.com/2.0/?method=user.gettopalbums&user=windhamdavid&api_key=e12ea1d0253898ee9a93edfe42ffdeab&period=12month&format=json&limit=200";
  54. var albums = [];
  55. function isLoaded (albumElement) {
  56. for (var i = 0; i < albums.length; i++){
  57. var markup = $("<li class='list-group-item'>" + albums[i].artist + ": <span class='artist'>" + albums[i].name + "</span></li>");
  58. albumElement.append(markup);
  59. }
  60. albumElement.find('.album').hover(function(){
  61. $(this).addClass('flip');
  62. },function(){
  63. $(this).removeClass('flip');
  64. });
  65. }
  66. return this.each(function(){
  67. var $this = $(this);
  68. $.getJSON( url, function(data){
  69. $(data.topalbums.album).each(function(){
  70. albums.push ({
  71. name: this.name,
  72. artist: this.artist.name,
  73. played: this.playcount,
  74. art: this.image[this.image.length-1]["#text"]
  75. });
  76. });
  77. isLoaded($this);
  78. });
  79. });
  80. };
  81. $('.albums').lfm();
  82. })( jQuery );
  83. function getRecentTracks() {
  84. $.fn.lfmr = function(){
  85. //tracksinterval = setInterval(getRecentTracks,180000); // check every 3 minutes
  86. var urla = "https://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&user=windhamdavid&api_key=e12ea1d0253898ee9a93edfe42ffdeab&format=json&limit=100";
  87. var tracks = [];
  88. function isLoadedr (recentElement) {
  89. for (var i = 0; i < tracks.length; i++){
  90. var markup = $("<li class='list-group-item'>" + tracks[i].artist + " - <span class='artist'>" + tracks[i].title + " : " + tracks[i].album + "</li>");
  91. recentElement.append(markup);
  92. }
  93. }
  94. return this.each(function(){
  95. var $this = $(this);
  96. $.getJSON( urla, function(data){
  97. $(data.recenttracks.track).each(function(){
  98. tracks.push ({
  99. artist: this.artist["#text"],
  100. title: this.name,
  101. album: this.album["#text"]
  102. });
  103. });
  104. isLoadedr($this);
  105. });
  106. });
  107. };
  108. $('.recent').lfmr();
  109. $('.recent').hide();
  110. $('.recent').fadeIn(1000);
  111. }
  112. /**** Audio Player ****/
  113. amplitude_config = {
  114. "amplitude_songs": [{
  115. "url": "http://stream.davidawindham.com:8008/stream",
  116. "live": true
  117. }],
  118. "amplitude_volume": 73
  119. };
  120. function get_radio_tower() {return 'img/radio.gif';}
  121. function get_radio_none() {return 'img/none.svg';}
  122. function get_radio_eq() {return 'img/eq.gif';}
  123. function get_radio_eq_none() {return 'img/1.png';}
  124. var interval = null;
  125. function radioTitle() {
  126. var url = 'http://stream.davidawindham.com/status2.xsl';
  127. var mountpoint = '/stream';
  128. $.ajax({ type: 'GET',
  129. url: url,
  130. async: true,
  131. jsonpCallback: 'parseMusic',
  132. contentType: "application/json",
  133. dataType: 'jsonp',
  134. success: function(json){
  135. if(json[mountpoint] == null) {
  136. $('#connection-error').modal('show');
  137. $('#error-reconnecting').hide();
  138. $('#error-reconnecting-again').hide();
  139. $('#connection-error-reconnecting').attr('data-transitiongoal', 0).progressbar();
  140. $('#connection-error-retry').on('click', function () {
  141. $('#error-reconnecting').show();
  142. $('#connection-error-reconnecting').attr('data-transitiongoal', 100).progressbar({
  143. done: function() { $('#error-reconnecting-again').show(); }
  144. });
  145. });
  146. $('#radio').attr('src', get_radio_none()).fadeIn(300);
  147. $('#eq').attr('src', get_radio_eq_none()).fadeIn(300);
  148. }
  149. else {
  150. $('#connection-error').modal('hide');
  151. $('#track').text(json[mountpoint].title);
  152. $('#listeners').text(json[mountpoint].listeners);
  153. $('#peak-listeners').text(json[mountpoint].peak_listeners);
  154. $('#bitrate').text(json[mountpoint].bitrate);
  155. $('#radio').attr('src', get_radio_tower()).fadeIn(300);
  156. $('#eq').attr('src', get_radio_eq()).fadeIn(300);
  157. }
  158. },
  159. error: function(){
  160. $('#connection-error').modal('show');
  161. clearInterval(interval);
  162. $('#radio').attr('src', get_radio_none()).fadeIn(300);
  163. $('#eq').attr('src', get_radio_eq_none()).fadeIn(300);
  164. }
  165. });
  166. }
  167. interval = setInterval(radioTitle,20000); // every 20 seconds or stop polling
  168. /**** Page Features ****/
  169. $(document).ready(function() {
  170. $('#auth-modal').modal('show');
  171. $('#auth').validator().on('submit', function (e) {
  172. if (e.isDefaultPrevented()) {
  173. } else {
  174. e.preventDefault();
  175. $('#auth-modal').modal('hide');
  176. $('#modal_setnick').modal('show');
  177. }
  178. });
  179. $('#nick').validator();
  180. var socket = io.connect(window.location.host);
  181. var getNickname = function() {
  182. var nickname = $('#nickname').val();
  183. $('#nickname').val("");
  184. return nickname;
  185. };
  186. $('#nick').validator().on('submit', function (e) {
  187. if (e.isDefaultPrevented()) {
  188. } else {
  189. e.preventDefault();
  190. socket.emit('setNickname', {'username':getNickname()});
  191. $('#modal_setnick').modal('hide');
  192. }
  193. });
  194. radioTitle(); // call it once on load to avoid 20s delay
  195. getRecentTracks(); //call it once to avoid 3m delay
  196. var randomColor = Math.floor(Math.random()*16777215).toString(16);
  197. $("span#user-label").css({ backgroundColor: '#' + randomColor });
  198. $('ul.nav-tabs a').tooltip();
  199. });