PageRenderTime 44ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/vues/home.php

https://github.com/cyprieng/MediaStreamer
PHP | 345 lines | 246 code | 38 blank | 61 comment | 33 complexity | 61eed997d681519cd134917d825aca81 MD5 | raw file
  1. <div class="row-fluid" id="player-container">
  2. <div class="span8 offset1">
  3. <audio id="player" src="" controls></audio>
  4. </div>
  5. <div class="span2">
  6. <a class="btn btn-small" href="#"><i class="icon-fast-backward"></i></a>
  7. <a class="btn btn-small" href="#"><i class="icon-fast-forward"></i></a>
  8. <a class="btn btn-small" href="#" onclick="random();"><i class="icon-random"></i></a>
  9. <a class="btn btn-small" href="#" onclick="$(this).toggleClass('active');"><i class="icon-repeat"></i></a>
  10. </div>
  11. </div>
  12. <br/><br/><br/><br/>
  13. <div class="container-fluid">
  14. <div class="row-fluid">
  15. <div class="span4" id="mediaList">
  16. <?php
  17. /*
  18. Affiche l'arboresence
  19. @params arborescence Array d'arborescence
  20. @return Affiche une mise en forme l'arborescence
  21. @see modele/home.php
  22. */
  23. function showArborescence($arborescence){
  24. //On affiche le nom du dossier
  25. if(!isset($arborescence[0])) return;
  26. echo '<ul><span class="addToLibrary"><i class="icon-folder-close"></i><a href="#">'.substr(strrchr($arborescence[0],'/'),1).'</a></span><br/>';
  27. unset($arborescence[0]);
  28. foreach($arborescence as $arbo){
  29. if(is_array($arbo)){ //C'est un dossier => on le parcours
  30. showArborescence($arbo);
  31. }
  32. else{ //Fichier => on l'affiche
  33. $info = pathinfo($arbo);
  34. $file_name = basename($arbo,'.'.$info['extension']);
  35. echo '<li><i class="icon-file"></i><a href="'.MODELE_PATH.'media.php?file='.$arbo.'" onclick="$(\'#playlist\').append(\'<li class=\\\'ui-state-default\\\' src=\\\''.MODELE_PATH.'media.php?file='.urlencode($arbo).'\\\'>'.addslashes($file_name).'</li>\');trackInit();return false;">'.$file_name.'</a></li>';
  36. }
  37. }
  38. echo '</ul>';
  39. }
  40. foreach($arborescence as $arbo){
  41. showArborescence($arbo); //On affiche l'arborescence
  42. }
  43. ?>
  44. </div>
  45. <div class="span4">
  46. <div class="separator"></div>
  47. <h3>Playlist</h3>
  48. <ul id="playlist">
  49. </ul>
  50. </div>
  51. <div class="span4" id="lyrics">
  52. <div class="separator"></div>
  53. <h3>Lyrics</h3>
  54. </div>
  55. </div>
  56. </div>
  57. <script type="text/javascript">
  58. window.onload=function(){
  59. //On affiche uniquement la racine
  60. $('#mediaList ul').css('display', 'none');
  61. $('#mediaList li').css('display', 'none');
  62. $('#mediaList > ul').css('display', '');
  63. //Playlist sortable cf jqueryui
  64. $('#playlist').sortable();
  65. $('#playlist').disableSelection();
  66. /*
  67. Cache ou affiche le contenu d'un dossier
  68. @params element Dossier cliqué
  69. */
  70. function toggleChild(element){
  71. if(element.children('ul').css('display') == 'none' || element.children('li').css('display') == 'none'){
  72. //On affiche le contenu
  73. element.children('.addToLibrary').children('.icon-folder-close').attr('class', 'icon-folder-open');
  74. element.children('ul').css('display', '');
  75. element.children('li').css('display', '');
  76. }
  77. else{
  78. //On cache le contenu
  79. element.children('.addToLibrary').children('.icon-folder-open').attr('class', 'icon-folder-close');
  80. element.children('ul').css('display', 'none');
  81. element.children('li').css('display', 'none');
  82. }
  83. }
  84. //On attache les évènement aux dossier
  85. $('#mediaList .addToLibrary').each(function(){
  86. $(this).click(function(){
  87. toggleChild($(this).parent('ul'));
  88. return false;
  89. });
  90. });
  91. /*
  92. Lit la chanson
  93. @params id Numéro de la chanson dans la playlist
  94. */
  95. function play(id){
  96. $('#player').attr('src', $('#playlist li:eq('+id+')').attr('src')); //On récupère le lien
  97. $('#playlist li i').remove();
  98. $('#playlist li:eq('+id+')').append('<i class="icon-music"></i>'); //On ajoute l'icon
  99. $('#player')[0].play(); //On lit
  100. //On affiche les paroles et on scrobble
  101. lyrics();
  102. scrobble();
  103. }
  104. /*
  105. Passe à la chanson suivante ou démarre la playlist autmatiquement
  106. */
  107. function playlist(){
  108. if($('#player').attr('src') == ''){ //Aucune piste en lecture
  109. if($('#playlist li:eq(0)').length){ //Playlist non vide
  110. play(0); //On commence la lexture
  111. }
  112. }
  113. else{
  114. if($('#player')[0].currentTime == $('#player')[0].duration){ //Piste fini => on passe à la suivante
  115. nextTrack();
  116. }
  117. }
  118. setTimeout(playlist, 1000);
  119. }
  120. playlist();
  121. /*
  122. Passe à la chason suivante de la playlist
  123. */
  124. function nextTrack(){
  125. for(var i=0;i<=$('#playlist li').length;i++){
  126. //On récupère la piste actuel
  127. if($('#playlist li:eq('+i+')').attr('src') == $('#player').attr('src') && $('#playlist li:eq('+i+') .icon-music').length){
  128. var curentPlay = i+1;
  129. }
  130. }
  131. if($('#playlist li:eq('+curentPlay+')').length){ //On lit la piste suivante
  132. play(curentPlay);
  133. }
  134. else if($('.icon-repeat').parent('a').hasClass('active')){ //Si repeat => on retourne au début
  135. play(0);
  136. }
  137. else{ //Sion => stop
  138. $('#player').attr('src', 'stop');
  139. $('#playlist li i').remove();
  140. }
  141. }
  142. /*
  143. Passe à la chason précédente de la playlist
  144. */
  145. function previousTrack(){
  146. //On récupère la piste actuel
  147. for(var i=0;i<=$('#playlist li').length;i++){
  148. if($('#playlist li:eq('+i+')').attr('src') == $('#player').attr('src') && $('#playlist li:eq('+i+') .icon-music').length){
  149. var curentPlay = i-1;
  150. }
  151. }
  152. play(curentPlay);
  153. }
  154. //On affecte les actions aux boutons suivants/précédents
  155. $('#player-container a:eq(0)').click(previousTrack);
  156. $('#player-container a:eq(1)').click(nextTrack);
  157. /*
  158. Ajoute le contenu d'un dossier à la playlist
  159. */
  160. function addFolderToPlaylist(){
  161. $('#mediaList ul').each(function(){ //On boucle les dossier
  162. $(this).mouseenter(function(){ //Mouse enter => bouton
  163. $(this).children('.addToLibrary').after('<i class="icon-play-circle"></i>');
  164. $('.icon-play-circle').click(function(){ //On ajoute le contenu du dossier
  165. //On déclenche le click de toutes les pistes du dossier
  166. $(this).parent('ul').children('li').children('a').each(function(){
  167. $(this).click();
  168. });
  169. //On déclenche le click de tuotes les pistes des sous-dossier
  170. var folder = $(this).parent('ul').children('ul');
  171. while(folder.length){
  172. folder.children('li').children('a').each(function(){
  173. $(this).click();
  174. });
  175. folder = folder.children('ul');
  176. }
  177. });
  178. });
  179. $(this).mouseleave(function(){ //Mouse leave => supprime bouton
  180. $(this).children('.icon-play-circle').remove();
  181. });
  182. });
  183. }
  184. addFolderToPlaylist();
  185. };
  186. /*
  187. Scrobble la musique sur lastfm si 50% s'est écoulé
  188. */
  189. function scrobble(){
  190. if($('#player').attr('src') != ''){ //Une chanson est en lecture
  191. if($('#player')[0].currentTime / $('#player')[0].duration >= 0.5){ //50% s'est écoulé => on scrobble
  192. //On récupère la musique
  193. var file = $('#player').attr('src');
  194. file = file.replace('<?php echo MODELE_PATH; ?>media.php?file=', '');
  195. //on appel le script php
  196. $.ajax({
  197. type: 'GET',
  198. url: '<?php echo ROOT_PATH_HTML; ?>index.php',
  199. data: {
  200. p : 'scrobbler',
  201. file : file,
  202. },
  203. });
  204. }
  205. else{
  206. //On relance la fonction
  207. setTimeout(scrobble, 5000);
  208. }
  209. }
  210. else{
  211. //On relance la fonction
  212. setTimeout(scrobble, 5000);
  213. }
  214. }
  215. /*
  216. Affiche les paroles de la piste en cours
  217. */
  218. function lyrics(){
  219. $('#lyrics pre').remove();
  220. //On récupère le ficier
  221. var file = $('#player').attr('src');
  222. file = file.replace('<?php echo MODELE_PATH; ?>media.php?file=', '');
  223. //on appel le script php
  224. $.ajax({
  225. type: 'GET',
  226. url: '<?php echo ROOT_PATH_HTML; ?>index.php',
  227. data: {
  228. p : 'lyrics',
  229. file : file,
  230. },
  231. success: function(data, textStatus, jqXHR){
  232. $('#lyrics pre').remove();
  233. //On récupère et on affiche les lyrics
  234. $('#lyrics').append('<pre style="display:none;">'+data+'</pre>');
  235. var lyrics = $('#lyrics lyrics').html();
  236. $('#lyrics pre').html(lyrics).css('display', '');
  237. var i=1;
  238. $('#lyrics pre br').each(function(){
  239. if(i%2 == 0){
  240. $(this).remove();
  241. }
  242. i++;
  243. });
  244. }
  245. });
  246. }
  247. /*
  248. On initialise la piste lors de l'ajout
  249. */
  250. function trackInit(){
  251. $('#playlist li').each(function(){
  252. $(this).unbind('mouseenter').unbind('mouseleave').unbind('dblclick');
  253. //Mpouse enter => bouton suppression
  254. $(this).mouseenter(function(){
  255. $(this).children(".icon-remove").remove();
  256. $(this).append('<i class="icon-remove"></i>');
  257. $(this).children(".icon-remove").click(function(){
  258. $(this).parent().remove();
  259. });
  260. });
  261. $(this).mouseleave(function(){
  262. $(this).children(".icon-remove").remove();
  263. });
  264. //Double clique => play
  265. $(this).dblclick(function(){
  266. $('#player').attr('src', $(this).attr('src'));
  267. $('#playlist li i').remove();
  268. $(this).append('<i class="icon-music"></i>');
  269. $('#player')[0].play();
  270. lyrics();
  271. scrobble();
  272. });
  273. });
  274. }
  275. /*
  276. Mélange la playlit
  277. */
  278. function random(){
  279. var random;
  280. var number = [];
  281. var playlist = [];
  282. var playlistLength = $('#playlist li').length-1;
  283. //On récupère la playlist
  284. for(var i=0;i<=playlistLength;i++){
  285. playlist[i] = {};
  286. playlist[i]['text'] = $('#playlist li:eq('+i+')').text();
  287. playlist[i]['src'] = $('#playlist li:eq('+i+')').attr('src');
  288. if($('#playlist li:eq('+i+')').attr('src') == $('#player').attr('src') && $('#playlist li:eq('+i+') .icon-music').length){
  289. playlist[i]['play'] = true;
  290. }
  291. else{playlist[i]['play'] = false;}
  292. }
  293. $('#playlist li').remove(); //On supprime la playlist
  294. //On affiche la playlist au hasard
  295. i=0;var playing;
  296. while(i<=playlistLength){
  297. random = Math.floor( Math.random() * (playlistLength - 0 + 1) ) + 0;
  298. if($.inArray(random, number) == -1){
  299. playing = (playlist[random]['play'])? '<i class="icon-music"></i>':'';
  300. $('#playlist').append("<li class='ui-state-default' src='"+playlist[random]['src']+"'>"+playlist[random]['text']+ playing +"</li>");
  301. number[number.length] = random;
  302. i++;
  303. }
  304. }
  305. trackInit();
  306. }
  307. </script>