#!/usr/bin/perl use vars qw/ %opt /; our @ofls; our @fls; our $reverse = 0; our $ppref; our $argc = $#ARGV + 1; our $genre, $outfile; our $do_ogg = 1, $do_mp3 = 0, $do_flac = 0, $do_rename = 0, $do_aac = 0, $do_deco = 0; our $disart, $disalb, $albdisc = 1, $yearstr, $multidisc = 0, $overart = 0, $overalb = 0; $outfile = "Makefile"; #if($argc < 3) { # print STDERR "Usage: $0 \n"; # exit 1; #} #$genre = $ARGV[0]; #$yearstr = $ARGV[1]; sub optinit { use Getopt::Std; my $opts = 'y:g:mA:L:d:hp:MOFRCrD'; getopts($opts, \%opt) or usage(); usage() if $opt{h}; if($opt{y}) { $yearstr = $opt{y}; } if($opt{M}) { if(!$opt{O}) { $do_ogg = 0; } $do_mp3 = 1; } if($opt{C}) { if(!$opt{O}) { $do_ogg = 0; } $do_aac = 1; } if($opt{F}) { if(!$opt{O}) { $do_ogg = 0; } $do_flac = 1; } if($opt{R}) { if(!$opt{O}) { $do_ogg = 0; } $do_rename = 1; } if($opt{O}) { $do_ogg = 1; } if($opt{g}) { $genre = $opt{g}; } if($opt{m}) { $multidisc = 1; } if($opt{A}) { $disart = $opt{A}; $overart = 1; # artist override } if($opt{p}) { $ppref = $opt{p}; } if($opt{L}) { $disalb = $opt{L}; $overalb = 1; # album override } if($opt{d}) { $albdisc = $opt{d}; } if($opt{D}) { $do_deco = 1; $do_ogg = 0; } if($opt{r}) { $reverse = 1; } } sub usage { print STDERR < $g, fmt => $6, artist => ($overart ? $disart : $1), album => ($overalb ? $disalb : $2), track => $3, title => $5); $disart = $tef{'artist'}; $disalb = $tef{'album'}; if($tef{'title'} eq "Fillmein") { $tef{'title'} = askuser("title", $g); } push @ofls, \%tef; } elsif($g =~ /^([0-9]{1,2}-[0-9]{1,2}|[0-9]{1,2})\.{0,1} (.+) - (.+)\.(wav|flac|mp3)$/) { my $artist, $album, $mtr = $1, $mds = 0; my $fmt = $4, $ar, $tit; if($reverse) { $ar = ($overart ? $disart : $3); $tit = $2; } else { $ar = ($overart ? $disart : $2); $tit = $3; } if(length($disart) == 0) { $artist = askuser("artist", $g); } else { $artist = $disart; } if(length($disalb) == 0) { $album = askuser("album", $g); } else { $album = $disalb; } if($mtr =~ /^([0-9]{1,2})-([0-9]{1,2})$/) { $mds = $1; $mtr = $2; } my %tef = (file => $g, fmt => $4, artist => $ar, album => ($overalb ? $disalb : $album), track => $mtr, title => $tit); if($mds != 0) { $tef{'disc'} = $mds; } $disart = $tef{'artist'}; $disalb = $tef{'album'}; if($tef{'title'} eq "Fillmein") { $tef{'title'} = askuser("title", $g); } push @ofls, \%tef; } elsif($g =~ /([0-9]{1,2}-[0-9]{1,2}|[0-9]{1,2})(\.? ?- ?| )(.+)\.(wav|flac|mp3)$/) { my $artist, $album, $mtr = $1, $mds = 0; if(length($disart) == 0) { $artist = askuser("artist", $g); } else { $artist = $disart; } # if($mtr =~ /^([0-9]{1,2})-([0-9]{1,2})$/) { # $mds = $1; # $mtr = $2; # } if(length($disalb) == 0) { $album = askuser("album", $g); } else { $album = $disalb; } my %tef = (file => $g, fmt => $4, artist => ($overart ? $disart : $1), album => ($overalb ? $disalb : $3), track => $mtr, title => $3); # if($mds != 0) { # $tef{'disc'} = $mds; # } $disart = $tef{'artist'}; $disalb = $tef{'album'}; if($tef{'title'} eq "Fillmein") { $tef{'title'} = askuser("title", $g); } push @ofls, \%tef; } else { my $artist, $album, $trno, $tit; printf("I have no clue how to deal with '%s'! Manual metadata entry required.\n", $g); if(length($disart) == 0) { $artist = askuser("artist", $g); } else { $artist = $disart; } if(length($disalb) == 0) { $album = askuser("album", $g); } else { $album = $disalb; } $trno = askuser("track", $g); $tit = askuser("title", $g); my %tef = (file => $g, artist => ($overart ? $disart : $artist), album => ($overalb ? $disalb : $album), track => $trno, title => $tit); push @ofls, \%tef; } } if(@ofls < 1) { print STDERR "There were no files to work on, dying.\n"; exit 2; } open(OUTFILE, ">$outfile") or die("Cannot open $outfile for writing."); print OUTFILE "# Generated by oge.pl\n"; if($do_deco) { printf OUTFILE "wav: "; for($i = 0; $i < @ofls; $i++) { printf OUTFILE ("tr%02dwav ", $i + 1); } printf OUTFILE ("\n"); printf OUTFILE "# wave decode stuff\n"; } if($do_ogg) { printf OUTFILE ("ogg: "); for($i = 0; $i < @ofls; $i++) { printf OUTFILE ("tr%02dogg ", $i + 1); } printf OUTFILE ("\n"); printf OUTFILE "# ogg stuff\n"; } if($do_aac) { printf OUTFILE ("aac: "); for($i = 0; $i < @ofls; $i++) { printf OUTFILE ("tr%02dm4a ", $i + 1); } printf OUTFILE "\n"; printf OUTFILE "# aac stuff\n"; } if($do_mp3) { printf OUTFILE ("mp3: "); for($i = 0; $i < @ofls; $i++) { printf OUTFILE ("tr%02dmp3 ", $i + 1); } printf OUTFILE ("\n"); printf OUTFILE "# mp3 stuff\n"; } if($do_flac) { printf OUTFILE ("flac: "); for($i = 0; $i < @ofls; $i++) { printf OUTFILE ("tr%02dflac ", $i + 1); } printf OUTFILE ("\n"); printf OUTFILE "# flac stuff\n"; } if($do_rename) { printf OUTFILE ("rename: "); for($i = 0; $i < @ofls; $i++) { printf OUTFILE ("tr%02dren ", $i + 1); } printf OUTFILE ("\n"); printf OUTFILE ("# rename stuff\n"); } $i = 1; foreach $h (@ofls) { # $c =~ s/'/'\\''/g; my %c = %{$h}; my ($artist, $album, $tdisc, $tr, $title) = ($c{'artist'}, $c{'album'}, $albdisc, $c{'track'}, $c{'title'}); # $tdisc =~ s/-//; my $disc, $track, $ofn, $odfn; if(exists $c{'disc'}) { $disc = $c{'disc'}; } else { $disc = $albdisc; } $track = $tr; if($do_deco) { $odfn = $c{'file'}; $odfn =~ s:^.*/(.*)$:\1:; $odfn =~ s/\.flac$/.wav/; } if($multidisc) { $ofn = sprintf("%s - %s - %02d-%02d %s", $artist, $album, $disc, $track, $title); } else { $ofn = sprintf("%s - %s - %02d %s", $artist, $album, $track, $title); } $ofn =~ s/\//-/g; if($do_ogg) { printf OUTFILE ("tr%02dogg:\n\toggenc -q 6 -o '%s' %s -G '%s' -a '%s' -t '%s' -l '%s' -N %d -c 'DISCNUMBER=%d' '%s'\n", $i, nl(($ppref ne '' ? $ppref . '/' . $ofn : $ofn) . ".ogg"), $yearstr ne '' ? "-d '" . nl($yearstr) . "'" : '', nl($genre), nl($artist), nl($title), nl($album), nl($track), nl($disc), nl($c{'file'})); } if($do_deco) { printf OUTFILE ("tr%02dwav:\n\tflac -d -o '%s' '%s'\n", $i, nl(($ppref ne '' ? $ppref . '/' . $odfn : $odfn)), nl($c{'file'})); } if($do_aac) { my $useflac = 0, $fapd; if($c{'file'} =~ /.*\.flac$/) { $useflac = 1; $fapd = "flac -dc '" . nl($c{'file'}) . "' | "; } printf OUTFILE ("tr%02dm4a:\n\t%sfaac -o '%s' -w -s --artist '%s' --title '%s' --album '%s' --track '%s' --genre '%s' --disc '%s' %s '%s'\n", $i, ($useflac ? $fapd : ''), nl(($ppref ne '' ? $ppref . '/' . $ofn : $ofn) . ".m4a"), nl($artist) , nl($title), nl($album), nl($track), nl($genre), nl($disc), $yearstr ne '' ? "--year '" . nl($yearstr) . "'" : '', ($useflac ? '-' : nl($c{'file'}))); } if($do_mp3) { printf OUTFILE ("tr%02dmp3:\n\tlame -V 3 %s --add-id3v2 --tg '%s' --ta '%s' --tt '%s' --tl '%s' --tn %d '%s' '%s'\n", $i, $yearstr ne '' ? "--ty '" . nl($yearstr) . "'" : '', nl($genre), nl($artist), nl($title), nl($album), nl($track), nl($c{'file'}), nl(($ppref ne '' ? $ppref . '/' . $ofn : $ofn)) . ".mp3"); if($multidisc) { printf OUTFILE ("\tid3v2 --TPOS '%d' '%s'\n", nl($disc), nl(($ppref ne '' ? $ppref . '/' . $ofn : $ofn)) . ".mp3"); } } if($do_rename) { my $tfpath = nl(($ppref ne '' ? $ppref . '/' . $ofn : $ofn)) . ".mp3"; printf OUTFILE ("tr%02dren:\n\tcp -v '%s' '%s'\n\tid3tag -a '%s' -A '%s' -s '%s' -t '%s' %s '%s'\n" , $i, nl($c{'file'}), $tfpath, nl($artist), nl($album), nl($title), nl($track), $yearstr ne '' ? "-y '" . nl($yearstr) . "'" : '', $tfpath); if($multidisc) { printf OUTFILE ("\tid2v2 --TPOS '%d' '%s'\n", nl($disc), $tfpath); } } if($do_flac) { printf OUTFILE ("tr%02dflac:\n\tflac --best --replay-gain %s -T 'genre=%s' -T 'artist=%s' -T 'title=%s' -T 'album=%s' -T 'track=%d' -T 'TRACKNUMBER=%d' -T 'DISCNUMBER=%d' -o '%s' '%s'\n", $i, $yearstr ne '' ? "-T 'year=" . nl($yearstr) . "'" : '', nl($genre), nl($artist), nl($title), nl($album), nl($track), nl($track), nl($disc), nl(($ppref ne '' ? $ppref . '/' . $ofn : $ofn)) . ".flac", nl($c{'file'})); } $i++; } close OUTFILE; print "Done! Saved to $outfile\n"; sub nl { #normalise for shell my $c = shift; $c =~ s/'/'\\''/g; return $c; } sub newfname { my $ofn = shift; my $srcf = shift; open(INF, $ofn); my $artist, $album, $title, $tracknum, $ctn; my %tds; foreach $cl () { if($cl =~ /^Performer=\s*'(.+)'$/) { $artist = $1; } elsif($cl =~ /^Albumtitle=\s*'(.+)'$/) { $album = $1; } elsif($cl =~ /^Tracktitle=\s*'(.+)'$/) { $title = $1; } elsif($cl =~ /^Tracknumber=\s*([0-9]+)$/) { $tracknum = $1; } } close(INF); %tds = (file => $srcf, artist => $artist, album => $album, track => $tracknum, title => $title); return %tds; } sub askuser { my $field = shift; my $fn = shift; my $answer; printf("What is the %s for '%s'?> ", $field, $fn); $answer = <>; chop $answer; # newline return $answer; }