Skip to content

Instantly share code, notes, and snippets.

@warewolf
Created May 3, 2015 18:30
Show Gist options
  • Select an option

  • Save warewolf/a41d04e31961b275ac79 to your computer and use it in GitHub Desktop.

Select an option

Save warewolf/a41d04e31961b275ac79 to your computer and use it in GitHub Desktop.
Perl discid script for CDDB ids
#!/usr/bin/perl -w
use strict;
use constant CDROMREADTOCHDR=>0x5305;
use constant CDROMREADTOCENTRY=>0x5306;
use constant CDROM_MSF=>0x02;
use IO::File;
use Data::Dumper;
sub get_toc (*)
{
my $fh = shift;
my $ioctlarg=0x20 x 1024;
my $val = ioctl($fh,CDROMREADTOCHDR,$ioctlarg) or die "can't fcntl ($!)";
my $toc_ref;
my ($start,$finish) = unpack('CC',$ioctlarg);
my @tracks = ($start..$finish);
push @tracks, 0xAA;
foreach my $trackno (@tracks)
{
my $ioctlarg = pack('CCCCCCCCiC',$trackno, 0, CDROM_MSF,0,0,0,0,0,0,0);
my $val = ioctl($fh,CDROMREADTOCENTRY,$ioctlarg);
my @toc_entry = unpack("CCCCCCCCiC",$ioctlarg);
$toc_ref->{$trackno}->{track} = $toc_entry[0];
$toc_ref->{$trackno}->{minute} = $toc_entry[4];
$toc_ref->{$trackno}->{second} = $toc_entry[5];
$toc_ref->{$trackno}->{frame} = $toc_entry[6];
$toc_ref->{$trackno}->{offset} = $toc_ref->{$trackno}->{minute}*60+$toc_ref->{$trackno}->{second};
}
return $toc_ref;
}
sub seconds($)
{
my $track_ref = shift;
return $track_ref->{minute}*60+$track_ref->{second};
}
sub frames($)
{
my $track_ref = shift;
return ($track_ref->{minute}*60*75) +
($track_ref->{second}*75) +
$track_ref->{frame};
}
sub cddb_sum($)
{
my $n = shift;
my $ret = 0;
while ($n > 0)
{
$ret = $ret + ($n % 10);
$n = $n / 10;
}
return $ret;
}
sub get_discinfo($)
{
my ($csum,$t,$length) = (0,0,0);
my $toc_ref = shift;
my (@trackinfo);
my %discinfo;
foreach my $trackno (keys %$toc_ref)
{
if ($trackno eq 0xAA)
{
$t = seconds($toc_ref->{$trackno}) - seconds($toc_ref->{1});
$length = seconds($toc_ref->{$trackno});
} else {
push @trackinfo,frames($toc_ref->{$trackno});
$csum = $csum + cddb_sum(seconds($toc_ref->{$trackno}));
}
my $discid = (( $csum % 0xFF) << 24 | $t << 8 | (scalar keys %$toc_ref) - 1);
$discinfo{discid} = $discid;
$discinfo{tracks} = (scalar keys %$toc_ref) - 1;
$discinfo{trackinfo} = \@trackinfo;
$discinfo{length} = $length;
}
return \%discinfo;
}
# main
my ($device)=$ARGV[0]||"/dev/cdrom";
my $fh = new IO::File $device, O_RDONLY|O_NONBLOCK;
my $toc = get_toc($fh);
my $discinfo = get_discinfo($toc);
printf "%08x\n",$discinfo->{discid};
@warewolf
Copy link
Copy Markdown
Author

warewolf commented May 3, 2015

$ ls -la discid.pl
-rwx------ 1 warewolf warewolf 2285 Jun 21 2003 discid.pl*

Holy shit it's from 2003.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment