123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392 |
- <?php
- /**
- * ownCloud - media plugin
- *
- * @author Robin Appelman
- * @copyright 2010 Robin Appelman icewind1991@gmail.com
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- *
- */
- //class for managing a music collection
- class OC_MEDIA_COLLECTION{
- public static $uid;
- private static $artistIdCache=array();
- private static $albumIdCache=array();
- private static $songIdCache=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 (?)");
- $result=$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_lastplayed`<?');
- $query->execute(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));
- }
- }
- ?>
|