. * */ //implementation of ampache's xml api class OC_MEDIA_AMPACHE{ /** * fix the string to be XML compatible * @param string name * @return string */ /* this is an ugly hack(tm), this should be: */ /* htmlentities($name, ENT_XML1, 'UTF-8'); */ /* with PHP 5.4 and later */ public static function fixXmlString($name){ $result=str_replace("&", "&", $name); $result=str_replace("'", "'", $result); $result=str_replace("<", "<", $result); $result=str_replace(">", ">", $result); $result=str_replace("\"", """, $result); $result=str_replace("Ä", "Ä", $result); $result=str_replace("Ö", "Ö", $result); $result=str_replace("Ü", "Ü", $result); $result=str_replace("ä", "ä", $result); $result=str_replace("ö", "ö", $result); $result=str_replace("ü", "ü", $result); $result=str_replace("ß", "ß", $result); return $result; } /** * do the initial handshake * @param array params */ public static function handshake($params){ $auth=(isset($params['auth']))?$params['auth']:false; $user=(isset($params['user']))?$params['user']:false; $time=(isset($params['timestamp']))?$params['timestamp']:false; $now=time(); if($now-$time>(10*60)){ echo(''); echo(" timestamp is more then 10 minutes old "); } if($auth and $user and $time){ $query=OCP\DB::prepare("SELECT user_id, user_password_sha256 from *PREFIX*media_users WHERE user_id=?"); $users=$query->execute(array($user))->fetchAll(); if(count($users)>0){ $pass=$users[0]['user_password_sha256']; $key=hash('sha256',$time.$pass); if($key==$auth){ $token=hash('sha256','oc_media_'.$key); OC_MEDIA_COLLECTION::$uid=$users[0]['user_id']; $date=date('c');//todo proper update/add/clean dates $songs=OC_MEDIA_COLLECTION::getSongCount(); $artists=OC_MEDIA_COLLECTION::getArtistCount(); $albums=OC_MEDIA_COLLECTION::getAlbumCount(); $query=OCP\DB::prepare("INSERT INTO *PREFIX*media_sessions (`token`, `user_id`, `start`) VALUES (?, ?, now());"); $query->execute(array($token,$user)); $expire=date('c',time()+600); echo(''); echo(" $token 350001 $date $date $date $songs $artists $albums\ 600 $expire 0 0 "); return; } } echo(''); echo(" Invalid login "); }else{ echo(''); echo(" Missing arguments "); } } public static function ping($params){ if(isset($params['auth'])){ if(self::checkAuth($params['auth'])){ self::updateAuth($params['auth']); }else{ echo(''); echo(" Invalid login "); return; } } echo(''); echo(''); echo('350001'); echo(''); } public static function checkAuth($auth){ if(is_array($auth)){ if(isset($auth['auth'])){ $auth=$auth['auth']; }else{ return false; } } $CONFIG_DBTYPE = OCP\Config::getSystemValue( "dbtype", "sqlite" ); if($CONFIG_DBTYPE == 'psql'){ $interval = ' \'600s\'::interval '; }else { $interval = '600'; } //remove old sessions $query=OCP\DB::prepare("DELETE from *PREFIX*media_sessions WHERE start<(NOW() - ".$interval.")"); $query->execute(); $query=OCP\DB::prepare("SELECT user_id from *PREFIX*media_sessions WHERE token=?"); $users=$query->execute(array($auth))->fetchAll(); if(count($users)>0){ OC_MEDIA_COLLECTION::$uid=$users[0]['user_id']; return $users[0]['user_id']; }else{ return false; } } public static function updateAuth($auth){ $query=OCP\DB::prepare("UPDATE *PREFIX*media_sessions SET start=CURRENT_TIMESTAMP WHERE token=?"); $query->execute(array($auth)); } private static function printArtist($artist){ $albums=count(OC_MEDIA_COLLECTION::getAlbums($artist['artist_id'])); $songs=count(OC_MEDIA_COLLECTION::getSongs($artist['artist_id'])); $id=$artist['artist_id']; $name=self::fixXmlString($artist['artist_name']); echo("\t\n"); echo("\t\t$name\n"); echo("\t\t$albums\n"); echo("\t\t$songs\n"); echo("\t\t0\n"); echo("\t\t0\n"); echo("\t\n"); } private static function printAlbum($album,$artistName=false){ if(!$artistName){ $artistName=OC_MEDIA_COLLECTION::getArtistName($album['album_artist']); } $artistName=self::fixXmlString($artistName); $songs=count(OC_MEDIA_COLLECTION::getSongs($album['album_artist'],$album['album_id'])); $id=$album['album_id']; $name=self::fixXmlString($album['album_name']); $artist=$album['album_artist']; echo("\t\n"); echo("\t\t$name\n"); echo("\t\t$artistName\n"); echo("\t\t$songs\n"); echo("\t\t0\n"); echo("\t\t0\n"); /* make Viridian happy */ echo("\t\t1\n"); /* make Viridian happy */ echo("\t\t \n"); /* single space to make quickplay happy enough */ echo("\t\t0\n"); echo("\t\n"); } private static function printSong($song,$artistName=false,$albumName=false){ if(!$artistName){ $artistName=OC_MEDIA_COLLECTION::getArtistName($song['song_artist']); } if(!$albumName){ $albumName=OC_MEDIA_COLLECTION::getAlbumName($song['song_album']); } $artistName=self::fixXmlString($artistName); $albumName=self::fixXmlString($albumName); $id=$song['song_id']; $name=self::fixXmlString($song['song_name']); $artist=$song['song_artist']; $album=$song['song_album']; echo("\t\n"); echo("\t\t$name\n"); echo("\t\t$artistName\n"); echo("\t\t$albumName\n"); $url=OCP\Util::linkToRemote('ampache')."server/xml.server.php/?action=play&song=$id&auth={$_GET['auth']}"; $url=self::fixXmlString($url); echo("\t\t$url\n"); echo("\t\t\n"); echo("\t\t{$song['song_track']}\n"); echo("\t\t{$song['song_size']}\n"); echo("\t\t \n"); /* single space to make Viridian happy enough */ echo("\t\t0\n"); echo("\t\t0\n"); echo("\t\n"); } public static function artists($params){ if(!self::checkAuth($params)){ echo(''); echo(" Invalid login "); return; } $filter=isset($params['filter'])?$params['filter']:''; $exact=isset($params['exact'])?($params['exact']=='true'):false; $artists=OC_MEDIA_COLLECTION::getArtists($filter,$exact); echo(''); echo(''); foreach($artists as $artist){ self::printArtist($artist); } echo(''); } public static function artist_songs($params){ if(!self::checkAuth($params)){ echo(''); echo(" Invalid login "); return; } $filter=isset($params['filter'])?$params['filter']:''; $songs=OC_MEDIA_COLLECTION::getSongs($filter); $artist=OC_MEDIA_COLLECTION::getArtistName($filter); echo(''); echo(''); foreach($songs as $song){ self::printSong($song,$artist); } echo(''); } public static function artist_albums($params){ if(!self::checkAuth($params)){ echo(''); echo(" Invalid login "); return; } $filter=$params['filter']; $albums=OC_MEDIA_COLLECTION::getAlbums($filter); $artist=OC_MEDIA_COLLECTION::getArtistName($filter); echo(''); echo(''); foreach($albums as $album){ self::printAlbum($album,$artist); } echo(''); } public static function albums($params){ if(!self::checkAuth($params)){ echo(''); echo(" Invalid login "); return; } $filter=isset($params['filter'])?$params['filter']:''; $exact=isset($params['exact'])?($params['exact']=='true'):false; $albums=OC_MEDIA_COLLECTION::getAlbums(0,$filter,$exact); echo(''); echo(''); foreach($albums as $album){ self::printAlbum($album,false); } echo(''); } public static function album_songs($params){ if(!self::checkAuth($params)){ echo(''); echo(" Invalid login "); return; } $songs=OC_MEDIA_COLLECTION::getSongs(0,$params['filter']); if(count($songs)>0){ $artist=OC_MEDIA_COLLECTION::getArtistName($songs[0]['song_artist']); } echo(''); echo(''); foreach($songs as $song){ self::printSong($song,$artist); } echo(''); } public static function songs($params){ if(!self::checkAuth($params)){ echo(''); echo(" Invalid login "); return; } $filter=isset($params['filter'])?$params['filter']:''; $exact=isset($params['exact'])?($params['exact']=='true'):false; $songs=OC_MEDIA_COLLECTION::getSongs(0,0,$filter,$exact); echo(''); echo(''); foreach($songs as $song){ self::printSong($song); } echo(''); } public static function song($params){ if(!self::checkAuth($params)){ echo(''); echo(" Invalid login "); return; } if($song=OC_MEDIA_COLLECTION::getSong($params['filter'])){ echo(''); echo(''); self::printSong($song); echo(''); } } public static function play($params){ $username=!self::checkAuth($params); if($username){ echo(''); echo(" Invalid login "); return; } if($song=OC_MEDIA_COLLECTION::getSong($params['song'])){ OC_Util::setupFS($song["song_user"]); header('Content-type: '.OC_Filesystem::getMimeType($song['song_path'])); header('Content-Length: '.$song['song_size']); OC_Filesystem::readfile($song['song_path']); } } public static function url_to_song($params){ if(!self::checkAuth($params)){ echo(''); echo(" Invalid login "); return; } $url=$params['url']; $songId=substr($url,strrpos($url,'song=')+5); if($song=OC_MEDIA_COLLECTION::getSong($songId)){ echo(''); echo(''); self::printSong($song); echo(''); } } public static function search_songs($params){ if(!self::checkAuth($params)){ echo(''); echo(" Invalid login "); return; } $filter=$params['filter']; $artists=OC_MEDIA_COLLECTION::getArtists($filter); $albums=OC_MEDIA_COLLECTION::getAlbums(0,$filter); $songs=OC_MEDIA_COLLECTION::getSongs(0,0,$filter); foreach($artists as $artist){ $songs=array_merge($songs,OC_MEDIA_COLLECTION::getSongs($artist['artist_id'])); } foreach($albums as $album){ $songs=array_merge($songs,OC_MEDIA_COLLECTION::getSongs($album['album_artist'],$album['album_id'])); } echo(''); echo(''); foreach($songs as $song){ self::printSong($song); } echo(''); } }