#!/usr/bin/perl # # burn - burn audio cds using cdtext and disc-at-once # # (c) joakim mared # # 20040429 initial version use warnings; use strict; use locale; use MP3::Info; my $CDR_DEVICE = '/dev/hdb'; my $CDR_SCSI = '0,0,0'; my $CDR_SPEED = 16; my $filename; my $total_tracks = 0; my $track; my $max = 0; my @tokens; my @keys; my @non_distinct; my %common_data; my %track_data; my %files; my %skip; my $title; my $mp3_info; my $total_secs; my $total_mins; my $artist; my $command; my $dirname = "/tmp/" . time() . "." . $$; exit 0 if (-d $dirname); mkdir $dirname; open LS, "ls -1 |"; while() { chomp; next unless /\.mp3$/i; $filename = $_; s/-/ - /g; s/_/ /g; s/-?\s*(\d{2,})\s*(-?)/$2/; s/\.mp3$//i; s/\w+/\L\u$&\E/g; while(s/-\s+-/ - /g) {} while(s/\s\s/ /g) {} s/^(\W+)//g; $total_tracks++; $files{$total_tracks} = $filename; @tokens = split /\s*-\s*/, $_; $max = scalar(@tokens) if (scalar(@tokens) > $max); for($a = 0; $a < scalar(@tokens); $a++) { $common_data{$a}{$tokens[$a]} = $common_data{$a}{$tokens[$a]} ? $common_data{$a}{$tokens[$a]} + 1 : 1; $track_data{$total_tracks}{$a} = $tokens[$a]; } } close LS; for($a = 0; $a < $max; $a++) { @keys = keys(%{$common_data{$a}}); if (scalar(@keys) == 1 && $common_data{$a}{$keys[0]} == $total_tracks) { $skip{$a} = 1; if ($a == ($max - 1) && length($keys[0]) < 4) { next; } push @non_distinct, $keys[0]; } } if (scalar(@non_distinct) == 1) { $artist = $non_distinct[0]; print "Artist:\t$artist\n"; } elsif (scalar(@non_distinct)) { $artist = shift(@non_distinct); print "Artist:\t$artist\n"; print "Album:\t" . shift(@non_distinct) . "\n"; foreach(@non_distinct) { print "Extra:\t$_\n"; } } print "================================================================================"; for($track = 1; $track <= $total_tracks; $track++) { $title = ''; for($a = 0; $a < scalar(keys(%{$track_data{$track}})); $a++) { next if ($skip{$a}); $title .= $track_data{$track}{$a} . " - "; } chop $title; chop $title; chop $title; $mp3_info = get_mp3info($files{$track}); print "$track\t(" . pad($mp3_info->{MM}) . ":" . pad($mp3_info->{SS}) . ")\t(CD-Text: $title)\n"; $total_secs += $mp3_info->{MM} * 60 + $mp3_info->{SS}; $command = "mpg321 -q -w $dirname/" . pad($track) . ".wav \"$files{$track}\""; system $command; if ($title) { open CDT, "> $dirname/" . pad($track) . ".inf"; print CDT "Performer=$artist\n" if ($artist); print CDT "Tracktitle=$title\n"; close CDT; } } print "================================================================================"; $total_mins = int($total_secs / 60); $total_secs = $total_secs % 60; print "TOT\t(" . pad($total_mins) . ":" . pad($total_secs) . ")\n"; print "\n\nBurning...\n"; $command = "cd $dirname ; hdparm -d0 $CDR_DEVICE ; cdrecord dev=$CDR_SCSI speed=$CDR_SPEED -pad -dao -eject -text -useinfo *.wav ; hdparm -d1 $CDR_DEVICE"; system $command; $command = "rm -rf $dirname"; system $command; sub pad { my $string = shift; return "0$string" if (length($string) == 1); return $string; }