" . self::_footer(); return $string; } // error /** * single_string * This takes two values, first the key second the string */ public static function single_string($key,$string) { $final = self::_header() . "\t<$key>" . self::_footer(); return $final; } // single_string /** * header * This returns the header */ public static function header() { return self::_header(); } // header /** * footer * This returns the footer */ public static function footer() { return self::_footer(); } // header /** * tags_string * This returns the formated 'tags' string for an xml document */ private static function tags_string($tags,$type,$object_id) { $string = ''; foreach ($tags as $tag_id=>$data) { $tag = new Tag($tag_id); $string .= "\tid . "\" count=\"" . $data['count'] . "\">name]]>\n"; } return $string; } // tags_string /** * keyed_array * This will build an xml document from a key'd array, */ public static function keyed_array($array,$callback='') { $string = ''; // Foreach it foreach ($array as $key=>$value) { // If it's an array, run again if (is_array($value)) { $value = self::keyed_array($value,1); $string .= "<$key>\n$value\n\n"; } else { $string .= "\t<$key>\n"; } } // end foreach if (!$callback) { $string = self::_header() . $string . self::_footer(); } return $string; } // keyed_array /** * tags * This returns tags to the user, in a pretty xml document with the information */ public static function tags($tags) { if (count($tags) > self::$limit OR self::$offset > 0) { $tags = array_splice($tags,self::$offset,self::$limit); } $string = ''; foreach ($tags as $tag_id) { $tag = new Tag($tag_id); $counts = $tag->count(); $string .= "\n" . "\tname]]>\n" . "\t" . intval($counts['album']) . "\n" . "\t" . intval($counts['artist']) . "\n" . "\t" . intval($counts['song']) . "\n" . "\t" . intval($counts['video']) . "\n" . "\t" . intval($count['playlist']) . "\n" . "\t" . intval($count['live_stream']) . "\n" . "\n"; } // end foreach $final = self::_header() . $string . self::_footer(); return $final; } // tags /** * artists * This takes an array of artists and then returns a pretty xml document with the information * we want */ public static function artists($artists) { if (count($artists) > self::$limit OR self::$offset > 0) { $artists = array_splice($artists,self::$offset,self::$limit); } $string = ''; Rating::build_cache('artist',$artists); foreach ($artists as $artist_id) { $artist = new Artist($artist_id); $artist->format(); $rating = new Rating($artist_id,'artist'); $tag_string = self::tags_string($artist->tags,'artist',$artist->id); $string .= "id\">\n" . "\tf_full_name]]>\n" . $tag_string . "\t$artist->albums\n" . "\t$artist->songs\n" . "\t" . $rating->preciserating . "\n" . "\t" . $rating->rating . "\n" . "\n"; } // end foreach artists $final = self::_header() . $string . self::_footer(); return $final; } // artists /** * albums * This echos out a standard albums XML document, it pays attention to the limit */ public static function albums($albums) { if (count($albums) > self::$limit OR self::$offset > 0) { $albums = array_splice($albums,self::$offset,self::$limit); } Rating::build_cache('album',$albums); foreach ($albums as $album_id) { $album = new Album($album_id); $album->format(); $rating = new Rating($album_id,'album'); // Build the Art URL, include session $art_url = Config::get('web_path') . '/image.php?id=' . $album->id . '&auth=' . scrub_out($_REQUEST['auth']); $string .= "id\">\n" . "\tname]]>\n"; // Do a little check for artist stuff if ($album->artist_count != 1) { $string .= "\t\n"; } else { $string .= "\tartist_id\">artist_name]]>\n"; } $string .= "\t$album->year\n" . "\t$album->song_count\n" . "\t$album->disk\n" . self::tags_string($album->tags,'album',$album->id) . "\t\n" . "\t" . $rating->preciserating . "\n" . "\t" . $rating->rating . "\n" . "\n"; } // end foreach $final = self::_header() . $string . self::_footer(); return $final; } // albums /** * playlists * This takes an array of playlist ids and then returns a nice pretty XML document */ public static function playlists($playlists) { if (count($playlists) > self::$limit OR self::$offset > 0) { $playlists = array_slice($playlists,self::$offset,self::$limit); } $string = ''; // Foreach the playlist ids foreach ($playlists as $playlist_id) { $playlist = new Playlist($playlist_id); $playlist->format(); $item_total = $playlist->get_song_count(); // Build this element $string .= "id\">\n" . "\tname]]>\n" . "\tf_user]]>\n" . "\t$item_total\n" . "\t$playlist->type\n" . "\n"; } // end foreach // Build the final and then send her off $final = self::_header() . $string . self::_footer(); return $final; } // playlists /** * songs * This returns an xml document from an array of song ids spiffy isn't it! */ public static function songs($songs) { if (count($songs) > self::$limit OR self::$offset > 0) { $songs = array_slice($songs,self::$offset,self::$limit); } Rating::build_cache('song',$songs); Stream::set_session($_REQUEST['auth']); // Foreach the ids! foreach ($songs as $song_id) { $song = new Song($song_id); // If the song id is invalid/null if (!$song->id) { continue; } $song->format(); $tag_string = ''; $tag = new Tag($song->tags['0']); $song->genre = $tag->id; $song->f_genre = $tag->name; $tag_string = self::tags_string($song->tags,'song',$song->id); $rating = new Rating($song_id,'song'); $art_url = Album::get_art_url($song->album,$_REQUEST['auth']); $string .= "id\">\n" . "\t<![CDATA[$song->title]]>\n" . "\tartist\">f_artist_full]]>\n" . "\talbum\">f_album_full]]>\n" . "\tgenre\">f_genre]]>\n" . $tag_string . "\t$song->track\n" . "\t\n" . "\t$song->mime\n" . "\tid) . "]]>\n" . "\t$song->size\n" . "\t\n" . "\t" . $rating->preciserating . "\n" . "\t" . $rating->rating . "\n" . "\n"; } // end foreach $final = self::_header() . $string . self::_footer(); return $final; } // songs /** * videos * This builds the xml document for displaying video objects */ public static function videos($videos) { if (count($videos) > self::$limit OR self::$offset > 0) { $videos = array_slice($videos,self::$offset,self::$limit); } $string = ''; foreach ($videos as $video_id) { $video = new Video($video_id); $video->format(); $string .= "\n"; } // end foreach $final = self::_header() . $string . self::_footer(); return $final; } // videos /** * democratic * This handles creating an xml document for democratic items, this can be a little complicated * due to the votes and all of that */ public static function democratic($object_ids=array()) { if (!is_array($object_ids)) { $object_ids = array(); } $democratic = Democratic::get_current_playlist(); $string = ''; foreach ($object_ids as $row_id=>$data) { $song = new $data['object_type']($data['object_id']); $song->format(); //FIXME: This is duplicate code and so wrong, functions need to be improved $tag_string = ''; $tag = new Tag($song->tags['0']); $song->genre = $tag->id; $song->f_genre = $tag->name; $tag_string = self::tags_string($song->tags,'song',$song->id); $rating = new Rating($song_id,'song'); $art_url = Album::get_art_url($song->album,$_REQUEST['auth']); $string .= "id\">\n" . "\t<![CDATA[$song->title]]>\n" . "\tartist\">f_artist_full]]>\n" . "\talbum\">f_album_full]]>\n" . "\tgenre\">f_genre]]>\n" . $tag_string . "\t$song->track\n" . "\t\n" . "\t$song->mime\n" . "\tid) . "]]>\n" . "\t$song->size\n" . "\t\n" . "\t" . $rating->preciserating . "\n" . "\t" . $rating->rating . "\n" . "\t" . $democratic->get_vote($row_id) . "\n" . "\n"; } // end foreach $final = self::_header() . $string . self::_footer(); return $final; } // democratic /** * rss_feed */ public static function rss_feed($data,$title,$description,$date) { $string = "\t$title\n\t" . Config::get('web_path') . "\n\t" . "" . date("r",$date) . "\n"; // Pass it to the keyed array xml function foreach ($data as $item) { // We need to enclose it in an item tag $string .= self::keyed_array(array('item'=>$item),1); } $final = self::_header() . $string . self::_footer(); return $final; } // rss_feed /** * _header * this returns a standard header, there are a few types * so we allow them to pass a type if they want to */ private static function _header() { switch (self::$type) { case 'xspf': $header = "\n" . "\n " . "Ampache XSPF Playlist\n" . "" . scrub_out(Config::get('site_title')) . "\n" . "" . scrub_out(Config::get('site_title')) . "\n" . "". Config::get('web_path') ."\n" . "\n"; break; case 'itunes': $header = "\n" . "\n"; "\n" . "\n" . "\n" . " Major Version1\n" . " Minor Version1\n" . " Application Version7.0.2\n" . " Features1\n" . " Show Content Ratings\n" . " Tracks\n" . " \n"; break; case 'rss': $header = "\n " . "\n" . "\n\n"; break; default: $header = "\n\n"; break; } // end switch return $header; } // _header /** * _footer * this returns the footer for this document, these are pretty boring */ private static function _footer() { switch (self::$type) { case 'itunes': $footer = "\t\t\t\n\n\n"; break; case 'xspf': $footer = "\n\n"; break; case 'rss': $footer = "\n\n\n"; break; default: $footer = "\n\n"; break; } // end switch on type return $footer; } // _footer } // xmlData ?>