Network: Needish · clandescuento · Willka Travel & Adventures
// you’re reading...

last.fm CakePHP component for songs submission

Ayer comentaba sobre la clase PHP para enviar canciones a last.fm. Bueno dado que lo voy a utilizar desde CakePHP lo más lógico era construir un componente, y gracias al HttpSocket de CakePHP el código se redujo bastante. Aquí les dejo el código para usarlo libremente (MIT License)

< ?php
/**
 * last.fm component for songs submissions
 * Send songs to last.fm using cakephp
 *
 *
 * PHP versions 4 and 5
 *
 * Copyright 2008, Pablo Viojo
 *
 * Licensed under The MIT License
 * Redistributions of files must retain the above copyright notice.
 *
 * @filesource
 * @copyright			Copyright 2008, Pablo Viojo (http://pviojo.net)
 * @link						http://projects.pviojo.net/lastfm
 * @version				0.1.1
 * @lastmodified		2008-07-26
 * @license					http://www.opensource.org/licenses/mit-license.php The MIT License
 *
 * Usage sample:
 * 

 if($this->Lastfm->connect($user, $password)){
	if(
		$this->Lastfm->submit(
			array(
				'artist'=>'Artist',
				'title'=>'Song Name',
				'album'=>'Album nane',
				'duration'=>duration(secs)
			)
		)
	 ){
		// ...submission success
  	}
  }

 *
 */	

if (!defined('LASTFM_CONNECTED')){
	define ('LASTFM_CONNECTED', 'OK');
}
if (!defined('LASTFM_ERROR')){
	define ('LASTFM_ERROR', 'ERROR');
}

App::import('core','HttpSocket');

class LastfmComponent extends Object {

/**
 * Constructor.
 */
	function startup(&$controller) {
		$this->controller = $controller;

		$this->clientId = "tst";
		$this->clientVer = "1.0";

		$this->socket = new HttpSocket();

	}

/**
 * Connects to lastfm using user and password
 */
	function connect($user, $password){
		$this->user = $user;
		$this->password = $password;
		return $this->_handShake();

	}
/**
 * Returns true if connected to last.fm
 *
 * @return boolean Connection Status
 * @access public
 */
 	function isConnected(){
		if ($this->status==LASTFM_CONNECTED){
			return true;
		}

		return false;
	}
/**
 * Performs a handshake
 *
 * @return Status (LASTFM_CONNECTED on success, LASTFM_ERROR otherwise)
 * @access private
 */
	function _handShake(){

		$this->status = false;

		$timestamp = time();
		$auth = md5(md5($this->password) . $timestamp);

		$url = "http://post.audioscrobbler.com/?hs=true&p=1.2.1&c=" . $this->clientId . "&v=" . $this->clientVer . "&u=" . $this->user . "&t=" . $timestamp . "&a=" . $auth ;
		$rsp = $this->_execute($url,  array('username'=>$this->user, 'password'=>$this->password));
		if ($rsp){
			$rsp = split("\n",$rsp);
			$this->status = $rsp[0];
			switch($this->status){
				case "OK":
					$this->status = LASTFM_CONNECTED;
					$this->sessionId = $rsp[1];
					$this->urls['nowPlaying'] = $rsp[2];
					$this->urls['submission'] = $rsp[3];
					break;
				default:
					$this->status = LASTFM_ERROR;
					$this->sessionId = null;
					break;
			}
		}
		return $this->status ;
	}

/**
 * Submit a song to last.fm
 * @param array $song array ("artist", "title", "duration", "album"[, "start"] )
 * @return boolean Submission Status
 * @access public
 */
	function submit($song){

		$timestamp = time();
		$auth = md5(md5($this->password) . $timestamp);

		$data = array(
			"s"=>$this->sessionId,
			"a[0]"=>$song['artist'],
			"t[0]"=>$song['title'],
			"i[0]"=>(isset($song['start'])?$song['start']:time()),
			"o[0]"=>"P",
			"r[0]"=>"",
			"l[0]"=>$song['duration'],
			"b[0]"=>$song['album'],
			"n[0]"=>"",
			"m[0]"=>""
		);

		$url = $this->urls['submission'];
		$rsp = $this->_execute($url,  array('username'=>$this->user, 'password'=>$this->password), 'POST', $data);
		switch(trim($rsp)){
			case "OK":
				return true;
				break;
			default:
				return false;
		}
	}

/**
 * Execute a request
 * @access private
 */
	function _execute($url, $auth = null, $method = 'GET', $data = null){

		$request = array(
			'method' => $method,
			'uri' => $url
		);

		if ($auth){
			$request = am(
				$request,
				array(
					'auth' => array(
						'method' => 'basic',
						'user' => $auth["username"],
						'pass' => $auth["password"]
					)
				)
			);
		}

		if (strtoupper($method)=="POST"){
			if ($data){
				foreach($data as $key=>$value ) {
					$postData[$key] = $value;
				}
				$request['body'] = $postData;
			}
		}

		$output = $this->socket->request($request);
		return $output;

	}

}

