autoplay.js 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. /* Librairie Autoplay pour muzi.ch */
  2. $(document).ready(function(){
  3. /*
  4. * Section commune
  5. */
  6. // Liste de données pour la lecture
  7. var autoplay_list = new Array;
  8. // object player
  9. var autoplay_player = null;
  10. // Ritournelle pour le lecteur soundcloud (une seule variable sinon bug)
  11. var autoplay_player_soundcloud = null;
  12. // identifiant de la division du lecteur
  13. var autoplay_player_div_id = "autoplay_player";
  14. // identifiant du lecteur
  15. var autoplay_player_id = "autoplay_player_id";
  16. // étape de lecture, on commence naturellement a 0
  17. var autoplay_step = 0;
  18. // On utilise cette variable pour savoir quel est l'élélement choisis en
  19. // dernier (cas du brute click)
  20. var autoplay_last_element_id = null;
  21. // Pour savoir si on est en bout de ligne
  22. var autoplay_no_more = false;
  23. // En cas de click sur un bouton de lecture
  24. $('a#autoplay_launch').click(function(){
  25. // On ouvre la boite de dialogue pendant la demande ajax
  26. open_popin_dialog('autoplay');
  27. $('img#autoplay_loader').show();
  28. $.getJSON($(this).attr('href'), function(response) {
  29. if (response.status == 'mustbeconnected')
  30. {
  31. $(location).attr('href', url_index);
  32. }
  33. if (response.status == 'success')
  34. {
  35. // On récupère la liste d'élèments
  36. autoplay_list = response.data;
  37. autoplay_last_element_id = autoplay_list[0].element_id;
  38. autoplay_run(0);
  39. }
  40. });
  41. return false;
  42. });
  43. function autoplay_load_element(element_id, timeouted)
  44. {
  45. // On vérifie ici que c'est le dernier élement demandé, ca evite de multiples
  46. // requetes en cas de brute click sur les flèches.
  47. if (!timeouted)
  48. {
  49. $('#autoplay_element_loader').show();
  50. $('li#autoplay_element_container').html('');
  51. setTimeout(autoplay_load_element, 1000, element_id, true);
  52. }
  53. else
  54. {
  55. if (autoplay_last_element_id == element_id)
  56. {
  57. $.getJSON(url_element_dom_get_one_autoplay+'/'+element_id, function(response) {
  58. $('#autoplay_element_loader').hide();
  59. if (response.status == 'mustbeconnected')
  60. {
  61. $(location).attr('href', url_index);
  62. }
  63. if (response.status == 'success' && autoplay_last_element_id == element_id)
  64. {
  65. if (!autoplay_no_more)
  66. {
  67. // On récupère la liste d'élèments
  68. $('li#autoplay_element_container').html(response.data);
  69. }
  70. else
  71. {
  72. $('li#autoplay_element_container').html('');
  73. }
  74. }
  75. });
  76. }
  77. }
  78. }
  79. // Lancement de l'élèment suivant
  80. function autoplay_run(step)
  81. {
  82. // En premier lieu on réinitialise le lecteur en détruisant le dom qui a
  83. // pu être créé par la lecture précedente.
  84. autoplay_clean_for_player_creation();
  85. // Pause des lecteurs potentiels
  86. autoplay_pause_all_players();
  87. if (autoplay_list.length)
  88. {
  89. if (array_key_exists(step, autoplay_list))
  90. {
  91. // Youtube case
  92. if (autoplay_list[step].element_type == 'youtube.com' || autoplay_list[step].element_type == 'youtu.be')
  93. {
  94. autoplay_load_element(autoplay_list[step].element_id, false);
  95. youtube_create_player(autoplay_list[step].element_ref_id);
  96. }
  97. if (autoplay_list[step].element_type == 'soundcloud.com')
  98. {
  99. autoplay_load_element(autoplay_list[step].element_id, false);
  100. soundcloud_create_player(autoplay_list[step].element_ref_id, autoplay_list[step].element_normalized_url);
  101. }
  102. }
  103. }
  104. else
  105. {
  106. autoplay_display_nomore();
  107. }
  108. }
  109. function autoplay_clean_for_player_creation(clean_element)
  110. {
  111. autoplay_pause_all_players();
  112. $('div#'+autoplay_player_div_id+'_container').html('<div id="'+autoplay_player_div_id+'"></div>');
  113. $('#autoplay_noelements_text').hide();
  114. if (clean_element)
  115. {
  116. $('li#autoplay_element_container').html('');
  117. }
  118. $('img#autoplay_loader').show();
  119. }
  120. function autoplay_pause_all_players()
  121. {
  122. soundcloud_stop_player();
  123. }
  124. function autoplay_display_nomore()
  125. {
  126. autoplay_no_more = true;
  127. $('div#'+autoplay_player_div_id+'_container').html('<div id="'+autoplay_player_div_id+'"></div>');
  128. $('li#autoplay_element_container').html('');
  129. $('#autoplay_noelements_text').show();
  130. $('img#autoplay_loader').hide();
  131. if (autoplay_player_soundcloud)
  132. {
  133. $('div#autoplay_player_soundcloud').hide();
  134. autoplay_player_soundcloud.pause();
  135. }
  136. }
  137. // Avancer d'un élelement dans la liste
  138. function autoplay_next()
  139. {
  140. autoplay_no_more = false;
  141. autoplay_step++;
  142. if (array_key_exists(autoplay_step, autoplay_list))
  143. {
  144. autoplay_last_element_id = autoplay_list[autoplay_step].element_id;
  145. autoplay_run(autoplay_step);
  146. }
  147. else
  148. {
  149. autoplay_display_nomore();
  150. autoplay_step = autoplay_list.length;
  151. }
  152. }
  153. // Reculer d'un élement dans la liste
  154. function autoplay_previous()
  155. {
  156. autoplay_no_more = false;
  157. autoplay_step--;
  158. if (array_key_exists(autoplay_step, autoplay_list))
  159. {
  160. autoplay_last_element_id = autoplay_list[autoplay_step].element_id;
  161. autoplay_run(autoplay_step);
  162. }
  163. else
  164. {
  165. autoplay_display_nomore();
  166. autoplay_step = -1;
  167. }
  168. }
  169. // bouton précedent
  170. $('a#autoplay_previous').click(function(){autoplay_previous();});
  171. // bouton suivant
  172. $('a#autoplay_next').click(function(){autoplay_next();});
  173. // Fermeture de la lecture auto
  174. $('a#autoplay_close').click(function(){
  175. // Fond gris
  176. $('#fade').fadeOut(1000, function(){$('#fade').remove();});
  177. // On cache le lecteur
  178. $('#autoplay').hide();
  179. // On vide le dom du lecteur
  180. $('div#'+autoplay_player_div_id+'_container').html('<div id="'+autoplay_player_div_id+'"></div>');
  181. // Plus rien de dois être lu
  182. autoplay_pause_all_players();
  183. });
  184. /*
  185. *
  186. *
  187. *
  188. * Fonction youtube.com et youtu.be
  189. *
  190. *
  191. *
  192. */
  193. // Création du lecteur FLASH youtube
  194. function youtube_create_player(ref_id)
  195. {
  196. // Préparation du terrain
  197. autoplay_clean_for_player_creation();
  198. var playerapiid = "ytplayerapiid";
  199. var params = {allowScriptAccess: "always"};
  200. var atts = {id: autoplay_player_id};
  201. swfobject.embedSWF(
  202. "http://www.youtube.com/v/"+ref_id+"?enablejsapi=1&playerapiid="+playerapiid+"&version=3",
  203. autoplay_player_div_id,
  204. "425",
  205. "356",
  206. "8",
  207. null,
  208. null,
  209. params,
  210. atts
  211. );
  212. }
  213. // Fonction appelé par l'ActionScript (flash) du lecteur youtube quand il est prêt
  214. window.onYouTubePlayerReady = function()
  215. {
  216. autoplay_player = document.getElementById(autoplay_player_id);
  217. autoplay_player.addEventListener("onStateChange", "youtube_StateChange");
  218. autoplay_player.addEventListener("onError", "youtube_error");
  219. $('img#autoplay_loader').hide();
  220. youtube_play();
  221. }
  222. // Fonction appelé par le lecteur youtube quand il change d'état
  223. window.youtube_StateChange = function(newState)
  224. {
  225. // Lorsque la lecture est terminé
  226. if (newState === 0)
  227. {
  228. autoplay_next();
  229. }
  230. }
  231. // Fonction appelé par le lecteur youtube quand il y a une erreur
  232. window.youtube_error = function(newState)
  233. {
  234. autoplay_next();
  235. }
  236. // Lecture
  237. function youtube_play()
  238. {
  239. if (autoplay_player)
  240. {
  241. autoplay_player.playVideo();
  242. }
  243. }
  244. /*
  245. *
  246. *
  247. * Fonctions soundcloud
  248. *
  249. *
  250. *
  251. */
  252. function soundcloud_create_player(ref_id, ref_url)
  253. {
  254. // Préparation du terrain
  255. autoplay_clean_for_player_creation();
  256. // Variable dans lequelle on met l'index dela track lu précedamment
  257. var index_track_previous = 0;
  258. if (!$('iframe#soundcloud_iframe_player').length)
  259. {
  260. $('div#autoplay_player_soundcloud').show();
  261. // TODO: on garde ?
  262. SC.initialize({
  263. client_id: '39946ea18e3d78d64c0ac95a025794e1'
  264. });
  265. // Aucun lecteur soundcloud n'a été ouvert pour le moment
  266. $('#autoplay_player_soundcloud').html(
  267. '<iframe id="soundcloud_iframe_player" src="http://w.soundcloud.com/player/?url='
  268. +ref_url+'&show_artwork=false&auto_play=true" width="100%" '
  269. +'height="370" scrolling="no" frameborder="no"></iframe>'
  270. );
  271. //console.debug(document.getElementById('sc-widget_'+ref_id));
  272. var widgetIframe = document.getElementById('soundcloud_iframe_player');
  273. autoplay_player_soundcloud = SC.Widget(widgetIframe);
  274. SC.get(ref_url, function(track, error) {
  275. if (error)
  276. {
  277. // En cas d'erreur on passe a al suivante
  278. autoplay_next();
  279. }
  280. else
  281. {
  282. // Lorsque le lecteur est prêt on lance la lecture
  283. autoplay_player_soundcloud.bind(SC.Widget.Events.READY, function ()
  284. {
  285. autoplay_player_soundcloud.play();
  286. $('img#autoplay_loader').hide();
  287. });
  288. autoplay_player_soundcloud.bind(SC.Widget.Events.PLAY, function ()
  289. {
  290. // Lorsque le lecteur commence une lecture
  291. // On garde en mémoire l'index de la lecture en cours
  292. autoplay_player_soundcloud.getCurrentSoundIndex(function(value){
  293. index_track_previous = value;
  294. });
  295. });
  296. // Lorsque le lecteur a terminé sa lecture, on passe au suivant
  297. autoplay_player_soundcloud.bind(SC.Widget.Events.FINISH, function ()
  298. {
  299. // Cette variable contient le nombre de pistes dans la liste de lecture
  300. var track_count = 1;
  301. autoplay_player_soundcloud.getSounds(function(value){
  302. // On récupère le nomre de pistes
  303. track_count = value.length;
  304. });
  305. autoplay_player_soundcloud.getCurrentSoundIndex(function(value){
  306. // Si la index_track_previous est la même maintenant que la piste
  307. // est terminé, c'est que l'on est arrivé en fin de liste.
  308. // Cependant, si c'est une liste avec une piste unique, on passe
  309. // tout de suite a la suite
  310. if (value == index_track_previous || track_count == 1)
  311. {
  312. autoplay_next();
  313. }
  314. // Sinon on prend al nouvelle valeur
  315. index_track_previous = value;
  316. });
  317. });
  318. }
  319. });
  320. }
  321. else
  322. {
  323. SC.get(ref_url, function(track, error) {
  324. if (error)
  325. {
  326. // En cas d'erreur on passe a al suivante
  327. console.log('Not found!');
  328. autoplay_next();
  329. }
  330. else
  331. {
  332. // Le lecteur iframe existait déjà
  333. $('div#autoplay_player_soundcloud').show();
  334. autoplay_player_soundcloud.load(ref_url+'&show_artwork=false&auto_play=true');
  335. //autoplay_player_soundcloud.play();
  336. $('img#autoplay_loader').hide();
  337. }
  338. });
  339. }
  340. }
  341. function soundcloud_stop_player()
  342. {
  343. if (autoplay_player_soundcloud)
  344. {
  345. autoplay_player_soundcloud.pause();
  346. }
  347. $('div#autoplay_player_soundcloud').hide();
  348. }
  349. });