diff --git a/examples/discid.pl b/examples/discid.pl index dcbb265..258d650 100644 --- a/examples/discid.pl +++ b/examples/discid.pl @@ -3,12 +3,32 @@ use MusicBrainz::DiscID; use strict; -print "Default device: ".MusicBrainz::DiscID::default_device()."\n"; +my $disc = new MusicBrainz::DiscID(); -#my $discid = new MusicBrainz::DiscID(); +# read the disc in the default disc drive */ +if ( $disc->read() == 0 ) { + printf STDERR "Error: %s\n", $disc->error_msg(); + exit(1); +} +printf("DiscID : %s\n", $disc->id()); +printf("FreeDB DiscID : %s\n", $disc->freedb_id()); +printf("First track : %d\n", $disc->first_track_num()); +printf("Last track : %d\n", $disc->last_track_num()); +printf("Length : %d sectors\n", $disc->sectors()); -#undef $discid; +for ( my $i = $disc->first_track_num; + $i <= $disc->last_track_num; $i++ ) { + + printf("Track %-2d : %8d %8d\n", $i, + $disc->track_offset($i), + $disc->track_length($i)); +} + +printf("Submit via : %s\n", $disc->submission_url()); +printf("WS url : %s\n", $disc->webservice_url()); + +undef $disc; diff --git a/lib/MusicBrainz/DiscID.pm b/lib/MusicBrainz/DiscID.pm index 343f279..77b60ac 100644 --- a/lib/MusicBrainz/DiscID.pm +++ b/lib/MusicBrainz/DiscID.pm @@ -37,8 +37,8 @@ sub new { bless $self, $class; # Create new DiscID instance - $self->{discid} = MusicBrainz::DiscID::discid_new(); - if (!defined $self->{discid}) { + $self->{disc} = MusicBrainz::DiscID::discid_new(); + if (!defined $self->{disc}) { carp("Error creating DiscId structure"); undef $self; } @@ -46,14 +46,68 @@ sub new { return $self; } +sub first_track_num { + my $self = shift; + return MusicBrainz::DiscID::discid_get_first_track_num($self->{disc}); +} + +sub error_msg { + my $self = shift; + return MusicBrainz::DiscID::discid_get_error_msg($self->{disc}); +} +sub freedb_id { + my $self = shift; + return MusicBrainz::DiscID::discid_get_freedb_id($self->{disc}); +} + +sub id { + my $self = shift; + return MusicBrainz::DiscID::discid_get_id($self->{disc}); +} + +sub last_track_num { + my $self = shift; + return MusicBrainz::DiscID::discid_get_last_track_num($self->{disc}); +} + +sub read { + my $self = shift; + $self->{device} = $_[0] if (defined $_[0]); + return MusicBrainz::DiscID::discid_read($self->{disc},$self->{device}); +} + +sub sectors { + my $self = shift; + return MusicBrainz::DiscID::discid_get_sectors($self->{disc}); +} + +sub submission_url { + my $self = shift; + return MusicBrainz::DiscID::discid_get_submission_url($self->{disc}); +} + +sub track_offset { + my $self = shift; + return MusicBrainz::DiscID::discid_get_track_offset($self->{disc}, $_[0]); +} + +sub track_length { + my $self = shift; + return MusicBrainz::DiscID::discid_get_track_length($self->{disc}, $_[0]); +} + +sub webservice_url { + my $self = shift; + return MusicBrainz::DiscID::discid_get_webservice_url($self->{disc}); +} sub DESTROY { my $self=shift; - if (defined $self->{discid}) { - MusicBrainz::DiscID::discid_free( $self->{discid} ); - undef $self->{discid}; + if (defined $self->{disc}) { + MusicBrainz::DiscID::discid_free( $self->{disc} ); + undef $self->{disc}; } } @@ -73,7 +127,87 @@ MusicBrainz::DiscID - Perl interface for the MusicBrainz libdiscid library use MusicBrainz::DiscID; my $discid = new MusicBrainz::DiscID(); + if ( $disc->read() == 0 ) { + printf STDERR "Error: %s\n", $disc->error_msg(); + exit(1); + } + printf("DiscID: %s\n", $disc->id()); + +=head1 DESCRIPTION + +MusicBrainz::DiscID is a class to calculate a MusicBrainz DiscID +from an audio CD in the drive. The coding style is slightly different to +the C interface to libdiscid, because it makes use of perl's Object Oriented +functionality. + +=over 4 + +=item MusicBrainz::DiscID::default_device() + +Returns a device string for the default device for this platform. + +=item MusicBrainz::DiscID::new( [$device] ) + +Construct a new DiscID object. + +As an optional argument the name of the device to read the ID from may +be given. If you donÔt specify a device here you can later read the ID with +the read method. + +=item $discid->error_msg() + +Return a human-readable error message of the last error that occured. + +=item $discid->first_track_num() + +Return the number of the first track on this disc (usually 1). +Returns undef if no ID was yet read. + +=item $discid->last_track_num() + +Return the number of the last track on this disc. + +=item $discid->id() + +Returns the DiscID as a string. +Returns undef if no ID was yet read. + +=item $discid->last_track_num() + +Return the number of the last track on this disc. +Returns undef if no ID was yet read. + +=item $discid->read( [$device] ) + +Read the disc ID from the given device. +If no device is given the default device of the platform will be used. +On error, this function returns false and sets the error message which you +can access $discid->error_msg(). + +=item $discid->sectors() + +Return the length of the disc in sectors. +Returns undef if no ID was yet read. + +=item $discid->submission_url() + +Returns a submission URL for the DiscID as a string. +Returns undef if no ID was yet read. + +=item $discid->track_length( $track_num ) + +Return the length of a track in sectors. + +=item $discid->track_offset( $track_num ) + +Return the sector offset of a track. + +=item $discid->webservice_url() + +Returns a Webservice URL for the DiscID as a string. +Returns undef if no ID was yet read. +=back =head1 SEE ALSO diff --git a/lib/MusicBrainz/DiscID.xs b/lib/MusicBrainz/DiscID.xs index c9e1f21..1d529af 100644 --- a/lib/MusicBrainz/DiscID.xs +++ b/lib/MusicBrainz/DiscID.xs @@ -30,86 +30,85 @@ discid_new() ## Release the memory allocated for the DiscId object. ## void -discid_free( d ) - DiscId *d +discid_free( disc ) + DiscId *disc ## ## Read the disc in the given CD-ROM/DVD-ROM drive. ## int -discid_read( d, device ) - DiscId *d +discid_read( disc, device ) + DiscId *disc char* device ## ## Return a human-readable error message. ## char* -discid_get_error_msg( d ) - DiscId *d +discid_get_error_msg( disc ) + DiscId *disc ## ## Return a MusicBrainz DiscID. ## char* -discid_get_id( d ) - DiscId *d +discid_get_id( disc ) + DiscId *disc ## ## Return a FreeDB DiscID. ## char* -discid_get_freedb_id( d ) - DiscId *d +discid_get_freedb_id( disc ) + DiscId *disc ## ## Return an URL for submitting the DiscID to MusicBrainz. ## char* -discid_get_submission_url( d ) - DiscId *d +discid_get_submission_url( disc ) + DiscId *disc ## ## Return an URL for retrieving CD information from MusicBrainz' web service. ## char* -discid_get_webservice_url( d ) - DiscId *d +discid_get_webservice_url( disc ) + DiscId *disc ## ## Return the number of the first track on this disc. ## int -discid_get_first_track_num( d ) - DiscId *d +discid_get_first_track_num( disc ) + DiscId *disc ## ## Return the number of the last track on this disc. ## int -discid_get_last_track_num( d ) - DiscId *d +discid_get_last_track_num( disc ) + DiscId *disc ## ## Return the length of the disc in sectors. ## int -discid_get_sectors( d ) - DiscId *d +discid_get_sectors( disc ) + DiscId *disc ## ## Return the sector offset of a track. ## int -discid_get_track_offset( d, track_num ) - DiscId *d +discid_get_track_offset( disc, track_num ) + DiscId *disc int track_num ## ## Return the length of a track in sectors. ## int -discid_get_track_length( d, track_num ) - DiscId *d +discid_get_track_length( disc, track_num ) + DiscId *disc int track_num -