jueves, 9 de septiembre de 2010

GetLyric: Buscador de Letras de Canciones

Bueno, aquí se viene otro código más...

Este entrega la letra (o lyric) de una cierta canción!

Como funciona:
Fácil, solo tienen que correr el Escri por linea de comando (usa Perl) y pasarle como parámetro el nombre del artista y el nombre de la canción.
El script buscará la letra en dos sitios distintos (en caso de que falle el primero, se utiliza el segundo ;) ) y si dá con él entonces lo mostrará por pantalla, sino, se queda callado y termina la ejecución del script corta y fome :P

Yap, espero que en este código no se me haya quedado una password o algo por el estilo (información sensible) ya que últimamente he cometido ese tipo de errores (pero gracias a Dios que tengo buenos amigos ;) )

Bueno, ahí está el código... Enjoy!

#!/usr/bin/perl
use strict;
use LWP::UserAgent;
use HTML::Entities;


if (($ARGV[0] eq '') || ($ARGV[1] eq '')) {

    print "GetLyric 1.0 ( http://wischv.blogspot.com/ )\n";
    print "Autor: Walter Schmidt\n";
    print "Usage: $0 \"Artist\" \"Song\"\n";
    exit;
}

#################################################


#my $artist = '311';
#my $song   = 'Do You Right';
my $artist = $ARGV[0];
my $song   = $ARGV[1];


my $lyric = '';
if ($lyric = get_lyric_lyricsplugin($artist, $song)) {
    print $lyric;
}
elsif ($lyric = get_lyric_songlyrics($artist, $song)) {
    print $lyric;
}


#################
##  FUNCIONES  ##
#################

sub get_lyric_songlyrics {

    my $body;
    my $artist_song = lc($_[0] . '/' . $_[1]);
    $artist_song =~ s/' / /g; # Livin' And Rockin' => livin-and-rockin
    $artist_song =~ s/'$//g;  # Livin' And Rockin' => livin-and-rockin
    $artist_song =~ s/'$//g;  # Livin' And Rockin' => livin-and-rockin
    $artist_song =~ s/[\?\&\.' ]/-/g; # It's Alright => it-s-alright
    $artist_song =~ s/[^a-zA-Z0-9\-\/]//g;
    # El exceso de '-' (Ej: '---') son limpiados por el server

    my $ua = new LWP::UserAgent;
    my $resource = $ua->get("http://www.songlyrics.com/$artist_song-lyrics/");

    if ($resource->is_success) {

        $body = $resource->content;
        $body =~ s/[^[:print:]]//g;
        $body =~ /(<p id="songLyricsDiv".*)<p id="songLyricsSmallDiv"/i;
        my $lyric = $1;

        decode_entities($lyric);

        $lyric =~ s/<br \/>/\n/g; # Convierte los <br /> en <ENTER>'s
        $lyric =~ s/<[^>]*>//g;   # Elimina los TAGs de HTML existentes
        $lyric =~ s/\n\[ [^\n]+ are found on www.songlyrics.com \]//g; # Elimina los mensajes de Songlyric
        $lyric =~ s/ +/ /g;    # Elimina el exceso de espacios entre las palabras
        $lyric =~ s/^\s+//g;   # Elimina los espacios y <ENTER>'s del comienzo del Lyric
        $lyric =~ s/\n +/\n/g; # Elimina los espacios del comienzo de cada linea
        $lyric =~ s/ +\n/\n/g; # Elimina los espacios del final de cada linea
        $lyric =~ s/\n+$/\n/g; # Elimina el exceso de <ENTER> al final del Lyric

        return $lyric;
    }
    else {

        #print $resource->status_line . "\n";
        return 0;
    }
}


sub get_lyric_lyricsplugin {

    my $artist = shift;
    my $song   = shift;

    my $site   = 'http://www.lyricsplugin.com';
    my $ua = new LWP::UserAgent;
    my $resource = $ua->get("$site/wmplayer03/plugin/?title=$song&artist=$artist");


    if ($resource->is_success) {

        my $body = $resource->content;
        $body =~ /javascript:getContent\('([^']*)', '([^']*)', '([^']*)', '([^']*)'\)/;

        $resource = $ua->get("$site/wmplayer03/plugin/content.php?artist=$1&title=$2&timestamp=$3&hash=$4", 'Referer' => "http://www.lyricsplugin.com/wmplayer03/plugin/?title=$2&artist=$1");

        if ($resource->is_success) {

            my $lyric = '';
            my $lyric_flag = 0;
            foreach my $line (split /\n/, $resource->content) {

                last if (($line =~ /<\/div>/) && ($lyric_flag));
                if ($lyric_flag) {

                    $line =~ s/\r//;
                    $line =~ s/<br \/>/\n/;
                    $lyric .= $line;
                }
                $lyric_flag = 1 if ($line =~ /<div id="lyrics">/);
            }

            return ($lyric eq '') ? 0 : $lyric . "\n";
        }
        else {

            #print $resource->status_line . "\n";
            return 0;
        }
    }
    else {

        #print $resource->status_line . "\n";
        return 0;
    }
}