rendered paste body#!/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(<RIP>) {
$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;