¿Cuál es la mejor manera de obtener la información de CDDB para un CD de audio en Perl?
Pregunta
¿Cuál es la mejor manera de conseguir el cd-título y los CD-track-nombres de un CD de audio? Probé este módulo, pero no funcionó.
#!/usr/bin/env perl
use warnings;
use strict;
use CDDB_get qw( get_cddb );
my %config;
$config{CDDB_HOST} = "freedb.freedb.org";
$config{CDDB_PORT} = 8880;
$config{CDDB_MODE} = "cddb";
$config{CD_DEVICE} = "/dev/sr1";
# user interaction welcome?
$config{input} = 1;
my %cd = get_cddb( \%config ); # line 16
print "$_ : $cd{$_}\n" for keys %cd;
unless( defined $cd{title} ) {
die "no cddb entry found";
}
print "artist: $cd{artist}\n";
print "title: $cd{title}\n";
print "category: $cd{cat}\n";
print "cddbid: $cd{id}\n";
print "trackno: $cd{tno}\n";
my $n = 1;
for my $i ( @{$cd{track}} ) {
print "track $n: $i\n";
$n++;
}
# OUT:
# Odd number of elements in hash assignment at ./cddb_get.pl line 16.
# Use of uninitialized value in list assignment at ./cddb_get.pl line 16.
# Use of uninitialized value in concatenation (.) or string at ./cddb_get.pl line 18.
# :
# no cddb entry found at ./cddb_get.pl line 21.
Solución
Trate de poner
BEGIN { $CDDB_get::debug = 1 }
antes de la línea use CDDB_get
con el fin de obtener información de depuración en STDERR.
Otros consejos
¿Está seguro de la URL API para FreeDB es correcto en el módulo?
Se puede tratar de HTTP en lugar de CDDBP?
Configure su CDDB1- o freedb-enterado software para señalar freedb.freedb.org (Servidor freedb Aleatorio) como su CDDB / freedb-servidor.
Todos los servidores oficiales son freedb cddbp corriendo en el puerto 8880 y HTTP en el puerto 80. La ruta de acceso http-es /~cddb/cddb.cgi.
Me gustaría considerar la búsqueda de información sobre musicbrainz.org lugar.
El uso de MusicBrainz :: ID de disco para encontrar el ID de disco de un CD y WebService :: MusicBrainz para recuperar los datos es muy fácil:
#!/usr/bin/perl
use strict;
use warnings;
use MusicBrainz::DiscID;
use WebService::MusicBrainz;
my $discid=MusicBrainz::DiscID->new;
if ( !$discid->read ) {
print STDERR "Error: " . $discid->error_msg . "\n";
exit 1;
}
print "DiscID: " . $discid->id . "\n";
my $service=WebService::MusicBrainz->new_release;
my $response=$service->search({ DISCID=>$discid->id });
my $release=$response->release;
print "ARTIST: " . $release->artist->name . "\n";
print "ALBUM: " . $release->title . "\n";