diff options
Diffstat (limited to 'modules/class/song.php')
-rw-r--r-- | modules/class/song.php | 657 |
1 files changed, 657 insertions, 0 deletions
diff --git a/modules/class/song.php b/modules/class/song.php new file mode 100644 index 00000000..f42f55a8 --- /dev/null +++ b/modules/class/song.php @@ -0,0 +1,657 @@ +<? +/* + + Copyright (c) 2004 Ampache.org + All rights reserved. + + 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 Song Class +*/ + +class Song { + + /* Variables from DB */ + var $id; + var $file; + var $album; + var $artist; + var $title; + var $year; + var $comment; + var $bitrate; + var $rate; + var $mode; + var $size; + var $time; + var $track; + var $genre; + var $type; + var $mime; + var $played; + var $addition_time; + var $update_time; + + /*! + @function Song + @discussion Song class, for modifing a song. + @param $song_id The ID of the song + */ + function Song($song_id = 0) { + + /* If we have passed an id then do something */ + if ($song_id) { + + /* Assign id for use in get_info() */ + $this->id = $song_id; + + /* Get the information from the db */ + if ($info = $this->get_info()) { + + /* Assign Vars */ + $this->file = $info->file; + $this->album = $info->album; + $this->artist = $info->artist; + $this->title = $info->title; + $this->comment = $info->comment; + $this->year = $info->year; + $this->bitrate = $info->bitrate; + $this->rate = $info->rate; + $this->mode = $info->mode; + $this->size = $info->size; + $this->time = $info->time; + $this->track = $info->track; + $this->genre = $info->genre; + $this->addition_time = $info->addition_time; + $this->catalog = $info->catalog; + $this->played = $info->played; + $this->update_time = $info->update_time; + $this->flagid = $info->flagid; + $this->flaguser = $info->flaguser; + $this->flagtype = $info->flagtype; + $this->flagcomment = $info->flagcomment; + $this->status = $info->status; + + // Format the Type of the song + $this->format_type(); + } + + } + + } //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 song.id,file,catalog,album,song.comment,year,artist,". + "title,bitrate,rate,mode,size,time,track,genre,played,status,update_time,". + "addition_time,flagged.id as flagid,flagged.user as flaguser,flagged.type ". + "as flagtype,flagged.date as flagdate,flagged.comment as flagcomment FROM ". + "song LEFT JOIN flagged ON song.id = flagged.song WHERE song.id = '$this->id'"; + $db_results = mysql_query($sql, dbh()); + + $results = mysql_fetch_object($db_results); + + return $results; + + } //get_info + + /*! + @function format_type + @discussion gets the type of song we are trying to + play, used to set mime headers and to trick + players into playing them correctly + */ + function format_type() { + + preg_match('/\.([A-Za-z0-9]+)$/', $this->file,$results); + + $this->type = $results[1]; + + switch ($this->type) { + case "spx": + case "ogg": + $this->mime = "application/x-ogg"; + break; + case "wma": + case "WMA": + case "asf": + $this->mime = "audio/x-ms-wma"; + break; + case "mp3": + case "mpeg3": + $this->mime = "audio/mpeg"; + break; + case "rm": + $this->mime = "audio/x-realaudio"; + break; + case "flac"; + $this->mime = "audio/x-flac"; + break; + case 'aac': + case 'mp4': + case 'm4a': + $this->mime = "audio/mp4"; + break; + case 'mpc': + $this->mime = "audio/x-musepack"; + break; + default: + $this->mime = "audio/mpeg"; + break; + } + + } // get_type + /*! + @function get_album_songs + @discussion gets an array of song objects based on album + */ + function get_album_songs($album_id) { + + $sql = "SELECT id FROM song WHERE album='$album_id'"; + $db_results = mysql_query($sql, libglue_param(libglue_param('dbh_name'))); + + while ($r = mysql_fetch_object($db_results)) { + $results[] = new Song($r->id); + } + + return $results; + + } // get_album_songs + + /*! + @function get_album_name + @discussion gets the name of $this->album + */ + function get_album_name() { + + $sql = "SELECT name,prefix FROM album WHERE id='$this->album'"; + $db_results = mysql_query($sql, dbh()); + + $results = mysql_fetch_array($db_results); + + if ($results['prefix']) { + return $results['prefix'] . " " .$results['name']; + } + else { + return $results['name']; + } + + } // get_album_name + + /*! + @function get_artist_name + @discussion gets the name of $this->artist + */ + function get_artist_name() { + + $sql = "SELECT name,prefix FROM artist WHERE id='$this->artist'"; + $db_results = mysql_query($sql, dbh()); + + $results = mysql_fetch_array($db_results); + + if ($results['prefix']) { + return $results['prefix'] . " " . $results['name']; + } + else { + return $results['name']; + } + + } // get_album_name + + /*! + @function get_genre_name + @discussion gets the name of the genre + */ + function get_genre_name() { + + $sql = "SELECT name FROM genre WHERE id='$this->genre'"; + $db_results = mysql_query($sql, dbh()); + + $results = mysql_fetch_array($db_results); + + return $results['name']; + + } // get_genre_name + /*! + @function compare_song_information + @discussion this compares the new ID3 tags of a file against + the ones in the database to see if they have changed + it returns false if nothing has changes, or the true + if they have. + @param $song The origional song object + @param $new_song The new version of the song + */ + function compare_song_information($song,$new_song) { + + if ($song->title == "No Title Found") { $song->title = false; } + + + if (trim($song->title) != trim($new_song->title) && strlen($new_song->title) > 0) { + $array['change'] = true; + $array['text'] .= "<br />" . _("Title") . " [$song->title] " . _("updated to") . " [$new_song->title]\n"; + } // if title + if ($song->bitrate != $new_song->bitrate) { + $array['change'] = true; + $array['text'] .= "<br />" . _("Bitrate") . " [$song->bitrate] " . _("updated to") . " [$new_song->bitrate]\n"; + } // if bitrate + if ($song->rate != $new_song->rate) { + $array['change'] = true; + $array['text'] .= "<br />" . _("Rate") . " [$song->rate] " . _("updated to") . " [$new_song->rate]\n"; + } // if rate + if ($song->mode != $new_song->mode) { + $array['change'] = true; + $array['text'] .= "<br />" . _("Mode") . " [$song->mode] " . _("updated to") . " [$new_song->mode]\n"; + } // if mode + if ($song->time != $new_song->time) { + $array['change'] = true; + $array['text'] .= "<br />" . _("Time") . " [$song->time] " . _("updated to") . " [$new_song->time]\n"; + } // if time + if ($song->track != $new_song->track) { + $array['change'] = true; + $array['text'] .= "<br />" . _("Track") . " [$song->track] " . _("updated to") . " [$new_song->track]\n"; + } // if track + if ($song->size != $new_song->size) { + $array['change'] = true; + $array['text'] .= "<br />" . _("Filesize") . " [$song->size] " . _("updated to") . " [$new_song->size]\n"; + } // if artist + if ($song->artist != $new_song->artist) { + $array['change'] = true; + $name = $song->get_artist_name(); + $array['text'] .= "<br />" . _("Artist") . " [$name] " . _("updated to") . " [$new_song->f_artist]\n"; + } // if artist + if ($song->album != $new_song->album) { + $array['change'] = true; + $name = $song->get_album_name() . " - " . $song->year; + $array['text'] .= "<br />" . _("Album") . " [$name] " . _("updated to") . " [$new_song->f_album]\n"; + } // if album + if ($song->year != $new_song->year) { + $array['change'] = true; + $array['text'] .= "<br />" . _("Year") . " [$song->year] " . _("updated to") . " [$new_song->year]\n"; + } // if year + if (trim($song->comment) != trim($new_song->comment)) { + $array['change'] = true; + $array['text'] .= "<br />" . _("Comment") . " [$song->comment] " . _("updated to") . " [$new_song->comment]\n"; + } // if comment + if ($song->genre != $new_song->genre) { + $array['change'] = true; + $name = $song->get_genre_name(); + $array['text'] .= "<br />" . _("Genre") . " [$name] " . _("updated to") . " [$new_song->f_genre]\n"; + } // if genre + + return $array; + + } // compare_song_information + + /*! + @function update_song + @discussion this is the main updater for a song it actually + calls a whole bunch of mini functions to update + each little part of the song... lastly it updates + the "update_time" of the song + @param $song_id The id of the song we are updating + @param $new_song A object with the new song params + */ + function update_song($song_id, $new_song) { + + $this->update_title($new_song->title,$song_id); + $this->update_bitrate($new_song->bitrate,$song_id); + $this->update_rate($new_song->rate,$song_id); + $this->update_mode($new_song->mode,$song_id); + $this->update_size($new_song->size,$song_id); + $this->update_time($new_song->time,$song_id); + $this->update_track($new_song->track,$song_id); + $this->update_artist($new_song->artist,$song_id); + $this->update_genre($new_song->genre,$song_id); + $this->update_album($new_song->album,$song_id); + $this->update_year($new_song->year,$song_id); + $this->update_comment($new_song->comment,$song_id); + $this->update_played('false',$song_id); + $this->update_utime($song_id); + + } // update_song + + /*! + @function update_year + @discussion update the year tag + */ + function update_year($new_year,$song_id=0) { + + if ($_SESSION['userdata']['access'] === 'admin') { + $this->update_item('year',$new_year,$song_id); + } + } // update_year + + /*! + @function update_comment + @discussion updates the comment field + */ + function update_comment($new_comment,$song_id=0) { + + if ($_SESSION['userdata']['access'] === 'admin') { + $this->update_item('comment',$new_comment,$song_id); + } + } // update_comment + + /*! + @function update_title + @discussion updates the title field + */ + function update_title($new_title,$song_id=0) { + + if ($_SESSION['userdata']['access'] === 'admin') { + $this->update_item('title',$new_title,$song_id); + } + } // update_title + + /*! + @function update_bitrate + @discussion updates the bitrate field + */ + function update_bitrate($new_bitrate,$song_id=0) { + + if ($_SESSION['userdata']['access'] === 'admin') { + $this->update_item('bitrate',$new_bitrate,$song_id); + } + + } // update_bitrate + + /*! + @function update_rate + @discussion updates the rate field + */ + function update_rate($new_rate,$song_id=0) { + + if ($_SESSION['userdata']['access'] === 'admin') { + $this->update_item('rate',$new_rate,$song_id); + } + + } // update_rate + + /*! + @function update_mode + @discussion updates the mode field + */ + function update_mode($new_mode,$song_id=0) { + + if ($_SESSION['userdata']['access'] === 'admin') { + $this->update_item('mode',$new_mode,$song_id); + } + + } // update_mode + + /*! + @function update_size + @discussion updates the size field + */ + function update_size($new_size,$song_id=0) { + + if ($_SESSION['userdata']['access'] === 'admin') { + $this->update_item('size',$new_size,$song_id); + } + + } // update_size + + /*! + @function update_time + @discussion updates the time field + */ + function update_time($new_time,$song_id=0) { + + if ($_SESSION['userdata']['access'] === 'admin') { + $this->update_item('time',$new_time,$song_id); + } + + } // update_time + + /*! + @function update_track + @discussion this updates the track field + */ + function update_track($new_track,$song_id=0) { + + if ($_SESSION['userdata']['access'] === 'admin') { + $this->update_item('track',$new_track,$song_id); + } + + } // update_track + + /*! + @function update_artist + @discussion updates the artist field + */ + function update_artist($new_artist,$song_id=0) { + + if ($_SESSION['userdata']['access'] === 'admin') { + $this->update_item('artist',$new_artist,$song_id); + } + + } // update_artist + + /*! + @function update_genre + @discussion updates the genre field + */ + function update_genre($new_genre,$song_id=0) { + + if ($_SESSION['userdata']['access'] === 'admin') { + $this->update_item('genre',$new_genre,$song_id); + } + + } // update_genre + + /*! + @function update_album + @discussion updates the album field + */ + function update_album($new_album,$song_id=0) { + + if ($_SESSION['userdata']['access'] === 'admin') { + $this->update_item('album',$new_album,$song_id); + } + + } // update_album + + /*! + @function update_utime + @discussion sets a new update time + */ + function update_utime($song_id=0,$time=0) { + + if (!$time) { $time = time(); } + + if ($_SESSION['userdata']['access'] === 'admin') { + $this->update_item('update_time',$time,$song_id); + } + + } // update_utime + + /*! + @function update_played + @discussion sets the played flag + */ + function update_played($new_played,$song_id=0) { + + $this->update_item('played',$new_played,$song_id); + + } // update_played + + + /*! + @function update_enabled + @discussion sets the enabled flag + */ + function update_enabled($new_enabled,$song_id=0) { + + if ($_SESSION['userdata']['access'] === 'admin' || $_SESSION['userdata']['access'] === '100') { + $this->update_item('status',$new_enabled,$song_id); + } + + } // update_enabled + + /*! + @function update_item + @discussion this is a generic function that is called + by all the other update functions... + @param $field The field we are updating + @param $value The new value for said field + @param $song_id ID of the song, uses $this->id by default + */ + function update_item($field,$value,$song_id=0) { + + if (!$song_id) { $song_id = $this->id; } + + $value = sql_escape($value); + + $sql = "UPDATE song SET $field='$value' WHERE id='$song_id'"; + $db_results = mysql_query($sql, dbh()); + + $this->{$field} = $value; + + } //update_item + + + /*! + @function format_song + @discussion this takes a song object + and formats it for display + and returns the object cleaned up + */ + function format_song() { + + // Format the filename + preg_match("/^.*\/(.*?)$/",$this->file, $short); + $this->f_file = htmlspecialchars($short[1]); + + // Format the album name + $this->f_album_full = $this->get_album_name(); + $this->f_album = truncate_with_ellipse($this->f_album_full,conf('ellipse_threshold_album')); + + // Format the artist name + $this->f_artist_full = $this->get_artist_name(); + $this->f_artist = truncate_with_ellipse($this->f_artist_full,conf('ellipse_threshold_artist')); + + // Format the title + $this->f_title = truncate_with_ellipse($this->title,conf('ellipse_threshold_title')); + + // Create A link inclduing the title + $this->f_link = "<a href=\"" . conf('web_path') . "/song.php?action=m3u&song=" . $this->id . "\">$this->f_title</a>"; + + // Format the Bitrate + $this->f_bitrate = intval($this->bitrate/1000) . "-" . strtoupper($this->mode); + + // Format Genre + $this->f_genre = $this->get_genre_name(); + + // Format the Time + $min = floor($this->time/60); + $sec = sprintf("%02d", ($this->time%60) ); + $this->f_time = $min . ":" . $sec; + + // Format the size + $this->f_size = sprintf("%.2f",($this->size/1048576)); + + // Set style + if (preg_match("/id3/", $this->flagtype)) { $this->f_style = "style=\"color: #33c;\""; } + elseif (preg_match("/(mp3|del|sort|ren)/", $this->flagtype)) { $this->f_style = "style=\"color: #C00;\""; } + if ($this->status === 'disabled') { $this->f_style = "style=\"text-decoration: line-through;\""; } + + return true; + + } // format_song + + /*! + * @function get_rel_path + * @discussion returns the path of the song file stripped of the catalog path + * used for mpd playback + */ + function get_rel_path($file_path=0,$catalog_id=0) { + + if (!$file_path) { + $info = $this->get_info( ); + $file_path = $info->file; + } + if (!$catalog_id) { + $catalog_id = $info->catalog; + } + $catalog = new Catalog( $catalog_id ); + $info = $catalog->get_info( ); + $catalog_path = $info->path; + return( str_replace( $catalog_path . "/", "", $file_path ) ); + + } // get_rel_path + + + /*! + @function fill_info + @discussion this takes the $results from getid3 and attempts to fill + as much information as possible from the file name using the + pattern set in the current catalog + */ + function fill_info($results,$pattern,$catalog_id,$key) { + + $filename = $this->get_rel_path($results['file'],$catalog_id); + + if (!strlen($results[$key]['title'])) { + $results[$key]['title'] = $this->get_info_from_filename($filename,$pattern,"%t"); + } + if (!strlen($results[$key]['track'])) { + $results[$key]['track'] = $this->get_info_from_filename($filename,$pattern,"%T"); + } + if (!strlen($results[$key]['year'])) { + $results[$key]['year'] = $this->get_info_from_filename($filename,$pattern,"%y"); + } + if (!strlen($results[$key]['album'])) { + $results[$key]['album'] = $this->get_info_from_filename($filename,$pattern,"%A"); + } + if (!strlen($results[$key]['artist'])) { + $results[$key]['artist'] = $this->get_info_from_filename($filename,$pattern,"%a"); + } + if (!strlen($results[$key]['genre'])) { + $results[$key]['genre'] = $this->get_info_from_filename($filename,$pattern,"%g"); + } + + return $results; + + } // fill_info + + /*! + @function get_info_from_filename + @discussion get information from a filename based on pattern + */ + function get_info_from_filename($file,$pattern,$tag) { + + $preg_pattern = preg_replace("/$tag/","(.+)",$pattern); + $preg_pattern = preg_replace("/\%\w/",".+",$preg_pattern); + $preg_pattern = "/" . str_replace("/","\/",$preg_pattern) . "\..+/"; + + preg_match($preg_pattern,$file,$matches); + + return stripslashes($matches[1]); + + } // get_info_from_filename + +} //end of song class + +?> |