Last.fm + PHP: Conheça novos artistas e novas músicas

4 03 2007

Cansado de ouvir as mesmas músicas ? Que tal escrever um pequeno script para obter uma lista de artistas similares aos que você costuma ouvir ?

Para isso utilizaremos informações disponibilizadas pela Last.FM

Inicialmente, criamos uma classe, bem simples, para obter as informações. Uma breve explicação do funcionamento desta classe está nos comentários.


<?php
    
// arquivo similarartist.class.php
    
    /**
    * Classe que ira obter as informacoes de artistas similares
    *
    * @author e silva <heap@heap.com.br>
    */
    
class SimilarArtist {
        
/**
        * URL onde serao buscadas as informacoes
        * @var string
        */
        
private $url ;
        
        
/**
        * Nome do artista informado na instanciacao da classe
        * @var string
        */
        
private $artist ;
        
        
/**
        * Lista com os artistas similares encontrados
        * @var array
        */
        
private $similarArtists = array();
        
        
/**
        * Construtor da classe
        *
        * Inicializa as propriedades “url” e “artist” e chama o metodo
        * responsavel pelo carregamento da lista com os artistas similares
        *
        * @param string $artist Nome do artista desejado
        */
        
public function __construct($artist)
        {
            
$this->artist $artist;
            
$this->url sprintf(http://ws.audioscrobbler.com/1.0/artist/%s/similar.xml&#8217;$artist);
            
$this->load();
        }
        
        
/**
        * Efetua carregamento do artistas similares ao informado
        *
        * @throw Exception
        */
        
private function load()
        {
            
// obtem o conteudo do arquivo com as informacoes de artistas
            // similares.
            // Caso nao consiga, gera uma exception
            
$content = @file_get_contents($this->url);
            if ( !
$content )
                throw new 
Exception (‘Could not load url’);

            // caso o conteudo do arquivo contenha uma string informando que
            // o artista nao existe, tambem gera uma exception
            
if ( strstr($content‘No artist exists with this name’) )
                throw new 
Exception (sprintf(‘Artist “%s” not found’$this->artist));

            // o conteudo do arquivo esta em formato XML. Transforma-se entao
            // este conteudo em uma instancia da classe SimpleXMLElement. Caso
            // ocorra algum erro, uma outra exception e’ gerada
            
$xml = @simplexml_load_file($this->url);
            if ( !
$xml )
                throw new 
Exception (‘Could not load url’);

            // efetua uma iteracao por todos os itens do objeto criado anteriormente,
            // populando a propriedade “similarArtists” desta classe.
            // note que e’ criado um array de arrays com dois indices: “name” e “image”:
            // o primeiro indice e’ o nome do artista similar encontrado e o segundo
            // contem uma url com uma imagem do artista. Simples…
            
foreach ( $xml->artist as $similar )
                
$this->similarArtists[] = array( 
                                            
‘name’  => (string) $similar->name
                                            
‘image’ => (string) $similar->image
                                          
);
        }
        
        
/**
        * Retorna uma lista com todos os artistas encontrados
        *
        * @return array Array de arrays com todos os artistas similares encontrados
        */
        
public function getAll()
        {
            return 
$this->similarArtists;
        }
    }

Após a criação da classe, que por sinal é bastante simples, criaremos 2 exemplos de uso: Um utilizando a linha de comando e um utilizando um script acessado via navegador. Ambos estão comentados também. Vejamos o primeiro:


<?php
    
// incluimos a definicao da classe
    
include ‘similarartist.class.php’;

