Skip to content

Commit

Permalink
Implemented the example script from lidiscid in perl.
Browse files Browse the repository at this point in the history
  • Loading branch information
njh committed May 27, 2009
1 parent dba14eb commit 8c31ccd
Show file tree
Hide file tree
Showing 3 changed files with 186 additions and 33 deletions.
26 changes: 23 additions & 3 deletions examples/discid.pl
Expand Up @@ -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;
144 changes: 139 additions & 5 deletions lib/MusicBrainz/DiscID.pm
Expand Up @@ -37,23 +37,77 @@ 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;
}

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};
}
}

Expand All @@ -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
Expand Down
49 changes: 24 additions & 25 deletions lib/MusicBrainz/DiscID.xs
Expand Up @@ -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

0 comments on commit 8c31ccd

Please sign in to comment.