. * */ //class for managing a music collection class OC_MEDIA_COLLECTION{ public static $uid; private static $artistIdCache=array(); private static $albumIdCache=array(); private static $queries=array(); /** * get the id of an artist (case-insensitive) * @param string name * @return int */ public static function getArtistId($name){ if(empty($name)){ return 0; } $name=strtolower($name); if(isset(self::$artistIdCache[$name])){ return self::$artistIdCache[$name]; }else{ $query=OCP\DB::prepare("SELECT artist_id FROM *PREFIX*media_artists WHERE lower(artist_name) LIKE ?"); $artists=$query->execute(array($name))->fetchAll(); if(is_array($artists) and isset($artists[0])){ self::$artistIdCache[$name]=$artists[0]['artist_id']; return $artists[0]['artist_id']; }else{ return 0; } } } /** * get the id of an album (case-insensitive) * @param string name * @param int artistId * @return int */ public static function getAlbumId($name,$artistId){ if(empty($name)){ return 0; } $name=strtolower($name); if(!isset(self::$albumIdCache[$artistId])){ self::$albumIdCache[$artistId]=array(); } if(isset(self::$albumIdCache[$artistId][$name])){ return self::$albumIdCache[$artistId][$name]; }else{ $query=OCP\DB::prepare("SELECT album_id FROM *PREFIX*media_albums WHERE lower(album_name) LIKE ? AND album_artist=?"); $albums=$query->execute(array($name,$artistId))->fetchAll(); if(is_array($albums) and isset($albums[0])){ self::$albumIdCache[$artistId][$name]=$albums[0]['album_id']; return $albums[0]['album_id']; }else{ return 0; } } } /** * get the id of an song (case-insensitive) * @param string name * @param int artistId * @param int albumId * @return int */ public static function getSongId($name,$artistId,$albumId){ if(empty($name)){ return 0; } $name=strtolower($name); if(!isset(self::$albumIdCache[$artistId])){ self::$albumIdCache[$artistId]=array(); } if(!isset(self::$albumIdCache[$artistId][$albumId])){ self::$albumIdCache[$artistId][$albumId]=array(); } if(isset(self::$albumIdCache[$artistId][$albumId][$name])){ return self::$albumIdCache[$artistId][$albumId][$name]; }else{ $uid=$_SESSION['user_id']; $query=OCP\DB::prepare("SELECT song_id FROM *PREFIX*media_songs WHERE song_user=? AND lower(song_name) LIKE ? AND song_artist=? AND song_album=?"); $songs=$query->execute(array($uid,$name,$artistId,$albumId))->fetchAll(); if(is_array($songs) and isset($songs[0])){ self::$albumIdCache[$artistId][$albumId][$name]=$songs[0]['song_id']; return $songs[0]['song_id']; }else{ return 0; } } } /** * Get the list of artists that (optionally) match a search string * @param string search optional * @return array the list of artists found */ static public function getArtists($search='%',$exact=false){ $uid=self::$uid; if(empty($uid)){ $uid=self::$uid=$_SESSION['user_id']; } if(!$exact and $search!='%'){ $search="%$search%"; }elseif($search==''){ $search='%'; } $query=OCP\DB::prepare("SELECT DISTINCT artist_name, artist_id FROM *PREFIX*media_artists INNER JOIN *PREFIX*media_songs ON artist_id=song_artist WHERE artist_name LIKE ? AND song_user=? ORDER BY artist_name"); $result=$query->execute(array($search,self::$uid)); return $result->fetchAll(); } /** * Add an artists to the database * @param string name * @return integer the artist_id of the added artist */ static public function addArtist($name){ $name=trim($name); if($name==''){ return 0; } //check if the artist is already in the database $artistId=self::getArtistId($name); if($artistId!=0){ return $artistId; }else{ $query=OCP\DB::prepare("INSERT INTO `*PREFIX*media_artists` (`artist_name`) VALUES (?)"); $query->execute(array($name)); return self::getArtistId($name);; } } /** * Get the list of albums that (optionally) match an artist and/or search string * @param integer artist optional * @param string search optional * @return array the list of albums found */ static public function getAlbums($artist=0,$search='%',$exact=false){ $uid=self::$uid; if(empty($uid)){ $uid=self::$uid=$_SESSION['user_id']; } $cmd="SELECT DISTINCT album_name, album_artist, album_id FROM *PREFIX*media_albums INNER JOIN *PREFIX*media_songs ON album_id=song_album WHERE song_user=? "; $params=array(self::$uid); if($artist!=0){ $cmd.="AND album_artist = ? "; array_push($params,$artist); } if($search!='%'){ $cmd.="AND album_name LIKE ? "; if(!$exact){ $search="%$search%"; } array_push($params,$search); } $cmd.=' ORDER BY album_name'; $query=OCP\DB::prepare($cmd); return $query->execute($params)->fetchAll(); } /** * Add an album to the database * @param string name * @param integer artist * @return integer the album_id of the added artist */ static public function addAlbum($name,$artist){ $name=trim($name); if($name==''){ return 0; } //check if the album is already in the database $albumId=self::getAlbumId($name,$artist); if($albumId!=0){ return $albumId; }else{ $query=OCP\DB::prepare("INSERT INTO `*PREFIX*media_albums` (`album_name` ,`album_artist`) VALUES ( ?, ?)"); $query->execute(array($name,$artist)); return self::getAlbumId($name,$artist); } } /** * Get the list of songs that (optionally) match an artist and/or album and/or search string * @param integer artist optional * @param integer album optional * @param string search optional * @return array the list of songs found */ static public function getSongs($artist=0,$album=0,$search='',$exact=false){ $uid=self::$uid; if(empty($uid)){ $uid=self::$uid=$_SESSION['user_id']; } $params=array($uid); if($artist!=0){ $artistString="AND song_artist = ?"; array_push($params,$artist); }else{ $artistString=''; } if($album!=0){ $albumString="AND song_album = ?"; array_push($params,$album); }else{ $albumString=''; } if($search){ if(!$exact){ $search="%$search%"; } $searchString ="AND song_name LIKE ?"; array_push($params,$search); }else{ $searchString=''; } $query=OCP\DB::prepare("SELECT * FROM *PREFIX*media_songs WHERE song_user=? $artistString $albumString $searchString ORDER BY song_track, song_name, song_path"); return $query->execute($params)->fetchAll(); } /** * Add an song to the database * @param string name * @param string path * @param integer artist * @param integer album * @return integer the song_id of the added artist */ static public function addSong($name,$path,$artist,$album,$length,$track,$size){ $name=trim($name); $path=trim($path); if($name=='' or $path==''){ return 0; } $uid=OCP\USER::getUser(); //check if the song is already in the database $songId=self::getSongId($name,$artist,$album); if($songId!=0){ $songInfo=self::getSong($songId); self::moveSong($songInfo['song_path'],$path); return $songId; }else{ if(!isset(self::$queries['addsong'])){ $query=OCP\DB::prepare("INSERT INTO `*PREFIX*media_songs` (`song_name` ,`song_artist` ,`song_album` ,`song_path` ,`song_user`,`song_length`,`song_track`,`song_size`,`song_playcount`,`song_lastplayed`) VALUES (?, ?, ?, ?,?,?,?,?,0,0)"); self::$queries['addsong']=$query; }else{ $query=self::$queries['addsong']; } $query->execute(array($name,$artist,$album,$path,$uid,$length,$track,$size)); $songId=OCP\DB::insertid('*PREFIX*media_songs_song'); // self::setLastUpdated(); return self::getSongId($name,$artist,$album); } } public static function getSongCount(){ $query=OCP\DB::prepare("SELECT COUNT(song_id) AS count FROM *PREFIX*media_songs"); $result=$query->execute()->fetchAll(); return $result[0]['count']; } public static function getArtistCount(){ $query=OCP\DB::prepare("SELECT COUNT(artist_id) AS count FROM *PREFIX*media_artists"); $result=$query->execute()->fetchAll(); return $result[0]['count']; } public static function getAlbumCount(){ $query=OCP\DB::prepare("SELECT COUNT(album_id) AS count FROM *PREFIX*media_albums"); $result=$query->execute()->fetchAll(); return $result[0]['count']; } public static function getArtistName($artistId){ $query=OCP\DB::prepare("SELECT artist_name FROM *PREFIX*media_artists WHERE artist_id=?"); $artist=$query->execute(array($artistId))->fetchAll(); if(count($artist)>0){ return $artist[0]['artist_name']; }else{ return ''; } } public static function getAlbumName($albumId){ $query=OCP\DB::prepare("SELECT album_name FROM *PREFIX*media_albums WHERE album_id=?"); $album=$query->execute(array($albumId))->fetchAll(); if(count($album)>0){ return $album[0]['album_name']; }else{ return ''; } } public static function getSong($id){ $query=OCP\DB::prepare("SELECT * FROM *PREFIX*media_songs WHERE song_id=?"); $song=$query->execute(array($id))->fetchAll(); if(count($song)>0){ return $song[0]; }else{ return ''; } } /** * get the number of songs in a directory * @param string $path */ public static function getSongCountByPath($path){ $query=OCP\DB::prepare("SELECT COUNT(song_id) AS count FROM *PREFIX*media_songs WHERE song_path LIKE ?"); $result=$query->execute(array("$path%"))->fetchAll(); return $result[0]['count']; } /** * remove a song from the database by path * @param string $path the path of the song * * if a path of a folder is passed, all songs stored in the folder will be removed from the database */ public static function deleteSongByPath($path){ $query=OCP\DB::prepare("DELETE FROM *PREFIX*media_songs WHERE song_path LIKE ?"); $query->execute(array("$path%")); } /** * increase the play count of a song * @param int songId */ public static function registerPlay($songId){ $now=time(); $query=OCP\DB::prepare('UPDATE *PREFIX*media_songs SET song_playcount=song_playcount+1, song_lastplayed=? WHERE song_id=? AND song_lastplayedexecute(array($now,$songId,$now-60)); } /** * get the id of the song by path * @param string $path * @return int */ public static function getSongByPath($path){ $query=OCP\DB::prepare("SELECT song_id FROM *PREFIX*media_songs WHERE song_path = ?"); $result=$query->execute(array($path)); if($row=$result->fetchRow()){ return $row['song_id']; }else{ return 0; } } /** * set the path of a song * @param string $oldPath * @param string $newPath */ public static function moveSong($oldPath,$newPath){ $query=OCP\DB::prepare("UPDATE *PREFIX*media_songs SET song_path = ? WHERE song_path = ?"); $query->execute(array($newPath,$oldPath)); } }