    // como a classe SimilarArtist gera exceptions e nao desejamos que
    // elas sejam simplesmente jogadas na tela, iremos captura-las.
    // Resumidamente, este bloco funciona assim:
    //
    // tente fazer o seguinte {
    //      lista de itens que devem
    //      ser executados. Alguns deles
    //      podem gerar uma exception
    // } capture as excecoes {
    //      se estamos aqui, significa que no bloco
    //      anterior foi gerada uma exception. Fazemos o
    //      tratamento necessario nesta parte.
    // }
    //
    // Bastante simples. Futuramente havera por aqui um pequeno tutorial
    // sobre exceptions
    
try {
        
// aqui obtemos o nome do artista informado na linha de comando
        // ha outras formas de se fazer o que faco aqui, por exemplo, utilizando
        // getopt. Caso nao encontre o argumento necessario, gera uma exception, que
        // sera capturada mais abaixo
        
$pos array_search(‘–artist’$argv);
        if ( !
$pos || !isset($argv[$pos+1]))
            throw new 
Exception(‘Uso: php cli.php –artist nome do artista’);
        
$artist implode(‘+’array_slice($argv$pos+1$argc));

        // instancia a classe com o nome do artista informado e exibe 
        // informacao de quantos foram encontrados
        
$sa = new SimilarArtist($artist);
        
$list $sa->getAll();
        echo 
sprintf(‘Encontrados %s artistas similares. Exibindo os 5 primeiros:%s’sizeof($list), “\n”);

        // e finalmente, exibe a lista de artistas
        
$cont 1;
        foreach ( 
$list as $similar ) {
            echo 
sprintf(‘%s – %s%s’$cont++, $similar[‘name’], “\n”);
            if ( 
$cont ) break;
        }
    
// como explicado anteriormente, capturamos qualquer exception que possa ter 
    // sido gerada
    
} catch ( Exception $exc ) {
        echo 
sprintf(‘Ocorreu um erro: %s%s%s’“\n”$exc->getMessage(), “\n”);
    }

Executando temos:

$ php cli.php –artist velhas virgens
Encontrados 100 artistas similares. Exibindo os 5 primeiros:
1 – Raul Seixas
2 – Raimundos
3 – Ultraje a Rigor
4 – Matanza
5 – Engenheiros do Hawaii

Segundo exemplo: Script web:


<?php
    
// arquivo web.php

    // veja explicacao no script anterior, o funcionamento e’ bem similar
    include ‘similarartist.class.php’;
    
    
    try {
        if ( !isset(
$_REQUEST[‘artist’]) )
            throw new 
Exception(‘Artista nao informado’);
        
$sa = new SimilarArtist($_REQUEST[‘artist’]);
        
$list $sa->getAll();
        echo 
sprintf(‘Exibindo <strong>%s</strong> artistas similares a <strong>%s</strong>’sizeof($list), $_REQUEST[‘artist’]);
        foreach ( 
$list as $artist ) {
          echo 
‘<div style=”float:left;margin-right:10px;”>’;
          echo 
sprintf(‘    <h3>%s</h3>’utf8_decode($artist[‘name’]));
          echo 
sprintf(‘    <img src=”%s” alt=”%s” />’$artist[‘image’], utf8_decode($artist[‘name’]));
          echo 
‘</div>’;
        }
    } catch ( 
Exception $exc ) {
        echo 
sprintf(‘Ocorreu um erro: %s%s%s’“\n”$exc->getMessage(), “\n”);
    }
?>

Executando temos:

web

Arquivos:
similarartist.class.txt
cli.txt
web.txt

É isso ai.

Anúncios

Ações

Information

3 responses

21 03 2007
Celso

Olá,

Legal artigo mas fiquei com uma duvida aqui
url);
?>

Tentei fazer isso com uma url assim:
http://www.exemplo.com/index.php?cep=teste

Não deu certo você sabe o que pode ser?

Obrigado

22 03 2007
E Silva

ooops()

Acho q você tentou colar algum código e wordpress apagou… Descreve o problema ai que já descobrimos o que rolou : )

23 05 2008
Thiago Korsakoff

Olá!

Seu código está muito bom, e bem funcional.
Agora só fiquei com uma dúvida. Quando a gente tenta repassar para a váriavel artist um nome de banda composto por mais de 1 palavra, tipo Maroon 5 ou Capital Inicial, ele retorna Could not load URL.

Será que há possibilidade de fixar isto?

Desde já Grato,

Thiago Korsakoff

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s




%d blogueiros gostam disto: