Ripping CD to flac and mp3 with metadata
I use the following script.
From the --help:
I assume the WAVS are in the current directory, generated by something like this:
cdparanoia -d /dev/sr1 -B -L
Then I assume the .inf files are in the "info" directory, generated by
mkdir info
cd info
icedax dev=/dev/sr1 -vall cddb=0 -info-only
And the script itself (save it as myripper.pl and make it executable or download it here):
#!/usr/bin/perl -w # -*- mode: cperl -*- use strict; use warnings; use Data::Dumper; use File::Copy; if (@ARGV) { show_help() if (($ARGV[0] eq "--help") || ($ARGV[0] eq "-h")); } my $infodir = "info"; my $mp3dir = "mp3"; my $flacdir = "flac"; my @wavs; my @infos; opendir(my $dh, ".") || die "can't opendir . $!"; @wavs = grep { /\.wav$/ && -f "$_" } readdir($dh); closedir $dh; show_help() unless @wavs; foreach my $destdir ($infodir, $mp3dir, $flacdir) { unless (-d $destdir) { die "$destdir is a file" if -e $destdir; mkdir $destdir; } } my $discinfo = parse_inf_file("$infodir/audio.cddb"); print Dumper($discinfo); system("md5sum *.wav > MD5SUMS.txt"); foreach my $input (sort @wavs) { my $tracknumber; if ($input =~ m/^track(\d\d)\.cdda\.wav$/) { $tracknumber = $1; } else { show_help("This doesn't look as a track from cdparanoia\n"); } my $basename = $input; $basename =~ s/\.wav$//; my $wav = $basename . ".wav"; my $mp3 = $basename . ".mp3"; my $flac = $basename . ".flac"; my $infofile = "info/audio_$tracknumber.inf"; my $trackinfo = parse_inf_file($infofile); my ($number, $artist, $title, $genre, $date, $album); $number = ($trackinfo->{Tracknumber} or $tracknumber); $number =~ s/^0+//; $artist = ($trackinfo->{Performer} or "Unknown"); my $trackindex = $number - 1; $title = ($trackinfo->{Tracktitle} or $discinfo->{"TTITLE$trackindex"} or "Unknown"); $genre = ($discinfo->{DGENRE} or "Unknown"); my $mp3genre = $genre; $mp3genre =~ s/(.+?)\s*,.*/$1/; $date = ($discinfo->{DYEAR} or "Unknown"); $album = ($trackinfo->{Albumtitle} or $discinfo->{DTITLE} or "Unknown"); my @mpexecute = ('lame', '-b', '320', '-h', '--tt', $title, '--tn', $number, '--tg', $mp3genre, '--tl', $album, '--ty', $date, '--ta', $artist, '--add-id3v2', $wav, $mp3); print "\nExecuting ", join(" ", @mpexecute), "\n\n"; my @flacexecute = ( 'flac', "--tag=TITLE=$title", "--tag=DATE=$date", "--tag=ARTIST=$artist", "--tag=TRACKNUMBER=$number", "--tag=ALBUM=$album", "--tag=GENRE=$genre", $wav ); print "\nExecuting ", join(" ", @flacexecute), "\n\n"; system(@mpexecute) == 0 or die "$!\n"; system(@flacexecute) == 0 or die "$!\n"; my $targetname = "$tracknumber $artist $title"; $targetname =~ s![/\\]!!g; move($mp3, "$mp3dir/$targetname.mp3"); move($flac, "$flacdir/$targetname.flac"); } system("md5sum -c MD5SUMS.txt"); sub parse_inf_file { my $target = shift; my %info; open (my $fh, "<", $target) or show_help("Can't open $target $!\n"); while (<$fh>) { my $line = $_; if ($line =~ m/^\s*(\w+)\s*=\s*['"]?\s*(.+?)\s*['"]?\s*$/) { $info{$1} = $2; } } close $fh; return \%info; } sub show_help { my $arg = shift; print <<'EOF'; I assume the WAVS are in the current directory, generated by something like this: cdparanoia -d /dev/sr1 -B -L Then I assume the .inf files are in the "info" directory, generated by mkdir info cd info icedax dev=/dev/sr1 -vall cddb=0 -info-only EOF print $arg if $arg; exit 1; }