2011-07-22 04:30:52 +00:00
< ? 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 ();
2011-07-31 22:07:46 +00:00
private static $queries = array ();
2011-07-22 04:30:52 +00:00
/**
* 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 {
2012-05-03 11:06:08 +00:00
$query = OCP\DB :: prepare ( " SELECT artist_id FROM *PREFIX*media_artists WHERE lower(artist_name) LIKE ? " );
2011-07-22 04:30:52 +00:00
$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 {
2012-05-03 11:06:08 +00:00
$query = OCP\DB :: prepare ( " SELECT album_id FROM *PREFIX*media_albums WHERE lower(album_name) LIKE ? AND album_artist=? " );
2011-07-22 04:30:52 +00:00
$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' ];
2012-06-24 15:58:51 +00:00
$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=? " );
2011-07-22 04:30:52 +00:00
$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 ){
2012-01-12 01:01:59 +00:00
$uid = self :: $uid ;
if ( empty ( $uid )){
$uid = self :: $uid = $_SESSION [ 'user_id' ];
}
2011-07-22 04:30:52 +00:00
if ( ! $exact and $search != '%' ){
$search = " % $search % " ;
2011-08-16 22:07:08 +00:00
} elseif ( $search == '' ){
$search = '%' ;
2011-07-22 04:30:52 +00:00
}
2012-05-03 11:06:08 +00:00
$query = OCP\DB :: prepare ( " SELECT DISTINCT artist_name, artist_id FROM *PREFIX*media_artists
2012-01-12 01:01:59 +00:00
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 ();
2011-07-22 04:30:52 +00:00
}
/**
* 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 {
2012-05-03 11:06:08 +00:00
$query = OCP\DB :: prepare ( " INSERT INTO `*PREFIX*media_artists` (`artist_name`) VALUES (?) " );
2011-07-22 04:30:52 +00:00
$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 ){
2012-01-12 01:01:59 +00:00
$uid = self :: $uid ;
if ( empty ( $uid )){
$uid = self :: $uid = $_SESSION [ 'user_id' ];
}
2012-01-11 23:54:29 +00:00
$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 = ? " ;
2011-08-16 22:07:08 +00:00
$params = array ( self :: $uid );
2011-07-22 04:30:52 +00:00
if ( $artist != 0 ){
2012-01-11 23:54:29 +00:00
$cmd .= " AND album_artist = ? " ;
2011-07-22 04:30:52 +00:00
array_push ( $params , $artist );
}
if ( $search != '%' ){
2012-01-11 23:54:29 +00:00
$cmd .= " AND album_name LIKE ? " ;
2011-07-22 04:30:52 +00:00
if ( ! $exact ){
$search = " % $search % " ;
}
array_push ( $params , $search );
}
2012-01-11 23:54:29 +00:00
$cmd .= ' ORDER BY album_name' ;
2012-05-03 11:06:08 +00:00
$query = OCP\DB :: prepare ( $cmd );
2011-07-31 18:24:27 +00:00
return $query -> execute ( $params ) -> fetchAll ();
2011-07-22 04:30:52 +00:00
}
/**
* 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 {
2012-05-03 11:06:08 +00:00
$query = OCP\DB :: prepare ( " INSERT INTO `*PREFIX*media_albums` (`album_name` ,`album_artist`) VALUES ( ?, ?) " );
2011-07-22 04:30:52 +00:00
$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 = '' ;
}
2012-05-03 11:06:08 +00:00
$query = OCP\DB :: prepare ( " SELECT * FROM *PREFIX*media_songs WHERE song_user=? $artistString $albumString $searchString ORDER BY song_track, song_name, song_path " );
2011-07-31 18:24:27 +00:00
return $query -> execute ( $params ) -> fetchAll ();
2011-07-22 04:30:52 +00:00
}
/**
* 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 ;
}
2012-05-01 16:50:31 +00:00
$uid = OCP\USER :: getUser ();
2011-07-22 04:30:52 +00:00
//check if the song is already in the database
$songId = self :: getSongId ( $name , $artist , $album );
if ( $songId != 0 ){
2011-09-24 23:34:19 +00:00
$songInfo = self :: getSong ( $songId );
self :: moveSong ( $songInfo [ 'song_path' ], $path );
2011-07-22 04:30:52 +00:00
return $songId ;
} else {
2011-07-31 22:07:46 +00:00
if ( ! isset ( self :: $queries [ 'addsong' ])){
2012-05-03 11:06:08 +00:00
$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`)
2011-07-31 22:07:46 +00:00
VALUES ( ? , ? , ? , ? , ? , ? , ? , ? , 0 , 0 ) " );
self :: $queries [ 'addsong' ] = $query ;
} else {
$query = self :: $queries [ 'addsong' ];
}
2011-07-22 04:30:52 +00:00
$query -> execute ( array ( $name , $artist , $album , $path , $uid , $length , $track , $size ));
2012-06-24 15:11:58 +00:00
$songId = OCP\DB :: insertid ( '*PREFIX*media_songs_song' );
2011-07-22 04:30:52 +00:00
// self::setLastUpdated();
return self :: getSongId ( $name , $artist , $album );
}
}
public static function getSongCount (){
2012-05-03 11:06:08 +00:00
$query = OCP\DB :: prepare ( " SELECT COUNT(song_id) AS count FROM *PREFIX*media_songs " );
2011-07-22 04:30:52 +00:00
$result = $query -> execute () -> fetchAll ();
return $result [ 0 ][ 'count' ];
}
public static function getArtistCount (){
2012-05-03 11:06:08 +00:00
$query = OCP\DB :: prepare ( " SELECT COUNT(artist_id) AS count FROM *PREFIX*media_artists " );
2011-07-22 04:30:52 +00:00
$result = $query -> execute () -> fetchAll ();
return $result [ 0 ][ 'count' ];
}
public static function getAlbumCount (){
2012-05-03 11:06:08 +00:00
$query = OCP\DB :: prepare ( " SELECT COUNT(album_id) AS count FROM *PREFIX*media_albums " );
2011-07-22 04:30:52 +00:00
$result = $query -> execute () -> fetchAll ();
return $result [ 0 ][ 'count' ];
}
public static function getArtistName ( $artistId ){
2012-05-03 11:06:08 +00:00
$query = OCP\DB :: prepare ( " SELECT artist_name FROM *PREFIX*media_artists WHERE artist_id=? " );
2011-07-22 04:30:52 +00:00
$artist = $query -> execute ( array ( $artistId )) -> fetchAll ();
if ( count ( $artist ) > 0 ){
return $artist [ 0 ][ 'artist_name' ];
} else {
return '' ;
}
}
public static function getAlbumName ( $albumId ){
2012-05-03 11:06:08 +00:00
$query = OCP\DB :: prepare ( " SELECT album_name FROM *PREFIX*media_albums WHERE album_id=? " );
2011-07-22 04:30:52 +00:00
$album = $query -> execute ( array ( $albumId )) -> fetchAll ();
if ( count ( $album ) > 0 ){
return $album [ 0 ][ 'album_name' ];
} else {
return '' ;
}
}
public static function getSong ( $id ){
2012-05-03 11:06:08 +00:00
$query = OCP\DB :: prepare ( " SELECT * FROM *PREFIX*media_songs WHERE song_id=? " );
2011-07-22 04:30:52 +00:00
$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 ){
2012-05-03 11:06:08 +00:00
$query = OCP\DB :: prepare ( " SELECT COUNT(song_id) AS count FROM *PREFIX*media_songs WHERE song_path LIKE ? " );
2011-07-22 04:30:52 +00:00
$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 ){
2012-05-03 11:06:08 +00:00
$query = OCP\DB :: prepare ( " DELETE FROM *PREFIX*media_songs WHERE song_path LIKE ? " );
2011-07-22 04:30:52 +00:00
$query -> execute ( array ( " $path % " ));
}
2011-07-28 18:59:36 +00:00
/**
* increase the play count of a song
* @ param int songId
*/
public static function registerPlay ( $songId ){
$now = time ();
2012-05-03 11:06:08 +00:00
$query = OCP\DB :: prepare ( 'UPDATE *PREFIX*media_songs SET song_playcount=song_playcount+1, song_lastplayed=? WHERE song_id=? AND song_lastplayed<?' );
2011-07-28 18:59:36 +00:00
$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 ){
2012-05-03 11:06:08 +00:00
$query = OCP\DB :: prepare ( " SELECT song_id FROM *PREFIX*media_songs WHERE song_path = ? " );
2011-09-24 23:34:19 +00:00
$result = $query -> execute ( array ( $path ));
if ( $row = $result -> fetchRow ()){
return $row [ 'song_id' ];
2011-07-28 18:59:36 +00:00
} else {
return 0 ;
}
}
2011-09-24 23:34:19 +00:00
/**
* set the path of a song
* @ param string $oldPath
* @ param string $newPath
*/
public static function moveSong ( $oldPath , $newPath ){
2012-05-03 11:06:08 +00:00
$query = OCP\DB :: prepare ( " UPDATE *PREFIX*media_songs SET song_path = ? WHERE song_path = ? " );
2011-09-24 23:34:19 +00:00
$query -> execute ( array ( $newPath , $oldPath ));
}
2011-07-22 04:30:52 +00:00
}
2012-01-06 10:01:32 +00:00
?>