id = $album_id; /* Get the information from the db */ if ($info = $this->get_info()) { /* Assign Vars */ $this->name = trim($info->prefix . " " . $info->album_name); $this->songs = $info->song_count; $this->artist_count = $info->artist_count; $this->year = $info->year; $this->artist = trim($info->artist_prefix . " " . $info->artist_name); $this->artist_id = $info->art_id; $this->album = $info->album_name; $this->prefix = $info->prefix; } // if info } // if album_id } //constructor /*! @function get_info @discussion get's the vars for $this out of the database @param $this->id Taken from the object */ function get_info() { /* Grab the basic information from the catalog and return it */ $sql = "SELECT COUNT(DISTINCT(song.artist)) as artist_count,album.prefix,album.year,album.name AS album_name,COUNT(song.id) AS song_count," . "artist.name AS artist_name,artist.id AS art_id,artist.prefix AS artist_prefix ". "FROM song,artist,album WHERE album.id='$this->id' AND song.album=album.id AND song.artist=artist.id GROUP BY song.album"; $db_results = mysql_query($sql, dbh()); $results = mysql_fetch_object($db_results); return $results; } //get_info /*! @function get_songs @discussion gets the songs for this album */ function get_songs($limit = 0) { $results = array(); $sql = "SELECT id FROM song WHERE album='$this->id' ORDER BY track, title"; if ($limit) { $sql .= " LIMIT $limit"; } $db_results = mysql_query($sql, dbh()); while ($r = mysql_fetch_object($db_results)) { $results[] = new Song($r->id); } return $results; } // get_songs /*! @function format_album @dicussion reformats this object with f_name, f_songs and f_artist that contain links etc... */ function format_album() { $web_path = conf('web_path'); /* Truncate the string if it's to long */ $name = truncate_with_ellipse($this->name,conf('ellipse_threshold_album')); $this->f_name = "id . "\" title=\"" . $this->name . "\">" . $name . ""; $this->f_songs = "
" . $this->songs . "
"; if ($this->artist_count == '1') { $this->f_artist = "artist_id . "\">" . $this->artist . ""; } else { $this->f_artist = _("Various"); } if ($this->year == '0') { $this->year = "N/A"; } } // format_album /*! @function get_art @discussion get art wrapper function */ function get_art($fast = 0) { /* Check DB first */ if ($image = $this->get_db_art()) { return $image; } /* Stop here if we are doing the fast art */ if ($fast) { return false; } /* Create Base Vars */ $album_art_order = array(); /* Attempt to retrive the album art order */ $config_value = conf('album_art_order'); $class_methods = get_class_methods('Album'); /* If it's not set */ if (empty($config_value)) { $album_art_order = array('id3','folder','amazon'); } elseif (!is_array($config_value)) { $album_art_order = array_push($album_art_order,$config_value); } else { $album_art_order = array_merge($album_art_order, conf('album_art_order')); } foreach ($album_art_order AS $method) { $method_name = "get_" . $method . "_art"; if (in_array($method_name,$class_methods)) { if ($this->{$method_name}()) { return $this->get_db_art(); } // if method finds the art } // if the method exists } // end foreach return false; } // get_art /*! @function get_id3_art @discussion looks for art from the id3 tags */ function get_id3_art() { $songs = $this->get_songs(); // Foreach songs in this album foreach ($songs as $song) { // If we find a good one, stop looking $getID3 = new getID3(); $id3 = $getID3->analyze($song->file); if ($id3['format_name'] == "WMA") { $image = $id3['asf']['extended_content_description_object']['content_descriptors']['13']; } else { $image = $id3['id3v2']['APIC']['0']; } if ($image) { $art = $image['data']; $mime = $image['mime']; // Stick it in the db for next time $sql = "UPDATE album SET art = '" . sql_escape($art) . "'," . " art_mime = '" . sql_escape($mime) . "'" . " WHERE id = '" . $this->id . "'"; $db_result = mysql_query($sql, dbh()); return true; } // end if image } // end foreach return false; } // get_id3_art /*! @function get_folder_art() @discussion returns the album art from the folder of the mp3s */ function get_folder_art() { $songs = $this->get_songs(); /* See if we are looking for a specific filename */ $preferred_filename = conf('album_art_preferred_filename'); /* Thanks to dromio for origional code */ /* Added search for any .jpg, png or .gif - Vollmer */ foreach($songs as $song) { $dir = dirname($song->file); /* Open up the directory */ $handle = @opendir($dir); if (!is_resource($handle)) { echo "" . _("Error: Unable to open") . " $dir
\n"; if (conf('debug')) { log_event($GLOBALS['user']->username,' read ',"Error: Unable to open $dir for album art read"); } } /* Recurse through this dir and create the files array */ while ( FALSE !== ($file = @readdir($handle)) ) { $extension = substr($file,strlen($file)-3,4); /* If it's an image file */ if ($extension == "jpg" || $extension == "gif" || $extension == "png" || $extension == "jp2") { if ($file == $preferred_filename) { $found = 1; $album_art_filename = array('file' => $file, 'ext' => $extension); break; } elseif (!$preferred_filename) { $found = 1; $album_art_filename = array('file' => $file, 'ext' => $extension); break; } else { $found = 1; $album_art_filename = array('file' => $file, 'ext' => $extension); } } // end if it's an image } // end while reading dir @closedir($handle); if ($found) { $handle = fopen($dir."/".$album_art_filename['file'], "rb"); $mime = "image/" . $album_art_filename['ext']; $art = ''; while(!feof($handle)) { $art .= fread($handle, 1024); } fclose($handle); $sql = "UPDATE album SET art = '" . sql_escape($art) . "'," . " art_mime = '" . sql_escape($mime) . "'" . " WHERE id = '$this->id'"; $db_results = mysql_query($sql, dbh()); return true; } // if found } // end foreach songs return false; } // get_folder_art() /*! @function get_db_art() @discussion returns the album art from the db */ function get_db_art() { $sql = "SELECT art,art_mime FROM album WHERE id='$this->id' AND art_mime IS NOT NULL"; $db_results = mysql_query($sql, dbh()); $results = mysql_fetch_object($db_results); return $results; } // get_db_art /*! @function get_amazon_art @discussion searches amazon for the album art */ function get_amazon_art() { return $this->find_art(); } // get_amazon_art /*! @function get_random_songs @discussion gets a random number, and a random assortment of songs from this album */ function get_random_songs() { $results = array(); $sql = "SELECT id FROM song WHERE album='$this->id' ORDER BY RAND() LIMIT " . rand(1,$this->songs); $db_results = mysql_query($sql, dbh()); while ($r = mysql_fetch_array($db_results)) { $results[] = $r[0]; } return $results; } // get_random_songs /*! @function clear_art @discussion clears the album art from the DB */ function clear_art() { $sql = "UPDATE album SET art=NULL, art_mime=NULL WHERE id='$this->id'"; $db_results = mysql_query($sql, dbh()); } // clear_art /*! @function find_art @discussion searches amazon or a url for the album art //FIXME: Rename this POS */ function find_art($coverurl = '') { // No coverurl specified search amazon if (empty($coverurl)) { $amazon = new AmazonSearch(conf('amazon_developer_key')); // Prevent the script from timing out set_time_limit(0); $search_term = $this->artist . " " . $this->name; $amazon->search(array('artist' => $this->artist, 'album' => $this->name, 'keywords' => $serch_term)); // Only do the second search if the first actually returns something if (count($amazon->results)) { $amazon->lookup($amazon->results); } /* Log this if we're doin debug */ if (conf('debug')) { log_event($_SESSION['userdata']['username'],' amazon-xml ',"Searched using $search_term with " . conf('amazon_developer_key') . " as key " . count($amazon->results) . " results found"); } //FIXME: For now just pull the first one we find foreach ($amazon->results as $key=>$value) { $results = $value; break; } //FIXME: } // if no cover // If we've specified a coverurl, create a fake Amazon array with it else { $results = array('LargeImage' => $coverurl); } // If we have results of some kind if (is_array($results)) { /* Recurse through the images found */ $possible_keys = array("LargeImage","MediumImage","SmallImage"); foreach ($possible_keys as $key) { if (strlen($results[$key])) { break; } } // foreach // Rudimentary image type detection, only JPG and GIF allowed. if (substr($results[$key], -4 == ".jpg")) { $mime = "image/jpg"; } elseif (substr($results[$key], -4 == ".gif")) { $mime = "image/gif"; } else { return false; } /* Create Snoopy Object and pull info */ $snoopy = new Snoopy; $snoopy->fetch($results[$key]); $art = $snoopy->results; // Skip 1x1 size images if (function_exists('ImageCreateFromString')) { $im = @ImageCreateFromString($art); if (@imagesx($im) == 1 || @imagesy($im) == 1 && $im) { return false; } } // Push the image into the database $sql = "UPDATE album SET art = '" . sql_escape($art) . "'," . " art_mime = '" . sql_escape($mime) . "'" . " WHERE id = '$this->id'"; $db_results = mysql_query($sql, dbh()); return true; } // if we've got something /* Default to false */ return false; } // find_art /*! @function get_song_ids @discussion returns a list of song_ids on the album get_songs returns a list of song objects */ // it seems get_songs really should call this, // but I don't feel comfortable imposing that - RCR function get_song_ids( $limit = 0 ) { $results = array(); $sql = "SELECT id FROM song WHERE album='$this->id' ORDER BY track, title"; if ($limit) { $sql .= " LIMIT $limit"; } $db_results = mysql_query($sql, dbh()); while ($r = mysql_fetch_object($db_results)) { $results[] = $r->id; } return( $results ); } // get_song_ids } //end of album class ?>