X-Git-Url: https://diplodocus.org/git/flac-archive/blobdiff_plain/deb692c6d99f8d4bc99ccc46975f9b91ded6f596..d5d85722f4fb0fc6ca61102b397aa51a96bddcc6:/flac2mp3 diff --git a/flac2mp3 b/flac2mp3 index 5a92c3c..17452bf 100755 --- a/flac2mp3 +++ b/flac2mp3 @@ -22,13 +22,30 @@ and DATE tags. use strict; use warnings; +use POSIX ':sys_wait_h'; use Pod::Usage; +sub run_or_die { + my $command = shift; + my $status; + + $status = system($command); + + if (WIFEXITED($status)) { + if (($status = WEXITSTATUS($status)) != 0) { + die("$command exited with status $status"); + } + } elsif (WIFSIGNALED($status)) { + die("$command killed with signal ", WTERMSIG($status)); + } elsif (WIFSTOPPED($status)) { + die("$command stopped with signal ", WSTOPSIG($status)); + } else { + die("Major horkage on system($command): \$? = $? \$! = $!"); + } +} + sub tformat { - my $min = shift; - my $sec = shift; - my $hun = shift; - return "$min:$sec.$hun"; + return sprintf('%02d:%02d.%02d', @_); } sub get_decode_args { @@ -48,10 +65,10 @@ sub get_decode_args { if (defined($next)) { if ($next->[2] == 0) { if ($next->[1] == 0) { - push(@$arg, '--until=' . tformat($next->[0] - 1, 59, 99)); + push(@$arg, '--until=' . tformat($next->[0] - 1, 59, 74)); } else { push(@$arg, '--until=' . tformat($next->[0], $next->[1] - 1, - 99)); + 74)); } } else { push(@$arg, '--until=' . tformat($next->[0], $next->[1], @@ -88,7 +105,7 @@ sub get_tags { $album = $value; } elsif (/^DATE=/) { $date = $value; - } elsif (/TITLE=/) { + } elsif (/TITLE/) { push(@titles, $value); } } @@ -106,18 +123,22 @@ sub flac2mp3 { my $track = shift; my $skip_arg = shift; my $until_arg = shift; + my $outfile; - my $outfile = sprintf("$artist ($album) \%02s $title.mp3", $track); - for ($outfile) { - s/\//_/g; - s/:/_/g; - s/'/_/g; - s/"/_/g; + # We'll be putting these in single quotes, so we need to escape + # any single quotes in the filename by closing the quote ('), + # putting an escaped quote (\'), and then reopening the quote ('). + for ($fn, $title, $artist, $album, $date) { + s/'/'\\''/g; } + $outfile = sprintf("$artist ($album) \%02s $title.mp3", $track); + $outfile =~ s/\//_/g; + $until_arg ||= ''; - # XXX - system("flac -cd $skip_arg $until_arg '$fn' | lame --preset standard --tt '$title' --ta '$artist' --tl '$album' --ty '$date' --tn $track - '$outfile'"); + run_or_die(join(' ', "flac -cd $skip_arg $until_arg '$fn'", + " | lame --preset standard --tt '$title' --ta '$artist'", + " --tl '$album' --ty '$date' --tn $track - '$outfile'")); } MAIN: {