¡Ya estamos en Twitter!

Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad

Leyendo tu Ipod con Perl (Parte 1)

por Uriel Lizama

Hace poco me compré un Ipod, de esos blancos que pueden contener cerca de 80GB de música. Como uso Windows me descargué el Itunes que es el que uso para transferir datos a mi Ipod.

Itunes funciona muy bien, siempre y cuando sea cuestión de pasar datos al Ipod, el problema viene cuando quieres leer tu Ipod. Pero como siempre, viene Perl al rescate.

Perl al Rescate

Es increíble la cantidad de cosas para la que podemos usar Perl, basta con entrar a CPAN y realizar búsquedas de temas extraños, y de seguro vas a encontrar por lo menos un módulo para ello.

En CPAN podremos encontrar varios módulos que nos sirven para leer nuestro Ipod y realizar operaciones con él. Me puse a checar todos hasta que encontré el módulo Mac::Ipod::GNUpod. Éste módulo es el más completo de todos, y te permite leer Ipods formateados ya sea con Itunes o con GNUpod.

El módulo tiene un sin fin de opciones que te permite hacer básicamente de todo con tu Ipod, puedes formatearlo, inicializarlo, leerlo, transferir archivos, etc.

Leyendo nuestro Ipod

Para este tutorial vamos a aprender a leer nuestro Ipod, y vamos a desplegar nuestras canciones en un sencillo formato XML.

Lo primero que vamos a hacer es crear un nuevo objeto 'Mac::Ipod::GNUpod':

my $ipod = Mac::iPod::GNUpod->new(mountpoint => 'I:');

Es muy importante el 'mountpoint' pues eso le indica a nuestro módulo en que lugar está montado nuestro Ipod. En Windows será una letra de disco (D:,E:,F:,etc.) y en Unix será algo así como '/mnt/ipod'.

Si alguna vez has navegado a través de los archivos de tu Ipod, verás que no simplemente son copiados los archivos, sino que el Ipod los distribuye a través de carpetas con nombres raros. Lo que hace el Ipod es crear un database con todas las canciones, entonces, ya que tenemos nuestro objeto creado, ahora hay que leer el database de nuestro Ipod.

Como mi Ipod yo lo inicialicé con Itunes, entonces el database estará en tipo Itunes por lo que para cargarlo tengo que usar la siguiente línea:

$ipod->read_itunes;

En caso de que estés en UNIX con GNUpod entonces deberás de hacerlo con:

$ipod->read_gnupod;

Dependiendo del tamaño de tu database y de la velocidad de conexión con tu Ipod será el tiempo que le tomará a tu script cargar el database completo.

Una vez que lo hemos cargado entonces ya podemos empezar a hacer cosas con él. Por ejemplo, vamos a tomar un listado de todas las canciones en nuestro Ipod:

my @songs = $ipod->all_songs;

Nuestro array @songs tendrá la lista completa de los IDs de cada una de las canciones en nuestro Ipod, pero tener una lista de números no es para nada útil, sin embargo los podemos usar para cargar los datos de cada uno de los mp3 del Ipod, para hacerlo usamos la función get_song():

my $mp3 = $ipod->get_song([ID_CANCION]);

El valor [ID_CANCION] es el id de la canción de la cual queremos los detalles. Al final tendremos en nuestra variable $mp3 una referencia a un hash con todos los detalles de nuestra canción, por ejemplo, para imprimir el título podríamos hacer:

print $mp3->{title};

Ahora, tenemos un detalle muy importante y que debemos de tener en cuenta porque después podría ocasionar resultados no deseados. Todos los campos del hash con los detalles de nuestra canción no son cadenas, sino son objetos de tipo Unicode::String, y aunque tiene los métodos necesarios para varias operaciones, podría no estar en la codificación que quieres, por eso es mejor hacer lo siguiente:

my $title = $mp3->{title}->as_string;

Así $title tendrá la cadena del título, de lo contrario se haría una copia del objeto Unicode::String.

Los valores posibles que nos regresará la canción son los siguientes:

id
artist
album
title
songnum
songs
cdnum
cds
composer
year
genre
fdesc
filesize
bitrate
time
srate
playcount
path
orig_path

En caso de que no exista algún valor retornará nulo.

Creando nuestro XML

Ya sabemos como leer nuestro Ipod, ahora vamos a crear nuestro sencillo XML. Para ello vamos a usar el módulo XML::Simple, éste módulo nos permite leer y escribir archivos de tipo XML de manera sencilla.

