PageRenderTime 50ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/rest/api.php

https://github.com/cyprieng/MediaStreamer
PHP | 206 lines | 158 code | 41 blank | 7 comment | 34 complexity | 769e231dfc3026f253fe9bb1793bfb4f MD5 | raw file
  1. <?php
  2. header ("Content-Type:text/xml");
  3. require_once('../global/init.php');
  4. require_once(ROOT_PATH.MODELE_PATH.'login.php');
  5. require_once(ROOT_PATH.MODELE_PATH.'settings.php');
  6. require_once(ROOT_PATH.MODELE_PATH.'home.php');
  7. require_once(ROOT_PATH.MODELE_PATH.'podcast.php');
  8. require_once(ROOT_PATH.MODELE_PATH.'scrobbler.php');
  9. require_once(ROOT_PATH.MODELE_PATH.'getid3/getid3.php');
  10. //On vérifit si tout les paramètres sont transmis
  11. $missing_parameter = '<?xml version="1.0" encoding="UTF-8"?><subsonic-response xmlns="http://subsonic.org/restapi" status="failed" version="1.1.0"><error code="10" message="Required parameter is missing"/></subsonic-response>';
  12. if(empty($_GET['u']) || empty($_GET['p']) || empty($_GET['v']) || empty($_GET['c'])){exit($missing_parameter);}
  13. //Si le pass est en hexa, on le décode
  14. function hextostr($hex){
  15. $str='';
  16. for ($i=0; $i < strlen($hex)-1; $i+=2){
  17. $str .= chr(hexdec($hex[$i].$hex[$i+1]));
  18. }
  19. return $str;
  20. }
  21. if(preg_match('#^enc:#', $_GET['p'])){
  22. $passToStr = hextostr($_GET['p']);
  23. $pass = '';
  24. for($i = 0;$i <= strlen($passToStr)-1;$i++){
  25. if(preg_match('/^[a-z0-9_-]{1}$/', $passToStr[$i])){
  26. $pass .= $passToStr[$i];
  27. }
  28. }
  29. }
  30. else{$pass = $_GET['p'];}
  31. //On test le login
  32. $login = testLogin($_GET['u'], sha1($_GET['u'].$pass));
  33. if(!$login){exit('<?xml version="1.0" encoding="UTF-8"?><subsonic-response xmlns="http://subsonic.org/restapi" status="failed" version="1.1.0"><error code="40" message="Wrong username or password"/></subsonic-response>');}
  34. //On récupère les infos sur l'user
  35. $user = getUserArray();
  36. foreach($user as $key => $us){
  37. if($us['name'] == $_GET['u']){$user = $user[$key];break;}
  38. }
  39. $api = $_GET['api'];
  40. switch($api){ //cf Subsonic API
  41. case 'ping':
  42. echo '<?xml version="1.0" encoding="UTF-8"?><subsonic-response xmlns="http://subsonic.org/restapi" status="ok" version="1.1.1"></subsonic-response>';
  43. break;
  44. case 'getLicense':
  45. echo '<subsonic-response xmlns="http://subsonic.org/restapi" status="ok" version="1.8.0">
  46. <license valid="true" email="demo@subsonic.org" key="27608bf44d8dceed3a90c1b608dc4bea" date="2009-02-26T12:24:19" />
  47. </subsonic-response>';
  48. break;
  49. case 'getMusicFolders':
  50. echo '<?xml version="1.0" encoding="UTF-8"?><subsonic-response xmlns="http://subsonic.org/restapi" status="ok" version="1.1.1"><musicFolders><musicFolder id="1" name="Music"/></musicFolders></subsonic-response>';
  51. break;
  52. case 'getIndexes':
  53. $music_library = getArborescence($user['music_folder'], explode(', ', MUSIC_EXTENSION));
  54. unset($music_library[0]); //On supprime le nom du dossier racine
  55. $library_xml = '<artist name="Podcast" id="0" />'; $i=1;
  56. foreach($music_library as $arbo){ //On ajoute tous les dossiers
  57. $library_xml .= '<artist name="'.substr(strrchr($arbo[0],'/'),1).'" id="'.$i.'" />';
  58. $i++;
  59. }
  60. echo '<?xml version="1.0" encoding="UTF-8"?><subsonic-response xmlns="http://subsonic.org/restapi" status="ok" version="1.1.1"><indexes lastModified="'.time().'">'.$library_xml.'</indexes></subsonic-response>';
  61. break;
  62. case 'getMusicDirectory':
  63. if(empty($_GET['id']) && $_GET['id'] != 0){exit($missing_parameter);}
  64. $library = getArborescence($user['music_folder'], explode(', ', MUSIC_EXTENSION));
  65. if(preg_match('#^0#', $_GET['id'])){ //Podcast
  66. $podcast_library = getPodcast(explode(',', $user['podcast']));
  67. $library_xml = '';$i=0;
  68. if($_GET['id'] == '0'){ //Racine podcast
  69. $name = 'Podcast';
  70. foreach($podcast_library as $podcast){ //On boucle les podcasts
  71. $library_xml .= '<child id="'.$_GET['id'].'c'.$i.'" parent="'.$_GET['id'].'" title="'.substr(strrchr($podcast[0],'/'),1).'" isDir="true" />';
  72. $i++;
  73. }
  74. }
  75. else{
  76. $id = explode('c', $_GET['id']);
  77. $id = $id[1];
  78. $podcast_library = $podcast_library[$id]; //On récupère le podcast voulu
  79. $name = substr(strrchr($podcast_library[0],'/'),1);
  80. unset($podcast_library[0]); //On supprime le nom
  81. foreach($podcast_library as $podcast){ //On parcours les item
  82. $library_xml .= '<child id="'.$_GET['id'].'c'.$i.'" parent="'.$_GET['id'].'" title="'.preg_replace('#"#', "''", Trim($podcast[1])).'" isDir="false" album="'.$name.'" artist="'.$name.'" track="'.$i.'" type="podcast"/>';
  83. $i++;
  84. }
  85. }
  86. echo '<?xml version="1.0" encoding="UTF-8"?><subsonic-response xmlns="http://subsonic.org/restapi" status="ok" version="1.4.0"><directory id="'.$_GET['id'].'" name="'.$name.'">'.$library_xml.'</directory></subsonic-response>';
  87. exit('');
  88. }
  89. else if(!isset($library[$_GET['id']])){ //Musique sous-dossier
  90. $id = explode('c', $_GET['id']);
  91. $music_library = $library;
  92. for($i=1;$i<=count($id);$i++){ //On parcour les dossier définit dans $id
  93. $music_library = $music_library[$id[$i-1]];
  94. }
  95. }
  96. else{ //Musique dans racine
  97. $music_library = $library[$_GET['id']];
  98. }
  99. $artistName = substr(strrchr($music_library[0],'/'),1);
  100. unset($music_library[0]); //On supprime le nom de l'artiste
  101. $library_xml = '';$i=1;
  102. foreach($music_library as $arbo){ //On parcours le dossier
  103. if(is_array($arbo) && is_dir($arbo[0])){ //Dossier
  104. $library_xml .= '<child id="'.$_GET['id'].'c'.$i.'" parent="'.$_GET['id'].'" title="'.substr(strrchr($arbo[0],'/'),1).'" artist="'.$artistName.'" isDir="true" />';
  105. }
  106. else{ //Fichier
  107. //On récupère les tag de la musique
  108. $getID3 = new getID3;
  109. $tag = $getID3->analyze($arbo);
  110. $tag['bitrate'] = floor($tag['bitrate'] / 1000);
  111. $tag['tags_html']['id3v1']['album'][0] = ($tag['tags_html']['id3v1']['album'][0] != '') ? $tag['tags_html']['id3v1']['album'][0] : 'unknow';
  112. $tag['tags_html']['id3v1']['artist'][0] = ($tag['tags_html']['id3v1']['artist'][0] != '') ? $tag['tags_html']['id3v1']['artist'][0] : 'unknow';
  113. $tag['tags_html']['id3v1']['year'][0] = ($tag['tags_html']['id3v1']['year'][0] != '') ? $tag['tags_html']['id3v1']['year'][0] : '1970';
  114. $tag['tags_html']['id3v1']['genre'][0] = ($tag['tags_html']['id3v1']['genre'][0] != '') ? $tag['tags_html']['id3v1']['genre'][0] : 'unknow';
  115. $library_xml .= '<child id="'.$_GET['id'].'c'.$i.'" parent="'.$_GET['id'].'" title="'.substr(strrchr($arbo,'/'),1).'" isDir="false" album="'.$tag['tags_html']['id3v1']['album'][0].'" artist="'.$tag['tags_html']['id3v1']['artist'][0].'" track="'.$i.'" year="'.$tag['tags_html']['id3v1']['year'][0].'" genre="'.$tag['tags_html']['id3v1']['genre'][0].'" size="'.$tag['filesize'].'" contentType="'.$tag['mime_type'].'" suffix="'.$tag['fileformat'].'" duration="'.floor($tag['playtime_seconds']).'" bitRate="'.$tag['bitrate'].'" path="'.$arbo.'"/>';
  116. }
  117. $i++;
  118. }
  119. echo preg_replace('#&#', '&amp;', '<?xml version="1.0" encoding="UTF-8"?><subsonic-response xmlns="http://subsonic.org/restapi" status="ok" version="1.4.0"><directory id="'.$_GET['id'].'" name="'.$artistName.'">'.$library_xml.'</directory></subsonic-response>');
  120. break;
  121. case 'stream':
  122. if(empty($_GET['id'])){exit($missing_parameter);} //On vérifit les paramètres
  123. $library = getArborescence($user['music_folder'], explode(', ', MUSIC_EXTENSION));
  124. if(preg_match('#^0#', $_GET['id'])){ //Podcast
  125. //On récupère le podcast
  126. $podcast_library = getPodcast(explode(',', $user['podcast']));
  127. $id = explode('c', $_GET['id']);
  128. $music_library = $podcast_library[$id[1]][$id[2]+1][0][0];
  129. }
  130. else if(!isset($library[$_GET['id']])){ //Musique dans sous dossier
  131. $id = explode('c', $_GET['id']);
  132. $music_library = $library;
  133. for($i=1;$i<=count($id);$i++){ //On parcour les dossier définit dans $id
  134. $music_library = $music_library[$id[$i-1]];
  135. }
  136. }
  137. else{ //Musique dans dossier racine
  138. $music_library = $library[$_GET['id']];
  139. }
  140. //On définit les variables pour media.php
  141. $_GET['file'] = $music_library;
  142. $_GET['p'] = sha1($_GET['u'].$pass);
  143. scrobble($music_library, $user['lastfm_session']); //On scrobble
  144. require(ROOT_PATH.MODELE_PATH.'media.php');
  145. break;
  146. case 'scrobble':
  147. if(empty($_GET['id'])){exit($missing_parameter);}
  148. $library = getArborescence($user['music_folder'], explode(', ', MUSIC_EXTENSION));
  149. if(!isset($library[$_GET['id']])){ //Musique dns sous-dossier
  150. $id = explode('c', $_GET['id']);
  151. $music_library = $library;
  152. for($i=1;$i<=count($id);$i++){ //On parcour les dossier définit dans $id
  153. $music_library = $music_library[$id[$i-1]];
  154. }
  155. }
  156. else{ //Musique dans dossier racine
  157. $music_library = $library[$_GET['id']];
  158. }
  159. scrobble($music_library, $user['lastfm_session']); //On scrobble
  160. echo '<?xml version="1.0" encoding="UTF-8"?><subsonic-response xmlns="http://subsonic.org/restapi" status="ok" version="1.8.0"></subsonic-response>';
  161. break;
  162. default:
  163. echo '<?xml version="1.0" encoding="UTF-8"?><subsonic-response xmlns="http://subsonic.org/restapi" status="failed" version="1.1.0"><error code="70" message="The requested data was not found"/></subsonic-response>';
  164. }
  165. ?>