Created
May 3, 2015 18:30
-
-
Save warewolf/a41d04e31961b275ac79 to your computer and use it in GitHub Desktop.
Perl discid script for CDDB ids
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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}; |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
$ ls -la discid.pl
-rwx------ 1 warewolf warewolf 2285 Jun 21 2003 discid.pl*
Holy shit it's from 2003.