" . 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>$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$key>\n";
}
else {
$string .= "\t<$key>$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" .
"\ttitle]]>\n" .
"\tartist\">f_artist_full]]>\n" .
"\talbum\">f_album_full]]>\n" .
"\tgenre\">f_genre]]>\n" .
$tag_string .
"\t\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" .
"\ttitle]]>\n" .
"\tartist\">f_artist_full]]>\n" .
"\talbum\">f_album_full]]>\n" .
"\tgenre\">f_genre]]>\n" .
$tag_string .
"\t\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
?>