]> diplodocus.org Git - flac-archive/blob - flac2mp3
(flac2mp3: Put XXX comment where it belongs.
[flac-archive] / flac2mp3
1 #! /usr/bin/env perl
2
3 # $Id$
4
5 =head1 NAME
6
7 B<flac2mp3> - transcode FLAC file to MP3 files
8
9 =head1 SYNOPSIS
10
11 B<flac2mp3> I<file>
12
13 =head1 DESCRIPTION
14
15 B<flac2mp3> transcodes the FLAC file I<file> to MP3 files. I<file> is
16 the kind of FLAC file B<fa-flacd> generates. That is, it contains a
17 cue sheet, one TITLE tag per track listed therein, and ARTIST, ALBUM,
18 and DATE tags.
19
20 =cut
21
22 use strict;
23 use warnings;
24
25 use Pod::Usage;
26
27 sub tformat {
28 my $min = shift;
29 my $sec = shift;
30 my $hun = shift;
31 return "$min:$sec.$hun";
32 }
33
34 sub get_decode_args {
35 my $fn = shift;
36 my @l;
37
38 open(F, '-|', 'metaflac', '--export-cuesheet-to=-', $fn);
39 while (<F>) {
40 /INDEX 01 (\d\d):(\d\d):(\d\d)$/ or next;
41 push(@l, [$1, $2, $3]);
42 }
43
44 my @args;
45 for my $i (0..$#l) {
46 my $arg = ["--skip=" . tformat(@{$l[$i]})];
47 my $next = $l[$i+1];
48 if (defined($next)) {
49 if ($next->[2] == 0) {
50 if ($next->[1] == 0) {
51 push(@$arg, '--until=' . tformat($next->[0] - 1, 59, 99));
52 } else {
53 push(@$arg, '--until=' . tformat($next->[0], $next->[1] - 1,
54 99));
55 }
56 } else {
57 push(@$arg, '--until=' . tformat($next->[0], $next->[1],
58 $next->[2] - 1));
59 }
60 }
61 push(@args, $arg);
62 }
63
64 return @args;
65 }
66
67 # Return the ARTIST, ALBUM, and DATE tags followed by the TITLE tags
68 # in the file FN.
69 sub get_tags {
70 my $fn = shift;
71 my $tag;
72 my $value;
73 my $artist;
74 my $album;
75 my $date;
76 my @titles;
77
78 open(TAGS, '-|', 'metaflac', '--export-vc-to=-', $fn);
79 while (<TAGS>) {
80 chomp;
81
82 ($tag, $value) = split(/=/, $_, 2);
83
84 if (/^ARTIST=/) {
85 $artist = $value;
86 } elsif (/^ALBUM=/) {
87 $album = $value;
88 } elsif (/^DATE=/) {
89 $date = $value;
90 } elsif (/TITLE=/) {
91 push(@titles, $value);
92 }
93 }
94 close(TAGS) or die("close($fn): $!");
95
96 return ($artist, $album, $date, @titles);
97 }
98
99 sub flac2mp3 {
100 my $fn = shift;
101 my $title = shift;
102 my $artist = shift;
103 my $album = shift;
104 my $date = shift;
105 my $track = shift;
106 my $skip_arg = shift;
107 my $until_arg = shift;
108
109 my $outfile = sprintf("$artist ($album) \%02s $title.mp3", $track);
110 for ($outfile) {
111 s/\//_/g;
112 s/:/_/g;
113 s/'/_/g;
114 s/"/_/g;
115 }
116
117 $until_arg ||= '';
118 # XXX
119 system("flac -cd $skip_arg $until_arg '$fn' | lame --preset standard --tt '$title' --ta '$artist' --tl '$album' --ty '$date' --tn $track - '$outfile'");
120 }
121
122 MAIN: {
123 my $fn = shift or pod2usage();
124 my @args = get_decode_args($fn);
125 my ($artist, $album, $date, @titles) = get_tags($fn);
126
127 for my $i (0..$#titles) {
128 flac2mp3($fn, $titles[$i], $artist, $album, $date, $i + 1,
129 @{$args[$i]});
130 }
131 }
132
133 \f
134 __END__
135
136 =head1 AUTHORS
137
138 Written by Eric Gillespie <epg@pretzelnet.org>.
139
140 =cut
141
142 # Local variables:
143 # cperl-indent-level: 4
144 # perl-indent-level: 4
145 # indent-tabs-mode: nil
146 # End:
147
148 # vi: set tabstop=4 expandtab: