forked from GNUsocial/gnu-social
		
	
		
			
				
	
	
		
			192 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			192 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Phergie
 | |
|  *
 | |
|  * PHP version 5
 | |
|  *
 | |
|  * LICENSE
 | |
|  *
 | |
|  * This source file is subject to the new BSD license that is bundled
 | |
|  * with this package in the file LICENSE.
 | |
|  * It is also available through the world-wide-web at this URL:
 | |
|  * http://phergie.org/license
 | |
|  *
 | |
|  * @category  Phergie
 | |
|  * @package   Phergie_Plugin_AudioScrobbler
 | |
|  * @author    Phergie Development Team <team@phergie.org>
 | |
|  * @copyright 2008-2010 Phergie Development Team (http://phergie.org)
 | |
|  * @license   http://phergie.org/license New BSD License
 | |
|  * @link      http://pear.phergie.org/package/Phergie_Plugin_AudioScrobbler
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * Provides commands to look up information on tracks played by specific 
 | |
|  * users on the Last.fm and Libre.fm services.
 | |
|  *
 | |
|  * TODO: Make the "nick-binding" use an SQLite database instead of having them
 | |
|  *       hard-coded in to the config file.
 | |
|  * 
 | |
|  * Configuration settings:
 | |
|  * "audioscrobbler.lastfm_api_key":  API given by last.fm (string).
 | |
|  * "audioscrobbler.librefm_api_key": API key given by libre.fm (string).
 | |
|  * 
 | |
|  * @category Phergie
 | |
|  * @package  Phergie_Plugin_AudioScrobbler
 | |
|  * @author   Phergie Development Team <team@phergie.org>
 | |
|  * @license  http://phergie.org/license New BSD License
 | |
|  * @link     http://pear.phergie.org/package/Phergie_Plugin_AudioScrobbler
 | |
|  * @uses     Phergie_Plugin_Command pear.phergie.org
 | |
|  * @uses     Phergie_Plugin_Http pear.phergie.org
 | |
|  * @uses     extension simplexml
 | |
|  */
 | |
| class Phergie_Plugin_AudioScrobbler extends Phergie_Plugin_Abstract
 | |
| {
 | |
|     /**
 | |
|      * Last.FM API entry point
 | |
|      *
 | |
|      * @var string
 | |
|      */
 | |
|     protected $lastfmUrl = 'http://ws.audioscrobbler.com/2.0/';
 | |
|     
 | |
|     /**
 | |
|      * Libre.FM API entry point
 | |
|      *
 | |
|      * @var string
 | |
|      */
 | |
|     protected $librefmUrl = 'http://alpha.dev.libre.fm/2.0/';
 | |
|     
 | |
|     /**
 | |
|      * Scrobbler query string for user.getRecentTracks
 | |
|      *
 | |
|      * @var string
 | |
|      */
 | |
|     protected $query = '?method=user.getrecenttracks&user=%s&api_key=%s';
 | |
| 
 | |
|     /**
 | |
|      * HTTP plugin
 | |
|      *
 | |
|      * @var Phergie_Plugin_Http
 | |
|      */
 | |
|     protected $http;
 | |
|     
 | |
|     /**
 | |
|      * Check for dependencies.
 | |
|      *
 | |
|      * @return void
 | |
|      */
 | |
|     public function onLoad()
 | |
|     {
 | |
|         if (!extension_loaded('simplexml')) {
 | |
|             $this->fail('SimpleXML php extension is required');
 | |
|         }
 | |
|         
 | |
|         $plugins = $this->getPluginHandler();
 | |
|         $plugins->getPlugin('Command');
 | |
|         $this->http = $plugins->getPlugin('Http');
 | |
|     }
 | |
|     
 | |
|     /**
 | |
|      * Command function to get a user's status on last.fm.
 | |
|      * 
 | |
|      * @param string $user User identifier
 | |
|      *
 | |
|      * @return void
 | |
|      */
 | |
|     public function onCommandLastfm($user = null)
 | |
|     {
 | |
|         if ($key = $this->config['audioscrobbler.lastfm_api_key']) {
 | |
|             $scrobbled = $this->getScrobbled($user, $this->lastfmUrl, $key);
 | |
|             if ($scrobbled) {
 | |
|                 $this->doPrivmsg($this->getEvent()->getSource(), $scrobbled);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Command function to get a user's status on libre.fm.
 | |
|      * 
 | |
|      * @param string $user User identifier
 | |
|      *
 | |
|      * @return void
 | |
|      */
 | |
|     public function onCommandLibrefm($user = null)
 | |
|     {
 | |
|         if ($key = $this->config['audioscrobbler.librefm_api_key']) {
 | |
|             $scrobbled = $this->getScrobbled($user, $this->librefmUrl, $key);
 | |
|             if ($scrobbled) {
 | |
|                 $this->doPrivmsg($this->getEvent()->getSource(), $scrobbled);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Simple Scrobbler API function to get a formatted string of the most 
 | |
|      * recent track played by a user.
 | |
|      * 
 | |
|      * @param string $user Username to look up
 | |
|      * @param string $url  Base URL of the scrobbler service
 | |
|      * @param string $key  Scrobbler service API key
 | |
|      *
 | |
|      * @return string Formatted string of the most recent track played
 | |
|      */
 | |
|     public function getScrobbled($user, $url, $key)
 | |
|     {
 | |
|         $event = $this->getEvent();
 | |
|         $user = $user ? $user : $event->getNick();
 | |
|         $url = sprintf($url . $this->query, urlencode($user), urlencode($key));
 | |
| 
 | |
|         $response = $this->http->get($url);
 | |
|         if ($response->isError()) {
 | |
|             $this->doNotice(
 | |
|                 $event->getNick(),
 | |
|                 'Can\'t find status for ' . $user . ': HTTP ' . 
 | |
|                 $response->getCode() . ' ' . $response->getMessage()
 | |
|             );
 | |
|             return false; 
 | |
|         }
 | |
|         
 | |
|         $xml = $response->getContent();
 | |
|         if ($xml->error) {
 | |
|             $this->doNotice(
 | |
|                 $event->getNick(),
 | |
|                 'Can\'t find status for ' . $user . ': API ' . $xml->error
 | |
|             );
 | |
|             return false; 
 | |
|         }
 | |
|         
 | |
|         $recenttracks = $xml->recenttracks;
 | |
|         $track = $recenttracks->track[0];
 | |
|         
 | |
|         // If the user exists but has not scrobbled anything, the result will
 | |
|         // be empty.
 | |
|         if (empty($track->name) && empty($track->artist)) {
 | |
|             $this->doNotice(
 | |
|                 $event->getNick(),
 | |
|                 'Can\'t find track information for ' . $recenttracks['user']
 | |
|             );
 | |
|             return false;
 | |
|         }
 | |
|         
 | |
|         if (isset($track['nowplaying'])) {
 | |
|             $msg = sprintf(
 | |
|                 '%s is listening to %s by %s',
 | |
|                 $recenttracks['user'],
 | |
|                 $track->name,
 | |
|                 $track->artist
 | |
|             );
 | |
|         } else {
 | |
|             $msg = sprintf(
 | |
|                 '%s, %s was listening to %s by %s',
 | |
|                 date('j M Y, H:i', (int) $track->date['uts']),
 | |
|                 $recenttracks['user'],
 | |
|                 $track->name,
 | |
|                 $track->artist
 | |
|             );
 | |
|         }
 | |
|         if ($track->streamable == 1) {
 | |
|             $msg .= ' - ' . $track->url;
 | |
|         }
 | |
|         return $msg;
 | |
|     }
 | |
| }
 |