#!/usr/bin/perl # ripthing.pl - a cdda2wav/flac frontend # v1 by neuschnee ############################################################################### # *** SETTINGS *** # set the part after the dot to your drive (this can be commented out, probably) $drive = 'dev=' . '/dev/dvdrw'; # set to location of cdda2wav (can be just "cdda2wav") $cdda2wav = '/usr/bin/cdda2wav'; # set cdda2wav options (the defaults should be sufficient) $cdda2wav_opts = '-B -L1 -H -paranoia -O wav '.$drive; # set to location of flac (can be just "flac") $flac = 'flac'; # set extra flac encoding options $flac_opts = '-V -8'; # number of passes (times to rip) $passes = 2; ############################################################################### use Cwd; use Digest::MD5; sub rip { local $pass = $_[0]; $log = ""; open(RIP, $cdda2wav.' '.$cdda2wav_opts." 2>&1 |"); while() { $log .= $_; if($_ =~ m/^#Cdda2wav version [1-9].+$/) { $_ =~ m/^#Cdda2wav version ([1-9][^,|\r|\n]+).+$/; $version = $1; } if($_ =~ m/^Album title\:\ \'.+\'.+\[from .+\]$/) { $_ = m/^Album title\:\ \'(.+)\'.+\[from (.+)\]$/; $album = $1; $artist = $2; } if($_ =~ m/^Track.+[0-9]{1,3}\:\ \'.+\'$/) { $_ =~ m/^Track.+[0-9]{1,3}\:\ \'(.+)\'$/; push(@tracks,$1); } if($_ =~ m/samplefile size will be [0-9]+ bytes/) { if($pass==1) { $head = "VERSION: cdda2wav ".$version."\n"; $head .= "ARTIST: ".$artist."\n"; $head .= "ALBUM: ".$album."\n"; $head .= "Ripping with ".$passes." passes..\n"; print $head; } print " == PASS ".$pass." ==\n"; } if($_ =~ m/track[\ ]{0,2}[1-9][0-9]{0,2}.+recorded/) { $_ =~ m/track[\ ]{0,2}([1-9][0-9]{0,2}).+recorded/; $trackname = $tracks[$1-1]; $num = $1; if($num < 10) { $num = "0".$num; } if(!$album || !$artist || !$trackname) { $album = 'Unknown Album'; $artist = 'Unknown Artist'; $trackname = 'Track '.$num; $nocddb = 1; } open(FILE, "audio_".$num.".wav") or die "Can't open '$file': $!"; binmode(FILE); $md5 = Digest::MD5->new->addfile(*FILE)->hexdigest; push(@sums,$md5); push(@sumlog,"track=".$num." pass=".$pass." md5=".$md5); print " ".$num." - ".$trackname.".wav (md5=".$md5.")\n"; if($pass == $passes) { local $filename = $num." - ".$trackname.".wav"; push(@flacfiles,$num." - ".$trackname.".flac"); rename("audio_".$num.".wav", $filename); if(!$nocddb) { $tags = ' -T"ARTIST='.$artist.'" -T"TITLE='.$trackname.'" -T"ALBUM='.$album.'" -T"TRACKNUMBER='.$num.'" -T"COMMENT=ripped by cdda2wav '.$version.' ('.$passes.' passes)" '; } print " encoding to flac.. "; system($flac.' --delete-input-file '.$flac_opts.' '.$tags.'"'.$filename.'" -s'); print "done.\n"; } else { unlink("audio_".$num.".wav"); } } } close(RIP); $i=0; foreach(@sums) { $all_sums[$pass][$i] = $sums[$i]; $i++; } } $pass=1; $passes_count=$passes; while($passes_count>0) { &rip($pass); wait; $logname = $album.".log"; open(LOG, ">> ".$logname) or die "Can't write to '$logname': $!"; print LOG $log."\n"; close(LOG); $passes_count--; $pass++; } @sumlog = sort(@sumlog); $sumlogname = $album." (pass checksums).log"; $i=0; open(SUMLOG, ">> ".$sumlogname) or die "Can't write to '$sumlogname': $!"; print SUMLOG $head."\n"; foreach(@sumlog) { print SUMLOG $sumlog[$i]."\n"; $i++; } close(SUMLOG); $m3u = "00 - ".$artist." - ".$album.".m3u"; @audio_files = <*.[fF][lL][aA][cC]>; open(M3UW, "> $m3u") or die "Can't write to '$m3u': $!"; $i=0; foreach(@audio_files) { $file = $audio_files[$i]; print M3UW $file."\n"; $i++; } close M3UW; $dir = $album; $cue = $dir." (FLAC).cue"; $wavcue = $dir.".cue"; $body .= "PERFORMER \"Artist\"\n". "TITLE \"Album\"\n"; $i=0; foreach(@audio_files) { $num = $i+1; if($num < 10) { $num = "0".$num; } $body .= "FILE \"$audio_files[$i]\"\n". " TRACK $num AUDIO\n". " TITLE \"Track $num\"\n". " PERFORMER \"Artist\"\n". " INDEX 01 00:00:00\n"; $i++; } open(CUEW, "> $cue") or die "Can't write to '$cue': $!"; print CUEW $body; close CUEW; $body =~ s/(FILE \")(.+)\.[a-z]+\"/$1$2\.wav\"/gi; open(CUEW, "> $wavcue") or die "Can't write to '$wavcue': $!"; print CUEW $body; close CUEW; print "Generated CUE Sheets : $cue\n". " : $wavcue\n"; $md5 = "00 - ".$artist." - ".$album.".md5"; @rel_files = <*.[fF][lL][aA][cC] *.[lL][oO][gG] *.[cC][uU][eE]>; open(MD5W, "> $md5") or die "Can't write to '$md5': $!"; print "Generating MD5 file : $md5\n"; $j=0; foreach(@rel_files) { $file = $rel_files[$j]; $file = shift || $file; open(FILE, $file) or die "Can't open '$file': $!"; binmode(FILE); $md5 = Digest::MD5->new->addfile(*FILE)->hexdigest; print MD5W $md5." *".$file."\n"; print $file." : OK (".$md5.")\n"; $j++; } close MD5W;