summaryrefslogtreecommitdiffstats
path: root/lib/class/api.class.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/class/api.class.php')
-rw-r--r--lib/class/api.class.php1214
1 files changed, 607 insertions, 607 deletions
diff --git a/lib/class/api.class.php b/lib/class/api.class.php
index 841d3534..f289e98b 100644
--- a/lib/class/api.class.php
+++ b/lib/class/api.class.php
@@ -1,5 +1,5 @@
<?php
-/* vim:set tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab: */
+/* vim:set softtabstop=4 shiftwidth=4 expandtab: */
/**
*
* LICENSE: GNU General Public License, version 2 (GPLv2)
@@ -30,689 +30,689 @@
*/
class Api {
- public static $version = '350001';
-
- private static $browse = null;
-
- /**
- * constructor
- * This really isn't anything to do here, so it's private
- */
- private function __construct() {
-
- // Rien a faire
-
- } // constructor
-
- /**
- * _auto_init
- * Automatically called when this class is loaded.
- */
- public static function _auto_init() {
- if (is_null(self::$browse)) {
- self::$browse = new Browse();
- }
- }
-
- /**
- * set_filter
- * This is a play on the browse function, it's different as we expose
- * the filters in a slightly different and vastly simpler way to the
- * end users--so we have to do a little extra work to make them work
- * internally.
- */
- public static function set_filter($filter,$value) {
-
- if (!strlen($value)) { return false; }
-
- switch ($filter) {
- case 'add':
- // Check for a range, if no range default to gt
- if (strpos($value,'/')) {
- $elements = explode('/',$value);
- self::$browse->set_filter('add_lt',strtotime($elements['1']));
- self::$browse->set_filter('add_gt',strtotime($elements['0']));
- }
- else {
- self::$browse->set_filter('add_gt',strtotime($value));
- }
- break;
- case 'update':
- // Check for a range, if no range default to gt
- if (strpos($value,'/')) {
- $elements = explode('/',$value);
- self::$browse->set_filter('update_lt',strtotime($elements['1']));
- self::$browse->set_filter('update_gt',strtotime($elements['0']));
- }
- else {
- self::$browse->set_filter('update_gt',strtotime($value));
- }
- break;
- case 'alpha_match':
- self::$browse->set_filter('alpha_match',$value);
- break;
- case 'exact_match':
- self::$browse->set_filter('exact_match',$value);
- break;
- default:
- // Rien a faire
- break;
- } // end filter
-
- return true;
-
- } // set_filter
-
- /**
- * handshake
- *
- * This is the function that handles verifying a new handshake
- * Takes a timestamp, auth key, and username.
- */
- public static function handshake($input) {
-
- $timestamp = preg_replace('/[^0-9]/', '', $input['timestamp']);
- $passphrase = $input['auth'];
- $ip = $_SERVER['REMOTE_ADDR'];
- $username = $input['user'];
- $version = $input['version'];
-
- // Log the attempt
- debug_event('API', "Handshake Attempt, IP:$ip User:$username Version:$version", 5);
-
- if (intval($version) < self::$version) {
- debug_event('API', 'Login Failed: version too old', 1);
- Error::add('api', T_('Login Failed: version too old'));
- return false;
- }
-
- // If the timestamp isn't within 30 minutes sucks to be them
- if (($timestamp < (time() - 1800)) ||
- ($timestamp > (time() + 1800))) {
- debug_event('API', 'Login Failed: timestamp out of range', 1);
- Error::add('api', T_('Login Failed: timestamp out of range'));
- return false;
- }
-
- // Grab the correct userid
- // FIXME: Does this if/else make sense with the new ACLs?
- if (!trim($username)) {
- $user_id = '-1';
- }
- else {
- $client = User::get_from_username($username);
- $user_id = $client->id;
- }
- $user_id = Dba::escape($user_id);
-
- // Log this attempt
- debug_event('API', "Login Attempt, IP:$ip Time: $timestamp User:$username ($user_id) Auth:$passphrase", 1);
-
- if (Access::check_network('api', $user_id, 5, $ip)) {
- // Now we're sure that there is an ACL line that matches
- // this user or ALL USERS, pull the user's password and
- // then see what we come out with
- $sql = "SELECT * FROM `user` WHERE `id`='$user_id'";
- $db_results = Dba::read($sql);
-
- $row = Dba::fetch_assoc($db_results);
-
- if (!$row['password']) {
- debug_event('API', 'Unable to find user with userid of ' . $user_id, 1);
- Error::add('api', T_('Invalid Username/Password'));
- return false;
- }
-
- $sha1pass = hash('sha256', $timestamp . $row['password']);
-
- if ($sha1pass === $passphrase) {
- // Create the session
- // FIXME: needs to be moved to the correct class
- $data['username'] = $client->username;
- $data['type'] = 'api';
- $data['value'] = $timestamp;
- $token = vauth::session_create($data);
-
- // Insert the token into the streamer
- Stream::insert_session($token,$client->id);
- debug_event('API', 'Login Success, passphrase matched', 1);
-
- // We need to also get the 'last update' of the
- // catalog information in an RFC 2822 Format
- $sql = "SELECT MAX(`last_update`) AS `update`,MAX(`last_add`) AS `add`, MAX(`last_clean`) AS `clean` FROM `catalog`";
- $db_results = Dba::read($sql);
- $row = Dba::fetch_assoc($db_results);
-
- // Now we need to quickly get the song totals
- $sql = 'SELECT COUNT(`id`) AS `song`, ' .
- 'COUNT(DISTINCT(`album`)) AS `album`, '.
- 'COUNT(DISTINCT(`artist`)) AS `artist` ' .
- 'FROM `song`';
- $db_results = Dba::read($sql);
- $counts = Dba::fetch_assoc($db_results);
-
- // Next the video counts
- $sql = "SELECT COUNT(`id`) AS `video` FROM `video`";
- $db_results = Dba::read($sql);
- $vcounts = Dba::fetch_assoc($db_results);
-
- $sql = "SELECT COUNT(`id`) AS `playlist` FROM `playlist`";
- $db_results = Dba::read($sql);
- $playlist = Dba::fetch_assoc($db_results);
-
- $sql = "SELECT COUNT(`id`) AS `catalog` FROM `catalog` WHERE `catalog_type`='local'";
- $db_results = Dba::read($sql);
- $catalog = Dba::fetch_assoc($db_results);
-
- echo XML_Data::keyed_array(array('auth'=>$token,
- 'api'=>self::$version,
- 'session_expire'=>date("c",time()+Config::get('session_length')-60),
- 'update'=>date("c",$row['update']),
- 'add'=>date("c",$row['add']),
- 'clean'=>date("c",$row['clean']),
- 'songs'=>$counts['song'],
- 'albums'=>$counts['album'],
- 'artists'=>$counts['artist'],
- 'playlists'=>$playlist['playlist'],
- 'videos'=>$vcounts['video'],
- 'catalogs'=>$catalog['catalog']));
- return true;
- } // match
-
- } // end while
-
- debug_event('API','Login Failed, unable to match passphrase','1');
- XML_Data::error('401', T_('Error Invalid Handshake - ') . T_('Invalid Username/Password'));
-
- } // handshake
-
- /**
- * ping
- * This can be called without being authenticated, it is useful for determining if what the status
- * of the server is, and what version it is running/compatible with
- */
- public static function ping($input) {
-
- $xmldata = array('server'=>Config::get('version'),'version'=>Api::$version,'compatible'=>'350001');
-
- // Check and see if we should extend the api sessions (done if valid sess is passed)
- if (vauth::session_exists('api', $input['auth'])) {
- vauth::session_extend($input['auth']);
- $xmldata = array_merge(array('session_expire'=>date("c",time()+Config::get('session_length')-60)),$xmldata);
- }
-
- debug_event('API','Ping Received from ' . $_SERVER['REMOTE_ADDR'] . ' :: ' . $input['auth'],'5');
-
- ob_end_clean();
- echo XML_Data::keyed_array($xmldata);
-
- } // ping
-
- /**
- * artists
- * This takes a collection of inputs and returns
- * artist objects. This function is deprecated!
- * //DEPRECATED
- */
- public static function artists($input) {
-
- self::$browse->reset_filters();
- self::$browse->set_type('artist');
- self::$browse->set_sort('name','ASC');
-
- $method = $input['exact'] ? 'exact_match' : 'alpha_match';
- Api::set_filter($method,$input['filter']);
- Api::set_filter('add',$input['add']);
- Api::set_filter('update',$input['update']);
-
- // Set the offset
- XML_Data::set_offset($input['offset']);
- XML_Data::set_limit($input['limit']);
-
- $artists = self::$browse->get_objects();
- // echo out the resulting xml document
- ob_end_clean();
- echo XML_Data::artists($artists);
-
- } // artists
-
- /**
- * artist
- * This returns a single artist based on the UID of said artist
- * //DEPRECATED
- */
- public static function artist($input) {
-
- $uid = scrub_in($input['filter']);
- echo XML_Data::artists(array($uid));
-
- } // artist
-
- /**
- * artist_albums
- * This returns the albums of an artist
- */
- public static function artist_albums($input) {
-
- $artist = new Artist($input['filter']);
-
- $albums = $artist->get_albums();
-
- // Set the offset
- XML_Data::set_offset($input['offset']);
- XML_Data::set_limit($input['limit']);
- ob_end_clean();
- echo XML_Data::albums($albums);
-
- } // artist_albums
-
- /**
- * artist_songs
- * This returns the songs of the specified artist
- */
- public static function artist_songs($input) {
+ public static $version = '350001';
+
+ private static $browse = null;
+
+ /**
+ * constructor
+ * This really isn't anything to do here, so it's private
+ */
+ private function __construct() {
+
+ // Rien a faire
+
+ } // constructor
+
+ /**
+ * _auto_init
+ * Automatically called when this class is loaded.
+ */
+ public static function _auto_init() {
+ if (is_null(self::$browse)) {
+ self::$browse = new Browse();
+ }
+ }
+
+ /**
+ * set_filter
+ * This is a play on the browse function, it's different as we expose
+ * the filters in a slightly different and vastly simpler way to the
+ * end users--so we have to do a little extra work to make them work
+ * internally.
+ */
+ public static function set_filter($filter,$value) {
+
+ if (!strlen($value)) { return false; }
+
+ switch ($filter) {
+ case 'add':
+ // Check for a range, if no range default to gt
+ if (strpos($value,'/')) {
+ $elements = explode('/',$value);
+ self::$browse->set_filter('add_lt',strtotime($elements['1']));
+ self::$browse->set_filter('add_gt',strtotime($elements['0']));
+ }
+ else {
+ self::$browse->set_filter('add_gt',strtotime($value));
+ }
+ break;
+ case 'update':
+ // Check for a range, if no range default to gt
+ if (strpos($value,'/')) {
+ $elements = explode('/',$value);
+ self::$browse->set_filter('update_lt',strtotime($elements['1']));
+ self::$browse->set_filter('update_gt',strtotime($elements['0']));
+ }
+ else {
+ self::$browse->set_filter('update_gt',strtotime($value));
+ }
+ break;
+ case 'alpha_match':
+ self::$browse->set_filter('alpha_match',$value);
+ break;
+ case 'exact_match':
+ self::$browse->set_filter('exact_match',$value);
+ break;
+ default:
+ // Rien a faire
+ break;
+ } // end filter
+
+ return true;
+
+ } // set_filter
+
+ /**
+ * handshake
+ *
+ * This is the function that handles verifying a new handshake
+ * Takes a timestamp, auth key, and username.
+ */
+ public static function handshake($input) {
+
+ $timestamp = preg_replace('/[^0-9]/', '', $input['timestamp']);
+ $passphrase = $input['auth'];
+ $ip = $_SERVER['REMOTE_ADDR'];
+ $username = $input['user'];
+ $version = $input['version'];
+
+ // Log the attempt
+ debug_event('API', "Handshake Attempt, IP:$ip User:$username Version:$version", 5);
+
+ if (intval($version) < self::$version) {
+ debug_event('API', 'Login Failed: version too old', 1);
+ Error::add('api', T_('Login Failed: version too old'));
+ return false;
+ }
+
+ // If the timestamp isn't within 30 minutes sucks to be them
+ if (($timestamp < (time() - 1800)) ||
+ ($timestamp > (time() + 1800))) {
+ debug_event('API', 'Login Failed: timestamp out of range', 1);
+ Error::add('api', T_('Login Failed: timestamp out of range'));
+ return false;
+ }
+
+ // Grab the correct userid
+ // FIXME: Does this if/else make sense with the new ACLs?
+ if (!trim($username)) {
+ $user_id = '-1';
+ }
+ else {
+ $client = User::get_from_username($username);
+ $user_id = $client->id;
+ }
+ $user_id = Dba::escape($user_id);
+
+ // Log this attempt
+ debug_event('API', "Login Attempt, IP:$ip Time: $timestamp User:$username ($user_id) Auth:$passphrase", 1);
+
+ if (Access::check_network('api', $user_id, 5, $ip)) {
+ // Now we're sure that there is an ACL line that matches
+ // this user or ALL USERS, pull the user's password and
+ // then see what we come out with
+ $sql = "SELECT * FROM `user` WHERE `id`='$user_id'";
+ $db_results = Dba::read($sql);
+
+ $row = Dba::fetch_assoc($db_results);
+
+ if (!$row['password']) {
+ debug_event('API', 'Unable to find user with userid of ' . $user_id, 1);
+ Error::add('api', T_('Invalid Username/Password'));
+ return false;
+ }
+
+ $sha1pass = hash('sha256', $timestamp . $row['password']);
+
+ if ($sha1pass === $passphrase) {
+ // Create the session
+ // FIXME: needs to be moved to the correct class
+ $data['username'] = $client->username;
+ $data['type'] = 'api';
+ $data['value'] = $timestamp;
+ $token = vauth::session_create($data);
+
+ // Insert the token into the streamer
+ Stream::insert_session($token,$client->id);
+ debug_event('API', 'Login Success, passphrase matched', 1);
+
+ // We need to also get the 'last update' of the
+ // catalog information in an RFC 2822 Format
+ $sql = "SELECT MAX(`last_update`) AS `update`,MAX(`last_add`) AS `add`, MAX(`last_clean`) AS `clean` FROM `catalog`";
+ $db_results = Dba::read($sql);
+ $row = Dba::fetch_assoc($db_results);
+
+ // Now we need to quickly get the song totals
+ $sql = 'SELECT COUNT(`id`) AS `song`, ' .
+ 'COUNT(DISTINCT(`album`)) AS `album`, '.
+ 'COUNT(DISTINCT(`artist`)) AS `artist` ' .
+ 'FROM `song`';
+ $db_results = Dba::read($sql);
+ $counts = Dba::fetch_assoc($db_results);
+
+ // Next the video counts
+ $sql = "SELECT COUNT(`id`) AS `video` FROM `video`";
+ $db_results = Dba::read($sql);
+ $vcounts = Dba::fetch_assoc($db_results);
+
+ $sql = "SELECT COUNT(`id`) AS `playlist` FROM `playlist`";
+ $db_results = Dba::read($sql);
+ $playlist = Dba::fetch_assoc($db_results);
+
+ $sql = "SELECT COUNT(`id`) AS `catalog` FROM `catalog` WHERE `catalog_type`='local'";
+ $db_results = Dba::read($sql);
+ $catalog = Dba::fetch_assoc($db_results);
+
+ echo XML_Data::keyed_array(array('auth'=>$token,
+ 'api'=>self::$version,
+ 'session_expire'=>date("c",time()+Config::get('session_length')-60),
+ 'update'=>date("c",$row['update']),
+ 'add'=>date("c",$row['add']),
+ 'clean'=>date("c",$row['clean']),
+ 'songs'=>$counts['song'],
+ 'albums'=>$counts['album'],
+ 'artists'=>$counts['artist'],
+ 'playlists'=>$playlist['playlist'],
+ 'videos'=>$vcounts['video'],
+ 'catalogs'=>$catalog['catalog']));
+ return true;
+ } // match
+
+ } // end while
+
+ debug_event('API','Login Failed, unable to match passphrase','1');
+ XML_Data::error('401', T_('Error Invalid Handshake - ') . T_('Invalid Username/Password'));
+
+ } // handshake
+
+ /**
+ * ping
+ * This can be called without being authenticated, it is useful for determining if what the status
+ * of the server is, and what version it is running/compatible with
+ */
+ public static function ping($input) {
+
+ $xmldata = array('server'=>Config::get('version'),'version'=>Api::$version,'compatible'=>'350001');
+
+ // Check and see if we should extend the api sessions (done if valid sess is passed)
+ if (vauth::session_exists('api', $input['auth'])) {
+ vauth::session_extend($input['auth']);
+ $xmldata = array_merge(array('session_expire'=>date("c",time()+Config::get('session_length')-60)),$xmldata);
+ }
+
+ debug_event('API','Ping Received from ' . $_SERVER['REMOTE_ADDR'] . ' :: ' . $input['auth'],'5');
+
+ ob_end_clean();
+ echo XML_Data::keyed_array($xmldata);
+
+ } // ping
+
+ /**
+ * artists
+ * This takes a collection of inputs and returns
+ * artist objects. This function is deprecated!
+ * //DEPRECATED
+ */
+ public static function artists($input) {
+
+ self::$browse->reset_filters();
+ self::$browse->set_type('artist');
+ self::$browse->set_sort('name','ASC');
+
+ $method = $input['exact'] ? 'exact_match' : 'alpha_match';
+ Api::set_filter($method,$input['filter']);
+ Api::set_filter('add',$input['add']);
+ Api::set_filter('update',$input['update']);
+
+ // Set the offset
+ XML_Data::set_offset($input['offset']);
+ XML_Data::set_limit($input['limit']);
+
+ $artists = self::$browse->get_objects();
+ // echo out the resulting xml document
+ ob_end_clean();
+ echo XML_Data::artists($artists);
+
+ } // artists
+
+ /**
+ * artist
+ * This returns a single artist based on the UID of said artist
+ * //DEPRECATED
+ */
+ public static function artist($input) {
+
+ $uid = scrub_in($input['filter']);
+ echo XML_Data::artists(array($uid));
+
+ } // artist
+
+ /**
+ * artist_albums
+ * This returns the albums of an artist
+ */
+ public static function artist_albums($input) {
+
+ $artist = new Artist($input['filter']);
+
+ $albums = $artist->get_albums();
+
+ // Set the offset
+ XML_Data::set_offset($input['offset']);
+ XML_Data::set_limit($input['limit']);
+ ob_end_clean();
+ echo XML_Data::albums($albums);
+
+ } // artist_albums
+
+ /**
+ * artist_songs
+ * This returns the songs of the specified artist
+ */
+ public static function artist_songs($input) {
- $artist = new Artist($input['filter']);
- $songs = $artist->get_songs();
+ $artist = new Artist($input['filter']);
+ $songs = $artist->get_songs();
- // Set the offset
- XML_Data::set_offset($input['offset']);
- XML_Data::set_limit($input['limit']);
- ob_end_clean();
- echo XML_Data::songs($songs);
+ // Set the offset
+ XML_Data::set_offset($input['offset']);
+ XML_Data::set_limit($input['limit']);
+ ob_end_clean();
+ echo XML_Data::songs($songs);
- } // artist_songs
+ } // artist_songs
- /**
- * albums
- * This returns albums based on the provided search filters
- */
- public static function albums($input) {
+ /**
+ * albums
+ * This returns albums based on the provided search filters
+ */
+ public static function albums($input) {
- self::$browse->reset_filters();
- self::$browse->set_type('album');
- self::$browse->set_sort('name','ASC');
- $method = $input['exact'] ? 'exact_match' : 'alpha_match';
- Api::set_filter($method,$input['filter']);
- Api::set_filter('add',$input['add']);
- Api::set_filter('update',$input['update']);
+ self::$browse->reset_filters();
+ self::$browse->set_type('album');
+ self::$browse->set_sort('name','ASC');
+ $method = $input['exact'] ? 'exact_match' : 'alpha_match';
+ Api::set_filter($method,$input['filter']);
+ Api::set_filter('add',$input['add']);
+ Api::set_filter('update',$input['update']);
- $albums = self::$browse->get_objects();
+ $albums = self::$browse->get_objects();
- // Set the offset
- XML_Data::set_offset($input['offset']);
- XML_Data::set_limit($input['limit']);
- ob_end_clean();
- echo XML_Data::albums($albums);
+ // Set the offset
+ XML_Data::set_offset($input['offset']);
+ XML_Data::set_limit($input['limit']);
+ ob_end_clean();
+ echo XML_Data::albums($albums);
- } // albums
+ } // albums
- /**
- * album
- * This returns a single album based on the UID provided
- */
- public static function album($input) {
+ /**
+ * album
+ * This returns a single album based on the UID provided
+ */
+ public static function album($input) {
- $uid = scrub_in($input['filter']);
- echo XML_Data::albums(array($uid));
+ $uid = scrub_in($input['filter']);
+ echo XML_Data::albums(array($uid));
- } // album
+ } // album
- /**
- * album_songs
- * This returns the songs of a specified album
- */
- public static function album_songs($input) {
+ /**
+ * album_songs
+ * This returns the songs of a specified album
+ */
+ public static function album_songs($input) {
- $album = new Album($input['filter']);
- $songs = $album->get_songs();
+ $album = new Album($input['filter']);
+ $songs = $album->get_songs();
- // Set the offset
- XML_Data::set_offset($input['offset']);
- XML_Data::set_limit($input['limit']);
+ // Set the offset
+ XML_Data::set_offset($input['offset']);
+ XML_Data::set_limit($input['limit']);
- ob_end_clean();
- echo XML_Data::songs($songs);
+ ob_end_clean();
+ echo XML_Data::songs($songs);
- } // album_songs
+ } // album_songs
- /**
- * tags
- * This returns the tags based on the specified filter
- */
- public static function tags($input) {
+ /**
+ * tags
+ * This returns the tags based on the specified filter
+ */
+ public static function tags($input) {
- self::$browse->reset_filters();
- self::$browse->set_type('tag');
- self::$browse->set_sort('name','ASC');
+ self::$browse->reset_filters();
+ self::$browse->set_type('tag');
+ self::$browse->set_sort('name','ASC');
- $method = $input['exact'] ? 'exact_match' : 'alpha_match';
- Api::set_filter($method,$input['filter']);
- $tags = self::$browse->get_objects();
+ $method = $input['exact'] ? 'exact_match' : 'alpha_match';
+ Api::set_filter($method,$input['filter']);
+ $tags = self::$browse->get_objects();
- // Set the offset
- XML_Data::set_offset($input['offset']);
- XML_Data::set_limit($input['limit']);
+ // Set the offset
+ XML_Data::set_offset($input['offset']);
+ XML_Data::set_limit($input['limit']);
- ob_end_clean();
- echo XML_Data::tags($tags);
+ ob_end_clean();
+ echo XML_Data::tags($tags);
- } // tags
+ } // tags
- /**
- * tag
- * This returns a single tag based on UID
- */
- public static function tag($input) {
+ /**
+ * tag
+ * This returns a single tag based on UID
+ */
+ public static function tag($input) {
- $uid = scrub_in($input['filter']);
- ob_end_clean();
- echo XML_Data::tags(array($uid));
+ $uid = scrub_in($input['filter']);
+ ob_end_clean();
+ echo XML_Data::tags(array($uid));
- } // tag
+ } // tag
- /**
- * tag_artists
- * This returns the artists associated with the tag in question as defined by the UID
- */
- public static function tag_artists($input) {
+ /**
+ * tag_artists
+ * This returns the artists associated with the tag in question as defined by the UID
+ */
+ public static function tag_artists($input) {
- $artists = Tag::get_tag_objects('artist',$input['filter']);
+ $artists = Tag::get_tag_objects('artist',$input['filter']);
- XML_Data::set_offset($input['offset']);
- XML_Data::set_limit($input['limit']);
+ XML_Data::set_offset($input['offset']);
+ XML_Data::set_limit($input['limit']);
- ob_end_clean();
- echo XML_Data::artists($artists);
+ ob_end_clean();
+ echo XML_Data::artists($artists);
- } // tag_artists
+ } // tag_artists
- /**
- * tag_albums
- * This returns the albums associated with the tag in question
- */
- public static function tag_albums($input) {
+ /**
+ * tag_albums
+ * This returns the albums associated with the tag in question
+ */
+ public static function tag_albums($input) {
- $albums = Tag::get_tag_objects('album',$input['filter']);
+ $albums = Tag::get_tag_objects('album',$input['filter']);
- XML_Data::set_offset($input['offset']);
- XML_Data::set_limit($input['limit']);
+ XML_Data::set_offset($input['offset']);
+ XML_Data::set_limit($input['limit']);
- ob_end_clean();
- echo XML_Data::albums($albums);
+ ob_end_clean();
+ echo XML_Data::albums($albums);
- } // tag_albums
+ } // tag_albums
- /**
- * tag_songs
- * returns the songs for this tag
- */
- public static function tag_songs($input) {
+ /**
+ * tag_songs
+ * returns the songs for this tag
+ */
+ public static function tag_songs($input) {
- $songs = Tag::get_tag_objects('song',$input['filter']);
+ $songs = Tag::get_tag_objects('song',$input['filter']);
- XML_Data::set_offset($input['offset']);
- XML_Data::set_limit($input['limit']);
+ XML_Data::set_offset($input['offset']);
+ XML_Data::set_limit($input['limit']);
- ob_end_clean();
- echo XML_Data::songs($songs);
+ ob_end_clean();
+ echo XML_Data::songs($songs);
- } // tag_songs
+ } // tag_songs
- /**
- * songs
- * Returns songs based on the specified filter
- */
- public static function songs($input) {
+ /**
+ * songs
+ * Returns songs based on the specified filter
+ */
+ public static function songs($input) {
- self::$browse->reset_filters();
- self::$browse->set_type('song');
- self::$browse->set_sort('title','ASC');
+ self::$browse->reset_filters();
+ self::$browse->set_type('song');
+ self::$browse->set_sort('title','ASC');
- $method = $input['exact'] ? 'exact_match' : 'alpha_match';
- Api::set_filter($method,$input['filter']);
- Api::set_filter('add',$input['add']);
- Api::set_filter('update',$input['update']);
+ $method = $input['exact'] ? 'exact_match' : 'alpha_match';
+ Api::set_filter($method,$input['filter']);
+ Api::set_filter('add',$input['add']);
+ Api::set_filter('update',$input['update']);
- $songs = self::$browse->get_objects();
+ $songs = self::$browse->get_objects();
- // Set the offset
- XML_Data::set_offset($input['offset']);
- XML_Data::set_limit($input['limit']);
+ // Set the offset
+ XML_Data::set_offset($input['offset']);
+ XML_Data::set_limit($input['limit']);
- ob_end_clean();
- echo XML_Data::songs($songs);
+ ob_end_clean();
+ echo XML_Data::songs($songs);
- } // songs
+ } // songs
- /**
- * song
- * returns a single song
- */
- public static function song($input) {
+ /**
+ * song
+ * returns a single song
+ */
+ public static function song($input) {
- $uid = scrub_in($input['filter']);
+ $uid = scrub_in($input['filter']);
- ob_end_clean();
- echo XML_Data::songs(array($uid));
+ ob_end_clean();
+ echo XML_Data::songs(array($uid));
- } // song
+ } // song
- /**
- * url_to_song
- * This takes a url and returns the song object in question
- */
- public static function url_to_song($input) {
+ /**
+ * url_to_song
+ * This takes a url and returns the song object in question
+ */
+ public static function url_to_song($input) {
- // Don't scrub, the function needs her raw and juicy
- $song_id = Song::parse_song_url($input['url']);
+ // Don't scrub, the function needs her raw and juicy
+ $song_id = Song::parse_song_url($input['url']);
- ob_end_clean();
- echo XML_Data::songs(array($song_id));
+ ob_end_clean();
+ echo XML_Data::songs(array($song_id));
- } // url_to_song
+ } // url_to_song
- /**
- * playlists
- * This returns playlists based on the specified filter
- */
- public static function playlists($input) {
+ /**
+ * playlists
+ * This returns playlists based on the specified filter
+ */
+ public static function playlists($input) {
- self::$browse->reset_filters();
- self::$browse->set_type('playlist');
- self::$browse->set_sort('name','ASC');
+ self::$browse->reset_filters();
+ self::$browse->set_type('playlist');
+ self::$browse->set_sort('name','ASC');
- $method = $input['exact'] ? 'exact_match' : 'alpha_match';
- Api::set_filter($method,$input['filter']);
+ $method = $input['exact'] ? 'exact_match' : 'alpha_match';
+ Api::set_filter($method,$input['filter']);
- $playlist_ids = self::$browse->get_objects();
+ $playlist_ids = self::$browse->get_objects();
- XML_Data::set_offset($input['offset']);
- XML_Data::set_limit($input['limit']);
+ XML_Data::set_offset($input['offset']);
+ XML_Data::set_limit($input['limit']);
- ob_end_clean();
- echo XML_Data::playlists($playlist_ids);
+ ob_end_clean();
+ echo XML_Data::playlists($playlist_ids);
- } // playlists
+ } // playlists
- /**
- * playlist
- * This returns a single playlist
- */
- public static function playlist($input) {
+ /**
+ * playlist
+ * This returns a single playlist
+ */
+ public static function playlist($input) {
- $uid = scrub_in($input['filter']);
+ $uid = scrub_in($input['filter']);
- ob_end_clean();
- echo XML_Data::playlists(array($uid));
+ ob_end_clean();
+ echo XML_Data::playlists(array($uid));
- } // playlist
+ } // playlist
- /**
- * playlist_songs
- * This returns the songs for a playlist
- */
- public static function playlist_songs($input) {
+ /**
+ * playlist_songs
+ * This returns the songs for a playlist
+ */
+ public static function playlist_songs($input) {
- $playlist = new Playlist($input['filter']);
- $items = $playlist->get_items();
+ $playlist = new Playlist($input['filter']);
+ $items = $playlist->get_items();
- foreach ($items as $object) {
- if ($object['object_type'] == 'song') {
- $songs[] = $object['object_id'];
- }
- } // end foreach
+ foreach ($items as $object) {
+ if ($object['object_type'] == 'song') {
+ $songs[] = $object['object_id'];
+ }
+ } // end foreach
- XML_Data::set_offset($input['offset']);
- XML_Data::set_limit($input['limit']);
- ob_end_clean();
- echo XML_Data::songs($songs);
+ XML_Data::set_offset($input['offset']);
+ XML_Data::set_limit($input['limit']);
+ ob_end_clean();
+ echo XML_Data::songs($songs);
- } // playlist_songs
+ } // playlist_songs
- /**
- * search_songs
- * This searches the songs and returns... songs
- */
- public static function search_songs($input) {
- $array['type'] = 'song';
- $array['rule_1'] = 'anywhere';
- $array['rule_1_input'] = $input['filter'];
- $array['rule_1_operator'] = 0;
+ /**
+ * search_songs
+ * This searches the songs and returns... songs
+ */
+ public static function search_songs($input) {
+ $array['type'] = 'song';
+ $array['rule_1'] = 'anywhere';
+ $array['rule_1_input'] = $input['filter'];
+ $array['rule_1_operator'] = 0;
- ob_end_clean();
+ ob_end_clean();
- XML_Data::set_offset($input['offset']);
- XML_Data::set_limit($input['limit']);
+ XML_Data::set_offset($input['offset']);
+ XML_Data::set_limit($input['limit']);
- $results = Search::run($array);
-
- echo XML_Data::songs($results);
+ $results = Search::run($array);
+
+ echo XML_Data::songs($results);
- } // search_songs
+ } // search_songs
- /**
- * videos
- * This returns video objects!
- */
- public static function videos($input) {
-
- self::$browse->reset_filters();
- self::$browse->set_type('video');
- self::$browse->set_sort('title','ASC');
-
- $method = $input['exact'] ? 'exact_match' : 'alpha_match';
- Api::set_filter($method,$input['filter']);
-
- $video_ids = self::$browse->get_objects();
-
- XML_Data::set_offset($input['offset']);
- XML_Data::set_limit($input['limit']);
-
- echo XML_Data::videos($video_ids);
-
- } // videos
-
- /**
- * video
- * This returns a single video
- */
- public static function video($input) {
-
- $video_id = scrub_in($input['filter']);
-
- echo XML_Data::videos(array($video_id));
-
-
- } // video
-
- /**
- * localplay
- * This is for controling localplay
- */
- public static function localplay($input) {
-
- // Load their localplay instance
- $localplay = new Localplay(Config::get('localplay_controller'));
- $localplay->connect();
-
- switch ($input['command']) {
- case 'next':
- case 'prev':
- case 'play':
- case 'stop':
- $result_status = $localplay->$input['command']();
- $xml_array = array('localplay'=>array('command'=>array($input['command']=>make_bool($result_status))));
- echo XML_Data::keyed_array($xml_array);
- break;
- default:
- // They are doing it wrong
- echo XML_Data::error('405', T_('Invalid Request'));
- break;
- } // end switch on command
-
- } // localplay
-
- /**
- * democratic
- * This is for controlling democratic play
- */
- public static function democratic($input) {
-
- // Load up democratic information
- $democratic = Democratic::get_current_playlist();
- $democratic->set_parent();
-
- switch ($input['method']) {
- case 'vote':
- $type = 'song';
- $media = new $type($input['oid']);
- if (!$media->id) {
- echo XML_Data::error('400', T_('Media Object Invalid or Not Specified'));
- break;
- }
- $democratic->add_vote(array(
- array(
- 'object_type' => 'song',
- 'object_id' => $media->id
- )
- ));
-
- // If everything was ok
- $xml_array = array('action'=>$input['action'],'method'=>$input['method'],'result'=>true);
- echo XML_Data::keyed_array($xml_array);
- break;
- case 'devote':
- $type = 'song';
- $media = new $type($input['oid']);
- if (!$media->id) {
- echo XML_Data::error('400', T_('Media Object Invalid or Not Specified'));
- }
-
- $uid = $democratic->get_uid_from_object_id($media->id,$type);
- $democratic->remove_vote($uid);
-
- // Everything was ok
- $xml_array = array('action'=>$input['action'],'method'=>$input['method'],'result'=>true);
- echo XML_Data::keyed_array($xml_array);
- break;
- case 'playlist':
- $objects = $democratic->get_items();
- Song::build_cache($democratic->object_ids);
- Democratic::build_vote_cache($democratic->vote_ids);
- XML_Data::democratic($objects);
- break;
- case 'play':
- $url = $democratic->play_url();
- $xml_array = array('url'=>$url);
- echo XML_Data::keyed_array($xml_array);
- break;
- default:
- echo XML_Data::error('405', T_('Invalid Request'));
- break;
- } // switch on method
-
- } // democratic
+ /**
+ * videos
+ * This returns video objects!
+ */
+ public static function videos($input) {
+
+ self::$browse->reset_filters();
+ self::$browse->set_type('video');
+ self::$browse->set_sort('title','ASC');
+
+ $method = $input['exact'] ? 'exact_match' : 'alpha_match';
+ Api::set_filter($method,$input['filter']);
+
+ $video_ids = self::$browse->get_objects();
+
+ XML_Data::set_offset($input['offset']);
+ XML_Data::set_limit($input['limit']);
+
+ echo XML_Data::videos($video_ids);
+
+ } // videos
+
+ /**
+ * video
+ * This returns a single video
+ */
+ public static function video($input) {
+
+ $video_id = scrub_in($input['filter']);
+
+ echo XML_Data::videos(array($video_id));
+
+
+ } // video
+
+ /**
+ * localplay
+ * This is for controling localplay
+ */
+ public static function localplay($input) {
+
+ // Load their localplay instance
+ $localplay = new Localplay(Config::get('localplay_controller'));
+ $localplay->connect();
+
+ switch ($input['command']) {
+ case 'next':
+ case 'prev':
+ case 'play':
+ case 'stop':
+ $result_status = $localplay->$input['command']();
+ $xml_array = array('localplay'=>array('command'=>array($input['command']=>make_bool($result_status))));
+ echo XML_Data::keyed_array($xml_array);
+ break;
+ default:
+ // They are doing it wrong
+ echo XML_Data::error('405', T_('Invalid Request'));
+ break;
+ } // end switch on command
+
+ } // localplay
+
+ /**
+ * democratic
+ * This is for controlling democratic play
+ */
+ public static function democratic($input) {
+
+ // Load up democratic information
+ $democratic = Democratic::get_current_playlist();
+ $democratic->set_parent();
+
+ switch ($input['method']) {
+ case 'vote':
+ $type = 'song';
+ $media = new $type($input['oid']);
+ if (!$media->id) {
+ echo XML_Data::error('400', T_('Media Object Invalid or Not Specified'));
+ break;
+ }
+ $democratic->add_vote(array(
+ array(
+ 'object_type' => 'song',
+ 'object_id' => $media->id
+ )
+ ));
+
+ // If everything was ok
+ $xml_array = array('action'=>$input['action'],'method'=>$input['method'],'result'=>true);
+ echo XML_Data::keyed_array($xml_array);
+ break;
+ case 'devote':
+ $type = 'song';
+ $media = new $type($input['oid']);
+ if (!$media->id) {
+ echo XML_Data::error('400', T_('Media Object Invalid or Not Specified'));
+ }
+
+ $uid = $democratic->get_uid_from_object_id($media->id,$type);
+ $democratic->remove_vote($uid);
+
+ // Everything was ok
+ $xml_array = array('action'=>$input['action'],'method'=>$input['method'],'result'=>true);
+ echo XML_Data::keyed_array($xml_array);
+ break;
+ case 'playlist':
+ $objects = $democratic->get_items();
+ Song::build_cache($democratic->object_ids);
+ Democratic::build_vote_cache($democratic->vote_ids);
+ XML_Data::democratic($objects);
+ break;
+ case 'play':
+ $url = $democratic->play_url();
+ $xml_array = array('url'=>$url);
+ echo XML_Data::keyed_array($xml_array);
+ break;
+ default:
+ echo XML_Data::error('405', T_('Invalid Request'));
+ break;
+ } // switch on method
+
+ } // democratic
} // API class
?>