From f593f18131d6a0cbf30b558b208e86b9fc957f13 Mon Sep 17 00:00:00 2001 From: Karl 'vollmerk' Vollmer Date: Mon, 27 Oct 2008 09:24:34 +0000 Subject: Commit, still no internet paying for it.. curse you free.fr --- lib/class/browse.class.php | 7 + lib/class/catalog.class.php | 1510 ++++++++++++++++---------------- lib/class/database_object.abstract.php | 43 +- lib/class/playlist.class.php | 2 +- lib/class/radio.class.php | 25 +- lib/class/song.class.php | 24 +- lib/class/stats.class.php | 11 +- lib/class/tag.class.php | 308 ++++--- lib/class/update.class.php | 22 + lib/class/vainfo.class.php | 4 +- 10 files changed, 1017 insertions(+), 939 deletions(-) (limited to 'lib/class') diff --git a/lib/class/browse.class.php b/lib/class/browse.class.php index f245d7fa..4f6b6bcc 100644 --- a/lib/class/browse.class.php +++ b/lib/class/browse.class.php @@ -997,6 +997,7 @@ class Browse { show_box_bottom(); break; case 'playlist': + Playlist::build_cache($object_ids); show_box_top(_('Playlists') . $match, $class); require_once Config::get('prefix') . '/templates/show_playlists.inc.php'; show_box_bottom(); @@ -1026,6 +1027,12 @@ class Browse { require_once Config::get('prefix') . '/templates/show_flagged.inc.php'; show_box_bottom(); break; + case 'tag': + Tag::build_cache($tags); + show_box_top(_('Tag Cloud'),$class); + require_once Config::get('prefix') . '/templates/show_tagcloud.inc.php'; + show_box_bottom(); + break; default: // Rien a faire break; diff --git a/lib/class/catalog.class.php b/lib/class/catalog.class.php index a6b5136a..ec679b43 100644 --- a/lib/class/catalog.class.php +++ b/lib/class/catalog.class.php @@ -1,21 +1,21 @@ id = intval($catalog_id); @@ -62,9 +62,9 @@ class Catalog { /* Get the information from the db */ $info = $this->_get_info(); - foreach ($info as $key=>$value) { - $this->$key = $value; - } + foreach ($info as $key=>$value) { + $this->$key = $value; + } } //constructor @@ -89,32 +89,32 @@ class Catalog { * This poplates an array (filecache) on this object from the database * it is used to speed up the add process */ - private function _create_filecache() { + private function _create_filecache() { - if (count($this->_filecache) == 0) { - $catalog_id = Dba::escape($this->id); - // Get _EVERYTHING_ - $sql = "SELECT `id`,`file` FROM `song` WHERE `catalog`='$catalog_id'"; - $db_results = Dba::query($sql); + if (count($this->_filecache) == 0) { + $catalog_id = Dba::escape($this->id); + // Get _EVERYTHING_ + $sql = "SELECT `id`,`file` FROM `song` WHERE `catalog`='$catalog_id'"; + $db_results = Dba::query($sql); // Populate the filecache - while ($results = Dba::fetch_assoc($db_results)) { - $this->_filecache[strtolower($results['file'])] = $results['id']; - } + while ($results = Dba::fetch_assoc($db_results)) { + $this->_filecache[strtolower($results['file'])] = $results['id']; + } } // end if empty filecache - - } // _create_filecache + + } // _create_filecache /** * format * This makes the object human readable */ - public function format() { + public function format() { - $this->f_name = truncate_with_ellipsis($this->name,Config::get('ellipse_threshold_title')); - $this->f_name_link = '' . scrub_out($this->f_name) . ''; - $this->f_path = truncate_with_ellipsis($this->path,Config::get('ellipse_threshold_title')); - $this->f_update = $this->last_update ? date('d/m/Y h:i',$this->last_update) : _('Never'); + $this->f_name = truncate_with_ellipsis($this->name,Config::get('ellipse_threshold_title')); + $this->f_name_link = '' . scrub_out($this->f_name) . ''; + $this->f_path = truncate_with_ellipsis($this->path,Config::get('ellipse_threshold_title')); + $this->f_update = $this->last_update ? date('d/m/Y h:i',$this->last_update) : _('Never'); $this->f_add = $this->last_add ? date('d/m/Y h:i',$this->last_add) : _('Never'); } // format @@ -129,7 +129,7 @@ class Catalog { $sql = "SELECT `id` FROM `catalog` ORDER BY `name`"; $db_results = Dba::query($sql); - $results = array(); + $results = array(); while ($row = Dba::fetch_assoc($db_results)) { $results[] = $row['id']; @@ -143,12 +143,12 @@ class Catalog { * get_catalog_ids * This returns an array of all catalog ids */ - public static function get_catalog_ids() { + public static function get_catalog_ids() { $sql = "SELECT `id` FROM `catalog`"; $db_results = Dba::query($sql); - while ($r = Dba::fetch_assoc($db_results)) { + while ($r = Dba::fetch_assoc($db_results)) { $results[] = $r['id']; } @@ -164,34 +164,34 @@ class Catalog { */ public static function get_stats($catalog_id=0) { - $results = self::count_songs($catalog_id); - $results = array_merge(self::count_users($catalog_id),$results); + $results = self::count_songs($catalog_id); + $results = array_merge(self::count_users($catalog_id),$results); + + $hours = floor($results['time']/3600); + $size = $results['size']/1048576; + $days = floor($hours/24); + $hours = $hours%24; - $hours = floor($results['time']/3600); - $size = $results['size']/1048576; - $days = floor($hours/24); - $hours = $hours%24; - $time_text = "$days "; - $time_text .= ngettext('day','days',$days); - $time_text .= ", $hours "; - $time_text .= ngettext('hour','hours',$hours); + $time_text .= ngettext('day','days',$days); + $time_text .= ", $hours "; + $time_text .= ngettext('hour','hours',$hours); - $results['time_text'] = $time_text; + $results['time_text'] = $time_text; - if ($size > 1024) { - $total_size = sprintf("%.2f",($size/1024)); - $size_unit = "GB"; - } - else { - $total_size = sprintf("%.2f",$size); - $size_unit = "MB"; - } + if ($size > 1024) { + $total_size = sprintf("%.2f",($size/1024)); + $size_unit = "GB"; + } + else { + $total_size = sprintf("%.2f",$size); + $size_unit = "MB"; + } - $results['total_size'] = $total_size; - $results['size_unit'] = $size_unit; + $results['total_size'] = $total_size; + $results['size_unit'] = $size_unit; - return $results; + return $results; } // get_stats @@ -199,16 +199,16 @@ class Catalog { * clear_stats * This clears all stats for _everything_ */ - public static function clear_stats() { + public static function clear_stats() { /* Whip out everything */ - $sql = "TRUNCATE `object_count`"; - $db_results = Dba::query($sql); + $sql = "TRUNCATE `object_count`"; + $db_results = Dba::query($sql); - $sql = "UDPATE `song` SET `player`='0'"; - $db_results = Dba::query($sql); + $sql = "UDPATE `song` SET `played`='0'"; + $db_results = Dba::query($sql); - return true; + return true; } // clear_stats @@ -218,89 +218,89 @@ class Catalog { * it checks to make sure this path is not already used before creating * the catalog */ - public static function create($data) { + public static function create($data) { // Clean up the path just incase - $data['path'] = rtrim(rtrim(trim($data['path']),'/'),'\\'); + $data['path'] = rtrim(rtrim(trim($data['path']),'/'),'\\'); - $path = Dba::escape($data['path']); + $path = Dba::escape($data['path']); // Make sure the path is readable/exists - if (!is_readable($data['path']) AND $data['type'] == 'local') { - Error::add('general','Error: ' . scrub_out($data['path']) . ' is not readable or does not exist'); - return false; - } + if (!is_readable($data['path']) AND $data['type'] == 'local') { + Error::add('general','Error: ' . scrub_out($data['path']) . ' is not readable or does not exist'); + return false; + } // Make sure this path isn't already in use by an existing catalog - $sql = "SELECT `id` FROM `catalog` WHERE `path`='$path'"; - $db_results = Dba::query($sql); + $sql = "SELECT `id` FROM `catalog` WHERE `path`='$path'"; + $db_results = Dba::query($sql); - if (Dba::num_rows($db_results)) { - Error::add('general','Error: Catalog with ' . $path . ' already exists'); - return false; - } + if (Dba::num_rows($db_results)) { + Error::add('general','Error: Catalog with ' . $path . ' already exists'); + return false; + } - $name = Dba::escape($data['name']); - $catalog_type = Dba::escape($data['type']); - $rename_pattern = Dba::escape($data['rename_pattern']); - $sort_pattern = Dba::escape($data['sort_pattern']); - $gather_types = ' '; //FIXME - $key = Dba::escape($data['key']); + $name = Dba::escape($data['name']); + $catalog_type = Dba::escape($data['type']); + $rename_pattern = Dba::escape($data['rename_pattern']); + $sort_pattern = Dba::escape($data['sort_pattern']); + $gather_types = ' '; //FIXME + $key = Dba::escape($data['key']); - if (!$key) { $key = ' '; } //FIXME + if (!$key) { $key = ' '; } //FIXME // Ok we're good to go ahead and insert this record - $sql = "INSERT INTO `catalog` (`name`,`path`,`add_path`,`catalog_type`,`rename_pattern`,`sort_pattern`,`gather_types`,`key`) " . + $sql = "INSERT INTO `catalog` (`name`,`path`,`add_path`,`catalog_type`,`rename_pattern`,`sort_pattern`,`gather_types`,`key`) " . "VALUES ('$name','$path','','$catalog_type','$rename_pattern','$sort_pattern','$gather_types','$key')"; - $db_results = Dba::query($sql); + $db_results = Dba::query($sql); - $insert_id = Dba::insert_id(); + $insert_id = Dba::insert_id(); - if (!$insert_id) { - Error::add('general','Catalog Insert Failed check debug logs'); - debug_event('catalog','SQL Failed:' . $sql,'3'); - return false; - } + if (!$insert_id) { + Error::add('general','Catalog Insert Failed check debug logs'); + debug_event('catalog','SQL Failed:' . $sql,'3'); + return false; + } - return $insert_id; + return $insert_id; } // create /** * run_add - * This runs the add to catalog function - * it includes the javascript refresh stuff and then starts rolling + * This runs the add to catalog function + * it includes the javascript refresh stuff and then starts rolling * throught the path for this catalog */ - public function run_add($options) { + public function run_add($options) { if ($this->catalog_type == 'remote') { - show_box_top(_('Running Remote Sync') . '. . .'); - $this->get_remote_catalog($type=0); - show_box_bottom(); - return true; - } + show_box_top(_('Running Remote Sync') . '. . .'); + $this->get_remote_catalog($type=0); + show_box_bottom(); + return true; + } // Catalog Add start - $start_time = time(); + $start_time = time(); - require Config::get('prefix') . '/templates/show_adds_catalog.inc.php'; - flush(); + require Config::get('prefix') . '/templates/show_adds_catalog.inc.php'; + flush(); // Prevent the script from timing out and flush what we've got set_time_limit(0); - $this->add_files($this->path,$options); + $this->add_files($this->path,$options); // If they have checked the box then go ahead and gather the art if ($options['gather_art']) { - $catalog_id = $this->id; - require Config::get('prefix') . '/templates/show_gather_art.inc.php'; - flush(); - $this->get_album_art('',1); - } + $catalog_id = $this->id; + require Config::get('prefix') . '/templates/show_gather_art.inc.php'; + flush(); + $this->get_album_art('',1); + } - return true; + return true; } // run_add @@ -309,88 +309,65 @@ class Catalog { * This returns the current # of songs, albums, artists, genres * in this catalog */ - public static function count_songs($catalog_id='') { + public static function count_songs($catalog_id='') { - if ($catalog_id) { $catalog_search = "WHERE `catalog`='" . Dba::escape($catalog_id) . "'"; } + if ($catalog_id) { $catalog_search = "WHERE `catalog`='" . Dba::escape($catalog_id) . "'"; } - $sql = "SELECT COUNT(`id`),SUM(`time`),SUM(`size`) FROM `song` $catalog_search"; - $db_results = Dba::query($sql); - $data = Dba::fetch_row($db_results); - $songs = $data['0']; - $time = $data['1']; - $size = $data['2']; + $sql = "SELECT COUNT(`id`),SUM(`time`),SUM(`size`) FROM `song` $catalog_search"; + $db_results = Dba::query($sql); + $data = Dba::fetch_row($db_results); + $songs = $data['0']; + $time = $data['1']; + $size = $data['2']; - $sql = "SELECT COUNT(DISTINCT(`album`)) FROM `song` $catalog_search"; - $db_results = Dba::query($sql); - $data = Dba::fetch_row($db_results); - $albums = $data['0']; + $sql = "SELECT COUNT(DISTINCT(`album`)) FROM `song` $catalog_search"; + $db_results = Dba::query($sql); + $data = Dba::fetch_row($db_results); + $albums = $data['0']; - $sql = "SELECT COUNT(DISTINCT(`artist`)) FROM `song` $catalog_search"; - $db_results = Dba::query($sql); - $data = Dba::fetch_row($db_results); - $artists = $data['0']; + $sql = "SELECT COUNT(DISTINCT(`artist`)) FROM `song` $catalog_search"; + $db_results = Dba::query($sql); + $data = Dba::fetch_row($db_results); + $artists = $data['0']; - $results['songs'] = $songs; - $results['albums'] = $albums; - $results['artists'] = $artists; - $results['size'] = $size; - $results['time'] = $time; + $results['songs'] = $songs; + $results['albums'] = $albums; + $results['artists'] = $artists; + $results['size'] = $size; + $results['time'] = $time; - return $results; + return $results; } // count_songs /** * count_users * This returns the total number of users in the ampache instance - */ - public static function count_users($catalog_id='') { + */ + public static function count_users($catalog_id='') { // Count total users - $sql = "SELECT COUNT(id) FROM `user`"; - $db_results = Dba::query($sql); - $data = Dba::fetch_row($db_results); + $sql = "SELECT COUNT(id) FROM `user`"; + $db_results = Dba::query($sql); + $data = Dba::fetch_row($db_results); $results['users'] = $data['0']; // Get the connected users - $time = time(); - $last_seen_time = $time - 1200; - $sql = "SELECT count(DISTINCT s.username) FROM session AS s " . + $time = time(); + $last_seen_time = $time - 1200; + $sql = "SELECT count(DISTINCT s.username) FROM session AS s " . "INNER JOIN user AS u ON s.username = u.username " . "WHERE s.expire > " . $time . " " . "AND u.last_seen > " . $last_seen_time; - $db_results = Dba::query($sql); - $data = Dba::fetch_row($db_results); + $db_results = Dba::query($sql); + $data = Dba::fetch_row($db_results); $results['connected'] = $data['0']; - return $results; + return $results; } // count_users - - /*! - @function add_file - @discussion adds a single file - */ - function add_file($filename) { - - $file_size = filesize($filename); - $pattern = "/\.[" . conf('catalog_file_pattern') . "]$/i"; - - if ( preg_match($pattern ,$filename) && ($file_size > 0) && (!preg_match('/\.AppleDouble/', $filename)) ) { - if(!$this->check_local_mp3($filename,$gather_type)) { - $this->insert_local_song($filename,$file_size); - } - debug_event('add_file', "Error: File exists",'2','ampache-catalog'); - } // if valid file - - debug_event('add_file', "Error: File doesn't match pattern",'2','ampache-catalog'); - - - } // add_file - - /** * add_files * Recurses throught $this->path and pulls out all mp3s and returns the full @@ -400,57 +377,57 @@ class Catalog { public function add_files($path,$options) { // Correctly detect the slash we need to use here - if (strstr($path,"/")) { + if (strstr($path,"/")) { $slash_type = '/'; - } - else { + } + else { $slash_type = '\\'; - } + } /* Open up the directory */ $handle = opendir($path); if (!is_resource($handle)) { - debug_event('read',"Unable to Open $path",'5','ampache-catalog'); - Error::add('catalog_add',_('Error: Unable to open') . ' ' . $path); - return false; + debug_event('read',"Unable to Open $path",'5','ampache-catalog'); + Error::add('catalog_add',_('Error: Unable to open') . ' ' . $path); + return false; } /* Change the dir so is_dir works correctly */ if (!chdir($path)) { - debug_event('read',"Unable to chdir $path",'2','ampache-catalog'); - Error::add('catalog_add',_('Error: Unable to change to directory') . ' ' . $path); - return false; + debug_event('read',"Unable to chdir $path",'2','ampache-catalog'); + Error::add('catalog_add',_('Error: Unable to change to directory') . ' ' . $path); + return false; } // Ensure that we've got our cache - $this->_create_filecache(); + $this->_create_filecache(); /* Recurse through this dir and create the files array */ while ( false !== ( $file = readdir($handle) ) ) { /* Skip to next if we've got . or .. */ - if (substr($file,0,1) == '.' || $file == '..') { continue; } + if (substr($file,0,1) == '.' || $file == '..') { continue; } debug_event('read',"Starting work on $file inside $path",'5','ampache-catalog'); /* Create the new path */ $full_file = $path.$slash_type.$file; - /* First thing first, check if file is already in catalog. + /* First thing first, check if file is already in catalog. * This check is very quick, so it should be performed before any other checks to save time */ - if (isset($this->_filecache[strtolower($full_file)])) { - continue; - } - - // Incase this is the second time through clear this variable + if (isset($this->_filecache[strtolower($full_file)])) { + continue; + } + + // Incase this is the second time through clear this variable // if it was set the day before unset($failed_check); - + if (Config::get('no_symlinks')) { - if (is_link($full_file)) { - debug_event('read',"Skipping Symbolic Link $path",'5','ampache-catalog'); + if (is_link($full_file)) { + debug_event('read',"Skipping Symbolic Link $path",'5','ampache-catalog'); continue; } } @@ -459,57 +436,57 @@ class Catalog { if (is_dir($full_file)) { $this->add_files($full_file,$options); - /* Change the dir so is_dir works correctly */ - if (!chdir($path)) { - debug_event('read',"Unable to chdir $path",'2','ampache-catalog'); - Error::add('catalog_add',_('Error: Unable to change to directory') . ' ' . $path); - } + /* Change the dir so is_dir works correctly */ + if (!chdir($path)) { + debug_event('read',"Unable to chdir $path",'2','ampache-catalog'); + Error::add('catalog_add',_('Error: Unable to change to directory') . ' ' . $path); + } /* Skip to the next file */ continue; } //it's a directory - /* If it's not a dir let's roll with it + /* If it's not a dir let's roll with it * next we need to build the pattern that we will use * to detect if it's a audio file for now the source for * this is in the /modules/init.php file */ $pattern = "/\.(" . Config::get('catalog_file_pattern'); - if ($options['parse_m3u']) { + if ($options['parse_m3u']) { $pattern .= "|m3u)$/i"; } - else { + else { $pattern .= ")$/i"; } - + /* see if this is a valid audio file or playlist file */ if (preg_match($pattern ,$file)) { /* Now that we're sure its a file get filesize */ $file_size = filesize($full_file); - if (!$file_size) { - debug_event('read',"Unable to get filesize for $full_file",'2','ampache-catalog'); - Error::add('catalog_add',sprintf(_('Error: Unable to get filesize for %s'), $full_file)); + if (!$file_size) { + debug_event('read',"Unable to get filesize for $full_file",'2','ampache-catalog'); + Error::add('catalog_add',sprintf(_('Error: Unable to get filesize for %s'), $full_file)); } // file_size check - if (!is_readable($full_file)) { + if (!is_readable($full_file)) { // not readable, warn user - debug_event('read',"$full_file is not readable by ampache",'2','ampache-catalog'); + debug_event('read',"$full_file is not readable by ampache",'2','ampache-catalog'); Error::add('catalog_add', sprintf(_('%s is not readable by ampache'), $full_file)); - continue; - } + continue; + } // Check to make sure the filename is of the expected charset - if (function_exists('iconv')) { - if (strcmp($full_file,iconv(Config::get('site_charset'),Config::get('site_charset'),$full_file)) != '0') { - debug_event('read',$full_file . ' has non-' . Config::get('site_charset') . ' characters and can not be indexed','1'); - Error::add('catalog_add', sprintf(_('%s does not match site charset'), $full_file)); - continue; - } + if (function_exists('iconv')) { + if (strcmp($full_file,iconv(Config::get('site_charset'),Config::get('site_charset'),$full_file)) != '0') { + debug_event('read',$full_file . ' has non-' . Config::get('site_charset') . ' characters and can not be indexed','1'); + Error::add('catalog_add', sprintf(_('%s does not match site charset'), $full_file)); + continue; + } } // end if iconv - - if (substr($file,-3,3) == 'm3u' AND $parse_m3u > 0) { + + if (substr($file,-3,3) == 'm3u' AND $parse_m3u > 0) { $this->_playlists[] = $full_file; } // if it's an m3u @@ -519,33 +496,33 @@ class Catalog { /* Stupid little cutesie thing */ $this->count++; if ( !($this->count%10)) { - $file = str_replace(array('(',')','\''),'',$full_file); - echo "\n"; - flush(); + $file = str_replace(array('(',')','\''),'',$full_file); + echo "\n"; + flush(); } // update our current state } // if it's not an m3u - + } //if it matches the pattern else { debug_event('read',"$full_file ignored, non audio file or 0 bytes",'5','ampache-catalog'); } // else not an audio file - } // end while reading directory + } // end while reading directory debug_event('closedir',"Finished reading $path closing handle",'5','ampache-catalog'); // This should only happen on the last run - if ($path == $this->path) { - echo "\n"; - flush(); - } + if ($path == $this->path) { + echo "\n"; + flush(); + } /* Close the dir handle */ @@ -556,10 +533,10 @@ class Catalog { /*! @function get_albums @discussion This gets albums for all songs passed in an array - */ - function get_albums($songs=array()) { + */ + function get_albums($songs=array()) { - foreach ($songs as $song_id) { + foreach ($songs as $song_id) { $sql = "SELECT album FROM song WHERE id='$song_id'"; $db_results = mysql_query($sql, dbh()); $results = mysql_fetch_array($db_results); @@ -574,103 +551,103 @@ class Catalog { * get_album_ids * This returns an array of ids of albums that have songs in this * catalog - */ - public function get_album_ids() { + */ + public function get_album_ids() { - $id = Dba::escape($this->id); - $results = array(); + $id = Dba::escape($this->id); + $results = array(); $sql = "SELECT DISTINCT(song.album) FROM `song` WHERE `song`.`catalog`='$id'"; - $db_results = Dba::query($sql); + $db_results = Dba::query($sql); - while ($r = Dba::fetch_assoc($db_results)) { - $results[] = $r['album']; - } + while ($r = Dba::fetch_assoc($db_results)) { + $results[] = $r['album']; + } - return $results; + return $results; } // get_album_ids /** * get_album_art - * This runs through all of the needs art albums and trys + * This runs through all of the needs art albums and trys * to find the art for them from the mp3s */ - public function get_album_art($catalog_id=0,$all='') { + public function get_album_art($catalog_id=0,$all='') { // Make sure they've actually got methods - $album_art_order = Config::get('album_art_order'); - if (empty($album_art_order)) { - return true; - } + $album_art_order = Config::get('album_art_order'); + if (empty($album_art_order)) { + return true; + } // Prevent the script from timing out set_time_limit(0); - // If not passed use this - $catalog_id = $catalog_id ? $catalog_id : $this->id; + // If not passed use this + $catalog_id = $catalog_id ? $catalog_id : $this->id; - if ($all) { - $albums = $this->get_album_ids(); + if ($all) { + $albums = $this->get_album_ids(); } - else { - $albums = array_keys(self::$_art_albums); - } - + else { + $albums = array_keys(self::$_art_albums); + } + // Run through them an get the art! - foreach ($albums as $album_id) { + foreach ($albums as $album_id) { // Create the object - $album = new Album($album_id); + $album = new Album($album_id); // We're going to need the name here - $album->format(); - - debug_event('gather_art','Gathering art for ' . $album->name,'5'); - + $album->format(); + + debug_event('gather_art','Gathering art for ' . $album->name,'5'); + // Define the options we want to use for the find art function $options = array( 'album_name' => $album->full_name, 'artist' => $album->artist_name, 'keyword' => $album->artist_name . ' ' . $album->full_name - ); + ); // Return results - $results = $album->find_art($options,1); - - if (count($results)) { + $results = $album->find_art($options,1); + + if (count($results)) { // Pull the string representation from the source - $image = Album::get_image_from_source($results['0']); - if (strlen($image) > '5') { - $album->insert_art($image,$results['0']['mime']); - } - else { + $image = Album::get_image_from_source($results['0']); + if (strlen($image) > '5') { + $album->insert_art($image,$results['0']['mime']); + } + else { debug_event('album_art','Image less then 5 chars, not inserting','3'); - } - $art_found++; - } + } + $art_found++; + } /* Stupid little cutesie thing */ - $search_count++; - if ( !($search_count%5)) { + $search_count++; + if ( !($search_count%5)) { echo "\n"; - flush(); - } //echos song count - + echo "update_txt('" . $search_count ."','count_art_" . $this->id . "');"; + echo "update_txt('" . addslashes($album->name) . "','read_art_" . $this->id . "');"; + echo "\n\n"; + flush(); + } //echos song count + unset($found); } // foreach albums // One last time for good measure echo "\n"; - flush(); + echo "update_txt('" . $search_count ."','count_art_" . $this->id . "');"; + echo "update_txt('" . addslashes($album->name) . "','read_art_" . $this->id . "');"; + echo "\n\n"; + flush(); - self::$_art_albums = array(); + self::$_art_albums = array(); } // get_album_art @@ -678,21 +655,21 @@ class Catalog { * get_catalog_albums() * Returns an array of the albums from a catalog */ - public static function get_catalog_albums($catalog_id) { + public static function get_catalog_albums($catalog_id) { $results = array(); $sql = "SELECT DISTINCT(`song`.`album`) FROM `song` WHERE `song`.`catalog`='$catalog_id'"; $db_results = Dba::query($sql); - while ($row = Dba::fetch_assoc($db_results)) { - $results[] = $row['album']; + while ($row = Dba::fetch_assoc($db_results)) { + $results[] = $row['album']; } return $results; } // get_catalog_albums - + /** * get_catalog_files @@ -703,12 +680,12 @@ class Catalog { $results = array(); /* Use $this->id if nothing passed */ - $catalog_id = $catalog_id ? Dba::escape($catalog_id) : Dba::escape($this->id); + $catalog_id = $catalog_id ? Dba::escape($catalog_id) : Dba::escape($this->id); $sql = "SELECT `id` FROM `song` WHERE `catalog`='$catalog_id' AND `enabled`='1'"; - $db_results = Dba::query($sql); + $db_results = Dba::query($sql); - $results = array(); // return an emty array instead of nothing if no objects + $results = array(); // return an emty array instead of nothing if no objects while ($r = Dba::fetch_assoc($db_results)) { $results[] = new Song($r['id']); } //end while @@ -727,7 +704,7 @@ class Catalog { $results = array(); - if ($count) { $limit_clause = " LIMIT $count"; } + if ($count) { $limit_clause = " LIMIT $count"; } $sql = "SELECT id FROM song WHERE enabled='0' $limit_clause"; $db_results = Dba::query($sql); @@ -744,7 +721,7 @@ class Catalog { @function get_files @discussion Get's an array of .mp3s and returns the filenames @param $path Get files starting at root $path - */ + */ function get_files($path) { /* Set it as an empty array */ @@ -761,17 +738,17 @@ class Catalog { } // Determine the slash type and go from there - if (strstr($path,"/")) { + if (strstr($path,"/")) { $slash_type = '/'; - } - else { + } + else { $slash_type = '\\'; - } + } /* Recurse through this dir and create the files array */ while ( FALSE !== ($file = @readdir($handle)) ) { - $full_file = $path . $slash_type . $file; + $full_file = $path . $slash_type . $file; /* Incase this is the second time through, unset it before checking */ unset($failed_check); @@ -809,43 +786,43 @@ class Catalog { /** * get_duplicate_songs * This function takes a search type and returns a list of all song_ids that - * are likely to be duplicates based on teh search method selected. + * are likely to be duplicates based on teh search method selected. */ public static function get_duplicate_songs($search_method) { - $where_sql = ''; + $where_sql = ''; - if (!$_REQUEST['search_disabled']) { - $where_sql = 'WHERE enabled!=\'0\''; - } + if (!$_REQUEST['search_disabled']) { + $where_sql = 'WHERE enabled!=\'0\''; + } // Setup the base SQL - $sql = "SELECT song.id AS song,artist.id AS artist,album.id AS album,title,COUNT(title) AS ctitle". + $sql = "SELECT song.id AS song,artist.id AS artist,album.id AS album,title,COUNT(title) AS ctitle". " FROM `song` LEFT JOIN `artist` ON `artist`.`id`=`song`.`artist` " . " LEFT JOIN `album` ON `album`.`id`=`song`.`album` $where_sql GROUP BY `song`.`title`"; - + // Add any Additional constraints - if ($search_method == "artist_title" OR $search_method == "artist_album_title") { - $sql = $sql.",artist.name"; - } + if ($search_method == "artist_title" OR $search_method == "artist_album_title") { + $sql = $sql.",artist.name"; + } - if ($search_method == "artist_album_title") { - $sql = $sql.",album.name"; - } + if ($search_method == "artist_album_title") { + $sql = $sql.",album.name"; + } - // Final componets - $sql = $sql." HAVING COUNT(title) > 1"; - $sql = $sql." ORDER BY `ctitle`"; + // Final componets + $sql = $sql." HAVING COUNT(title) > 1"; + $sql = $sql." ORDER BY `ctitle`"; - $db_results = Dba::query($sql); + $db_results = Dba::query($sql); - $results = array(); + $results = array(); - while ($item = Dba::fetch_assoc($db_results)) { - $results[] = $item; - } // end while + while ($item = Dba::fetch_assoc($db_results)) { + $results[] = $item; + } // end while - return $results; + return $results; } // get_duplicate_songs @@ -855,30 +832,30 @@ class Catalog { * order, it sorts them by longest, higest bitrate, largest filesize, checking * the last one as most likely bad */ - public static function get_duplicate_info($item,$search_type) { - // Build the SQL - $sql = "SELECT `song`.`id`" . + public static function get_duplicate_info($item,$search_type) { + // Build the SQL + $sql = "SELECT `song`.`id`" . " FROM song,artist,album". " WHERE song.artist=artist.id AND song.album=album.id". " AND song.title= '".Dba::escape($item['title'])."'"; - if ($search_type == "artist_title" || $search_type == "artist_album_title") { - $sql .=" AND artist.id = '".Dba::escape($item['artist'])."'"; - } - if ($search_type == "artist_album_title" ) { - $sql .=" AND album.id = '".Dba::escape($item['album'])."'"; - } + if ($search_type == "artist_title" || $search_type == "artist_album_title") { + $sql .=" AND artist.id = '".Dba::escape($item['artist'])."'"; + } + if ($search_type == "artist_album_title" ) { + $sql .=" AND album.id = '".Dba::escape($item['album'])."'"; + } - $sql .= " ORDER BY `time`,`bitrate`,`size` LIMIT 2"; - $db_results = Dba::query($sql); + $sql .= " ORDER BY `time`,`bitrate`,`size` LIMIT 2"; + $db_results = Dba::query($sql); - $results = array(); + $results = array(); - while ($item = Dba::fetch_assoc($db_results)) { - $results[] = $item['id']; - } // end while + while ($item = Dba::fetch_assoc($db_results)) { + $results[] = $item['id']; + } // end while - return $results; + return $results; } // get_duplicate_info @@ -889,80 +866,80 @@ class Catalog { */ public static function dump_album_art($catalog_id,$methods=array()) { - // Get all of the albums in this catalog - $albums = self::get_catalog_albums($catalog_id); - + // Get all of the albums in this catalog + $albums = self::get_catalog_albums($catalog_id); + echo "Starting Dump Album Art...\n"; // Run through them an get the art! foreach ($albums as $album_id) { - $album = new Album($album_id); + $album = new Album($album_id); - // If no art, skip - if (!$album->has_art()) { continue; } + // If no art, skip + if (!$album->has_art()) { continue; } - $image = $album->get_db_art(); + $image = $album->get_db_art(); /* Get the first song in the album */ - $songs = $album->get_songs(1); - $song = new Song($songs[0]); - $dir = dirname($song->file); + $songs = $album->get_songs(1); + $song = new Song($songs[0]); + $dir = dirname($song->file); - if ($image['0']['mime'] == 'image/jpeg') { - $extension = 'jpg'; + if ($image['0']['mime'] == 'image/jpeg') { + $extension = 'jpg'; } - else { + else { $extension = substr($image['0']['mime'],strlen($image['0']['mime'])-3,3); - } - + } + // Try the preferred filename, if that fails use folder.??? - $preferred_filename = Config::get('album_art_preferred_filename'); - if (!$preferred_filename || strstr($preferred_filename,"%")) { $preferred_filename = "folder.$extension"; } + $preferred_filename = Config::get('album_art_preferred_filename'); + if (!$preferred_filename || strstr($preferred_filename,"%")) { $preferred_filename = "folder.$extension"; } - $file = "$dir/$preferred_filename"; - if ($file_handle = fopen($file,"w")) { - if (fwrite($file_handle, $image['0']['raw'])) { + $file = "$dir/$preferred_filename"; + if ($file_handle = fopen($file,"w")) { + if (fwrite($file_handle, $image['0']['raw'])) { // Also check and see if we should write out some meta data - if ($methods['metadata']) { - switch ($methods['metadata']) { + if ($methods['metadata']) { + switch ($methods['metadata']) { case 'windows': $meta_file = $dir . '/desktop.ini'; $string = "[.ShellClassInfo]\nIconFile=$file\nIconIndex=0\nInfoTip=$album->full_name"; - break; + break; default: - case 'linux': - $meta_file = $dir . '/.directory'; - $string = "Name=$album->full_name\nIcon=$file"; - break; - } // end switch + case 'linux': + $meta_file = $dir . '/.directory'; + $string = "Name=$album->full_name\nIcon=$file"; + break; + } // end switch - $meta_handle = fopen($meta_file,"w"); - fwrite($meta_handle,$string); - fclose($meta_handle); + $meta_handle = fopen($meta_file,"w"); + fwrite($meta_handle,$string); + fclose($meta_handle); } // end metadata - $i++; - if (!($i%100)) { - echo "Written: $i. . .\n"; - debug_event('art_write',"$album->name Art written to $file",'5'); - } - } // end if fopen + $i++; + if (!($i%100)) { + echo "Written: $i. . .\n"; + debug_event('art_write',"$album->name Art written to $file",'5'); + } + } // end if fopen else { - debug_event('art_write',"Unable to open $file for writting",'5'); + debug_event('art_write',"Unable to open $file for writting",'5'); echo "Error unable to open file for writting [$file]\n"; } - } // end if fopen worked - + } // end if fopen worked + fclose($file_handle); - } // end foreach + } // end foreach - echo "Album Art Dump Complete\n"; + echo "Album Art Dump Complete\n"; - } // dump_album_art + } // dump_album_art /** * update_last_update @@ -993,15 +970,15 @@ class Catalog { * update_settings * This function updates the basic setting of the catalog */ - public static function update_settings($data) { + public static function update_settings($data) { $id = Dba::escape($data['catalog_id']); $name = Dba::escape($data['name']); $key = Dba::escape($data['key']); $rename = Dba::escape($data['rename_pattern']); $sort = Dba::escape($data['sort_pattern']); - - $sql = "UPDATE `catalog` SET `name`='$name', `key`='$key', `rename_pattern`='$rename', " . + + $sql = "UPDATE `catalog` SET `name`='$name', `key`='$key', `rename_pattern`='$rename', " . "`sort_pattern`='$sort' WHERE `id` = '$id'"; $db_results = Dba::query($sql); @@ -1014,7 +991,7 @@ class Catalog { * updates a single album,artist,song from the tag data * this can be done by 75+ */ - public static function update_single_item($type,$id) { + public static function update_single_item($type,$id) { // Because single items are large numbers of things too set_time_limit(0); @@ -1031,22 +1008,22 @@ class Catalog { $songs = $artist->get_songs(); break; case 'song': - $songs[] = $id; + $songs[] = $id; break; } // end switch type - foreach($songs as $song_id) { - $song = new Song($song_id); + foreach($songs as $song_id) { + $song = new Song($song_id); $info = self::update_song_from_tags($song,'',''); - if ($info['change']) { + if ($info['change']) { $file = scrub_out($song->file); - echo "
\n\t
"; - echo "$file " . _('Updated') . "\n"; - echo $info['text']; - echo "\t
\n

"; - flush(); - } // if change + echo "
\n\t
"; + echo "$file " . _('Updated') . "\n"; + echo $info['text']; + echo "\t
\n

"; + flush(); + } // if change else { echo"
\n\t
"; echo "" . scrub_out($song->file) . "
" . _('No Update Needed') . "\n"; @@ -1061,6 +1038,7 @@ class Catalog { * update_song_from_tags * updates the song info based on tags, this is called from a bunch of different places * and passes in a full fledged song object, so it's a static function + * FIXME: This is an ugly mess, this really needs to be consolidated and cleaned up */ public static function update_song_from_tags(&$song,$sort_pattern='',$rename_pattern='') { @@ -1101,6 +1079,7 @@ class Catalog { $artist = $results['artist']; $album = $results['album']; $disk = $results['disk']; + $tag = $results['genre']; /* Clean up Old Vars */ unset($vainfo,$key); @@ -1114,74 +1093,77 @@ class Catalog { $new_song->album = self::check_album($album,$new_song->year,$disk); $new_song->f_album = $album . " - " . $new_song->year; $new_song->title = self::check_title($new_song->title,$new_song->file); + + // Nothing to assign here this is a multi-value doodly + self::check_tag($tag,$song->id); /* Since we're doing a full compare make sure we fill the extended information */ $song->fill_ext_info(); - $info = Song::compare_song_information($song,$new_song); + $info = Song::compare_song_information($song,$new_song); - if ($info['change']) { - debug_event('update',"$song->file difference found, updating database",'5','ampache-catalog'); - $song->update_song($song->id,$new_song); + if ($info['change']) { + debug_event('update',"$song->file difference found, updating database",'5','ampache-catalog'); + $song->update_song($song->id,$new_song); // Redfine our reference - $song = $new_song; - } - else { + $song = $new_song; + } + else { debug_event('update',"$song->file no difference found returning",'5','ampache-catalog'); } - return $info; + return $info; - } // update_song_from_tags + } // update_song_from_tags /** * add_to_catalog * this function adds new files to an * existing catalog */ - public function add_to_catalog() { + public function add_to_catalog() { - if ($this->catalog_type == 'remote') { - show_box_top(_('Running Remote Update') . '. . .'); + if ($this->catalog_type == 'remote') { + show_box_top(_('Running Remote Update') . '. . .'); $this->get_remote_catalog($type=0); - show_box_bottom(); + show_box_bottom(); return true; - } - - require Config::get('prefix') . '/templates/show_adds_catalog.inc.php'; + } + + require Config::get('prefix') . '/templates/show_adds_catalog.inc.php'; flush(); /* Set the Start time */ $start_time = time(); // Make sure the path doesn't end in a / or \ - $this->path = rtrim($this->path,'/'); + $this->path = rtrim($this->path,'/'); $this->path = rtrim($this->path,'\\'); - // Prevent the script from timing out and flush what we've got - set_time_limit(0); + // Prevent the script from timing out and flush what we've got + set_time_limit(0); /* Get the songs and then insert them into the db */ $this->add_files($this->path,$type,0,$verbose); // Foreach Playlists we found - foreach ($this->_playlists as $full_file) { - if ($this->import_m3u($full_file)) { + foreach ($this->_playlists as $full_file) { + if ($this->import_m3u($full_file)) { $file = basename($full_file); - if ($verbose) { - echo "   " . _('Added Playlist From') . " $file . . . .
\n"; - flush(); + if ($verbose) { + echo "   " . _('Added Playlist From') . " $file . . . .
\n"; + flush(); } - } // end if import worked - } // end foreach playlist files + } // end if import worked + } // end foreach playlist files /* Do a little stats mojo here */ $current_time = time(); - $catalog_id = $this->id; - require Config::get('prefix') . '/templates/show_gather_art.inc.php'; - flush(); - $this->get_album_art(); + $catalog_id = $this->id; + require Config::get('prefix') . '/templates/show_gather_art.inc.php'; + flush(); + $this->get_album_art(); /* Update the Catalog last_update */ $this->update_last_add(); @@ -1197,10 +1179,10 @@ class Catalog { $this->count = 0; } - show_box_top(); + show_box_top(); echo "\n
" . _('Catalog Update Finished') . "... " . _('Total Time') . " [" . date("i:s",$time_diff) . "] " . - _('Total Songs') . " [" . $this->count . "] " . _('Songs Per Seconds') . " [" . $song_per_sec . "]

"; - show_box_bottom(); + _('Total Songs') . " [" . $this->count . "] " . _('Songs Per Seconds') . " [" . $song_per_sec . "]

"; + show_box_bottom(); } // add_to_catalog @@ -1209,57 +1191,57 @@ class Catalog { * get a remote catalog and runs update if needed this requires * the XML RPC stuff and a key to be passed */ - public function get_remote_catalog($type=0) { + public function get_remote_catalog($type=0) { /* Make sure the xmlrpc lib is loaded */ - if (!class_exists('xmlrpc_client')) { - debug_event('xmlrpc',"Unable to load XMLRPC library",'1'); + if (!class_exists('xmlrpc_client')) { + debug_event('xmlrpc',"Unable to load XMLRPC library",'1'); echo "" . _("Error") . ": " . _('Unable to load XMLRPC library, make sure XML-RPC is enabled') . "
\n"; return false; } // end check for class // Handshake and get our token for this little conversation - $token = xmlRpcClient::ampache_handshake($this->path,$this->key); + $token = xmlRpcClient::ampache_handshake($this->path,$this->key); - if (!$token) { - debug_event('XMLCLIENT','Error No Token returned'); - Error::display('general'); + if (!$token) { + debug_event('XMLCLIENT','Error No Token returned'); + Error::display('general'); return; - } + } - // Figure out the host etc - preg_match("/http:\/\/([^\/\:]+):?(\d*)\/*(.*)/", $this->path, $match); - $server = $match['1']; - $port = $match['2'] ? intval($match['2']) : '80'; - $path = $match['3']; + // Figure out the host etc + preg_match("/http:\/\/([^\/\:]+):?(\d*)\/*(.*)/", $this->path, $match); + $server = $match['1']; + $port = $match['2'] ? intval($match['2']) : '80'; + $path = $match['3']; - $full_url = ltrim("/$path/server/xmlrpc.server.php",'/'); - $client = new xmlrpc_client($full_url,$server,$port); + $full_url = ltrim("/$path/server/xmlrpc.server.php",'/'); + $client = new xmlrpc_client($full_url,$server,$port); /* encode the variables we need to send over */ $encoded_key = new xmlrpcval($token,'string'); $encoded_path = new xmlrpcval(Config::get('web_path'),'string'); - + $xmlrpc_message = new xmlrpcmsg('xmlrpcserver.get_catalogs', array($encoded_key,$encoded_path)); - $response = $client->send($xmlrpc_message,30); + $response = $client->send($xmlrpc_message,30); - if ($response->faultCode() ) { + if ($response->faultCode() ) { $error_msg = _("Error connecting to") . " " . $server . " " . _("Code") . ": " . $response->faultCode() . " " . _("Reason") . ": " . $response->faultString(); debug_event('XMLCLIENT',$error_msg,'1'); echo "

$error_msg

"; - return; - } - + return; + } + $data = php_xmlrpc_decode($response->value()); // Print out the catalogs we are going to sync - foreach ($data as $vars) { + foreach ($data as $vars) { $catalog_name = $vars['name']; $count = $vars['count']; - print("Reading Remote Catalog: $catalog_name ($count Songs) [$this->path]
\n"); + print("Reading Remote Catalog: $catalog_name ($count Songs) [$this->path]
\n"); $total += $count; - } - + } + // Flush the output flush(); @@ -1267,13 +1249,13 @@ class Catalog { $step = '500'; $current = '0'; - while ($total > $current) { + while ($total > $current) { $start = $current; $current += $step; $this->get_remote_song($client,$token,$start,$step); } - echo "

" . _('Completed updating remote catalog(s)') . ".


\n"; + echo "

" . _('Completed updating remote catalog(s)') . ".


\n"; flush(); // Update the last update value @@ -1283,39 +1265,39 @@ class Catalog { } // get_remote_catalog - /** + /** * get_remote_song * This functions takes a start and end point for gathering songs from a remote server. It is broken up * in attempt to get around the problem of very large target catalogs */ - public function get_remote_song($client,$token,$start,$end) { + public function get_remote_song($client,$token,$start,$end) { $encoded_start = new xmlrpcval($start,'int'); $encoded_end = new xmlrpcval($end,'int'); $encoded_key = new xmlrpcval($token,'string'); - $query_array = array($encoded_key,$encoded_start,$encoded_end); + $query_array = array($encoded_key,$encoded_start,$encoded_end); + + $xmlrpc_message = new xmlrpcmsg('xmlrpcserver.get_songs',$query_array); + /* Depending upon the size of the target catalog this can be a very slow/long process */ + set_time_limit(0); - $xmlrpc_message = new xmlrpcmsg('xmlrpcserver.get_songs',$query_array); - /* Depending upon the size of the target catalog this can be a very slow/long process */ - set_time_limit(0); - // Sixty Second time out per chunk - $response = $client->send($xmlrpc_message,60); - $value = $response->value(); + $response = $client->send($xmlrpc_message,60); + $value = $response->value(); - if ( !$response->faultCode() ) { - $data = php_xmlrpc_decode($value); - $this->update_remote_catalog($data,$this->path); + if ( !$response->faultCode() ) { + $data = php_xmlrpc_decode($value); + $this->update_remote_catalog($data,$this->path); $total = $start + $end; echo _('Added') . " $total...
"; flush(); - } - else { - $error_msg = _('Error connecting to') . " " . $server . " " . _("Code") . ": " . $response->faultCode() . " " . _("Reason") . ": " . $response->faultString(); - debug_event('XMLCLIENT',$error_msg,'1'); - echo "

$error_msg

"; - } + } + else { + $error_msg = _('Error connecting to') . " " . $server . " " . _("Code") . ": " . $response->faultCode() . " " . _("Reason") . ": " . $response->faultString(); + debug_event('XMLCLIENT',$error_msg,'1'); + echo "

$error_msg

"; + } return; @@ -1329,40 +1311,40 @@ class Catalog { */ function update_remote_catalog($data,$root_path) { - /* - We need to check the incomming songs - to see which ones need to be added - */ + /* + We need to check the incomming songs + to see which ones need to be added + */ foreach ($data as $serialized_song) { - + // Prevent a timeout - set_time_limit(0); - + set_time_limit(0); + $song = unserialize($serialized_song); - $song->artist = self::check_artist($song->artist); - $song->album = self::check_album($song->album,$song->year); + $song->artist = self::check_artist($song->artist); + $song->album = self::check_album($song->album,$song->year); $song->file = $root_path . "/play/index.php?song=" . $song->id; $song->catalog = $this->id; // Clear out the song id - unset($song->id); - - if (!$this->check_remote_song($song->file)) { + unset($song->id); + + if (!$this->check_remote_song($song->file)) { $this->insert_remote_song($song); - } + } } // foreach new Songs - // now delete invalid entries - self::clean($this->id); + // now delete invalid entries + self::clean($this->id); } // update_remote_catalog /** * clean_catalog - * Cleans the Catalog of files that no longer exist grabs from $this->id or $id passed - * Doesn't actually delete anything, disables errored files, and returns them in an array + * Cleans the Catalog of files that no longer exist grabs from $this->id or $id passed + * Doesn't actually delete anything, disables errored files, and returns them in an array */ public function clean_catalog() { @@ -1370,20 +1352,20 @@ class Catalog { $dead_files = array(); // Added set time limit because this runs out of time for some people - set_time_limit(0); + set_time_limit(0); require_once Config::get('prefix') . '/templates/show_clean_catalog.inc.php'; - flush(); + flush(); - /* Do a quick check to make sure that the root of the catalog is readable, error if not + /* Do a quick check to make sure that the root of the catalog is readable, error if not * this will minimize the loss of catalog data if mount points fail */ - if (!is_readable($this->path)) { - debug_event('catalog','Catalog path:' . $this->path . ' unreadable, clean failed','1'); - Error::add('general',_('Catalog Root unreadable, stopping clean')); - Error::display('general'); - return false; - } + if (!is_readable($this->path)) { + debug_event('catalog','Catalog path:' . $this->path . ' unreadable, clean failed','1'); + Error::add('general',_('Catalog Root unreadable, stopping clean')); + Error::display('general'); + return false; + } /* Get all songs in this catalog */ @@ -1395,52 +1377,52 @@ class Catalog { /* Recurse through files, put @ to prevent errors poping up */ while ($results = Dba::fetch_assoc($db_results)) { - /* Stupid little cutesie thing */ - $count++; - if (!($count%10)) { + /* Stupid little cutesie thing */ + $count++; + if (!($count%10)) { $file = str_replace(array('(',')','\''),'',$results['file']); - echo "\n"; - flush(); - } //echos song count + echo "\n"; + flush(); + } //echos song count /* Also check the file information */ $file_info = filesize($results['file']); /* If it errors somethings splated, or the files empty */ if (!file_exists($results['file']) OR $file_info < 1) { - + /* Add Error */ - Error::add('general',"Error File Not Found or 0 Bytes: " . $results['file']); + Error::add('general',"Error File Not Found or 0 Bytes: " . $results['file']); /* Remove the file! */ - $sql = "DELETE FROM `song` WHERE `id`='" . $results['id'] . "'"; - $delete_results = Dba::query($sql); + $sql = "DELETE FROM `song` WHERE `id`='" . $results['id'] . "'"; + $delete_results = Dba::query($sql); // Count em! - $dead_files++; + $dead_files++; } //if error } //while gettings songs - + /* Step two find orphaned Arists/Albums * This finds artists and albums that no * longer have any songs associated with them */ - self::clean($catalog_id); - + self::clean($catalog_id); + /* Return dead files, so they can be listed */ - echo "\n"; - show_box_top(); + echo "\n"; + show_box_top(); echo "" . _('Catalog Clean Done') . " [" . $dead_files . "] " . _('files removed') . "
\n"; - echo "" . _('Optimizing Tables') . "...
\n"; - self::optimize_tables(); - show_box_bottom(); + echo "" . _('Optimizing Tables') . "...
\n"; + self::optimize_tables(); + show_box_bottom(); flush(); } //clean_catalog @@ -1451,10 +1433,10 @@ class Catalog { * And checks to see if those specific elements are now orphaned * this is often used in flagging, and is a faster way then calling * the normal clean functions. The assumption is made that this is - * an old song object whoes information has already been updated in the + * an old song object whoes information has already been updated in the * database */ - function clean_single_song($song) { + function clean_single_song($song) { $results = array(); @@ -1462,7 +1444,7 @@ class Catalog { $sql = "SELECT song.artist FROM song WHERE artist='" . $song->artist . "'"; $db_results = mysql_query($sql, dbh()); - if (!mysql_num_rows($db_results)) { + if (!mysql_num_rows($db_results)) { $sql = "DELETE FROM artist WHERE id='" . $song->artist . "'"; $db_results = mysql_query($sql, dbh()); $results['artist'] = true; @@ -1472,7 +1454,7 @@ class Catalog { $sql = "SELECT song.album FROM song WHERE album='" . $song->album . "'"; $db_results = mysql_query($sql, dbh()); - if (!mysql_num_rows($db_results)) { + if (!mysql_num_rows($db_results)) { $sql = "DELETE FROM album WHERE id='" . $song->album . "'"; $db_results = mysql_query($sql, dbh()); $results['album'] = true; @@ -1487,24 +1469,24 @@ class Catalog { * This cleans out tag_maps that are not assoicated with a 'living' object * and then cleans the tags that have no maps */ - public static function clean_tags() { + public static function clean_tags() { - $sql = "DELETE FROM `tag_map` USING `tag_map` LEFT JOIN `song` ON `song`.`id`=`tag_map`.`object_id` " . + $sql = "DELETE FROM `tag_map` USING `tag_map` LEFT JOIN `song` ON `song`.`id`=`tag_map`.`object_id` " . "WHERE `tag_map`.`object_type`='song' AND `song`.`id` IS NULL"; - $db_results = Dba::query($sql); + $db_results = Dba::query($sql); - $sql = "DELETE FROM `tag_map` USING `tag_map` LEFT JOIN `album` ON `album`.`id`=`tag_map`.`object_id` " . + $sql = "DELETE FROM `tag_map` USING `tag_map` LEFT JOIN `album` ON `album`.`id`=`tag_map`.`object_id` " . "WHERE `tag_map`.`object_type`='album' AND `album`.`id` IS NULL"; - $db_results = Dba::query($sql); + $db_results = Dba::query($sql); - $sql = "DELETE FROM `tag_map` USING `tag_map` LEFT JOIN `artist` ON `artist`.`id`=`tag_map`.`object_id` " . + $sql = "DELETE FROM `tag_map` USING `tag_map` LEFT JOIN `artist` ON `artist`.`id`=`tag_map`.`object_id` " . "WHERE `tag_map`.`object_type`='artist' AND `artist`.`id` IS NULL"; - $db_results = Dba::query($sql); + $db_results = Dba::query($sql); // Now nuke the tags themselves - $sql = "DELETE FROM `tag` USING `tag` LEFT JOIN `tag_map` ON `tag`.`id`=`tag_map`.`tag_id` " . + $sql = "DELETE FROM `tag` USING `tag` LEFT JOIN `tag_map` ON `tag`.`id`=`tag_map`.`tag_id` " . "WHERE `tag_map`.`id` IS NULL"; - $db_results = Dba::query($sql); + $db_results = Dba::query($sql); } // clean_tags @@ -1512,22 +1494,22 @@ class Catalog { * clean_shoutbox * This cleans out any shoutbox items that are now orphaned */ - public static function clean_shoutbox() { + public static function clean_shoutbox() { // Clean songs - $sql = "DELETE FROM `user_shout` USING `user_shout` LEFT JOIN `song` ON `song`.`id`=`user_shout`.`object_id` " . + $sql = "DELETE FROM `user_shout` USING `user_shout` LEFT JOIN `song` ON `song`.`id`=`user_shout`.`object_id` " . "WHERE `song`.`id` IS NULL AND `user_shout`.`object_type`='song'"; - $db_results = Dba::query($sql); + $db_results = Dba::query($sql); // Clean albums - $sql = "DELETE FROM `user_shout` USING `user_shout` LEFT JOIN `album` ON `album`.`id`=`user_shout`.`object_id` " . + $sql = "DELETE FROM `user_shout` USING `user_shout` LEFT JOIN `album` ON `album`.`id`=`user_shout`.`object_id` " . "WHERE `album`.`id` IS NULL AND `user_shout`.`object_type`='album'"; - $db_results = Dba::query($sql); + $db_results = Dba::query($sql); // Clean artists - $sql = "DELETE FROM `user_shout` USING `user_shout` LEFT JOIN `artist` ON `artist`.`id`=`user_shout`.`object_id` " . + $sql = "DELETE FROM `user_shout` USING `user_shout` LEFT JOIN `artist` ON `artist`.`id`=`user_shout`.`object_id` " . "WHERE `artist`.`id` IS NULL AND `user_shout`.`object_type`='artist'"; - $db_results = Dba::query($sql); + $db_results = Dba::query($sql); } // clean_shoutbox @@ -1543,12 +1525,12 @@ class Catalog { $db_results = Dba::query($sql); /* Now remove any album art that is now dead */ - $sql = "DELETE FROM `album_data` USING `album_data` LEFT JOIN `album` ON `album`.`id`=`album_data`.`album_id` WHERE `album`.`id` IS NULL"; - $db_results = Dba::query($sql); + $sql = "DELETE FROM `album_data` USING `album_data` LEFT JOIN `album` ON `album`.`id`=`album_data`.`album_id` WHERE `album`.`id` IS NULL"; + $db_results = Dba::query($sql); // This can save a lot of space so always optomize - $sql = "OPTIMIZE TABLE `album_data`"; - $db_results = Dba::query($sql); + $sql = "OPTIMIZE TABLE `album_data`"; + $db_results = Dba::query($sql); } // clean_albums @@ -1556,7 +1538,7 @@ class Catalog { * clean_flagged * This functions cleans ou unused flagged items */ - public static function clean_flagged() { + public static function clean_flagged() { /* Do a complex delete to get flagged items where the songs are now gone */ $sql = "DELETE FROM flagged USING flagged LEFT JOIN song ON song.id = flagged.object_id WHERE song.id IS NULL AND object_type='song'"; @@ -1580,17 +1562,17 @@ class Catalog { * clean_playlists * cleans out dead files from playlists */ - public static function clean_playlists() { + public static function clean_playlists() { /* Do a complex delete to get playlist songs where there are no songs */ - $sql = "DELETE FROM `playlist_data` USING `playlist_data` LEFT JOIN `song` ON `song`.`id` = `playlist_data`.`object_id` " . + $sql = "DELETE FROM `playlist_data` USING `playlist_data` LEFT JOIN `song` ON `song`.`id` = `playlist_data`.`object_id` " . "WHERE `song`.`file` IS NULL AND `playlist_data`.`object_type`='song'"; $db_results = Dba::query($sql); // Clear TMP Playlist information as well - $sql = "DELETE FROM `tmp_playlist_data` USING `tmp_playlist_data` LEFT JOIN `song` ON `tmp_playlist_data`.`object_id` = `song`.`id` " . + $sql = "DELETE FROM `tmp_playlist_data` USING `tmp_playlist_data` LEFT JOIN `song` ON `tmp_playlist_data`.`object_id` = `song`.`id` " . "WHERE `song`.`id` IS NULL"; - $db_results = Dba::query($sql); + $db_results = Dba::query($sql); } // clean_playlists @@ -1598,11 +1580,11 @@ class Catalog { * clean_ext_info * This function clears any ext_info that no longer has a parent */ - public static function clean_ext_info() { + public static function clean_ext_info() { - $sql = "DELETE FROM `song_data` USING `song_data` LEFT JOIN `song` ON `song`.`id` = `song_data`.`song_id` " . + $sql = "DELETE FROM `song_data` USING `song_data` LEFT JOIN `song` ON `song`.`id` = `song_data`.`song_id` " . "WHERE `song`.`id` IS NULL"; - $db_results = Dba::query($sql); + $db_results = Dba::query($sql); } // clean_ext_info @@ -1612,36 +1594,36 @@ class Catalog { */ public static function clean_stats() { - // Crazy SQL Mojo to remove stats where there are no songs + // Crazy SQL Mojo to remove stats where there are no songs $sql = "DELETE FROM object_count USING object_count LEFT JOIN song ON song.id=object_count.object_id WHERE object_type='song' AND song.id IS NULL"; $db_results = Dba::query($sql); - - // Crazy SQL Mojo to remove stats where there are no albums + + // Crazy SQL Mojo to remove stats where there are no albums $sql = "DELETE FROM object_count USING object_count LEFT JOIN album ON album.id=object_count.object_id WHERE object_type='album' AND album.id IS NULL"; $db_results = Dba::query($sql); - - // Crazy SQL Mojo to remove stats where ther are no artists + + // Crazy SQL Mojo to remove stats where ther are no artists $sql = "DELETE FROM object_count USING object_count LEFT JOIN artist ON artist.id=object_count.object_id WHERE object_type='artist' AND artist.id IS NULL"; $db_results = Dba::query($sql); // Delete the live_stream stat information $sql = "DELETE FROM object_count USING object_count LEFT JOIN live_stream ON live_stream.id=object_count.object_id WHERE object_type='live_stream' AND live_stream.id IS NULL"; - $db_results = Dba::query($sql); + $db_results = Dba::query($sql); // Delete Song Ratings information - $sql = "DELETE FROM rating USING rating LEFT JOIN song ON song.id=rating.object_id WHERE object_type='song' AND song.id IS NULL"; - $db_results = Dba::query($sql); + $sql = "DELETE FROM rating USING rating LEFT JOIN song ON song.id=rating.object_id WHERE object_type='song' AND song.id IS NULL"; + $db_results = Dba::query($sql); // Delete Album Rating Information - $sql = "DELETE FROM rating USING rating LEFT JOIN album ON album.id=rating.object_id WHERE object_type='album' AND album.id IS NULL"; - $db_results = Dba::query($sql); + $sql = "DELETE FROM rating USING rating LEFT JOIN album ON album.id=rating.object_id WHERE object_type='album' AND album.id IS NULL"; + $db_results = Dba::query($sql); // Delete Artist Rating Information - $sql = "DELETE FROM rating USING rating LEFT JOIN artist ON artist.id=rating.object_id WHERE object_type='artist' AND artist.id IS NULL"; - $db_results = Dba::query($sql); + $sql = "DELETE FROM rating USING rating LEFT JOIN artist ON artist.id=rating.object_id WHERE object_type='artist' AND artist.id IS NULL"; + $db_results = Dba::query($sql); } // clean_stats - + /** * verify_catalog * This function compares the DB's information with the ID3 tags @@ -1649,13 +1631,13 @@ class Catalog { public function verify_catalog($catalog_id) { // Create the object so we have some information on it - $catalog = new Catalog($catalog_id); + $catalog = new Catalog($catalog_id); /* First get the filenames for the catalog */ $sql = "SELECT `id`,`file` FROM `song` WHERE `catalog`='$catalog_id'"; $db_results = Dba::query($sql); $number = Dba::num_rows($db_results); - + require_once Config::get('prefix') . '/templates/show_verify_catalog.inc.php'; flush(); @@ -1663,7 +1645,7 @@ class Catalog { set_time_limit(0); // Caching array for album art, save us some time here - $album_art_check_cache = array(); + $album_art_check_cache = array(); /* Recurse through this catalogs files * and get the id3 tage information, @@ -1673,19 +1655,19 @@ class Catalog { while ($results = Dba::fetch_assoc($db_results)) { debug_event('verify',"Starting work on " . $results['file'],'5','ampache-catalog'); - + if (is_readable($results['file'])) { /* Create the object from the existing database information */ $song = new Song($results['id']); - + unset($skip); /* Make sure the song isn't flagged, we don't update flagged stuff */ - if ($song->has_flag()) { - $skip = true; - } - + if ($song->has_flag()) { + $skip = true; + } + // if the file hasn't been modified since the last_update if (!$skip) { @@ -1698,48 +1680,48 @@ class Catalog { } // end skip - if ($skip) { - debug_event('skip',"$song->file has been skipped due to newer local update or file mod time",'5','ampache-catalog'); + if ($skip) { + debug_event('skip',"$song->file has been skipped due to newer local update or file mod time",'5','ampache-catalog'); } - - /* Stupid little cutesie thing */ - $count++; - if (!($count%10) ) { - $file = str_replace(array('(',')','\''),'',$song->file); - echo "\n"; - flush(); - } //echos song count - + + /* Stupid little cutesie thing */ + $count++; + if (!($count%10) ) { + $file = str_replace(array('(',')','\''),'',$song->file); + echo "\n"; + flush(); + } //echos song count + } // end if file exists else { - Error::add('general',"$song->file does not exist or is not readable"); - debug_event('read-error',"$song->file does not exist or is not readable, removing",'5','ampache-catalog'); + Error::add('general',"$song->file does not exist or is not readable"); + debug_event('read-error',"$song->file does not exist or is not readable, removing",'5','ampache-catalog'); // Let's go ahead and remove it! - $sql = "DELETE FROM `song` WHERE `id`='" . Dba::escape($song->id) . "'"; - $del_results = Dba::query($sql); + $sql = "DELETE FROM `song` WHERE `id`='" . Dba::escape($song->id) . "'"; + $del_results = Dba::query($sql); } } //end foreach /* After we have updated all the songs with the new information clear any empty albums/artists */ - self::clean($catalog_id); + self::clean($catalog_id); // Update the last_update $this->update_last_update(); - // One final time! + // One final time! echo "\n"; - flush(); + echo "update_txt('" . $this->count . "','count_verify_" . $this->id . "');"; + echo "\n\n"; + flush(); - show_box_top(); + show_box_top(); echo _('Update Finished.') . ' ' . _('Checked') . " $count. $total_updated " . _('songs updated.') . "

"; - show_box_bottom(); + show_box_bottom(); return true; @@ -1750,16 +1732,16 @@ class Catalog { * This is a wrapper function for all of the different cleaning * functions, it runs them in the correct order and takes a catalog_id */ - public static function clean() { + public static function clean() { - self::clean_albums(); - self::clean_artists(); - self::clean_flagged(); - self::clean_stats(); - self::clean_ext_info(); - self::clean_playlists(); - self::clean_shoutbox(); - self::clean_tags(); + self::clean_albums(); + self::clean_artists(); + self::clean_flagged(); + self::clean_stats(); + self::clean_ext_info(); + self::clean_playlists(); + self::clean_shoutbox(); + self::clean_tags(); } // clean @@ -1769,19 +1751,19 @@ class Catalog { * this can be slow, but is a good idea to do from time to time. This is incase the dba * isn't doing it... which we're going to assume they aren't */ - public static function optimize_tables() { + public static function optimize_tables() { - $sql = "OPTIMIZE TABLE `song_data`,`song`,`rating`,`catalog`,`session`,`object_count`,`album`,`album_data`" . + $sql = "OPTIMIZE TABLE `song_data`,`song`,`rating`,`catalog`,`session`,`object_count`,`album`,`album_data`" . ",`artist`,`ip_history`,`flagged`,`now_playing`,`user_preference`,`tag`,`tag_map`,`tmp_playlist`" . ",`tmp_playlist_data`,`playlist`,`playlist_data`"; - $db_results = Dba::query($sql); + $db_results = Dba::query($sql); - $sql = "ANALYZE TABLE `song_data`,`song`,`rating`,`catalog`,`session`,`object_count`,`album`,`album_data`" . + $sql = "ANALYZE TABLE `song_data`,`song`,`rating`,`catalog`,`session`,`object_count`,`album`,`album_data`" . ",`artist`,`ip_history`,`flagged`,`now_playing`,`user_preference`,`tag`,`tag_map`,`tmp_playlist`" . ",`tmp_playlist_data`,`playlist`,`playlist_data`"; - $db_results = Dba::query($sql); + $db_results = Dba::query($sql); - } // optimize_tables; + } // optimize_tables; /** * check_artist @@ -1801,7 +1783,7 @@ class Catalog { } // Remove the prefix so we can sort it correctly - $prefix_pattern = '/^(' . implode('\\s|',explode('|',Config::get('catalog_prefix_pattern'))) . '\\s)(.*)/i'; + $prefix_pattern = '/^(' . implode('\\s|',explode('|',Config::get('catalog_prefix_pattern'))) . '\\s)(.*)/i'; preg_match($prefix_pattern,$artist,$matches); if (count($matches)) { @@ -1831,20 +1813,20 @@ class Catalog { if ($prefix) { $prefix_txt = "'$prefix'"; } - + $sql = "INSERT INTO `artist` (`name`, `prefix`) VALUES ('$artist',$prefix_txt)"; $db_results = Dba::query($sql); $artist_id = Dba::insert_id(); if (!$db_results) { - Error::add('general',"Inserting Artist:$artist"); + Error::add('general',"Inserting Artist:$artist"); } } // not found // If readonly, and not found return false - else { - return false; - } + else { + return false; + } $array = array($artist => $artist_id); self::$artists = array_merge(self::$artists, $array); @@ -1856,7 +1838,7 @@ class Catalog { /** * check_album - * Takes $album and checks if there then return id else insert and return id + * Takes $album and checks if there then return id else insert and return id */ public static function check_album($album,$album_year=0,$disk='',$readonly='') { @@ -1869,12 +1851,12 @@ class Catalog { /* Ohh no the album has lost it's mojo */ if (!$album) { $album = _('Unknown (Orphaned)'); - unset($album_year); + unset($album_year); } // Remove the prefix so we can sort it correctly - $prefix_pattern = '/^(' . implode('\\s|',explode('|',Config::get('catalog_prefix_pattern'))) . '\\s)(.*)/i'; -debug_event('prefix',$prefix_pattern,'3'); + $prefix_pattern = '/^(' . implode('\\s|',explode('|',Config::get('catalog_prefix_pattern'))) . '\\s)(.*)/i'; + debug_event('prefix',$prefix_pattern,'3'); preg_match($prefix_pattern,$album,$matches); if (count($matches)) { @@ -1890,7 +1872,7 @@ debug_event('prefix',$prefix_pattern,'3'); /* Setup the Query */ $sql = "SELECT `id` FROM `album` WHERE `name` = '$album'"; if ($album_year) { $sql .= " AND `year`='$album_year'"; } - if ($album_disk) { $sql .= " AND `disk`='$album_disk'"; } + if ($album_disk) { $sql .= " AND `disk`='$album_disk'"; } if ($prefix) { $sql .= " AND `prefix`='" . Dba::escape($prefix) . "'"; } $db_results = Dba::query($sql); @@ -1899,37 +1881,37 @@ debug_event('prefix',$prefix_pattern,'3'); $album_id = $r['id']; // If we don't have art put it in the 'needs me some art' array - if (!strlen($r['art'])) { - $key = $r['id']; + if (!strlen($r['art'])) { + $key = $r['id']; self::$_art_albums[$key] = $key; } - + } //if found /* If not found create */ elseif (!$readonly) { - $prefix_txt = $prefix ? "'$prefix'" : 'NULL'; + $prefix_txt = $prefix ? "'$prefix'" : 'NULL'; $sql = "INSERT INTO `album` (`name`, `prefix`,`year`,`disk`) VALUES ('$album',$prefix_txt,'$album_year','$album_disk')"; $db_results = Dba::query($sql); $album_id = Dba::insert_id(); if (!$db_results) { - debug_event('album',"Error Unable to insert Album:$album",'2'); + debug_event('album',"Error Unable to insert Album:$album",'2'); } // Add it to the I needs me some album art array - self::$_art_albums[$album_id] = $album_id; + self::$_art_albums[$album_id] = $album_id; } //not found // If not readonly and not found - else { - return false; - } + else { + return false; + } $array = array($album => $album_id); - self::$albums = array_merge(self::$albums,$array); + self::$albums = array_merge(self::$albums,$array); unset($array); return $album_id; @@ -1944,35 +1926,9 @@ debug_event('prefix',$prefix_pattern,'3'); */ public static function check_tag($value,$object_id,$object_type='song') { - // First see if the tag exists at all - $tag_id = self::$tags[$value]; - - if ($tag_id) { - - // At least we know the tag but sadly we still have to check the map - $tag = new Tag($tag_id); - if ($tag->has_object($object_id,$object_type)) { - return $tag->id; - } - // Oooh well time to add it - Tag::add_tag_map($tag->id,$object_type,$object_id,'0'); - - return $tag->id; - - } // if cached already - - // Clean it up and try to create it - $value = Tag::clean_tag($value); - $tag = Tag::construct_from_name($value); - - // Figure out the ID so we can cache it - if (!$tag) { $insert_id = Tag::add_tag($object_type,$object_id,$value,'0'); } - else { $insert_id = $tag->id; } - - // Add to the cache - self::$tags[$value] = $insert_id; + $map_id = Tag::add($object_type,$object_id,$value,'0'); - return $insert_id; + return $map_id; } // check_tag @@ -2007,7 +1963,7 @@ debug_event('prefix',$prefix_pattern,'3'); /* Clean Up the tags */ $results = clean_tag_info($vainfo->tags,$key,$file); - + /* Set the vars here... so we don't have to do the '" . $blah['asd'] . "' */ $title = Dba::escape($results['title']); $artist = $results['artist']; @@ -2021,7 +1977,7 @@ debug_event('prefix',$prefix_pattern,'3'); $disk = $results['disk']; $year = $results['year']; $comment = $results['comment']; - $tag = $results['genre']; + $tag = $results['genre']; $current_time = time(); $lyrics = ' '; @@ -2038,29 +1994,29 @@ debug_event('prefix',$prefix_pattern,'3'); " VALUES ('$add_file','$this->id','$album_id','$artist_id','$title','$bitrate','$rate','$mode','$size','$song_time','$track','$current_time','$year')"; $db_results = Dba::query($sql); - if (!$db_results) { - debug_event('insert',"Unable to insert $file -- $sql" . Dba::error(),'5','ampache-catalog'); - Error::add('catalog_add','Error Adding ' . $file . ' SQL:' . $sql); - } + if (!$db_results) { + debug_event('insert',"Unable to insert $file -- $sql" . Dba::error(),'5','ampache-catalog'); + Error::add('catalog_add','Error Adding ' . $file . ' SQL:' . $sql); + } - $song_id = Dba::insert_id(); + $song_id = Dba::insert_id(); - self::check_tag($tag,$song_id); + self::check_tag($tag,$song_id); /* Add the EXT information */ - $sql = "INSERT INTO `song_data` (`song_id`,`comment`,`lyrics`) " . + $sql = "INSERT INTO `song_data` (`song_id`,`comment`,`lyrics`) " . " VALUES ('$song_id','$comment','$lyrics')"; - $db_results = Dba::query($sql); + $db_results = Dba::query($sql); if (!$db_results) { - debug_event('insert',"Unable to insert EXT Info for $file -- $sql",'5','ampache-catalog'); + debug_event('insert',"Unable to insert EXT Info for $file -- $sql",'5','ampache-catalog'); } } // insert_local_song /** * insert_remote_song - * takes the information gotten from XML-RPC and + * takes the information gotten from XML-RPC and * inserts it into the local database. The filename * ends up being the url. */ @@ -2069,14 +2025,14 @@ debug_event('prefix',$prefix_pattern,'3'); $url = Dba::escape($song->file); $title = self::check_title($song->title); $title = Dba::escape($title); - $current_time = time(); - + $current_time = time(); + $sql = "INSERT INTO song (file,catalog,album,artist,title,bitrate,rate,mode,size,time,track,addition_time,year)" . " VALUES ('$url','$song->catalog','$song->album','$song->artist','$title','$song->bitrate','$song->rate','$song->mode','$song->size','$song->time','$song->track','$current_time','$song->year')"; - $db_results = Dba::query($sql); + $db_results = Dba::query($sql); - if (!$db_results) { - debug_event('insert',"Unable to Add Remote $url -- $sql",'5','ampache-catalog'); + if (!$db_results) { + debug_event('insert',"Unable to Add Remote $url -- $sql",'5','ampache-catalog'); echo "Error Adding Remote $url
$sql
\n"; flush(); } @@ -2088,30 +2044,30 @@ debug_event('prefix',$prefix_pattern,'3'); * checks to see if a remote song exists in the database or not * if it find a song it returns the UID */ - public function check_remote_song($url) { + public function check_remote_song($url) { $url = Dba::escape($url); $sql = "SELECT `id` FROM `song` WHERE `file`='$url'"; - $db_results = Dba::query($sql); + $db_results = Dba::query($sql); - if (Dba::num_rows($db_results)) { + if (Dba::num_rows($db_results)) { return true; } - + return false; } // check_remote_song /** * check_local_mp3 - * Checks the song to see if it's there already returns true if found, false if not + * Checks the song to see if it's there already returns true if found, false if not */ public function check_local_mp3($full_file, $gather_type='') { $file_date = filemtime($full_file); if ($file_date < $this->last_add) { - debug_event('Check','Skipping ' . $full_file . ' File modify time before last add run','3'); + debug_event('Check','Skipping ' . $full_file . ' File modify time before last add run','3'); return true; } @@ -2133,23 +2089,23 @@ debug_event('prefix',$prefix_pattern,'3'); * import_m3u * this takes m3u filename and then attempts to create a Public Playlist based on the filenames * listed in the m3u - */ - public function import_m3u($filename) { + */ + public function import_m3u($filename) { $m3u_handle = fopen($filename,'r'); - + $data = fread($m3u_handle,filesize($filename)); - + $results = explode("\n",$data); - $pattern = '/\.(' . Config::get('catalog_file_pattern') . ')$/i'; + $pattern = '/\.(' . Config::get('catalog_file_pattern') . ')$/i'; // Foreach what we're able to pull out from the file foreach ($results as $value) { // Remove extra whitespace $value = trim($value); - if (preg_match($pattern,$value)) { + if (preg_match($pattern,$value)) { /* Translate from \ to / so basename works */ $value = str_replace("\\","/",$value); @@ -2157,34 +2113,34 @@ debug_event('prefix',$prefix_pattern,'3'); /* Search for this filename, cause it's a audio file */ $sql = "SELECT `id` FROM `song` WHERE `file` LIKE '%" . Dba::escape($file) . "'"; - $db_results = Dba::query($sql); - $results = Dba::fetch_assoc($db_results); + $db_results = Dba::query($sql); + $results = Dba::fetch_assoc($db_results); if (isset($results['id'])) { $songs[] = $results['id']; } } // if it's a file // Check to see if it's a url from this ampache instance - elseif (substr($value,0,strlen(Config::get('web_path'))) == Config::get('web_path')) { + elseif (substr($value,0,strlen(Config::get('web_path'))) == Config::get('web_path')) { $song_id = intval(Song::parse_song_url($value)); - - $sql = "SELECT COUNT(*) FROM `song` WHERE `id`='$song_id'"; - $db_results = Dba::query($sql); - - if (Dba::num_rows($db_results)) { - $songs[] = $song_id; - } + + $sql = "SELECT COUNT(*) FROM `song` WHERE `id`='$song_id'"; + $db_results = Dba::query($sql); + + if (Dba::num_rows($db_results)) { + $songs[] = $song_id; + } } // end if it's an http url } // end foreach line - debug_event('m3u_parse',"Parsing $filename - Found: " . count($songs) . " Songs",'5'); + debug_event('m3u_parse',"Parsing $filename - Found: " . count($songs) . " Songs",'5'); - if (count($songs)) { + if (count($songs)) { $name = "M3U - " . basename($filename,'.m3u'); - $playlist_id = Playlist::create($name,'public'); + $playlist_id = Playlist::create($name,'public'); - if (!$playlist_id) { return false; } + if (!$playlist_id) { return false; } /* Recreate the Playlist */ $playlist = new Playlist($playlist_id); @@ -2196,60 +2152,60 @@ debug_event('prefix',$prefix_pattern,'3'); } // import_m3u - /*! - @function merge_stats - @discussion merge stats entries - @param $type the object_type row in object_count to use - @param $oldid the old object_id - @param $newid the new object_id to merge to - @return the number of stats changed - @todo move this to the right file - */ - function merge_stats ($type,$oldid,$newid) { - - //check data - $accepted_types = array ("artist"); - if (!in_array($type,$accepted_types)) { return false; } - - //now retrieve all of type and oldid - $stats_qstring = "SELECT id,count,userid," . + /*! + @function merge_stats + @discussion merge stats entries + @param $type the object_type row in object_count to use + @param $oldid the old object_id + @param $newid the new object_id to merge to + @return the number of stats changed + @todo move this to the right file + */ + function merge_stats ($type,$oldid,$newid) { + + //check data + $accepted_types = array ("artist"); + if (!in_array($type,$accepted_types)) { return false; } + + //now retrieve all of type and oldid + $stats_qstring = "SELECT id,count,userid," . "(SELECT id FROM object_count WHERE object_type = '$type' AND object_id = '$newid' AND userid=o.userid) AS existingid " . "FROM object_count AS o WHERE object_type = '$type' AND object_id = '$oldid'"; - $stats_query = mysql_query($stats_qstring,dbh()); - $oldstats = array(); - //now collect needed data into a array - while ($stats_result = mysql_fetch_assoc($stats_query)) { - $userid = $stats_result['userid']; - $oldstats[$userid]['id'] = $stats_result['id']; - $oldstats[$userid]['count'] = $stats_result['count']; - $oldstats[$userid]['existingid'] = $stats_result['existingid']; - } - //now foreach that array, changeing/updateing object_count and if needed deleting old row - $num_changed = 0; - foreach ($oldstats as $userid => $stats) { - //first check if it is a update or insert - if (is_numeric($stats['existingid'])) { - - $stats_count_change_qstring = "UPDATE object_count SET count = count + '" . $stats['count'] . "' WHERE id = '" . $stats['existingid'] . "'"; - mysql_query($stats_count_change_qstring,dbh()); - - //then, delete old row - $old_stats_delete_qstring = "DELETE FROM object_count WHERE id ='" . $stats['id'] . "'"; - mysql_query($old_stats_delete_qstring,dbh()); - - $num_changed++; - } else { - //hasn't yet listened, just change object_id - $stats_artist_change_qstring = "UPDATE object_count SET object_id = '$newid' WHERE id ='" . $stats['id'] . "'"; - mysql_query($stats_artist_change_qstring,dbh()); - //done! - $num_changed++; - } - } - return $num_changed; - - } // merge_stats + $stats_query = mysql_query($stats_qstring,dbh()); + $oldstats = array(); + //now collect needed data into a array + while ($stats_result = mysql_fetch_assoc($stats_query)) { + $userid = $stats_result['userid']; + $oldstats[$userid]['id'] = $stats_result['id']; + $oldstats[$userid]['count'] = $stats_result['count']; + $oldstats[$userid]['existingid'] = $stats_result['existingid']; + } + //now foreach that array, changeing/updateing object_count and if needed deleting old row + $num_changed = 0; + foreach ($oldstats as $userid => $stats) { + //first check if it is a update or insert + if (is_numeric($stats['existingid'])) { + + $stats_count_change_qstring = "UPDATE object_count SET count = count + '" . $stats['count'] . "' WHERE id = '" . $stats['existingid'] . "'"; + mysql_query($stats_count_change_qstring,dbh()); + + //then, delete old row + $old_stats_delete_qstring = "DELETE FROM object_count WHERE id ='" . $stats['id'] . "'"; + mysql_query($old_stats_delete_qstring,dbh()); + + $num_changed++; + } else { + //hasn't yet listened, just change object_id + $stats_artist_change_qstring = "UPDATE object_count SET object_id = '$newid' WHERE id ='" . $stats['id'] . "'"; + mysql_query($stats_artist_change_qstring,dbh()); + //done! + $num_changed++; + } + } + return $num_changed; + + } // merge_stats /** * delete @@ -2258,29 +2214,29 @@ debug_event('prefix',$prefix_pattern,'3'); */ public static function delete($catalog_id) { - $catalog_id = Dba::escape($catalog_id); + $catalog_id = Dba::escape($catalog_id); // First remove the songs in this catalog $sql = "DELETE FROM `song` WHERE `catalog` = '$catalog_id'"; $db_results = Dba::query($sql); // Only if the previous one works do we go on - if (!$db_results) { return false; } + if (!$db_results) { return false; } // Next Remove the Catalog Entry it's self $sql = "DELETE FROM `catalog` WHERE `id` = '$catalog_id'"; $db_results = Dba::query($sql); // Run the Aritst/Album Cleaners... - self::clean($catalog_id); + self::clean($catalog_id); } // delete /*! @function remove_songs @discussion removes all songs sent in $songs array from the - database, it doesn't actually delete them... - */ + database, it doesn't actually delete them... + */ function remove_songs($songs) { foreach($songs as $song) { @@ -2304,11 +2260,11 @@ debug_event('prefix',$prefix_pattern,'3'); } $db_results = Dba::query($sql); - switch ($type) { - case 'itunes': + switch ($type) { + case 'itunes': echo xml_get_header('itunes'); - - while ($results = Dba::fetch_assoc($db_results)) { + + while ($results = Dba::fetch_assoc($db_results)) { $song = new Song($results['id']); $song->format(); @@ -2333,18 +2289,18 @@ debug_event('prefix',$prefix_pattern,'3'); } // while result echo xml_get_footer('itunes'); - break; + break; case 'csv': - echo "ID,Title,Artist,Album,Genre,Length,Track,Year,Date Added,Bitrate,Played,File\n"; - while ($results = Dba::fetch_assoc($db_results)) { - $song = new Song($results['id']); - $song->format(); - echo '"' . $song->id . '","' . $song->title . '","' . $song->artist_full . '","' . $song->album_full . + echo "ID,Title,Artist,Album,Genre,Length,Track,Year,Date Added,Bitrate,Played,File\n"; + while ($results = Dba::fetch_assoc($db_results)) { + $song = new Song($results['id']); + $song->format(); + echo '"' . $song->id . '","' . $song->title . '","' . $song->artist_full . '","' . $song->album_full . '","' . $song->f_genre . '","' . $song->f_time . '","' . $song->f_track . '","' . $song->year . '","' . date("Y-m-d\TH:i:s\Z",$song->addition_time) . '","' . $song->f_bitrate . '","' . $song->played . '","' . $song->file . "\n"; - } - break; + } + break; } // end switch } // export diff --git a/lib/class/database_object.abstract.php b/lib/class/database_object.abstract.php index 2005da55..5c6020c6 100644 --- a/lib/class/database_object.abstract.php +++ b/lib/class/database_object.abstract.php @@ -31,6 +31,14 @@ abstract class database_object { // Statistics for debugging public static $cache_hit = 0; + /** + * get_info + * retrieves the info from the database and puts it in the cache + * + * @param string $id + * @param string $table_name + * @return array + */ public function get_info($id,$table_name='') { $table_name = $table_name ? Dba::escape($table_name) : Dba::escape(strtolower(get_class($this))); @@ -58,19 +66,26 @@ abstract class database_object { */ public static function is_cached($index,$id) { - $is_cached = isset(self::$object_cache[$index][$id]); - - return $is_cached; + return isset(self::$object_cache[$index][$id]); } // is_cached /** - * get_from_cache + * get_from_cache * This attempts to retrive the specified object from the cache we've got here + * + * @param string $index + * @param string $id + * @return array */ public static function get_from_cache($index,$id) { - if (isset(self::$object_cache[$index][$id])) { + // Check if the object is set + if (isset(self::$object_cache) + && isset(self::$object_cache[$index]) + && isset(self::$object_cache[$index][$id]) + ) { + self::$cache_hit++; return self::$object_cache[$index][$id]; } @@ -82,12 +97,22 @@ abstract class database_object { /** * add_to_cache * This adds the specified object to the specified index in the cache + * + * @param string $index + * @param string $id + * @param array $data + * @return boolean */ public static function add_to_cache($index,$id,$data) { - - self::$object_cache[$index][$id] = $data; - - return true; + $hasbeenset = false; + + // Set the data if it is set + if (isset($data)) { + self::$object_cache[$index][$id] = $data; + $hasbeenset = true; + } + + return $hasbeenset; } // add_to_cache diff --git a/lib/class/playlist.class.php b/lib/class/playlist.class.php index 37b645d1..5c66e0be 100644 --- a/lib/class/playlist.class.php +++ b/lib/class/playlist.class.php @@ -43,7 +43,7 @@ class Playlist extends database_object { */ public function __construct($id) { - $info = $this->get_info($id); + $info = $this->get_info($id); foreach ($info as $key=>$value) { $this->$key = $value; diff --git a/lib/class/radio.class.php b/lib/class/radio.class.php index 09ac9876..ee3cf4aa 100644 --- a/lib/class/radio.class.php +++ b/lib/class/radio.class.php @@ -25,7 +25,7 @@ * This handles the internet radio stuff, that is inserted into live_stream * this can include podcasts or what-have-you */ -class Radio { +class Radio extends database_object { /* DB based variables */ public $id; @@ -42,11 +42,7 @@ class Radio { */ public function __construct($id) { - $this->id = intval($id); - - if (!$this->id) { return false; } - - $info = $this->_get_info(); + $info = $this->get_info($id,'live_stream'); // Set the vars foreach ($info as $key=>$value) { @@ -55,23 +51,6 @@ class Radio { } // constructor - /** - * _get_info - * Private function for getting the information for this object from the database - */ - private function _get_info() { - - $id = Dba::escape($this->id); - - $sql = "SELECT * FROM `live_stream` WHERE `id`='$id'"; - $db_results = Dba::query($sql); - - $results = Dba::fetch_assoc($db_results); - - return $results; - - } // _get_info - /** * format * This takes the normal data from the database and makes it pretty diff --git a/lib/class/song.class.php b/lib/class/song.class.php index 6c97383f..5b94ac38 100644 --- a/lib/class/song.class.php +++ b/lib/class/song.class.php @@ -94,7 +94,9 @@ class Song extends database_object { parent::add_to_cache('song',$row['id'],$row); $artists[$row['artist']] = $row['artist']; $albums[$row['album']] = $row['album']; - $tags[$row['tag_id']] = $row['tag_id']; + if ($row['tag_id']) { + $tags[$row['tag_id']] = $row['tag_id']; + } } Artist::build_cache($artists); @@ -362,6 +364,15 @@ class Song extends database_object { foreach ($data as $key=>$value) { switch ($key) { + case 'artist': + // Don't do anything if we've negative one'd this baby + if ($value == '-1') { + $value = Catalog::check_artist($data['artist_name']); + } + case 'album': + if ($value == '-1') { + $value = Catalog::check_album($data['album_name']); + } case 'title': case 'track': // Check to see if it needs to be updated @@ -372,8 +383,6 @@ class Song extends database_object { $updated = 1; } break; - case 'artist': - case 'album': default: // Rien a faire break; @@ -677,11 +686,12 @@ class Song extends database_object { // Get the top tags $tags = Tag::get_top_tags('song',$this->id); - $this->f_tags = ''; - foreach ($tags as $tag_id) { + + foreach ($tags as $tag_id=>$values) { $tag = new Tag($tag_id); - $this->f_tags .= $tag->name . ', '; + $tag->format('song',$this->id); + $this->f_tags .= $tag->f_name . ', '; } $this->f_tags = rtrim($this->f_tags,', '); @@ -909,7 +919,7 @@ class Song extends database_object { $conf_var = 'transcode_' . $this->type; $conf_type = 'transcode_' . $this->type . '_target'; - + if (Config::get($conf_var)) { $this->_transcode = true; debug_event('auto_transcode','Transcoding to ' . $this->type,'5'); diff --git a/lib/class/stats.class.php b/lib/class/stats.class.php index 9f5cfdae..b57bb56e 100644 --- a/lib/class/stats.class.php +++ b/lib/class/stats.class.php @@ -1,7 +1,7 @@ $value) { - $tag->$key = $value; + if ($type) { + $this->set_object($type,$object_id); } - return $tag; + $size = 3 + ($this->weight-1) - ($this->count-1); + if ($size > 4) { $size = 4; } + + if ($this->owner == $GLOBALS['user']->id) { + $action = '?page=tag&action=remove_tag&type=' . scrub_out($type) . '&tag_id=' . intval($this->id) . '&object_id=' . intval($object_id); + $class = "hover-remove "; + } + else { + $action = '?page=tag&action=add_tag&type=' . scrub_out($type) . '&tag_id=' . intval($this->id) . '&object_id=' . intval($object_id); + $class = "hover-add "; + } + + $class .= 'tag_size' . $size; + + $this->f_name = Ajax::text($action,$this->name,'modify_tag_' . $this->id . '_' . $object_id,'',$class); + + } // format + + /** + * set_object + * This assoicates the tag with a specified object, we try to get the data + * from the map cache, otherwise I guess we'll just have to look it up + */ + public function set_object($type,$object_id) { + + if (parent::is_cached('tag_top_' . $type,$object_id)) { + $data = parent::get_from_cache('tag_top_' . $type,$object_id); + } + else { + $data = self::get_top_tags($type,$object_id); + } + + $this->weight = $data[$this->id]['count']; + + if (in_array($GLOBALS['user']->id,$data[$this->id]['users'])) { + $this->owner = $GLOBALS['user']->id; + } - } // construct_from_name + $this->count = count($data); + + } // set_object /** * build_cache @@ -76,13 +124,13 @@ class Tag extends database_object { * in a single query, cuts down on the connections */ public static function build_cache($ids) { - + if (!is_array($ids) OR !count($ids)) { return false; } $idlist = '(' . implode(',',$ids) . ')'; $sql = "SELECT * FROM `tag` WHERE `id` IN $idlist"; - $db_results = Dba::query($sql); + $db_results = Dba::read($sql); while ($row = Dba::fetch_assoc($db_results)) { parent::add_to_cache('tag',$row['id'],$row); @@ -102,18 +150,20 @@ class Tag extends database_object { $type = self::validate_type($type); $idlist = '(' . implode(',',$ids) . ')'; - $sql = "SELECT COUNT(`tag_map`.`id`) AS `count`,`tag`.`id`,`tag_map`.`object_id` FROM `tag_map` " . - "INNER JOIN `tag` ON `tag`.`id`=`tag_map`.`tag_id` " . - "WHERE `tag_map`.`object_type`='$type' AND `tag_map`.`object_id` IN $idlist " . - "GROUP BY `tag_map`.`object_id` ORDER BY `count` DESC"; + $sql = "SELECT `tag_map`.`tag_id`,`tag_map`.`object_id`,`tag_map`.`user` FROM `tag_map` " . + "WHERE `tag_map`.`object_type`='$type' AND `tag_map`.`object_id` IN $idlist "; $db_results = Dba::query($sql); + $tags = array(); + while ($row = Dba::fetch_assoc($db_results)) { - $tags[$row['object_id']][] = $row; + $tags[$row['object_id']][$row['tag_id']]['users'][] = $row['user']; + $tags[$row['object_id']][$row['tag_id']]['count']++; } - foreach ($tags as $id=>$entry) { - parent::add_to_cache('tag_map_' . $type,$id,$entry); + // Run through our origional ids as we want to cache NULL results + foreach ($ids as $id) { + parent::add_to_cache('tag_top_' . $type,$id,$tags[$id]); } return true; @@ -121,61 +171,60 @@ class Tag extends database_object { } // build_map_cache /** - * has_object - * This checks to see if the current tag element has the specified object - * of the specified type + * add + * This is a wrapper function, it figures out what we need to add, be it a tag + * and map, or just the mapping */ - public function has_object($object_type,$object_id) { + public static function add($type,$id,$value,$user='') { - $object_type = self::validate_type($object_type); - $object_id = intval($object_id); - $tag_id = intval($this->id); - - $sql = "SELECT * FROM `tag_map` WHERE `object_type`='$object_type' AND `object_id`='$object_id' " . - " AND `tag_id`='$tag_id'"; - $db_results = Dba::query($sql); + // Validate the tag type + if (!self::validate_type($type)) { return false; } + + if (!is_numeric($id)) { return false; } + + $cleaned_value = self::clean_tag($value); + + if (!strlen($cleaned_value)) { return false; } + + $uid = ($user == '') ? intval($user) : intval($GLOBALS['user']->id); + + // Check and see if the tag exists, if not create it, we need the tag id from this + if (!$tag_id = self::tag_exists($cleaned_value)) { + $tag_id = self::add_tag($cleaned_value); + } + + if (!$tag_id) { + debug_event('Error','Error unable to create tag value:' . $cleaned_value . ' unknown error','1'); + return false; + } + + // We've got the tag id, let's see if it's already got a map, if not then create the map and return the value + if (!$map_id = self::tag_map_exists($type,$id,$tag_id,$user)) { + $map_id = self::add_tag_map($type,$id,$tag_id,$user); + } - return Dba::num_rows($db_results); + return $map_id; - } // has_object + } // add /** * add_tag * This function adds a new tag, for now we're going to limit the tagging a bit */ - public static function add_tag($type, $id, $tagval,$user='') { + public static function add_tag($value) { - if (!self::validate_type($type)) { - return false; - } - if (!is_numeric($id)) { - return false; - } - // Clean it up and make it tagish - $tagval = self::clean_tag($tagval); + $value = self::clean_tag($value); - if (!strlen($tagval)) { return false; } + if (!strlen($value)) { return false; } - $uid = ($user == '') ? intval($user) : intval($GLOBALS['user']->id); - $tagval = Dba::escape($tagval); - $type = Dba::escape($type); - $id = intval($id); - - // Check if tag object exists - $sql = "SELECT `tag`.`id` FROM `tag` WHERE `name`='$tagval'"; - $db_results = Dba::query($sql) ; - $row = Dba::fetch_assoc($db_results); - $insert_id = $row['id']; - - // If the tag doesn't exist create it. - if (!count($row)) { - $sql = "INSERT INTO `tag` SET `name`='$tagval'"; - $db_results = Dba::query($sql) ; - $insert_id = Dba::insert_id(); - } + $value = Dba::escape($value); + + $sql = "REPLACE INTO `tag` SET `name`='$value'"; + $db_results = Dba::write($sql); + $insert_id = Dba::insert_id(); - self::add_tag_map($insert_id,$type,$id); + parent::add_to_cache('tag_name',$value,$insert_id); return $insert_id; @@ -185,98 +234,107 @@ class Tag extends database_object { * add_tag_map * This adds a specific tag to the map for specified object */ - public static function add_tag_map($tag_id,$object_type,$object_id,$user='') { + public static function add_tag_map($type,$object_id,$tag_id,$user='') { $uid = ($user == '') ? intval($GLOBALS['user']->id) : intval($user); $tag_id = intval($tag_id); - $type = self::validate_type($object_type); + if (!self::validate_type($type)) { return false; } $id = intval($object_id); + + if (!$tag_id || !$id) { return false; } + + $sql = "INSERT INTO `tag_map` (`tag_id`,`user`,`object_type`,`object_id`) " . + "VALUES ('$tag_id','$uid','$type','$id')"; + $db_results = Dba::write($sql); + $insert_id = Dba::insert_id(); - // Now make sure this isn't a duplicate - $sql = "SELECT * FROM `tag_map " . - "WHERE `tag_id`='$insert_id' AND `user`='$uid' AND `object_type`='$type' AND `object_id`='$id'"; - $db_results = Dba::query($sql); - - $row = Dba::fetch_assoc($db_results); - - // Only insert it if the current tag for this user doesn't exist - if (!count($row)) { - $sql = "INSERT INTO `tag_map` (`tag_id`,`user`,`object_type`,`object_id`) " . - "VALUES ('$tag_id','$uid','$type','$id')"; - $db_results = Dba::query($sql); - $insert_id = Dba::insert_id(); - } - else { - $insert_id = $row['id']; - } + parent::add_to_cache('tag_map_' . $type,$insert_id,array('tag_id'=>$tag_id,'user'=>$uid,'object_type'=>$type,'object_id'=>$id)); return $insert_id; } // add_tag_map /** - * get_many_tags - * This builds a cache of all of the tags contained by the specified object ids - * of the specified type + * tag_exists + * This checks to see if a tag exists, this has nothing to do with objects or maps */ - public static function get_many_tags($type, $object_ids) { + public static function tag_exists($value) { + + if (parent::is_cached('tag_name',$value)) { + return parent::get_from_cache('tag_name',$value); + } + + $value = Dba::escape($value); + $sql = "SELECT * FROM `tag` WHERE `name`='$value'"; + $db_results = Dba::read($sql); - // If they pass us nothing, they get nothing - if (!count($object_ids)) { return array(); } - if (!self::validate_type($type)) { return array(); } + $results = Dba::fetch_assoc($db_results); - $lid = '(' . implode(',',$id) . ')'; - $orsql = ''; + parent::add_to_cache('tag_name',$results['name'],$results['id']); + + return $results['id']; + + } // tag_exists + + /** + * tag_map_exists + * This looks to see if the current mapping of the current object of the current tag of the current + * user exists, lots of currents... taste good in scones. + */ + public static function tag_map_exists($type,$object_id,$tag_id,$user) { + + if (!self::validate_type($type)) { return false; } - if ($objType == 'artist' || $objType == 'album') - $orsql=" or (tag_map.object_id = song.id AND tag_map.object_type='song' and song.$objType in $lid )"; - if ($objType == 'artist') - $orsql .= "or (tag_map.object_id = album.id AND tag_map.object_type='album' and $objType.id in $lid )"; - $sql = "SELECT DISTINCT tag.id, tag.name, tag_map.user, $objType.id as oid FROM tag, tag_map, song, artist, album WHERE " . - "tag_map.tag_id = tag.id AND ( (tag_map.object_type='$objType' AND $objType.id in $lid AND tag_map.object_id = $objType.id) $orsql) " . - "AND song.album = album.id AND song.artist = artist.id;"; -return array(); - $results = array(); - - $db_results = Dba::query($sql) or die(Dba::error()); - - while ($r = Dba::fetch_assoc($db_results)) { - $uid = intval($r['oid']); - $results[] = $r; + if (parent::is_cached('tag_map_' . $type,$object_id)) { + $data = parent::get_from_cache('tag_map_' . $type,$object_id); + return $data['id']; } - //return self::filter_with_prefs($results); - return $results; + $object_id = Dba::escape($object_id); + $tag_id = Dba::escape($tag_id); + $user = Dba::escape($user); + $type = Dba::escape($type); - } // get_man_tags + $sql = "SELECT * FROM `tag_map` WHERE `tag_id`='$tag_id' AND `user`='$user' AND `object_id`='$object_id' AND `object_type`='$type'"; + $db_results = Dba::read($sql); + + $results = Dba::fetch_assoc($db_results); + + parent::add_to_cache('tag_map_' . $type,$results['id'],$results); + + return $results['id']; + + } // tag_map_exists /** * get_top_tags * This gets the top tags for the specified object using limit */ - public static function get_top_tags($type,$object_id,$limit='2') { + public static function get_top_tags($type,$object_id,$limit='10') { - $type = self::validate_type($type); + if (!self::validate_type($type)) { return false; } - if (parent::is_cached('tag_map_' . $type,$object_id)) { - return parent::get_from_cache('tag_map_' . $type,$object_id); + if (parent::is_cached('tag_top_' . $type,$object_id)) { + return parent::get_from_cache('tag_top_' . $type,$object_id); } $object_id = intval($object_id); $limit = intval($limit); - $sql = "SELECT COUNT(`tag_map`.`id`) AS `count`,`tag`.`id` FROM `tag_map` " . - "INNER JOIN `tag` ON `tag`.`id`=`tag_map`.`tag_id` " . + $sql = "SELECT `tag_map`.`tag_id`,`tag_map`.`user` FROM `tag_map` " . "WHERE `tag_map`.`object_type`='$type' AND `tag_map`.`object_id`='$object_id' " . - "GROUP BY `tag_map`.`object_id` ORDER BY `count` DESC LIMIT $limit"; + "LIMIT $limit"; $db_results = Dba::query($sql); $results = array(); while ($row = Dba::fetch_assoc($db_results)) { - $results[] = $row['id']; + $results[$row['tag_id']]['users'][] = $row['user']; + $results[$row['tag_id']]['count']++; } + parent::add_to_cache('tag_top_' . $type,$object_id,$results); + return $results; } // get_top_tags @@ -364,6 +422,26 @@ return array(); } // filter_with_prefs + /** + * remove_map + * This will only remove tag maps for the current user + */ + public function remove_map($type,$object_id) { + + if (!self::validate_type($type)) { return false; } + + $type = Dba::escape($type); + $tag_id = Dba::escape($this->id); + $object_id = Dba::escape($object_id); + $user_id = Dba::escape($GLOBALS['user']->id); + + $sql = "DELETE FROM `tag_map` WHERE `tag_id`='$tag_id' AND `object_type`='$type' AND `object_id`='$object_id' AND `user`='$user_id'"; + $db_results = Dba::write($sql); + + return true; + + } // remove_map + /** * validate_type * This validates the type of the object the user wants to tag, we limit this to types diff --git a/lib/class/update.class.php b/lib/class/update.class.php index 4ddab260..f09047cc 100644 --- a/lib/class/update.class.php +++ b/lib/class/update.class.php @@ -1398,5 +1398,27 @@ class Update { } // update_350002 + /** + * update_350003 + * This update tweakes the tag tables a little bit more, we're going to simplify things for the first little bit and then + * then if it all works out we will worry about making it complex again. One thing at a time people... + */ + public static function update_350003() { + + $sql = "ALTER TABLE `tag` DROP `order`"; + $db_results = Dba::write($sql); + + $sql = "ALTER TABLE `tag` DROP INDEX `order`"; + $db_results = Dba::write($sql); + + $sql = "ALTER TABLE `tag` ADD UNIQUE ( `name` )"; + $db_results = Dba::write($sql); + + $sql = "ALTER TABLE `tag` CHANGE `name` `name` VARCHAR( 255 )"; + $db_results = Dba::write($sql); + + + } // update_350003 + } // end update class ?> diff --git a/lib/class/vainfo.class.php b/lib/class/vainfo.class.php index fb668078..80fed827 100644 --- a/lib/class/vainfo.class.php +++ b/lib/class/vainfo.class.php @@ -115,7 +115,7 @@ class vainfo { $this->_getID3->option_tag_lyrics3 = false; $this->_getID3->encoding = $this->encoding; $this->_getID3->encoding_id3v1 = $this->encoding_id3v1; - $this->_getID3->encoding_id3v2 = $this->encoding_id3v2; +// $this->_getID3->encoding_id3v2 = $this->encoding_id3v2; $this->_getID3->option_tags_process = true; /* Check for ICONV */ @@ -139,7 +139,7 @@ class vainfo { $this->_raw = $this->_getID3->analyze($this->filename); } catch (Exception $error) { - debug_event('getid3',$error->message,'1'); + debug_event('getid3',$error->message,'1'); } /* Figure out what type of file we are dealing with */ -- cgit