Comments

5 comments for “last.fm CakePHP component for songs submission”

  1. Que tal,

    Buen componente y ejemplo de como usar la API de LastFM, aunque tengo una duda.
    Porque no pusiste App::import(’core’,'HttpSocket’); al principio, o sea fuera del método _execute(). Y al igual que $socket = new HttpSocket();, no seria mejor ponerlo en startup() onda, $this->httpSocket = new HttpSocket();.

    Saludos.

    Posted by Victor San Martin | July 26, 2008, 18:14
  2. Toda la razón, ya está corregido. Muchas gracias!

    Posted by pviojo | July 26, 2008, 21:54
  3. Me parece raro usar define() en una clase.

    Quizas no habria sido mejor declararlas como atributos privados de una clase?

    private $connected = true;
    private $error = true;

    Asi puedes tener metodos accesadores y modificadores para estas variables y modificarlas cuando estimes. En cambio con define son estaticas.

    Ejemplo:

    if($lastfm->error()):
    $lastfm->setConnected(false);
    endif;

    if($lastfm->connected == true) {
    // Hace lo que tienes que hacer
    } else {
    return $lastfm->error;
    }

    Posted by Fabian Ramirez | July 28, 2008, 10:04
  4. @Fabián: El define esta fuera de la clase, y con el tema de declarlas como privadas no estoy muy de acuerdo, ya que connected y error son dos valores posibles para el atributo status, y no atributos de la clase.

    En cualquier caso debería declararlas como constantes (const) pero como PHP4 no lo soporta están definidas como están.

    Saludos

    Posted by pviojo | July 28, 2008, 10:59
  5. Pablo es el arte de programar de cada uno :)

    Posted by Fabian Ramirez | July 29, 2008, 22:28

Post a comment

Mi nombre es Pablo Viojo y tengo 27 años. Nací en Uruguay el 7 de agosto de 1981. Actualmente vivo en Santiago, Chile
Aparte de esto me interesa todo lo que tenga que ver con Internet y las nuevas tecnologías. Más info aquí, en mi hCard o en formato FOAF

View Pablo Viojo's profile on LinkedIn

Featured Posts

Romper paradigmas
February 23, 2009

A veces es necesario romper paradigmas…
¿Por qué la vista, o un elemento de la vista, no puede comunicarse con el modelo?
Paradigma: Un paradigma es —desde fines de la década de 1960— un modelo o patrón en cualquier disciplina científica u otro contexto epistemológico. El concepto fue originalmente específico de la gramática; en 1900 el diccionario [...]

Reedición: Microformatos, los bloques de la web semántica
November 18, 2008

¿Que son los microformatos?
Se trata de formatos de marcado XHTML, aplicables en contextos particulares, que utilizan los atributos definidos por los estándares para mejorar la semántica de los documentos. Son una herramienta muy util para aquellas estructuras que se repiten frecuentemente en documentos, ya sea que se trate de documentos creados por una persona, por [...]

La importancia del Undo en las Web Applications
November 11, 2008

Tomado de Needish the Blog, con permiso del autor
Robert O’Callahan, en su artículo The Essence Of Web Applications, resume algunos aspectos de las aplicaciones web y su relación con las aplicaciones de escritorio.
En lo personal no estoy muy de acuerdo con lo que opina, sobre todo cuando menciona aspectos relacionados con los elementos [...]

La importancia de las interfaces en los nuevos modelos de interacción web
May 14, 2006

Últimamente este blog ha tenido bastante poco movimiento, fundamentalmente debido a falta de tiempo por parte de quien escribe por estos lados.
Si bien tengo unos cuantos temas que me gustaría tocar, fundamentalmente porque en los últimos meses me ha tocado entrar en un área bastante nueva de la programación para la web (sí, esa, la [...]

Suscribe

Enter your email address: