All pastes #257067 Raw Edit

Stuff

public text v1 · immutable
#257067 ·published 2006-11-24 22:56 UTC
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;