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
?>