summaryrefslogtreecommitdiffstats
path: root/modules/class/album.php
diff options
context:
space:
mode:
Diffstat (limited to 'modules/class/album.php')
-rw-r--r--modules/class/album.php463
1 files changed, 463 insertions, 0 deletions
diff --git a/modules/class/album.php b/modules/class/album.php
new file mode 100644
index 00000000..c95a8ff6
--- /dev/null
+++ b/modules/class/album.php
@@ -0,0 +1,463 @@
+<?php
+/*
+ Copyright (c) 2004
+ Ampache.org
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+/*!
+ @header Album Class
+*/
+
+class Album {
+
+ /* Variables from DB */
+ var $id;
+ var $name;
+ var $year;
+ var $prefix;
+
+ /*!
+ @function Album
+ @discussion Album class, for modifing a song.
+ @param $album_id The ID of the song
+ */
+ function Album($album_id = 0) {
+
+ /* If we have passed an id then do something */
+ if ($album_id) {
+
+ /* Assign id for use in get_info() */
+ $this->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 = "<a href=\"$web_path/albums.php?action=show&amp;album=" . $this->id . "\" title=\"" . $this->name . "\">" . $name . "</a>";
+ $this->f_songs = "<div align=\"center\">" . $this->songs . "</div>";
+ if ($this->artist_count == '1') {
+ $this->f_artist = "<a href=\"$web_path/artists.php?action=show&amp;artist=" . $this->artist_id . "\">" . $this->artist . "</a>";
+ }
+ 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 "<font class=\"error\">" . _("Error: Unable to open") . " $dir</font><br />\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
+
+?>