web/lib/Zend/Service/Audioscrobbler.php
changeset 64 162c1de6545a
parent 19 1c2f13fd785c
child 68 ecaf28ffe26e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/lib/Zend/Service/Audioscrobbler.php	Fri Mar 11 15:05:35 2011 +0100
@@ -0,0 +1,681 @@
+<?php
+
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category   Zend
+ * @package    Zend_Service
+ * @subpackage Audioscrobbler
+ * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license    http://framework.zend.com/license/new-bsd     New BSD License
+ * @version    $Id: Audioscrobbler.php 20096 2010-01-06 02:05:09Z bkarwin $
+ */
+
+
+/**
+ * @see Zend_Http_Client
+ */
+require_once 'Zend/Http/Client.php';
+
+
+/**
+ * @category   Zend
+ * @package    Zend_Service
+ * @subpackage Audioscrobbler
+ * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license    http://framework.zend.com/license/new-bsd     New BSD License
+ */
+class Zend_Service_Audioscrobbler
+{
+    /**
+     * Zend_Http_Client Object
+     *
+     * @var     Zend_Http_Client
+     * @access  protected
+     */
+    protected $_client;
+
+    /**
+     * Array that contains parameters being used by the webservice
+     *
+     * @var     array
+     * @access  protected
+     */
+    protected $_params;
+
+    /**
+     * Holds error information (e.g., for handling simplexml_load_string() warnings)
+     *
+     * @var     array
+     * @access  protected
+     */
+    protected $_error = null;
+
+
+    /**
+     * Sets up character encoding, instantiates the HTTP client, and assigns the web service version.
+     */
+    public function __construct()
+    {
+        $this->set('version', '1.0');
+
+        iconv_set_encoding('output_encoding', 'UTF-8');
+        iconv_set_encoding('input_encoding', 'UTF-8');
+        iconv_set_encoding('internal_encoding', 'UTF-8');
+    }
+
+    /**
+     * Set Http Client
+     *
+     * @param Zend_Http_Client $client
+     */
+    public function setHttpClient(Zend_Http_Client $client)
+    {
+        $this->_client = $client;
+    }
+
+    /**
+     * Get current http client.
+     *
+     * @return Zend_Http_Client
+     */
+    public function getHttpClient()
+    {
+        if($this->_client == null) {
+            $this->lazyLoadHttpClient();
+        }
+        return $this->_client;
+    }
+
+    /**
+     * Lazy load Http Client if none is instantiated yet.
+     *
+     * @return void
+     */
+    protected function lazyLoadHttpClient()
+    {
+        $this->_client = new Zend_Http_Client();
+    }
+
+    /**
+     * Returns a field value, or false if the named field does not exist
+     *
+     * @param  string $field
+     * @return string|false
+     */
+    public function get($field)
+    {
+        if (array_key_exists($field, $this->_params)) {
+            return $this->_params[$field];
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * Generic set action for a field in the parameters being used
+     *
+     * @param  string $field name of field to set
+     * @param  string $value value to assign to the named field
+     * @return Zend_Service_Audioscrobbler Provides a fluent interface
+     */
+    public function set($field, $value)
+    {
+        $this->_params[$field] = urlencode($value);
+
+        return $this;
+    }
+
+    /**
+     * Protected method that queries REST service and returns SimpleXML response set
+     *
+     * @param  string $service name of Audioscrobbler service file we're accessing
+     * @param  string $params  parameters that we send to the service if needded
+     * @throws Zend_Http_Client_Exception
+     * @throws Zend_Service_Exception
+     * @return SimpleXMLElement result set
+     * @access protected
+     */
+    protected function _getInfo($service, $params = null)
+    {
+        $service = (string) $service;
+        $params  = (string) $params;
+
+        if ($params === '') {
+            $this->getHttpClient()->setUri("http://ws.audioscrobbler.com{$service}");
+        } else {
+            $this->getHttpClient()->setUri("http://ws.audioscrobbler.com{$service}?{$params}");
+        }
+
+        $response     = $this->getHttpClient()->request();
+        $responseBody = $response->getBody();
+
+        if (preg_match('/No such path/', $responseBody)) {
+            /**
+             * @see Zend_Http_Client_Exception
+             */
+            require_once 'Zend/Http/Client/Exception.php';
+            throw new Zend_Http_Client_Exception('Could not find: ' . $this->_client->getUri());
+        } elseif (preg_match('/No user exists with this name/', $responseBody)) {
+            /**
+             * @see Zend_Http_Client_Exception
+             */
+            require_once 'Zend/Http/Client/Exception.php';
+            throw new Zend_Http_Client_Exception('No user exists with this name');
+        } elseif (!$response->isSuccessful()) {
+            /**
+             * @see Zend_Http_Client_Exception
+             */
+            require_once 'Zend/Http/Client/Exception.php';
+            throw new Zend_Http_Client_Exception('The web service ' . $this->_client->getUri() . ' returned the following status code: ' . $response->getStatus());
+        }
+
+        set_error_handler(array($this, '_errorHandler'));
+
+        if (!$simpleXmlElementResponse = simplexml_load_string($responseBody)) {
+            restore_error_handler();
+            /**
+             * @see Zend_Service_Exception
+             */
+            require_once 'Zend/Service/Exception.php';
+            $exception = new Zend_Service_Exception('Response failed to load with SimpleXML');
+            $exception->error    = $this->_error;
+            $exception->response = $responseBody;
+            throw $exception;
+        }
+
+        restore_error_handler();
+
+        return $simpleXmlElementResponse;
+    }
+
+    /**
+    * Utility function to get Audioscrobbler profile information (eg: Name, Gender)
+     *
+    * @return array containing information
+    */
+    public function userGetProfileInformation()
+    {
+        $service = "/{$this->get('version')}/user/{$this->get('user')}/profile.xml";
+        return $this->_getInfo($service);
+    }
+
+    /**
+     * Utility function get this user's 50 most played artists
+     *
+     * @return array containing info
+    */
+    public function userGetTopArtists()
+    {
+        $service = "/{$this->get('version')}/user/{$this->get('user')}/topartists.xml";
+        return $this->_getInfo($service);
+    }
+
+    /**
+     * Utility function to get this user's 50 most played albums
+     *
+     * @return SimpleXMLElement object containing result set
+    */
+    public function userGetTopAlbums()
+    {
+        $service = "/{$this->get('version')}/user/{$this->get('user')}/topalbums.xml";
+        return $this->_getInfo($service);
+    }
+
+    /**
+     * Utility function to get this user's 50 most played tracks
+     * @return SimpleXML object containing resut set
+    */
+    public function userGetTopTracks()
+    {
+        $service = "/{$this->get('version')}/user/{$this->get('user')}/toptracks.xml";
+        return $this->_getInfo($service);
+    }
+
+    /**
+     * Utility function to get this user's 50 most used tags
+     *
+     * @return SimpleXMLElement object containing result set
+     */
+    public function userGetTopTags()
+    {
+        $service = "/{$this->get('version')}/user/{$this->get('user')}/tags.xml";
+        return $this->_getInfo($service);
+    }
+
+    /**
+     * Utility function that returns the user's top tags used most used on a specific artist
+     *
+     * @return SimpleXMLElement object containing result set
+     */
+    public function userGetTopTagsForArtist()
+    {
+        $service = "/{$this->get('version')}/user/{$this->get('user')}/artisttags.xml";
+        $params = "artist={$this->get('artist')}";
+        return $this->_getInfo($service, $params);
+    }
+
+    /**
+     * Utility function that returns this user's top tags for an album
+     *
+     * @return SimpleXMLElement object containing result set
+     */
+    public function userGetTopTagsForAlbum()
+    {
+        $service = "/{$this->get('version')}/user/{$this->get('user')}/albumtags.xml";
+        $params = "artist={$this->get('artist')}&album={$this->get('album')}";
+        return $this->_getInfo($service, $params);
+    }
+
+    /**
+     * Utility function that returns this user's top tags for a track
+     *
+     * @return SimpleXMLElement object containing result set
+     */
+    public function userGetTopTagsForTrack()
+    {
+        $service = "/{$this->get('version')}/user/{$this->get('user')}/tracktags.xml";
+        $params = "artist={$this->get('artist')}&track={$this->get('track')}";
+        return $this->_getInfo($service, $params);
+    }
+
+    /**
+     * Utility function that retrieves this user's list of friends
+     * @return SimpleXMLElement object containing result set
+     */
+    public function userGetFriends()
+    {
+        $service = "/{$this->get('version')}/user/{$this->get('user')}/friends.xml";
+        return $this->_getInfo($service);
+    }
+
+    /**
+     * Utility function that returns a list of people with similar listening preferences to this user
+     *
+     * @return SimpleXMLElement object containing result set
+     */
+    public function userGetNeighbours()
+    {
+        $service = "/{$this->get('version')}/user/{$this->get('user')}/neighbours.xml";
+        return $this->_getInfo($service);
+    }
+
+    /**
+     * Utility function that returns a list of the 10 most recent tracks played by this user
+     *
+     * @return SimpleXMLElement object containing result set
+     */
+    public function userGetRecentTracks()
+    {
+        $service = "/{$this->get('version')}/user/{$this->get('user')}/recenttracks.xml";
+        return $this->_getInfo($service);
+    }
+
+    /**
+     * Utility function that returns a list of the 10 tracks most recently banned by this user
+     *
+     * @return SimpleXMLElement object containing result set
+     */
+    public function userGetRecentBannedTracks()
+    {
+        $service = "/{$this->get('version')}/user/{$this->get('user')}/recentbannedtracks.xml";
+        return $this->_getInfo($service);
+    }
+
+    /**
+     * Utility function that returns a list of the 10 tracks most recently loved by this user
+     *
+     * @return SimpleXMLElement object containing result set
+     */
+    public function userGetRecentLovedTracks()
+    {
+        $service = "/{$this->get('version')}/user/{$this->get('user')}/recentlovedtracks.xml";
+        return $this->_getInfo($service);
+    }
+
+    /**
+     * Utility function that returns a list of dates of available weekly charts for a this user
+     *
+     * Should actually be named userGetWeeklyChartDateList() but we have to follow audioscrobbler's naming
+     *
+     * @return SimpleXMLElement object containing result set
+     */
+    public function userGetWeeklyChartList()
+    {
+        $service = "/{$this->get('version')}/user/{$this->get('user')}/weeklychartlist.xml";
+        return $this->_getInfo($service);
+    }
+
+
+    /**
+     * Utility function that returns weekly album chart data for this user
+     *
+     * @param integer $from optional UNIX timestamp for start of date range
+     * @param integer $to optional UNIX timestamp for end of date range
+     * @return SimpleXMLElement object containing result set
+     */
+    public function userGetWeeklyAlbumChart($from = NULL, $to = NULL)
+    {
+        $params = "";
+
+        if ($from != NULL && $to != NULL) {
+            $from = (int)$from;
+            $to = (int)$to;
+            $params = "from={$from}&to={$to}";
+        }
+
+        $service = "/{$this->get('version')}/user/{$this->get('user')}/weeklyalbumchart.xml";
+        return $this->_getInfo($service, $params);
+    }
+
+    /**
+     * Utility function that returns weekly artist chart data for this user
+     *
+     * @param integer $from optional UNIX timestamp for start of date range
+     * @param integer $to optional UNIX timestamp for end of date range
+     * @return SimpleXMLElement object containing result set
+     */
+    public function userGetWeeklyArtistChart($from = NULL, $to = NULL)
+    {
+        $params = "";
+
+        if ($from != NULL && $to != NULL) {
+            $from = (int)$from;
+            $to = (int)$to;
+            $params = "from={$from}&to={$to}";
+        }
+
+        $service = "/{$this->get('version')}/user/{$this->get('user')}/weeklyartistchart.xml";
+        return $this->_getInfo($service, $params);
+    }
+
+    /**
+     * Utility function that returns weekly track chart data for this user
+     *
+     * @param integer $from optional UNIX timestamp for start of date range
+     * @param integer $to optional UNIX timestamp for end of date range
+     * @return SimpleXMLElement object containing result set
+     */
+    public function userGetWeeklyTrackChart($from = NULL, $to = NULL)
+    {
+        $params = "";
+
+        if ($from != NULL && $to != NULL) {
+            $from = (int)$from;
+            $to = (int)$to;
+            $params = "from={$from}&to={$to}";
+        }
+
+        $service = "/{$this->get('version')}/user/{$this->get('user')}/weeklytrackchart.xml";
+        return $this->_getInfo($service, $params);
+    }
+
+
+    /**
+     * Utility function that returns a list of artists similiar to this artist
+     *
+     * @return SimpleXMLElement object containing result set
+     */
+    public function artistGetRelatedArtists()
+    {
+        $service = "/{$this->get('version')}/artist/{$this->get('artist')}/similar.xml";
+        return $this->_getInfo($service);
+    }
+
+    /**
+     * Utility function that returns a list of this artist's top listeners
+     *
+     * @return SimpleXMLElement object containing result set
+     */
+    public function artistGetTopFans()
+    {
+        $service = "/{$this->get('version')}/artist/{$this->get('artist')}/fans.xml";
+        return $this->_getInfo($service);
+    }
+
+    /**
+     * Utility function that returns a list of this artist's top-rated tracks
+     *
+     * @return SimpleXMLElement object containing result set
+     */
+    public function artistGetTopTracks()
+    {
+        $service = "/{$this->get('version')}/artist/{$this->get('artist')}/toptracks.xml";
+        return $this->_getInfo($service);
+    }
+
+    /**
+     * Utility function that returns a list of this artist's top-rated albums
+     *
+     * @return SimpleXMLElement object containing result set
+     */
+    public function artistGetTopAlbums()
+    {
+        $service = "/{$this->get('version')}/artist/{$this->get('artist')}/topalbums.xml";
+        return $this->_getInfo($service);
+    }
+
+    /**
+     * Utility function that returns a list of this artist's top-rated tags
+     *
+     * @return SimpleXMLElement object containing result set
+     */
+    public function artistGetTopTags()
+    {
+        $service = "/{$this->get('version')}/artist/{$this->get('artist')}/toptags.xml";
+        return $this->_getInfo($service);
+    }
+
+
+    /**
+     * Get information about an album
+     *
+     * @return SimpleXMLElement
+     */
+    public function albumGetInfo()
+    {
+        $service = "/{$this->get('version')}/album/{$this->get('artist')}/{$this->get('album')}/info.xml";
+        return $this->_getInfo($service);
+    }
+
+    /**
+     * Get top fans of the current track.
+     *
+     * @return SimpleXMLElement
+     */
+    public function trackGetTopFans()
+    {
+        $service = "/{$this->get('version')}/track/{$this->get('artist')}/{$this->get('track')}/fans.xml";
+        return $this->_getInfo($service);
+    }
+
+    /**
+     * Get top tags of the current track.
+     *
+     * @return SimpleXMLElement
+     */
+    public function trackGetTopTags()
+    {
+        $service = "/{$this->get('version')}/track/{$this->get('artist')}/{$this->get('track')}/toptags.xml";
+        return $this->_getInfo($service);
+    }
+
+    /**
+     * Get Top Tags.
+     *
+     * @return SimpleXMLElement
+     */
+    public function tagGetTopTags()
+    {
+        $service = "/{$this->get('version')}/tag/toptags.xml";
+        return $this->_getInfo($service);
+    }
+
+    /**
+     * Get top albums by current tag.
+     *
+     * @return SimpleXMLElement
+     */
+    public function tagGetTopAlbums()
+    {
+        $service = "/{$this->get('version')}/tag/{$this->get('tag')}/topalbums.xml";
+        return $this->_getInfo($service);
+    }
+
+    /**
+     * Get top artists by current tag.
+     *
+     * @return SimpleXMLElement
+     */
+    public function tagGetTopArtists()
+    {
+        $service = "/{$this->get('version')}/tag/{$this->get('tag')}/topartists.xml";
+        return $this->_getInfo($service);
+    }
+
+    /**
+     * Get Top Tracks by currently set tag.
+     *
+     * @return SimpleXMLElement
+     */
+    public function tagGetTopTracks()
+    {
+        $service = "/{$this->get('version')}/tag/{$this->get('tag')}/toptracks.xml";
+        return $this->_getInfo($service);
+    }
+
+    /**
+     * Get weekly chart list by current set group.
+     *
+     * @see set()
+     * @return SimpleXMLElement
+     */
+    public function groupGetWeeklyChartList()
+    {
+        $service = "/{$this->get('version')}/group/{$this->get('group')}/weeklychartlist.xml";
+        return $this->_getInfo($service);
+    }
+
+    /**
+     * Retrieve weekly Artist Charts
+     *
+     * @param  int $from
+     * @param  int $to
+     * @return SimpleXMLElement
+     */
+    public function groupGetWeeklyArtistChartList($from = NULL, $to = NULL)
+    {
+
+        if ($from != NULL && $to != NULL) {
+            $from = (int)$from;
+            $to = (int)$to;
+            $params = "from={$from}&$to={$to}";
+        } else {
+            $params = "";
+        }
+
+        $service = "/{$this->get('version')}/group/{$this->get('group')}/weeklyartistchart.xml";
+        return $this->_getInfo($service, $params);
+    }
+
+    /**
+     * Retrieve Weekly Track Charts
+     *
+     * @param  int $from
+     * @param  int $to
+     * @return SimpleXMLElement
+     */
+    public function groupGetWeeklyTrackChartList($from = NULL, $to = NULL)
+    {
+        if ($from != NULL && $to != NULL) {
+            $from = (int)$from;
+            $to = (int)$to;
+            $params = "from={$from}&to={$to}";
+        } else {
+            $params = "";
+        }
+
+        $service = "/{$this->get('version')}/group/{$this->get('group')}/weeklytrackchart.xml";
+        return $this->_getInfo($service, $params);
+    }
+
+    /**
+     * Retrieve Weekly album charts.
+     *
+     * @param int $from
+     * @param int $to
+     * @return SimpleXMLElement
+     */
+    public function groupGetWeeklyAlbumChartList($from = NULL, $to = NULL)
+    {
+        if ($from != NULL && $to != NULL) {
+            $from = (int)$from;
+            $to = (int)$to;
+            $params = "from={$from}&to={$to}";
+        } else {
+            $params = "";
+        }
+
+        $service = "/{$this->get('version')}/group/{$this->get('group')}/weeklyalbumchart.xml";
+        return $this->_getInfo($service, $params);
+    }
+
+    /**
+     * Saves the provided error information to this instance
+     *
+     * @param  integer $errno
+     * @param  string  $errstr
+     * @param  string  $errfile
+     * @param  integer $errline
+     * @param  array   $errcontext
+     * @return void
+     */
+    protected function _errorHandler($errno, $errstr, $errfile, $errline, array $errcontext)
+    {
+        $this->_error = array(
+            'errno'      => $errno,
+            'errstr'     => $errstr,
+            'errfile'    => $errfile,
+            'errline'    => $errline,
+            'errcontext' => $errcontext
+            );
+    }
+
+    /**
+     * Call Intercept for set($name, $field)
+     *
+     * @param  string $method
+     * @param  array  $args
+     * @return Zend_Service_Audioscrobbler
+     */
+    public function __call($method, $args)
+    {
+        if(substr($method, 0, 3) !== "set") {
+            require_once "Zend/Service/Exception.php";
+            throw new Zend_Service_Exception(
+                "Method ".$method." does not exist in class Zend_Service_Audioscrobbler."
+            );
+        }
+        $field = strtolower(substr($method, 3));
+
+        if(!is_array($args) || count($args) != 1) {
+            require_once "Zend/Service/Exception.php";
+            throw new Zend_Service_Exception(
+                "A value is required for setting a parameter field."
+            );
+        }
+        $this->set($field, $args[0]);
+
+        return $this;
+    }
+}