Para que el módulo haga el dump en XML debemos de pasarle una referencia a nuestro hash, para ello vamos a hacer un nuevo hash:

my %Song;

Vamos a crear una llave MP3 con una referencia a un array anónimo:

$Song{'MP3'} = [];

El array lo iremos llenando con los detalle de cada canción. De ésta manera nos quedará una estructura bien definida.

Ahora haremos el loop a través de los ids de nuestras canciones:

for my $id(@songs){

}

Vamos a tomar los detalles de cada una de las canciones o MP3:

my $mp3 = $ipod->get_song($id);

Y ya con eso podemos agregar un nuevo elemento a nuestro hash:

        push(@{$Song{'MP3'}},
                     {
                      ID      => $id,
                      Titulo  => $mp3->{title}->as_string,
                      Artista => $mp3->{artist}->as_string,
                      Album   => $mp3->{album}->as_string
                     }  );

Agregamos un nuevo elemento a nuestro array anónimo definido en la llave MP3 de nuestro hash MP3. El nuevo elemento será una referencia a un hash anónimo con las llaves que queremos mostrar.

Tu podrás editar las llaves que quieres pasar de acuerdo a los detalles que quieres mostrar en tu archivo XML.

Finalmente le pedimos al módulo XML::Simple que haga el dump de nuestra variable en un archivo de tipo XML:

my $xsimple = XML::Simple->new();

open my $XML, '>:encoding(iso-8859-1)', 'mi_ipod.xml' or die "No se pudo abrir archivo: $!";

print {$XML}
$xsimple->XMLout(
           $Song,
           noattr     => 1,
           AttrIndent => 1,
           RootName   => "Ipod",
           KeyAttr    => { 'MP3' => 'ID' },
           xmldecl    => '<?xml version="1.0" encoding="iso-8859-1" ?>'
          );

close $XML;

La Salida de XML

Si todo te funciona bien, entonces tendrás un archivo XML llamado "mi_ipod.xml" con entradas que se van a ver algo así:

<Ipod>
  <MP3>
    <ID>4228</ID>
    <Album>High Hopes</Album>
    <Artista>Pink Floyd</Artista>
    <Titulo>A Great Day for Freedom</Titulo>
  </MP3>
</Ipod>

Código Final

ipod2xml.pl

#!/usr/bin/perl

use strict;

use XML::Simple;
use Mac::Ipod::GNUpod;


my $ipod = Mac::iPod::GNUpod->new(mountpoint => 'I:');

   $ipod->read_itunes;

   my @songs = $ipod->all_songs;

    my %Song;
       $Song{'MP3'} = [];

    for my $id(@songs){

        my $mp3 = $ipod->get_song($id);

        push(@{$Song{'MP3'}},
                     {
                      ID      => $id,
                      Titulo  => $mp3->{title}->as_string,
                      Artista => $mp3->{artist}->as_string,
                      Album   => $mp3->{album}->as_string
                     }  );
    }


my $xsimple = XML::Simple->new();

open my $XML, '>:encoding(iso-8859-1)', 'mi_ipod.xml' or die "No se pudo abrir archivo: $!";

print {$XML}
$xsimple->XMLout(
           $Song,
           noattr     => 1,
           AttrIndent => 1,
           RootName   => "Ipod",
           KeyAttr    => { 'MP3' => 'ID' },
           xmldecl    => '<?xml version="1.0" encoding="iso-8859-1" ?>'
          );

close $XML;

¿Quiéres más tutoriales como este? Escribir tutoriales toma una gran cantidad de tiempo y esfuerzo. Si este tutorial te ayudó a aprender o a solucionar algo, por favor considera dejar alguna donación en apoyo a Perl en Español.

Cliquea en el botón de abajo para dejar tu donación por medio de PayPal.

Comparte:
Categorías de Tutoriales:
En Nuestros Foros:

    Software error:

    junk after document element at line 1, column 32, byte 32 at /usr/lib64/perl5/vendor_perl/XML/Parser.pm line 187.
    

    For help, please send mail to the webmaster ([email protected]), giving this error message and the time and date of the error.

  • Entra a los foros »
Socializa:
Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Perl en Español es mantenido con Movable Type
Todo el contenido de Perl en Español está bajo una licencia CC:
Creative Commons License