Showing
17 changed files
with
1572 additions
and
0 deletions
CDDB_get-2.23.tar.gz
0 → 100644
No preview for this file type
CDDB_get-2.23p1.patch
0 → 100644
1 | +diff -Naur CDDB_get-2.23/CDDB_get.pm CDDB_get-2.23p1/CDDB_get.pm | |
2 | +--- CDDB_get-2.23/CDDB_get.pm 2003-09-07 15:49:27.000000000 +0000 | |
3 | ++++ CDDB_get-2.23p1/CDDB_get.pm 2004-06-30 08:37:28.000000000 +0000 | |
4 | +@@ -261,6 +261,7 @@ | |
5 | + | |
6 | + my $input = $config->{input}; | |
7 | + my $multi = $config->{multi}; | |
8 | ++ my $entry = $config->{entry} if (defined($config->{entry})); | |
9 | + $input = 0 if $multi; | |
10 | + | |
11 | + print STDERR Dumper($config) if $debug; | |
12 | +@@ -426,7 +427,14 @@ | |
13 | + } | |
14 | + } | |
15 | + } else { | |
16 | +- push @to_get,@list; | |
17 | ++ unless(defined($entry)) { | |
18 | ++ push @to_get,@list; | |
19 | ++ } | |
20 | ++ else { | |
21 | ++ if($entry-1 >= 0 && $entry-1 <= $#list) { | |
22 | ++ push @to_get,$list[$entry-1]; | |
23 | ++ } | |
24 | ++ } | |
25 | + } | |
26 | + | |
27 | + my $i=0; | |
28 | +diff -Naur CDDB_get-2.23/cddb.pl CDDB_get-2.23p1/cddb.pl | |
29 | +--- CDDB_get-2.23/cddb.pl 2003-08-16 19:01:49.000000000 +0000 | |
30 | ++++ CDDB_get-2.23p1/cddb.pl 2004-06-30 08:33:03.000000000 +0000 | |
31 | +@@ -27,12 +27,13 @@ | |
32 | + use strict; | |
33 | + | |
34 | + my %option = (); | |
35 | +-getopts("oghdtsiSfDlOFc:", \%option); | |
36 | ++getopts("oghdtsiSfDlOFe:c:", \%option); | |
37 | + | |
38 | + if($option{h}) { | |
39 | + print "$0: gets CDDB info of a CD\n"; | |
40 | + print " no argument - gets CDDB info of CD in your drive\n"; | |
41 | + print " -c device (other than default device)\n"; | |
42 | ++ print " -e which cddb-entry to use\n"; | |
43 | + print " -o offline mode - just stores CD info\n"; | |
44 | + print " -d output in xmcd format\n"; | |
45 | + print " -s save in xmcd format\n"; | |
46 | +@@ -81,11 +82,19 @@ | |
47 | + $config{CD_DEVICE}=$option{c} if $option{c}; | |
48 | + | |
49 | + # user interaction welcome? | |
50 | +- | |
51 | +-$config{input}=1; # 1: ask user if more than one possibility | |
52 | +- # 0: no user interaction | |
53 | +-$config{multi}=0; # 1: do not ask user and get all of them | |
54 | +- # 0: just the first one | |
55 | ++if($option{e}) { | |
56 | ++ $config{entry}=$option{e}; | |
57 | ++ $config{input}=0; # 1: ask user if more than one possibility | |
58 | ++ # 0: no user interaction | |
59 | ++ $config{multi}=0; # 1: do not ask user and get all of them | |
60 | ++ # 0: just the first one | |
61 | ++} | |
62 | ++else { | |
63 | ++ $config{input}=1; # 1: ask user if more than one possibility | |
64 | ++ # 0: no user interaction | |
65 | ++ $config{multi}=0; # 1: do not ask user and get all of them | |
66 | ++ # 0: just the first one | |
67 | ++} | |
68 | + | |
69 | + my %db; | |
70 | + | ... | ... |
CDDB_get-2.27.tar.gz
0 → 100644
No preview for this file type
CDDB_get-2.27p1.patch
0 → 100644
1 | +diff -Naur CDDB_get-2.27/CDDB_get.pm CDDB_get-2.27.patched/CDDB_get.pm | |
2 | +--- CDDB_get-2.27/CDDB_get.pm 2006-01-01 20:52:54.000000000 +0100 | |
3 | ++++ CDDB_get-2.27.patched/CDDB_get.pm 2006-05-27 09:54:30.733131044 +0200 | |
4 | +@@ -262,6 +262,7 @@ | |
5 | + | |
6 | + my $input = $config->{input}; | |
7 | + my $multi = $config->{multi}; | |
8 | ++ my $entry = $config->{entry} if (defined($config->{entry})); | |
9 | + $input = 0 if $multi; | |
10 | + | |
11 | + print STDERR Dumper($config) if $debug; | |
12 | +@@ -441,7 +442,14 @@ | |
13 | + } | |
14 | + } | |
15 | + } else { | |
16 | +- push @to_get,@list; | |
17 | ++ unless(defined($entry)) { | |
18 | ++ push @to_get,@list; | |
19 | ++ } | |
20 | ++ else { | |
21 | ++ if($entry-1 >= 0 && $entry-1 <= $#list) { | |
22 | ++ push @to_get,$list[$entry-1]; | |
23 | ++ } | |
24 | ++ } | |
25 | + } | |
26 | + | |
27 | + my $i=0; | |
28 | +diff -Naur CDDB_get-2.27/cddb.pl CDDB_get-2.27.patched/cddb.pl | |
29 | +--- CDDB_get-2.27/cddb.pl 2005-10-06 08:00:59.000000000 +0200 | |
30 | ++++ CDDB_get-2.27.patched/cddb.pl 2006-05-27 09:56:17.798156565 +0200 | |
31 | +@@ -27,12 +27,13 @@ | |
32 | + use strict; | |
33 | + | |
34 | + my %option = (); | |
35 | +-getopts("oghdtsi:SfDlOFc:H:CIRGP", \%option); | |
36 | ++getopts("oghdtsi:SfDlOFe:c:H:CIRGP", \%option); | |
37 | + | |
38 | + if($option{h}) { | |
39 | + print "$0: gets CDDB info of a CD\n"; | |
40 | + print " no argument - gets CDDB info of CD in your drive\n"; | |
41 | + print " -c device (other than default device)\n"; | |
42 | ++ print " -e which cddb-entry to use\n"; | |
43 | + print " -o offline mode - just stores CD info\n"; | |
44 | + print " -d output in xmcd format\n"; | |
45 | + print " -s save in xmcd format\n"; | |
46 | +@@ -110,11 +111,19 @@ | |
47 | + $config{CD_DEVICE}=$option{c} if $option{c}; | |
48 | + | |
49 | + # user interaction welcome? | |
50 | +- | |
51 | +-$config{input}=1; # 1: ask user if more than one possibility | |
52 | +- # 0: no user interaction | |
53 | +-$config{multi}=0; # 1: do not ask user and get all of them | |
54 | +- # 0: just the first one | |
55 | ++if($option{e}) { | |
56 | ++ $config{entry}=$option{e}; | |
57 | ++ $config{input}=0; # 1: ask user if more than one possibility | |
58 | ++ # 0: no user interaction | |
59 | ++ $config{multi}=0; # 1: do not ask user and get all of them | |
60 | ++ # 0: just the first one | |
61 | ++} | |
62 | ++else { | |
63 | ++ $config{input}=1; # 1: ask user if more than one possibility | |
64 | ++ # 0: no user interaction | |
65 | ++ $config{multi}=0; # 1: do not ask user and get all of them | |
66 | ++ # 0: just the first one | |
67 | ++} | |
68 | + | |
69 | + $config{input}=0 if($option{I}); | |
70 | + | ... | ... |
cddb.pl
0 → 100755
1 | +#!/usr/bin/perl -I. | |
2 | +# | |
3 | +# CDDB - Read the CDDB entry for an audio CD in your drive | |
4 | +# | |
5 | +# This module/script gets the CDDB info for an audio cd. You need | |
6 | +# LINUX, a cdrom drive and an active internet connection in order | |
7 | +# to do that. | |
8 | +# | |
9 | +# (c) 2004 Armin Obersteiner <armin@xos.net> | |
10 | +# | |
11 | +# LICENSE | |
12 | +# | |
13 | +# This library is released under the same conditions as Perl, that | |
14 | +# is, either of the following: | |
15 | +# | |
16 | +# a) the GNU General Public License Version 2 as published by the | |
17 | +# Free Software Foundation, | |
18 | +# | |
19 | +# b) the Artistic License. | |
20 | +# | |
21 | + | |
22 | +#use CDDB_get qw( get_cddb get_discids ); | |
23 | + | |
24 | +use Data::Dumper; | |
25 | +use Getopt::Std; | |
26 | + | |
27 | +use strict; | |
28 | + | |
29 | +my %option = (); | |
30 | +getopts("oghdtsi:SfDlOFe:c:H:CIRGP", \%option); | |
31 | + | |
32 | +if($option{h}) { | |
33 | + print "$0: gets CDDB info of a CD\n"; | |
34 | + print " no argument - gets CDDB info of CD in your drive\n"; | |
35 | + print " -c device (other than default device)\n"; | |
36 | + print " -e which cddb-entry to use\n"; | |
37 | + print " -o offline mode - just stores CD info\n"; | |
38 | + print " -d output in xmcd format\n"; | |
39 | + print " -s save in xmcd format\n"; | |
40 | + print " -i db. one of: mysql, pg, oracle, sqlite\n"; | |
41 | + print " -O overwrite file or db\n"; | |
42 | + print " -t output toc\n"; | |
43 | + print " -l output lame command\n"; | |
44 | + print " -f http mode (e.g. through firewalls)\n"; | |
45 | + print " -F some stateful firewalls/http proxies need additional newlines\n"; | |
46 | + print " -g get CDDB info for stored CDs\n"; | |
47 | + print " -I non interactive mode\n"; | |
48 | + print " -H CDDB hostname\n"; | |
49 | + print " -C use local cache\n"; | |
50 | + print " -R readonly cache\n"; | |
51 | + print " -G cache has not the diskid as filenames (much slower)\n"; | |
52 | + print " -P cache path (default: /tmp/xmcd)\n"; | |
53 | + print " -D put CDDB_get in debug mode\n"; | |
54 | + exit; | |
55 | +} | |
56 | + | |
57 | +my %config; | |
58 | + | |
59 | +my $diskid; | |
60 | +my $total; | |
61 | +my $toc; | |
62 | +my $savedir="/tmp/cddb"; | |
63 | +my $xmcddir="/tmp/xmcd"; | |
64 | + | |
65 | +if($option{C}) { | |
66 | + # use CDDB_cache qw( get_cddb get_discids ); | |
67 | + require CDDB_cache; | |
68 | + CDDB_cache->import( qw( get_cddb get_discids ) ); | |
69 | + | |
70 | + $CDDB_cache::debug=1 if($option{D}); | |
71 | + $CDDB_cache::readonly=1 if($option{R}); | |
72 | + $CDDB_cache::grep=1 if($option{G}); | |
73 | + | |
74 | + $CDDB_cache::dir="/tmp/xmcd"; # default | |
75 | + # $CDDB_cache::dir="/opt/kde2/share/apps/kscd/cddb"; | |
76 | + $CDDB_cache::dir=$option{P} if($option{P}); | |
77 | + | |
78 | +} else { | |
79 | + # use CDDB_get qw( get_cddb get_discids ); | |
80 | + require CDDB_get; | |
81 | + CDDB_get->import( qw( get_cddb get_discids ) ); | |
82 | +} | |
83 | + | |
84 | +$CDDB_get::debug=1 if($option{D}); | |
85 | + | |
86 | +# following variables just need to be declared if different from defaults | |
87 | +# defaults are listed below (cdrom default is os specific) | |
88 | + | |
89 | +# $config{CDDB_HOST}="freedb.freedb.org"; # set cddb host | |
90 | +if($option{H}) { | |
91 | + $config{CDDB_HOST}=$option{H}; | |
92 | +} | |
93 | +# $config{CDDB_PORT}=8880; # set cddb port | |
94 | +# $config{CDDB_MODE}="cddb"; # set cddb mode: cddb or http, this is switched with -f | |
95 | +# $config{CD_DEVICE}="/dev/cdrom"; # set cd device | |
96 | + | |
97 | +# $config{HELLO_ID} ="root nowhere.com fastrip 0.77"; # hello string: username hostname clientname version | |
98 | +# $config{PROTO_VERSION} = 5; # cddb protokol version | |
99 | + | |
100 | + | |
101 | +# get proxy settings for cddb mode | |
102 | + | |
103 | +$config{HTTP_PROXY}=$ENV{http_proxy} if $ENV{http_proxy}; # maybe wanna use a proxy ? | |
104 | + | |
105 | +$config{CDDB_MODE}="http" if($option{f}); | |
106 | +if($option{F}) { | |
107 | + $config{CDDB_MODE}="http"; | |
108 | + $config{FW}=1; | |
109 | +} | |
110 | + | |
111 | +$config{CD_DEVICE}=$option{c} if $option{c}; | |
112 | + | |
113 | +# user interaction welcome? | |
114 | +if($option{e}) { | |
115 | + $config{entry}=$option{e}; | |
116 | + $config{input}=0; # 1: ask user if more than one possibility | |
117 | + # 0: no user interaction | |
118 | + $config{multi}=0; # 1: do not ask user and get all of them | |
119 | + # 0: just the first one | |
120 | +} | |
121 | +else { | |
122 | + $config{input}=1; # 1: ask user if more than one possibility | |
123 | + # 0: no user interaction | |
124 | + $config{multi}=0; # 1: do not ask user and get all of them | |
125 | + # 0: just the first one | |
126 | +} | |
127 | + | |
128 | +$config{input}=0 if($option{I}); | |
129 | + | |
130 | +my %db; | |
131 | + | |
132 | +if($option{i}) { | |
133 | + require DBI; | |
134 | + | |
135 | + $db{table_cds} = "cds"; | |
136 | + $db{table_tracks} = "tracks"; | |
137 | + | |
138 | + # not needed for sqlite | |
139 | + $db{host} = "localhost"; | |
140 | + $db{port} = "3306"; | |
141 | + | |
142 | + # not needed for oracle/sqlite | |
143 | + $db{name} = "mp3-test"; | |
144 | + | |
145 | + # just for oracle | |
146 | + $db{sid} = "xxx"; | |
147 | + $db{home} = "xxx"; | |
148 | + | |
149 | + # just for sqlite | |
150 | + $db{file} = "xxx"; | |
151 | + | |
152 | + # not needed for sqlite | |
153 | + $db{user} = "root"; | |
154 | + $db{passwd} = "xxx"; | |
155 | + | |
156 | + | |
157 | + if($option{i} eq "mysql") { | |
158 | + $db{connect} = sub { "dbi:mysql:database=$db{name};host=$db{host};port=$db{port}", $db{user}, $db{passwd} }; | |
159 | + } elsif($option{i} eq "pg") { | |
160 | + $db{connect} = sub { "dbi:Pg:dbname=$db{dbname};host=$db{host};port=$db{port}", $db{user}, $db{passwd} }; | |
161 | + } elsif($option{i} eq "oracle") { | |
162 | + $db{connect} = sub { "dbi:Oracle:host=$db{host};sid=$db{sid};port=$db{port}", $db{user}, $db{passwd} }; | |
163 | + $ENV{ORACLE_HOME} = $db{home}; | |
164 | + } elsif($option{i} eq "sqlite") { | |
165 | + $db{connect} = sub { "dbi:SQLite:dbname=$db{file}","","" }; | |
166 | + } else { | |
167 | + die "unkown database: $option{i}"; | |
168 | + } | |
169 | +} | |
170 | + | |
171 | +if($option{o}) { | |
172 | + my $ids=get_discids($config{CD_DEVICE}); | |
173 | + | |
174 | + unless(-e $savedir) { | |
175 | + mkdir $savedir,0755 or die "cannot create $savedir"; | |
176 | + } | |
177 | + | |
178 | + open OUT,">$savedir/$ids->[0]\_$$" or die "cannot open outfile"; | |
179 | + print OUT Data::Dumper->Dump($ids,["diskid","total","toc"]); | |
180 | + close OUT; | |
181 | + | |
182 | + print STDERR "saved in: $savedir/$ids->[0]\_$$\n"; | |
183 | + exit; | |
184 | +} | |
185 | + | |
186 | +if($option{g}) { | |
187 | + print STDERR "retrieving stored cds ...\n"; | |
188 | + | |
189 | + opendir(DIR, $savedir) or die "cannot opendir $savedir"; | |
190 | + while (defined(my $file = readdir(DIR))) { | |
191 | + next if($file =~ /^\./); | |
192 | + print "\n"; | |
193 | + | |
194 | + my $in=`/bin/cat $savedir/$file`; | |
195 | + my $exit = $? >> 8; | |
196 | + | |
197 | + if($exit>0) { | |
198 | + die "error reading file"; | |
199 | + } | |
200 | + | |
201 | + unless($in=~ m/^\$diskid\s+=\s+('\d+'|\d+);\s+ # $diskid | |
202 | + \$total\s+=\s+('\d+'|\d+);\s+ # $total | |
203 | + \$toc\s+=\s+\[\s+ # $toc | |
204 | + (\{\s+ | |
205 | + ('(frame|frames|min|sec|data)'\s+=\>\s+('\d+'|\d+)(,|)\s+){5} | |
206 | + \}(,|)\s+)+ | |
207 | + \];\s+$/xs) { | |
208 | + print "not a save file: $savedir/$file\n"; | |
209 | + next; | |
210 | + } | |
211 | + | |
212 | + eval $in; | |
213 | + | |
214 | + if($@) { | |
215 | + print "not a save file (eval error): $savedir/$file\n"; | |
216 | + next; | |
217 | + } | |
218 | + | |
219 | + my %cd=get_cddb(\%config,[$diskid,$total,$toc]); | |
220 | + | |
221 | + unless(defined $cd{title}) { | |
222 | + print "no cddb entry found: $savedir/$file\n"; | |
223 | + } | |
224 | + | |
225 | + unlink "$savedir/$file"; | |
226 | + | |
227 | + next unless defined $cd{title}; | |
228 | + | |
229 | + if($option{d} || $option{s}) { | |
230 | + print_xmcd(\%cd,$option{s}); | |
231 | + } elsif($option{i}) { | |
232 | + insert_db(\%cd,\%db); | |
233 | + } elsif($option{l}) { | |
234 | + print_lame(\%cd); | |
235 | + } else { | |
236 | + print_cd(\%cd); | |
237 | + } | |
238 | + } | |
239 | + closedir(DIR); | |
240 | + exit; | |
241 | +} | |
242 | + | |
243 | +# get it on | |
244 | + | |
245 | +unless($config{multi}) { | |
246 | + my %cd; | |
247 | + | |
248 | + # for those who don't like 'die' in modules ;-) | |
249 | + eval { | |
250 | + %cd = get_cddb(\%config); | |
251 | + }; | |
252 | + if ($@) { | |
253 | + print "fatal error: $!\n"; | |
254 | + exit; | |
255 | + } | |
256 | + | |
257 | + print Dumper(\%cd) if $option{D}; | |
258 | + | |
259 | + unless(defined $cd{title}) { | |
260 | + die "no cddb entry found"; | |
261 | + } | |
262 | + | |
263 | + # do somthing with the results | |
264 | + | |
265 | + if($option{d} || $option{s}) { | |
266 | + print_xmcd(\%cd,$option{s}); | |
267 | + } elsif($option{i}) { | |
268 | + insert_db(\%cd,\%db); | |
269 | + } elsif($option{l}) { | |
270 | + print_lame(\%cd); | |
271 | + } else { | |
272 | + print_cd(\%cd); | |
273 | + } | |
274 | +} else { | |
275 | + my @cd; | |
276 | + | |
277 | + # for those who don't like 'die' in modules ;-) | |
278 | + eval { | |
279 | + @cd=get_cddb(\%config); | |
280 | + }; | |
281 | + if ($@) { | |
282 | + print "fatal error: $!\n"; | |
283 | + exit; | |
284 | + } | |
285 | + | |
286 | + print Dumper(\@cd) if $option{D}; | |
287 | + | |
288 | + for my $c (@cd) { | |
289 | + unless(defined $c->{title}) { | |
290 | + die "no cddb entry found"; | |
291 | + } | |
292 | + | |
293 | + # do somthing with the results | |
294 | + | |
295 | + if($option{d} || $option{s}) { | |
296 | + print_xmcd($c,$option{s}); | |
297 | + } elsif($option{i}) { | |
298 | + insert_db($c,\%db); | |
299 | + } elsif($option{l}) { | |
300 | + print_lame($c); | |
301 | + print "\n"; | |
302 | + } else { | |
303 | + print_cd($c); | |
304 | + print "\n"; | |
305 | + } | |
306 | + } | |
307 | +} | |
308 | + | |
309 | +exit; | |
310 | + | |
311 | + | |
312 | +# subroutines | |
313 | + | |
314 | +sub print_cd { | |
315 | + my $cd=shift; | |
316 | + | |
317 | + print "artist: $cd->{artist}\n"; | |
318 | + print "title: $cd->{title}\n"; | |
319 | + print "category: $cd->{cat}\n"; | |
320 | + print "genre: $cd->{genre}\n" if($cd->{genre}); | |
321 | + print "year: $cd->{year}\n" if($cd->{year}); | |
322 | + print "cddbid: $cd->{id}\n"; | |
323 | + print "trackno: $cd->{tno}\n"; | |
324 | + | |
325 | + my $n=1; | |
326 | + foreach my $i ( @{$cd->{track}} ) { | |
327 | + if($option{t}) { | |
328 | + my $from=$cd->{frames}[$n-1]; | |
329 | + my $to=$cd->{frames}[$n]-1; | |
330 | + my $dur=$to-$from; | |
331 | + my $min=int($dur/75/60); | |
332 | + my $sec=int($dur/75)-$min*60; | |
333 | + my $frm=($dur-$sec*75-$min*75*60)*100/75; | |
334 | + my $out=sprintf "track %2d: %8d - %8d [%2d:%.2d.%.2d]: $i\n",$n,$from,$to,$min,$sec,$frm; | |
335 | + print "$out"; | |
336 | + } else { | |
337 | + print "track $n: $i\n"; | |
338 | + } | |
339 | + $n++; | |
340 | + } | |
341 | +} | |
342 | + | |
343 | +sub print_xmcd { | |
344 | + my $cd=shift; | |
345 | + my $save=shift; | |
346 | + | |
347 | + *OUT=*STDOUT; | |
348 | + | |
349 | + if($save) { | |
350 | + unless(-e $xmcddir) { | |
351 | + mkdir $xmcddir,0755 or die "cannot create $savedir"; | |
352 | + } | |
353 | + | |
354 | + unless($option{O}) { | |
355 | + if(-e "$xmcddir/$cd->{id}") { | |
356 | + print "XMCD file exists\n"; | |
357 | + exit; | |
358 | + } | |
359 | + } | |
360 | + | |
361 | + open XMCD,">$xmcddir/$cd->{id}" or die "cannot open outfile"; | |
362 | + *OUT=*XMCD; | |
363 | + } | |
364 | + | |
365 | + for(@{$cd->{raw}}) { | |
366 | + print OUT "$_"; | |
367 | + } | |
368 | + | |
369 | + if($save) { | |
370 | + print STDERR "saved in: $xmcddir/$cd->{id}\n"; | |
371 | + close OUT; | |
372 | + } | |
373 | +} | |
374 | + | |
375 | +sub insert_db { | |
376 | + my $cd=shift; | |
377 | + my $db=shift; | |
378 | + | |
379 | + my ($artist, $title, $category, $cddbid, $trackno) = | |
380 | + ($cd->{artist}, $cd->{title}, $cd->{cat}, $cd->{id}, $cd->{tno}); | |
381 | + | |
382 | + my $sql = "SELECT cddbid FROM $db->{table_cds} WHERE CDDBID = \'$cddbid\'"; | |
383 | + my $dbh = DBI->connect($db->{connect}->()) or die "cannot connect to db: $DBI::errstr"; | |
384 | + my $sth = $dbh->prepare($sql); | |
385 | + my $r = $sth->execute or die "cannot check for cd: $DBI::errstr"; | |
386 | + if ($r == 1) { | |
387 | + print "cd already in db\n"; | |
388 | + if($option{O}) { | |
389 | + my $sql = "DELETE FROM $db->{table_cds} WHERE CDDBID = \'$cddbid\'"; | |
390 | + my $sth = $dbh->prepare($sql); | |
391 | + my $r = $sth->execute or die "cannot delete from $db->{table_cds}: $DBI::errstr"; | |
392 | + $sql = "DELETE FROM $db->{table_tracks} WHERE CDDBID = \'$cddbid\'"; | |
393 | + $sth = $dbh->prepare($sql); | |
394 | + $r = $sth->execute or die "cannot delete from $db->{table_tracks}: $DBI::errstr"; | |
395 | + } else { | |
396 | + exit; | |
397 | + } | |
398 | + } | |
399 | + | |
400 | + $title =~ s/'/\\'/g; | |
401 | + $artist =~ s/'/\\'/g; | |
402 | + $category =~ s/'/\\'/g; | |
403 | + | |
404 | + $sql = "INSERT INTO $db->{table_cds} (cddbid, artist, title, category, tracks) VALUES (\'$cddbid\', \'$artist\', \'$title\', \'$category\' , \'$trackno\')"; | |
405 | + $sth = $dbh->prepare($sql); | |
406 | + $r = $sth->execute or die "failed to insert cd: $DBI::errstr"; | |
407 | + | |
408 | + my $n=1; | |
409 | + | |
410 | + print "titel: $title\n"; | |
411 | + print "artist: $artist\n"; | |
412 | + print "category: $category\n\n"; | |
413 | + | |
414 | + for my $t ( @{$cd->{track}} ) { | |
415 | + $t =~ s/'/\\'/g; | |
416 | + my $dur=($cd->{frames}[$n]-1-$cd->{frames}[$n-1])/75; | |
417 | + my $hour=int($dur/3600); | |
418 | + my $min=int($dur/60-$hour*60); | |
419 | + my $sec=$dur-$hour*3600-$min*60; | |
420 | + my $fr=substr(sprintf("%5.2f",$sec-int($sec)),2,3); | |
421 | + my $time=sprintf "%.2d:%.2d:%.2d%s",$hour,$min,int($sec),$fr; | |
422 | + | |
423 | + print "track $n: $t [$time]\n"; | |
424 | + | |
425 | + my $sql = "INSERT INTO $db->{table_tracks} (cddbid, title, trackno, time) | |
426 | + VALUES (\'$cddbid\',\'$t\', \'$n\', \'$time\')"; | |
427 | + my $sth = $dbh->prepare($sql); | |
428 | + my $r = $sth->execute or die "failed to insert track $n: $DBI::errstr"; | |
429 | + $n++; | |
430 | + } | |
431 | + | |
432 | + $dbh->disconnect(); | |
433 | +} | |
434 | + | |
435 | +sub print_lame { | |
436 | + my $cd=shift; | |
437 | + | |
438 | + print_cd($cd); | |
439 | + print "\n"; | |
440 | + | |
441 | + my $n=1; | |
442 | + for my $i ( @{$cd->{track}} ) { | |
443 | + $i =~ s/"/'/g; | |
444 | + print 'lame --tl "'.$cd->{title}.'" --ta "'.$cd->{artist}.'" --tt "'.$i.'" '; | |
445 | + printf "audio_%02d.wav ",$n; | |
446 | + $i =~ s/[^\S]|['"\/]/_/g; | |
447 | + $i =~ s/_+-_+/-/g; | |
448 | + print " $i.mp3\n"; | |
449 | + $n++; | |
450 | + } | |
451 | +} | ... | ... |
cdinfo2xinf.xsl
0 → 100755
1 | +<?xml version="1.0" encoding="ISO-8859-15"?> | |
2 | +<xsl:stylesheet version="1.0" | |
3 | + xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | |
4 | + | |
5 | + <xsl:output method="text" indent="no" encoding="ISO-8859-15" /> | |
6 | + | |
7 | + <xsl:template match="/"> | |
8 | +cddb=`echo <xsl:value-of select="/cdinfo/cddb"/> | sed 's/0x\(.*\)/\1/g'` | |
9 | +date=`date` | |
10 | + | |
11 | + <xsl:apply-templates select="/cdinfo/track"/> | |
12 | + </xsl:template> | |
13 | + | |
14 | + <xsl:template match="track"> | |
15 | +track="`echo <xsl:value-of select="track-number"/> | /usr/bin/awk '{printf("%02d", $0)}'`" | |
16 | +track="${track}-<xsl:value-of select="track-title"/>" | |
17 | + | |
18 | +cat > "${track}.xinf" <<- end | |
19 | + # | |
20 | + # X-CD-Roast 0.98alpha15 - INF-File | |
21 | + # created: $date | |
22 | + # by: getcd.sh | |
23 | + # | |
24 | + file = "./${track}.wav" | |
25 | + track = <xsl:value-of select="track-number"/> of <xsl:value-of select="/cdinfo/cd-tracks"/> | |
26 | + title = "<xsl:value-of select="track-title"/>" | |
27 | + artist = "<xsl:value-of select="track-artist"/>" | |
28 | + size = <xsl:value-of select="track-length"/> | |
29 | + type = 1 | |
30 | + rec_type = 0 | |
31 | + preemp = 0 | |
32 | + copyperm = 0 | |
33 | + stereo = 1 | |
34 | + # from CD: | |
35 | + cd_title = "<xsl:value-of select="/cdinfo/cd-title"/>" | |
36 | + cd_artist = "<xsl:value-of select="/cdinfo/cd-artist"/>" | |
37 | + cd_discid = "$cddb" | |
38 | +end | |
39 | + </xsl:template> | |
40 | +</xsl:stylesheet> | ... | ... |
flac2mp3.xsl
0 → 100755
1 | +<?xml version="1.0" encoding="ISO-8859-15"?> | |
2 | +<xsl:stylesheet version="1.0" | |
3 | + xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | |
4 | + | |
5 | + <xsl:output method="text" indent="no" encoding="ISO-8859-15" /> | |
6 | + | |
7 | + <xsl:template match="/"> | |
8 | +outdir="../../../mp3/<xsl:value-of select="/cdinfo/cd-artist"/>" | |
9 | +outdir="$outdir/<xsl:value-of select="/cdinfo/cd-title"/>" | |
10 | +mkdirhier "$outdir" | |
11 | + <xsl:apply-templates select="/cdinfo/track"/> | |
12 | + </xsl:template> | |
13 | + | |
14 | + <xsl:template match="track"> | |
15 | +tracknum=`echo <xsl:value-of select="track-number"/> | \ | |
16 | + awk '{printf("%02d", $0)}'` | |
17 | +title="<xsl:value-of select="track-title"/>" | |
18 | +flac -d -o - "$tracknum-$title.flac" | \ | |
19 | + lame -h --ta "<xsl:value-of select="track-artist"/>" \ | |
20 | + --tl "<xsl:value-of select="/cdinfo/cd-title"/>" \ | |
21 | + --tg "<xsl:value-of select="/cdinfo/cd-genre"/>" \ | |
22 | + --tt "<xsl:value-of select="track-title"/>" \ | |
23 | + --tn "<xsl:value-of select="track-number"/>" \ | |
24 | + --ty "<xsl:value-of select="/cdinfo/cd-year"/>" \ | |
25 | + --tc "<xsl:value-of select="track-comment"/>" - \ | |
26 | + "$outdir/$tracknum-$title.mp3" | |
27 | + </xsl:template> | |
28 | +</xsl:stylesheet> | ... | ... |
flac2wav.xsl
0 → 100755
1 | +<?xml version="1.0" encoding="ISO-8859-15"?> | |
2 | +<xsl:stylesheet version="1.0" | |
3 | + xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | |
4 | + | |
5 | + <xsl:output method="text" indent="no" encoding="ISO-8859-15" /> | |
6 | + | |
7 | + <xsl:template match="/"> | |
8 | +outdir="../../../wav/<xsl:value-of select="/cdinfo/cd-artist"/>" | |
9 | +outdir="$outdir/<xsl:value-of select="/cdinfo/cd-title"/>" | |
10 | +mkdirhier "$outdir" | |
11 | + <xsl:apply-templates select="/cdinfo/track"/> | |
12 | + </xsl:template> | |
13 | + | |
14 | + <xsl:template match="track"> | |
15 | +tracknum=`echo <xsl:value-of select="track-number"/> | \ | |
16 | + awk '{printf("%02d", $0)}'` | |
17 | +title="<xsl:value-of select="track-title"/>" | |
18 | +flac -d -o "$outdir/$tracknum-$title.wav" \ | |
19 | + "$tracknum-$title.flac" | |
20 | + </xsl:template> | |
21 | +</xsl:stylesheet> | ... | ... |
getcd.sh
0 → 100755
1 | +USAGE="usage: $0 [-d delimiter [-o {t|a}]] [-t {m|f|o}] [-p path] [-e encoder] [-c cddb-entry] [-h]\n" | |
2 | +USAGE="${USAGE} -d :\tA single character delimiting trackname from\n" | |
3 | +USAGE="${USAGE}\tartistname with sampler cds\n\n" | |
4 | +USAGE="${USAGE} -o :\tspecifies if theres the track or the artist first\n" | |
5 | +USAGE="${USAGE}\tMust be:\n" | |
6 | +USAGE="${USAGE}\t t for titel first or\n" | |
7 | +USAGE="${USAGE}\t a for artist first\n" | |
8 | +USAGE="${USAGE}\tIf there is none specified t is assumed\n" | |
9 | +USAGE="${USAGE} -t :\tyou can specify either m for encoding to mp3\n" | |
10 | +USAGE="${USAGE}\tusing lame, or f for making lossless encoding using flac,\n" | |
11 | +USAGE="${USAGE}\tor o for making ogg/vorbis, or w for uncompressed wav.\n" | |
12 | +USAGE="${USAGE}\tOmitting this results in encoding to flac.\n" | |
13 | +USAGE="${USAGE}\tmp3s will be placed under a subfolder mp3 and flacs\n" | |
14 | +USAGE="${USAGE}\tunder a subfolder flac\n" | |
15 | +USAGE="${USAGE} -p :\tspecifies the path to save the encoded data.\n" | |
16 | +USAGE="${USAGE}\tDefaults to the users home directory.\n" | |
17 | +USAGE="${USAGE} -e :\tspecifies the mp3 encoder to use.\n" | |
18 | +USAGE="${USAGE}\tvalid encoders are actually: lame,bladeenc\n" | |
19 | +USAGE="${USAGE}\tDefaults to lame.\n" | |
20 | +USAGE="${USAGE} -c :\tspecifies the CDDB-Entry to use.\n" | |
21 | +USAGE="${USAGE}\tsometimes there is more than 1 entry for a cd in cddb.\n" | |
22 | +USAGE="${USAGE}\tThen you can specify wich one to use by this option.\n" | |
23 | +USAGE="${USAGE}\tYou can checkout all entries using cddb.pl.\n" | |
24 | +USAGE="${USAGE} -h :\tShows this help." | |
25 | + | |
26 | +HAS_DELIMITER=0 | |
27 | +TA_ORDER="t" | |
28 | +ENCODING_DIR=$HOME | |
29 | +ENCODING_TYPE="f" | |
30 | +ENCODER="lame" | |
31 | +CDDB_ENTRY=1 | |
32 | + | |
33 | +while getopts d:o:t:p:he:c: option | |
34 | +do | |
35 | + case $option in | |
36 | + d) if [ ${#OPTARG} -gt 1 ] | |
37 | + then | |
38 | + echo -e "$USAGE" | |
39 | + exit 1 | |
40 | + fi | |
41 | + HAS_DELIMITER=1 | |
42 | + TA_DELIMITER=$OPTARG | |
43 | + ;; | |
44 | + o) if [ \( "${OPTARG}" != "t" -a "${OPTARG}" != "a" \) -o \ | |
45 | + ${HAS_DELIMITER} -eq 0 ] | |
46 | + then | |
47 | + echo -e "$USAGE" | |
48 | + exit 1 | |
49 | + fi | |
50 | + TA_ORDER=$OPTARG | |
51 | + ;; | |
52 | + t) if [ ${OPTARG} != "m" -a ${OPTARG} != "f" -a ${OPTARG} != "o" -a \ | |
53 | + ${OPTARG} != "w" ] | |
54 | + then | |
55 | + echo -e "$USAGE" | |
56 | + exit 1 | |
57 | + fi | |
58 | + ENCODING_TYPE=$OPTARG | |
59 | + ;; | |
60 | + p) if [ ! \( -d ${OPTARG} \) ] | |
61 | + then | |
62 | + echo -e "$USAGE" | |
63 | + exit 1 | |
64 | + fi | |
65 | + ENCODING_DIR=$OPTARG | |
66 | + ;; | |
67 | + e) if [ -z ${OPTARG} ] | |
68 | + then | |
69 | + echo -e "$USAGE" | |
70 | + exit 1 | |
71 | + fi | |
72 | + ENCODER=$OPTARG | |
73 | + ;; | |
74 | + c) if [ ${OPTARG} -lt 1 ] | |
75 | + then | |
76 | + echo -e "$USAGE" | |
77 | + exit 1 | |
78 | + fi | |
79 | + CDDB_ENTRY=$OPTARG | |
80 | + ;; | |
81 | + [h\?]) echo -e "$USAGE" | |
82 | + exit 1 | |
83 | + ;; | |
84 | + esac | |
85 | +done | |
86 | + | |
87 | +test "$ENCODING_TYPE" = "m" && ENCODING_DIR="$ENCODING_DIR/mp3" | |
88 | +test "$ENCODING_TYPE" = "f" && ENCODING_DIR="$ENCODING_DIR/flac" | |
89 | +test "$ENCODING_TYPE" = "o" && ENCODING_DIR="$ENCODING_DIR/ogg" | |
90 | +test "$ENCODING_TYPE" = "w" && ENCODING_DIR="$ENCODING_DIR/wav" | |
91 | + | |
92 | +indices[0]="album" | |
93 | +indices[1]="artist" | |
94 | +indices[2]="genre" | |
95 | +indices[3]="year" | |
96 | +indices[4]="comment" | |
97 | + | |
98 | +i=1 | |
99 | +max_track=30 | |
100 | + | |
101 | +while [ $i -le $max_track ]; do | |
102 | + indices[`expr \( $i \- 1 \) \* 2 \+ 5`]="`echo $i | \ | |
103 | + sed 's/^\([0-9]\)$/0\1/g;\ | |
104 | + s/\(.*\)/track-\1/g'`" | |
105 | + indices[`expr \( $i \- 1 \) \* 2 \+ 6`]="`echo $i | \ | |
106 | + sed 's/^\([0-9]\)$/0\1/g;\ | |
107 | + s/\(.*\)/tartist-\1/g'`" | |
108 | + i=`expr $i \+ 1` | |
109 | +done | |
110 | + | |
111 | +comment="" | |
112 | + | |
113 | +function idxof() { | |
114 | + str=$1 | |
115 | + idx=0 | |
116 | + | |
117 | + for i in "${indices[@]}"; do | |
118 | + test "$i" == "$str" && echo $idx && return 0 | |
119 | + idx=`expr $idx \+ 1` | |
120 | + done | |
121 | + | |
122 | + echo -1 | |
123 | + return 0 | |
124 | +} | |
125 | + | |
126 | +title_pat="/^[^:]*: *(.*[^ ]).*/" | |
127 | +artist_pat="//" | |
128 | + | |
129 | +if [ $HAS_DELIMITER -ne 0 ] | |
130 | +then | |
131 | + if [ $TA_ORDER == "t" ] | |
132 | + then | |
133 | + title_pat="/^[^:]*: *([^\\${TA_DELIMITER}]*[^ \\${TA_DELIMITER}]).*/" | |
134 | + artist_pat="/^[^:]*: *[^\\${TA_DELIMITER}]*\\${TA_DELIMITER} *(.*[^ ]).*/" | |
135 | + else | |
136 | + artist_pat="/^[^:]*: *([^\\${TA_DELIMITER}]*[^ \\${TA_DELIMITER}]).*/" | |
137 | + title_pat="/^[^:]*: *[^\\${TA_DELIMITER}]*\\${TA_DELIMITER} *(.*[^ ]).*/" | |
138 | + fi | |
139 | +fi | |
140 | + | |
141 | +echo "Preparing...." | |
142 | + | |
143 | +echo -n "getting cddb info..." | |
144 | +eval "`cddb.pl -e $CDDB_ENTRY | sed 's/ \([0-9]\):/ 0\1:/g;s/track /track-/g' |\ | |
145 | + awk -v has_delimiter=$HAS_DELIMITER \ | |
146 | + '/artist/||/title/||/genre/||/year/ { \ | |
147 | + cddb[gensub(/^([^:]*):.*/, \"\\\\1\", \"1\")]=\ | |
148 | + gensub(/^[^:]*: *(.*[^ ]).*/, \"\\\\1\", \"g\")\ | |
149 | + } \ | |
150 | + /trackno/ {\ | |
151 | + trackno=int(gensub(/^trackno: *([0-9]*).*/, \"\\\\1\", \"1\"))\ | |
152 | + }\ | |
153 | + /track-/ {\ | |
154 | + cddb[gensub(/^([^:]*):.*/, \"\\\\1\", \"1\")]=\ | |
155 | + gensub('\"$title_pat\"', \"\\\\1\", \"1\");\ | |
156 | + if(has_delimiter==0) \ | |
157 | + cddb[gensub(/^track([^:]*):.*/, \"tarti\\\\1\", \"1\")]=\ | |
158 | + cddb[\"artist\"]; \ | |
159 | + else \ | |
160 | + cddb[gensub(/^track([^:]*):.*/, \"tarti\\\\1\", \"1\")]=\ | |
161 | + gensub('\"$artist_pat\"', \"\\\\1\", \"1\");\ | |
162 | + } \ | |
163 | + END {\ | |
164 | + cddb_str=\"cddb=(\\\"\" cddb[\"title\"] \"\\\" \\\"\" \ | |
165 | + cddb[\"artist\"] \"\\\" \\\"\" \ | |
166 | + cddb[\"genre\"] \"\\\" \\\"\" \ | |
167 | + cddb[\"year\"] \"\\\" \\\"'$comment'\\\"\"; \ | |
168 | + for(i=1; i<=trackno; i++) {\ | |
169 | + cddb_str=cddb_str \" \\\"\" \ | |
170 | + cddb[\"track-\" sprintf(\"%02s\", i)] \"\\\"\";\ | |
171 | + cddb_str=cddb_str \" \\\"\" \ | |
172 | + cddb[\"tarti-\" sprintf(\"%02s\", i)] \"\\\"\"\ | |
173 | + }\ | |
174 | + print cddb_str \")\"\ | |
175 | + }'`" | |
176 | +echo "done" | |
177 | + | |
178 | +echo -n "getting CD info..." | |
179 | +cddainfo=`cdda2wav -H -D/dev/cdrom -J -v summary,toc,sectors 2>&1` | |
180 | +echo "done" | |
181 | + | |
182 | +track_num=`echo "$cddainfo" | \ | |
183 | + sed '/tracks/{s/^.*tracks:\([0-9]*\).*$/\1/g;p};d'` | |
184 | +cd_time=`echo "$cddainfo" | \ | |
185 | + sed '/tracks/{s/^.*time \([0-9:\.]*\).*$/\1/g;p};d'` | |
186 | +cddbid=`echo "$cddainfo" | \ | |
187 | + sed '/CDDB/{s/^.*discid: *\(0x[a-z0-9]*[^ ]\).*/\1/g;p};d'` | |
188 | +cdindex=`echo "$cddainfo" | \ | |
189 | + sed '/CDINDEX/{s/^.*discid: *\([a-zA-Z0-9_\.]*-\).*/\1/g;p};d'` | |
190 | +cdtext=`echo "$cddainfo" | sed '/CD-Text/{s/^[^:]*: *\(.*[^ ]\).*/\1/g | |
191 | + s/&/\&\;/g;s/\"/\"\;/g | |
192 | + s/</\<\;/g;s/>/\>\;/g | |
193 | + s/\o47/\&apos\;/g | |
194 | + p};d'` | |
195 | +cdextra=`echo "$cddainfo" | sed '/CD-Extra/{s/^[^:]*: *\(.*[^ ]\).*/\1/g | |
196 | + s/&/\&\;/g;s/\"/\"\;/g | |
197 | + s/</\<\;/g;s/>/\>\;/g | |
198 | + s/\o47/\&apos\;/g | |
199 | + p};d'` | |
200 | + | |
201 | +ENCODING_DIR="${ENCODING_DIR}/${cddb[`idxof "artist"`]}/" | |
202 | +ENCODING_DIR="${ENCODING_DIR}${cddb[`idxof "album"`]}/" | |
203 | +mkdirhier "$ENCODING_DIR" | |
204 | +echo "Output directory is: $ENCODING_DIR" | |
205 | + | |
206 | +xmlfile="${ENCODING_DIR}cdinfo.xml" | |
207 | + | |
208 | +# some special chars within xml must be converted to special syntax | |
209 | +# & => & | |
210 | +# " => " | |
211 | +# ' => ' | |
212 | +# < => < | |
213 | +# > => > | |
214 | +xmlartist=`echo ${cddb[\`idxof "artist"\`]} | \ | |
215 | + sed 's/&/\&\;/g | |
216 | + s/</\<\;/g | |
217 | + s/>/\>\;/g | |
218 | + s/\"/\"\;/g | |
219 | + s/\o47/\&apos\;/g'` | |
220 | +xmlalbum=`echo ${cddb[\`idxof "album"\`]} | \ | |
221 | + sed 's/&/\&\;/g | |
222 | + s/</\<\;/g | |
223 | + s/>/\>\;/g | |
224 | + s/\"/\"\;/g | |
225 | + s/\o47/\&apos\;/g'` | |
226 | + | |
227 | +echo "<?xml version=\"1.0\" encoding=\"ISO-8859-15\"?>" > "${xmlfile}" | |
228 | +echo "<!DOCTYPE cdInfo SYSTEM \"cdInfo.dtd\">" >> "${xmlfile}" | |
229 | +echo "<cdinfo>" >> "${xmlfile}" | |
230 | +echo " <cdindex>$cdindex</cdindex>" >> "${xmlfile}" | |
231 | +echo " <cddb>$cddbid</cddb>" >> "${xmlfile}" | |
232 | +echo " <cd-text>$cdtext</cd-text>" >> "${xmlfile}" | |
233 | +echo " <cd-extra>$cdextra</cd-extra>" >> "${xmlfile}" | |
234 | +echo " <cd-artist>${xmlartist}</cd-artist>" >> "${xmlfile}" | |
235 | +echo " <cd-title>${xmlalbum}</cd-title>" >> "${xmlfile}" | |
236 | +echo " <cd-year>${cddb[`idxof "year"`]}</cd-year>" >> "${xmlfile}" | |
237 | +echo " <cd-genre>${cddb[`idxof "genre"`]}</cd-genre>" >> "${xmlfile}" | |
238 | +echo " <cd-time>$cd_time</cd-time>" >> "${xmlfile}" | |
239 | +echo " <cd-tracks>$track_num</cd-tracks>" >> "${xmlfile}" | |
240 | +echo " <cd-comment></cd-comment>" >> "${xmlfile}" | |
241 | + | |
242 | +i=1; while [ $i -le $track_num ] | |
243 | +do | |
244 | + j=`expr $i \+ 1` | |
245 | + tracknr=`awk 'BEGIN{printf("%02d\n",'$i')}'` | |
246 | + track=${cddb[`idxof "track-$tracknr"`]} | |
247 | + tartist=${cddb[`idxof "tartist-$tracknr"`]} | |
248 | + | |
249 | + xmltrack=`echo ${track} | sed 's/&/\&\;/g | |
250 | + s/</\<\;/g | |
251 | + s/>/\>\;/g | |
252 | + s/\"/\"\;/g | |
253 | + s/\o47/\&apos\;/g'` | |
254 | + xmltartist=`echo ${tartist} | sed 's/&/\&\;/g | |
255 | + s/</\<\;/g | |
256 | + s/>/\>\;/g | |
257 | + s/\"/\"\;/g | |
258 | + s/\o47/\&apos\;/g'` | |
259 | + | |
260 | + tracklen=`echo "$cddainfo" | \ | |
261 | + sed '/ '"$i"'\.([0-9 ]*:/{s/.*'"$i"'\.( *\([0-9:\.]*\)).*/\1/g;p};d'` | |
262 | + trackstart=`echo "$cddainfo" | \ | |
263 | + sed '/ '"$i"'\.([0-9 ]*)/{s/.*'"$i"'\.( *\([0-9]*\)).*/\1/g;p};d'` | |
264 | + test $i -eq $track_num && \ | |
265 | + trackend=`echo "$cddainfo" | \ | |
266 | + sed '/ lead-out([0-9 ]*)/{s/.*lead-out( *\([0-9]*\)).*/\1/g;p};d'` || \ | |
267 | + trackend=`echo "$cddainfo" | \ | |
268 | + sed '/ '"$j"'\.([0-9 ]*)/{s/.*'"$j"'\.( *\([0-9]*\)).*/\1/g;p};d'` | |
269 | + | |
270 | + echo " <track>" >> "${xmlfile}" | |
271 | + echo " <track-number>$i</track-number>" >> "${xmlfile}" | |
272 | + echo " <track-time>$tracklen</track-time>" >> "${xmlfile}" | |
273 | + echo " <track-start-sector>$trackstart</track-start-sector>" >> "${xmlfile}" | |
274 | + echo " <track-length>`expr $trackend \- $trackstart`</track-length>" >> "${xmlfile}" | |
275 | + echo " <track-artist>$xmltartist</track-artist>" >> "${xmlfile}" | |
276 | + echo " <track-title>$xmltrack</track-title>" >> "${xmlfile}" | |
277 | + echo " <track-comment></track-comment>" >> "${xmlfile}" | |
278 | + echo " </track>" >> "${xmlfile}" | |
279 | + | |
280 | + # outfile="${ENCODING_DIR}The Wall/Disk2/" | |
281 | + outfile="${ENCODING_DIR}${tracknr}-${track}" | |
282 | + | |
283 | + test "$ENCODING_TYPE" = "f" && \ | |
284 | + outstr="track-$tracknr => ${tracknr}-${track}.flac" | |
285 | + test "$ENCODING_TYPE" = "m" && \ | |
286 | + outstr="track-$tracknr => ${tracknr}-${track}.mp3" | |
287 | + test "$ENCODING_TYPE" = "o" && \ | |
288 | + outstr="track-$tracknr => ${tracknr}-${track}.ogg" | |
289 | + test "$ENCODING_TYPE" = "w" && \ | |
290 | + outstr="track-$tracknr => ${tracknr}-${track}.wav" | |
291 | + | |
292 | + if [ "$ENCODING_TYPE" = "f" ] | |
293 | + then | |
294 | + bash -c "exec 2>&1;\ | |
295 | + cdda2wav -H -D/dev/cdrom -H -t$i - | \ | |
296 | + flac -c \ | |
297 | + -T artist=\"${tartist}\" -T album=\"${cddb[`idxof "album"`]}\" \ | |
298 | + -T genre=\"${cddb[`idxof "genre"`]}\" -T title=\"${track}\" \ | |
299 | + -T tnum=\"`expr ${tracknr} \+ 0`\" -T date=\"${cddb[`idxof "year"`]}\" \ | |
300 | + -T comment=\"${cddb[`idxof "comment"`]}\" \ | |
301 | + -o \"${outfile}.flac\" - 2>/dev/null" | rton | \ | |
302 | + awk '/ [0-9 ][0-9]%/ && percent!=$5{percent=$5;printf("\r'"$outstr"': %s", percent)}END{print "\r'"$outstr"': 100%"}' | |
303 | + fi | |
304 | + if [ "$ENCODING_TYPE" = "m" -a "$ENCODER" = "lame" ] | |
305 | + then | |
306 | + bash -c "exec 2>&1;\ | |
307 | + cdda2wav -H -D/dev/cdrom -t$i - | \ | |
308 | + lame -h \ | |
309 | + --ta \"${tartist}\" --tl \"${cddb[`idxof "album"`]}\" \ | |
310 | + --tg \"${cddb[`idxof "genre"`]}\" --tt \"${track}\" \ | |
311 | + --tn \"`expr ${tracknr} \+ 0`\" --ty \"${cddb[`idxof "year"`]}\" \ | |
312 | + --tc \"${cddb[`idxof "comment"`]}\" \ | |
313 | + - \"${outfile}.mp3\" 2>/dev/null" | rton | \ | |
314 | + awk '/ [0-9 ][0-9]%/ && percent!=$5{percent=$5;printf("\r'"$outstr"': %s", percent)}END{print "\r'"$outstr"': 100%"}' | |
315 | + fi | |
316 | + if [ "$ENCODING_TYPE" = "m" -a "$ENCODER" = "bladeenc" ] | |
317 | + then | |
318 | + bash -c "exec 2>&1;\ | |
319 | + cdda2wav -H -D/dev/cdrom -t$i - | \ | |
320 | + bladeenc -progress=0 STDIN \"${outfile}.mp3\" 2>/dev/null" | rton | \ | |
321 | + awk '/ [0-9 ][0-9]%/ && percent!=$5{percent=$5;printf("\r'"$outstr"': %s", percent)}END{print "\r'"$outstr"': 100%"}' | |
322 | + fi | |
323 | + if [ "$ENCODING_TYPE" = "o" ] | |
324 | + then | |
325 | + bash -c "exec 2>&1;\ | |
326 | + cdda2wav -H -D/dev/cdrom -t$i - | \ | |
327 | + oggenc -a \"${tartist}\" -l \"${cddb[`idxof "album"`]}\" \ | |
328 | + -G \"${cddb[`idxof "genre"`]}\" -t \"${track}\" \ | |
329 | + -N \"`expr ${tracknr} \+ 0`\" -d \"${cddb[`idxof "year"`]}\" \ | |
330 | + -c \"${cddb[`idxof "comment"`]}\" \ | |
331 | + -o \"${outfile}.ogg\" - 2>/dev/null" | rton | \ | |
332 | + awk '/ [0-9 ][0-9]%/ && percent!=$5{percent=$5;printf("\r'"$outstr"': %s", percent)}END{print "\r'"$outstr"': 100%"}' | |
333 | + fi | |
334 | + if [ "$ENCODING_TYPE" = "w" ] | |
335 | + then | |
336 | + bash -c "exec 2>&1;\ | |
337 | + cdda2wav -H -D/dev/cdrom -t$i - > \"${outfile}.wav\"" | rton | \ | |
338 | + awk '/ [0-9 ][0-9]%/ && percent!=$5{percent=$5;printf("\r'"$outstr"': %s", percent)}END{print "\r'"$outstr"': 100%"}' | |
339 | + fi | |
340 | + | |
341 | + i=`expr $i + 1` | |
342 | +done | |
343 | + | |
344 | +echo "</cdinfo>" >> "${xmlfile}" | ... | ... |
getcd.sh.neu
0 → 100755
1 | +USAGE="usage: $0 [-d delimiter [-o {t|a}]] [-t {m|f|o}] [-p path] [-e encoder] [-c cddb-entry] [-h]\n" | |
2 | +USAGE="${USAGE} -d :\tA single character delimiting trackname from\n" | |
3 | +USAGE="${USAGE}\tartistname with sampler cds\n\n" | |
4 | +USAGE="${USAGE} -o :\tspecifies if theres the track or the artist first\n" | |
5 | +USAGE="${USAGE}\tMust be:\n" | |
6 | +USAGE="${USAGE}\t t for titel first or\n" | |
7 | +USAGE="${USAGE}\t a for artist first\n" | |
8 | +USAGE="${USAGE}\tIf there is none specified t is assumed\n" | |
9 | +USAGE="${USAGE} -t :\tyou can specify either m for encoding to mp3\n" | |
10 | +USAGE="${USAGE}\tusing lame, or f for making lossless encoding using flac,\n" | |
11 | +USAGE="${USAGE}\tor o for making ogg/vorbis, or w for uncompressed wav.\n" | |
12 | +USAGE="${USAGE}\tOmitting this results in encoding to flac.\n" | |
13 | +USAGE="${USAGE}\tmp3s will be placed under a subfolder mp3 and flacs\n" | |
14 | +USAGE="${USAGE}\tunder a subfolder flac\n" | |
15 | +USAGE="${USAGE} -p :\tspecifies the path to save the encoded data.\n" | |
16 | +USAGE="${USAGE}\tDefaults to the users home directory.\n" | |
17 | +USAGE="${USAGE} -e :\tspecifies the mp3 encoder to use.\n" | |
18 | +USAGE="${USAGE}\tvalid encoders are actually: lame,bladeenc\n" | |
19 | +USAGE="${USAGE}\tDefaults to lame.\n" | |
20 | +USAGE="${USAGE} -c :\tspecifies the CDDB-Entry to use.\n" | |
21 | +USAGE="${USAGE}\tsometimes there is more than 1 entry for a cd in cddb.\n" | |
22 | +USAGE="${USAGE}\tThen you can specify wich one to use by this option.\n" | |
23 | +USAGE="${USAGE}\tYou can checkout all entries using cddb.pl.\n" | |
24 | +USAGE="${USAGE} -h :\tShows this help." | |
25 | + | |
26 | +PATH="$PATH:." | |
27 | + | |
28 | +HAS_DELIMITER=0 | |
29 | +TA_ORDER="t" | |
30 | +ENCODING_DIR=$HOME | |
31 | +ENCODING_TYPE="f" | |
32 | +ENCODER="lame" | |
33 | +CDDB_ENTRY=1 | |
34 | + | |
35 | +while getopts d:o:t:p:he:c: option | |
36 | +do | |
37 | + case $option in | |
38 | + d) if [ ${#OPTARG} -gt 1 ] | |
39 | + then | |
40 | + echo -e "$USAGE" | |
41 | + exit 1 | |
42 | + fi | |
43 | + HAS_DELIMITER=1 | |
44 | + TA_DELIMITER=$OPTARG | |
45 | + ;; | |
46 | + o) if [ \( "${OPTARG}" != "t" -a "${OPTARG}" != "a" \) -o \ | |
47 | + ${HAS_DELIMITER} -eq 0 ] | |
48 | + then | |
49 | + echo -e "$USAGE" | |
50 | + exit 1 | |
51 | + fi | |
52 | + TA_ORDER=$OPTARG | |
53 | + ;; | |
54 | + t) if [ ${OPTARG} != "m" -a ${OPTARG} != "f" -a ${OPTARG} != "o" -a \ | |
55 | + ${OPTARG} != "w" ] | |
56 | + then | |
57 | + echo -e "$USAGE" | |
58 | + exit 1 | |
59 | + fi | |
60 | + ENCODING_TYPE=$OPTARG | |
61 | + ;; | |
62 | + p) if [ ! \( -d ${OPTARG} \) ] | |
63 | + then | |
64 | + echo -e "$USAGE" | |
65 | + exit 1 | |
66 | + fi | |
67 | + ENCODING_DIR=$OPTARG | |
68 | + ;; | |
69 | + e) if [ -z ${OPTARG} ] | |
70 | + then | |
71 | + echo -e "$USAGE" | |
72 | + exit 1 | |
73 | + fi | |
74 | + ENCODER=$OPTARG | |
75 | + ;; | |
76 | + c) if [ ${OPTARG} -lt 1 ] | |
77 | + then | |
78 | + echo -e "$USAGE" | |
79 | + exit 1 | |
80 | + fi | |
81 | + CDDB_ENTRY=$OPTARG | |
82 | + ;; | |
83 | + [h\?]) echo -e "$USAGE" | |
84 | + exit 1 | |
85 | + ;; | |
86 | + esac | |
87 | +done | |
88 | + | |
89 | +test "$ENCODING_TYPE" = "m" && ENCODING_DIR="$ENCODING_DIR/mp3" | |
90 | +test "$ENCODING_TYPE" = "f" && ENCODING_DIR="$ENCODING_DIR/flac" | |
91 | +test "$ENCODING_TYPE" = "o" && ENCODING_DIR="$ENCODING_DIR/ogg" | |
92 | +test "$ENCODING_TYPE" = "w" && ENCODING_DIR="$ENCODING_DIR/wav" | |
93 | + | |
94 | +indices[0]="album" | |
95 | +indices[1]="artist" | |
96 | +indices[2]="genre" | |
97 | +indices[3]="year" | |
98 | +indices[4]="comment" | |
99 | + | |
100 | +i=1 | |
101 | +max_track=30 | |
102 | + | |
103 | +while [ $i -le $max_track ]; do | |
104 | + indices[`expr \( $i \- 1 \) \* 2 \+ 5`]="`echo $i | \ | |
105 | + sed 's/^\([0-9]\)$/0\1/g;\ | |
106 | + s/\(.*\)/track-\1/g'`" | |
107 | + indices[`expr \( $i \- 1 \) \* 2 \+ 6`]="`echo $i | \ | |
108 | + sed 's/^\([0-9]\)$/0\1/g;\ | |
109 | + s/\(.*\)/tartist-\1/g'`" | |
110 | + i=`expr $i \+ 1` | |
111 | +done | |
112 | + | |
113 | +comment="" | |
114 | + | |
115 | +function idxof() { | |
116 | + str=$1 | |
117 | + idx=0 | |
118 | + | |
119 | + for i in "${indices[@]}"; do | |
120 | + test "$i" == "$str" && echo $idx && return 0 | |
121 | + idx=`expr $idx \+ 1` | |
122 | + done | |
123 | + | |
124 | + echo -1 | |
125 | + return 0 | |
126 | +} | |
127 | + | |
128 | +title_pat="/^[^:]*: *(.*[^ ]).*/" | |
129 | +artist_pat="//" | |
130 | + | |
131 | +if [ $HAS_DELIMITER -ne 0 ] | |
132 | +then | |
133 | + if [ $TA_ORDER == "t" ] | |
134 | + then | |
135 | + title_pat="/^[^:]*: *([^\\${TA_DELIMITER}]*[^ \\${TA_DELIMITER}]).*/" | |
136 | + artist_pat="/^[^:]*: *[^\\${TA_DELIMITER}]*\\${TA_DELIMITER} *(.*[^ ]).*/" | |
137 | + else | |
138 | + artist_pat="/^[^:]*: *([^\\${TA_DELIMITER}]*[^ \\${TA_DELIMITER}]).*/" | |
139 | + title_pat="/^[^:]*: *[^\\${TA_DELIMITER}]*\\${TA_DELIMITER} *(.*[^ ]).*/" | |
140 | + fi | |
141 | +fi | |
142 | + | |
143 | +echo "Preparing...." | |
144 | + | |
145 | +echo -n "getting cddb info..." | |
146 | +eval "`cddb.pl -c /dev/cdrom1 -e $CDDB_ENTRY | sed 's/ \([0-9]\):/ 0\1:/g;s/track /track-/g' |\ | |
147 | + awk -v has_delimiter=$HAS_DELIMITER \ | |
148 | + '/artist/||/title/||/genre/||/year/ { \ | |
149 | + cddb[gensub(/^([^:]*):.*/, \"\\\\1\", \"1\")]=\ | |
150 | + gensub(/^[^:]*: *(.*[^ ]).*/, \"\\\\1\", \"g\")\ | |
151 | + } \ | |
152 | + /trackno/ {\ | |
153 | + trackno=int(gensub(/^trackno: *([0-9]*).*/, \"\\\\1\", \"1\"))\ | |
154 | + }\ | |
155 | + /track-/ {\ | |
156 | + cddb[gensub(/^([^:]*):.*/, \"\\\\1\", \"1\")]=\ | |
157 | + gensub('\"$title_pat\"', \"\\\\1\", \"1\");\ | |
158 | + if(has_delimiter==0) \ | |
159 | + cddb[gensub(/^track([^:]*):.*/, \"tarti\\\\1\", \"1\")]=\ | |
160 | + cddb[\"artist\"]; \ | |
161 | + else \ | |
162 | + cddb[gensub(/^track([^:]*):.*/, \"tarti\\\\1\", \"1\")]=\ | |
163 | + gensub('\"$artist_pat\"', \"\\\\1\", \"1\");\ | |
164 | + } \ | |
165 | + END {\ | |
166 | + cddb_str=\"cddb=(\\\"\" cddb[\"title\"] \"\\\" \\\"\" \ | |
167 | + cddb[\"artist\"] \"\\\" \\\"\" \ | |
168 | + cddb[\"genre\"] \"\\\" \\\"\" \ | |
169 | + cddb[\"year\"] \"\\\" \\\"'$comment'\\\"\"; \ | |
170 | + for(i=1; i<=trackno; i++) {\ | |
171 | + cddb_str=cddb_str \" \\\"\" \ | |
172 | + cddb[\"track-\" sprintf(\"%02s\", i)] \"\\\"\";\ | |
173 | + cddb_str=cddb_str \" \\\"\" \ | |
174 | + cddb[\"tarti-\" sprintf(\"%02s\", i)] \"\\\"\"\ | |
175 | + }\ | |
176 | + print cddb_str \")\"\ | |
177 | + }'`" | |
178 | +echo "done" | |
179 | + | |
180 | +echo -n "getting CD info..." | |
181 | +cddainfo=`cdda2wav -H -D/dev/cdrom1 -J -v summary,toc,sectors 2>&1` | |
182 | +echo "done" | |
183 | + | |
184 | +track_num=`echo "$cddainfo" | \ | |
185 | + sed '/tracks/{s/^.*tracks:\([0-9]*\).*$/\1/g;p};d'` | |
186 | +cd_time=`echo "$cddainfo" | \ | |
187 | + sed '/tracks/{s/^.*time \([0-9:\.]*\).*$/\1/g;p};d'` | |
188 | +cddbid=`echo "$cddainfo" | \ | |
189 | + sed '/CDDB/{s/^.*discid: *\(0x[a-z0-9]*[^ ]\).*/\1/g;p};d'` | |
190 | +cdindex=`echo "$cddainfo" | \ | |
191 | + sed '/CDINDEX/{s/^.*discid: *\([a-zA-Z0-9_\.]*-\).*/\1/g;p};d'` | |
192 | +cdtext=`echo "$cddainfo" | sed '/CD-Text/{s/^[^:]*: *\(.*[^ ]\).*/\1/g | |
193 | + s/&/\&\;/g;s/\"/\"\;/g | |
194 | + s/</\<\;/g;s/>/\>\;/g | |
195 | + s/\o47/\&apos\;/g | |
196 | + p};d'` | |
197 | +cdextra=`echo "$cddainfo" | sed '/CD-Extra/{s/^[^:]*: *\(.*[^ ]\).*/\1/g | |
198 | + s/&/\&\;/g;s/\"/\"\;/g | |
199 | + s/</\<\;/g;s/>/\>\;/g | |
200 | + s/\o47/\&apos\;/g | |
201 | + p};d'` | |
202 | + | |
203 | +# cddb[`idxof "artist"`]="Blue Öyster Cult" | |
204 | +ENCODING_DIR="${ENCODING_DIR}/${cddb[`idxof "artist"`]}/" | |
205 | +ENCODING_DIR="${ENCODING_DIR}${cddb[`idxof "album"`]}/" | |
206 | +mkdirhier "$ENCODING_DIR" | |
207 | +echo "Output directory is: $ENCODING_DIR" | |
208 | + | |
209 | +xmlfile="${ENCODING_DIR}cdinfo.xml" | |
210 | + | |
211 | +# some special chars within xml must be converted to special syntax | |
212 | +# & => & | |
213 | +# " => " | |
214 | +# ' => ' | |
215 | +# < => < | |
216 | +# > => > | |
217 | +xmlartist=`echo ${cddb[\`idxof "artist"\`]} | \ | |
218 | + sed 's/&/\&\;/g | |
219 | + s/</\<\;/g | |
220 | + s/>/\>\;/g | |
221 | + s/\"/\"\;/g | |
222 | + s/\o47/\&apos\;/g'` | |
223 | +xmlalbum=`echo ${cddb[\`idxof "album"\`]} | \ | |
224 | + sed 's/&/\&\;/g | |
225 | + s/</\<\;/g | |
226 | + s/>/\>\;/g | |
227 | + s/\"/\"\;/g | |
228 | + s/\o47/\&apos\;/g'` | |
229 | + | |
230 | +echo "<?xml version=\"1.0\" encoding=\"ISO-8859-15\"?>" > "${xmlfile}" | |
231 | +echo "<!DOCTYPE cdInfo SYSTEM \"cdInfo.dtd\">" >> "${xmlfile}" | |
232 | +echo "<cdinfo>" >> "${xmlfile}" | |
233 | +echo " <cdindex>$cdindex</cdindex>" >> "${xmlfile}" | |
234 | +echo " <cddb>$cddbid</cddb>" >> "${xmlfile}" | |
235 | +echo " <cd-text>$cdtext</cd-text>" >> "${xmlfile}" | |
236 | +echo " <cd-extra>$cdextra</cd-extra>" >> "${xmlfile}" | |
237 | +echo " <cd-artist>${xmlartist}</cd-artist>" >> "${xmlfile}" | |
238 | +echo " <cd-title>${xmlalbum}</cd-title>" >> "${xmlfile}" | |
239 | +echo " <cd-year>${cddb[`idxof "year"`]}</cd-year>" >> "${xmlfile}" | |
240 | +echo " <cd-genre>${cddb[`idxof "genre"`]}</cd-genre>" >> "${xmlfile}" | |
241 | +echo " <cd-time>$cd_time</cd-time>" >> "${xmlfile}" | |
242 | +echo " <cd-tracks>$track_num</cd-tracks>" >> "${xmlfile}" | |
243 | +echo " <cd-comment></cd-comment>" >> "${xmlfile}" | |
244 | + | |
245 | +i=1; while [ $i -le $track_num ] | |
246 | +do | |
247 | + j=`expr $i \+ 1` | |
248 | + tracknr=`awk 'BEGIN{printf("%02d\n",'$i')}'` | |
249 | + track=${cddb[`idxof "track-$tracknr"`]} | |
250 | + tartist=${cddb[`idxof "tartist-$tracknr"`]} | |
251 | + | |
252 | + xmltrack=`echo ${track} | sed 's/&/\&\;/g | |
253 | + s/</\<\;/g | |
254 | + s/>/\>\;/g | |
255 | + s/\"/\"\;/g | |
256 | + s/\o47/\&apos\;/g'` | |
257 | + xmltartist=`echo ${tartist} | sed 's/&/\&\;/g | |
258 | + s/</\<\;/g | |
259 | + s/>/\>\;/g | |
260 | + s/\"/\"\;/g | |
261 | + s/\o47/\&apos\;/g'` | |
262 | + | |
263 | + tracklen=`echo "$cddainfo" | \ | |
264 | + sed '/ '"$i"'\.([0-9 ]*:/{s/.*'"$i"'\.( *\([0-9:\.]*\)).*/\1/g;p};d'` | |
265 | + trackstart=`echo "$cddainfo" | \ | |
266 | + sed '/ '"$i"'\.([0-9 ]*)/{s/.*'"$i"'\.( *\([0-9]*\)).*/\1/g;p};d'` | |
267 | + test $i -eq $track_num && \ | |
268 | + trackend=`echo "$cddainfo" | \ | |
269 | + sed '/ lead-out([0-9 ]*)/{s/.*lead-out( *\([0-9]*\)).*/\1/g;p};d'` || \ | |
270 | + trackend=`echo "$cddainfo" | \ | |
271 | + sed '/ '"$j"'\.([0-9 ]*)/{s/.*'"$j"'\.( *\([0-9]*\)).*/\1/g;p};d'` | |
272 | + | |
273 | + test -z "$trackstart" -o -z "$trackend" && echo "Disk Error" && exit 1 | |
274 | + | |
275 | + echo " <track>" >> "${xmlfile}" | |
276 | + echo " <track-number>$i</track-number>" >> "${xmlfile}" | |
277 | + echo " <track-time>$tracklen</track-time>" >> "${xmlfile}" | |
278 | + echo " <track-start-sector>$trackstart</track-start-sector>" >> "${xmlfile}" | |
279 | + echo " <track-length>`expr $trackend \- $trackstart`</track-length>" >> "${xmlfile}" | |
280 | + echo " <track-artist>$xmltartist</track-artist>" >> "${xmlfile}" | |
281 | + echo " <track-title>$xmltrack</track-title>" >> "${xmlfile}" | |
282 | + echo " <track-comment></track-comment>" >> "${xmlfile}" | |
283 | + echo " </track>" >> "${xmlfile}" | |
284 | + | |
285 | + # outfile="${ENCODING_DIR}The Wall/Disk2/" | |
286 | + outfile="${ENCODING_DIR}${tracknr}-${track}" | |
287 | + | |
288 | + test "$ENCODING_TYPE" = "f" && \ | |
289 | + outstr="track-$tracknr => ${tracknr}-${track}.flac" | |
290 | + test "$ENCODING_TYPE" = "m" && \ | |
291 | + outstr="track-$tracknr => ${tracknr}-${track}.mp3" | |
292 | + test "$ENCODING_TYPE" = "o" && \ | |
293 | + outstr="track-$tracknr => ${tracknr}-${track}.ogg" | |
294 | + test "$ENCODING_TYPE" = "w" && \ | |
295 | + outstr="track-$tracknr => ${tracknr}-${track}.wav" | |
296 | + | |
297 | + if [ "$ENCODING_TYPE" = "f" ] | |
298 | + then | |
299 | + bash -c "exec 2>&1;\ | |
300 | + cdda2wav -H -D0,4,0 -t$i - | \ | |
301 | + flac -c \ | |
302 | + -T artist=\"${tartist}\" -T album=\"${cddb[`idxof "album"`]}\" \ | |
303 | + -T genre=\"${cddb[`idxof "genre"`]}\" -T title=\"${track}\" \ | |
304 | + -T tracknumber=\"`expr ${tracknr} \+ 0`\" \ | |
305 | + -T tracknum=\"`expr ${tracknr} \+ 0`\" -T date=\"${cddb[`idxof "year"`]}\" \ | |
306 | + -T comment=\"${cddb[`idxof "comment"`]}\" \ | |
307 | + -o \"${outfile}.flac\" - 2>/dev/null" | rton | \ | |
308 | + awk '/ [0-9 ][0-9]%/ && percent!=$5{percent=$5;printf("\r'"$outstr"': %s", percent)}END{print "\r'"$outstr"': 100%"}' | |
309 | + fi | |
310 | + if [ "$ENCODING_TYPE" = "m" -a "$ENCODER" = "lame" ] | |
311 | + then | |
312 | + bash -c "exec 2>&1;\ | |
313 | + cdda2wav -H -D0,4,0 -t$i - | \ | |
314 | + lame -h \ | |
315 | + --ta \"${tartist}\" --tl \"${cddb[`idxof "album"`]}\" \ | |
316 | + --tg \"${cddb[`idxof "genre"`]}\" --tt \"${track}\" \ | |
317 | + --tn \"`expr ${tracknr} \+ 0`\" --ty \"${cddb[`idxof "year"`]}\" \ | |
318 | + --tc \"${cddb[`idxof "comment"`]}\" \ | |
319 | + - \"${outfile}.mp3\" 2>/dev/null" | rton | \ | |
320 | + awk '/ [0-9 ][0-9]%/ && percent!=$5{percent=$5;printf("\r'"$outstr"': %s", percent)}END{print "\r'"$outstr"': 100%"}' | |
321 | + fi | |
322 | + if [ "$ENCODING_TYPE" = "m" -a "$ENCODER" = "bladeenc" ] | |
323 | + then | |
324 | + bash -c "exec 2>&1;\ | |
325 | + cdda2wav -H -D0,4,0 -t$i - | \ | |
326 | + bladeenc -progress=0 STDIN \"${outfile}.mp3\" 2>/dev/null" | rton | \ | |
327 | + awk '/ [0-9 ][0-9]%/ && percent!=$5{percent=$5;printf("\r'"$outstr"': %s", percent)}END{print "\r'"$outstr"': 100%"}' | |
328 | + fi | |
329 | + if [ "$ENCODING_TYPE" = "o" ] | |
330 | + then | |
331 | + bash -c "exec 2>&1;\ | |
332 | + cdda2wav -H -D0,4,0 -t$i - | \ | |
333 | + oggenc -a \"${tartist}\" -l \"${cddb[`idxof "album"`]}\" \ | |
334 | + -G \"${cddb[`idxof "genre"`]}\" -t \"${track}\" \ | |
335 | + -N \"`expr ${tracknr} \+ 0`\" -d \"${cddb[`idxof "year"`]}\" \ | |
336 | + -c \"${cddb[`idxof "comment"`]}\" \ | |
337 | + -o \"${outfile}.ogg\" - 2>/dev/null" | rton | \ | |
338 | + awk '/ [0-9 ][0-9]%/ && percent!=$5{percent=$5;printf("\r'"$outstr"': %s", percent)}END{print "\r'"$outstr"': 100%"}' | |
339 | + fi | |
340 | + if [ "$ENCODING_TYPE" = "w" ] | |
341 | + then | |
342 | + bash -c "exec 2>&1;\ | |
343 | + cdda2wav -H -D0,4,0 -t$i - > \"${outfile}.wav\"" | rton | \ | |
344 | + awk '/ [0-9 ][0-9]%/ && percent!=$5{percent=$5;printf("\r'"$outstr"': %s", percent)}END{print "\r'"$outstr"': 100%"}' | |
345 | + fi | |
346 | + | |
347 | + i=`expr $i + 1` | |
348 | +done | |
349 | + | |
350 | +echo "</cdinfo>" >> "${xmlfile}" | ... | ... |
getcd.xml
0 → 100755
1 | +<?xml version="1.0" encoding="ISO-8859-15"?> | |
2 | +<!DOCTYPE cdInfo SYSTEM "cdInfo.dtd"> | |
3 | +<cdinfo> | |
4 | +<cdindex>2pGK39LLL22K6K8mFDegkBNR39M-</cdindex> | |
5 | +<cddb>0x0911a912</cddb> | |
6 | +<cd-text/> | |
7 | +<cd-extra/> | |
8 | +<cd-artist>Various</cd-artist> | |
9 | +<cd-year>1998</cd-year> | |
10 | +<cd-genre>Alternative</cd-genre> | |
11 | +<track> | |
12 | +<track-number>1</track-number> | |
13 | +<track-time>3:42.20</track-time> | |
14 | +<track-start-sector>32</track-start-sector> | |
15 | +<track-artist>Guano Apes</track-artist> | |
16 | +<track-title>Lords Of The Boards</track-title> | |
17 | +<track-comment/> | |
18 | +</track> | |
19 | +<track> | |
20 | +<track-number>2</track-number> | |
21 | +<track-time>4:45.70</track-time> | |
22 | +<track-start-sector>16702</track-start-sector> | |
23 | +<track-artist>Rammstein</track-artist> | |
24 | +<track-title>Das Modell</track-title> | |
25 | +<track-comment/> | |
26 | +</track> | |
27 | +<track> | |
28 | +<track-number>3</track-number> | |
29 | +<track-time>4:11.08</track-time> | |
30 | +<track-start-sector>38147</track-start-sector> | |
31 | +<track-artist>Faith No More</track-artist> | |
32 | +<track-title>Last Cup Of Sorrow</track-title> | |
33 | +<track-comment/> | |
34 | +</track> | |
35 | +</cdinfo> | ... | ... |
install
0 → 100755
1 | +Files in this package | |
2 | +--------------------- | |
3 | + getcd.sh (The main script that does most of the work) | |
4 | + rton.c (A VERY small c-prog, that converts \r (carriage return) | |
5 | + to \n (line feed). It is needed to fetch the percent | |
6 | + complete messages from cdda2wav) | |
7 | + flac2mp3.xsl (xml stylesheet to convert cdinfo.xml in shell commands | |
8 | + that will create .flac from .mp3 files) | |
9 | + flac2wav.xsl (xml stylesheet to convert cdinfo.xml in shell commands | |
10 | + that will create .flac from .wav files) | |
11 | + mp32wav.xsl (xml stylesheet to convert cdinfo.xml in shell commands | |
12 | + that will create .wav from .mp3 files) | |
13 | + cdinfo2xinf.xsl (xml stylesheet to convert cdinfo.xml in shell commands | |
14 | + that create the .xinf Files used by xcdroast) | |
15 | + CDDB_get-2.23p1.patch (a patch for cddb.pl that makes it possible to | |
16 | + select one of multiple cddb-entrys at calltime) | |
17 | + README (Overview and Information) | |
18 | + INSTALL (This file, howto make something useful from it) | |
19 | + USAGE (How to use the script) | |
20 | + | |
21 | + | |
22 | +Requirments | |
23 | +----------- | |
24 | +first you need some software to run this script. | |
25 | + CDDB_get-2.23 (http://armin.emx.at/cddb/) | |
26 | + lame (http://lame.sourceforge.net/) | |
27 | + bladeenc (http://bladeenc.mp3.no/) | |
28 | + flac (http://flac.sourceforge.net/) | |
29 | + vorbis-tools (http://www.vorbis.com/download_unix_1.0.1.psp) | |
30 | + libxml2 (http://xmlsoft.org/) | |
31 | + | |
32 | +I assume you have a working sed and awk, else you need to install them too. | |
33 | + | |
34 | +Install lame, bladeenc, flac, vorbis-tools and libxml2 as discribed within | |
35 | +these packages. | |
36 | + | |
37 | +unpack CDDB_get-2.23.tar.gz and patch it with CDDB_get-2.23p1.patch. | |
38 | +For this copy both files in a directory dir then do the following: | |
39 | + | |
40 | +me@house:~> cd dir | |
41 | +me@house:~/dir> tar xfvz CDDB_get-2.23.tar.gz | |
42 | +me@house:~/dir/CDDB_get-2.23> patch -p1 -E < ../CDDB_get-2.23p1.patch | |
43 | + | |
44 | +now install it as usual (and described within the README from CDDB_get) | |
45 | + | |
46 | +now go in the directory where rton.c exists. | |
47 | +type here: gcc -o rton rton.c | |
48 | +and then copy rton in a directory in your path. | |
49 | + | |
50 | +Finally copy getcd.sh somewhere in you path. | |
51 | + | |
52 | +now you can use getcd.sh. For a short description how to use it either | |
53 | +read USAGE or type getcd.sh -h. | |
54 | + | |
55 | +IMPORTANT: Any user who should use this script needs read-access to the | |
56 | +cdrom device, additional it is actually necessary to create a symlink | |
57 | +/dev/cdrom to your real device eg. /dev/sr0 or /dev/hdb. And the user must have | |
58 | +access to the internet. | |
59 | + | |
60 | +Note | |
61 | +---- | |
62 | +Please note that this is not a release. You can use it and it will not harm | |
63 | +anything as for as I can say, but it might not work with some configurations | |
64 | +or CDs. | |
65 | +In the release there will be some kind of detection which tools are present and | |
66 | +witch not and the script will use only present tools or give an error | |
67 | +description. | |
68 | +Note further that it is desired to modify the script for your needs. It is not | |
69 | +very complex and with some error and trial it will be possible to tailor it | |
70 | +exactly for your needs. In future there will be configuration files to make it | |
71 | +even more ease to configure the script for your situation. (I am thinking | |
72 | +about reqriting the script in c) | ... | ... |
mp32wav.xsl
0 → 100755
1 | +<?xml version="1.0" encoding="ISO-8859-15"?> | |
2 | +<xsl:stylesheet version="1.0" | |
3 | + xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | |
4 | + | |
5 | + <xsl:output method="text" indent="no" encoding="ISO-8859-15" /> | |
6 | + | |
7 | + <xsl:template match="/"> | |
8 | +outdir="../../../wav/<xsl:value-of select="/cdinfo/cd-artist"/>" | |
9 | +outdir="$outdir/<xsl:value-of select="/cdinfo/cd-title"/>" | |
10 | +mkdirhier "$outdir" | |
11 | + <xsl:apply-templates select="/cdinfo/track"/> | |
12 | + </xsl:template> | |
13 | + | |
14 | + <xsl:template match="track"> | |
15 | +tracknum=`echo <xsl:value-of select="track-number"/> | \ | |
16 | + awk '{printf("%02d", $0)}'` | |
17 | +title="<xsl:value-of select="track-title"/>" | |
18 | +lame --decode "$tracknum-$title.flac" \ | |
19 | + "$outdir/$tracknum-$title.wav" | |
20 | + </xsl:template> | |
21 | +</xsl:stylesheet> | ... | ... |
readme
0 → 100755
1 | +This is another shell script that combines cdda2wav with various encoders. | |
2 | + | |
3 | +As I started this i was not pleased by any of the existent grabber/encoder | |
4 | +frontends. So I decided to create my own one. The goal was to rip and encode in | |
5 | +one step without creating any temporary .wav file and to have a simple command | |
6 | +with only a few easy arguments to control this command. | |
7 | + | |
8 | +Now getcd.sh is a not to complicated bash script that uses awk, sed, cdda2wav, | |
9 | +flac, lame, bladeenc, ogg/vorbis, cddb.pl (in a slightly patched version). | |
10 | +It encodes tracks from the cd to a spcifiable base directory without creating | |
11 | +any temporary files. | |
12 | +It creates subdirectorys basedir/[mp3|flac|ogg|wav]/artist/cd-title for the | |
13 | +corresponding encoding-method and save files with the name | |
14 | +trackno-tracktitle.[mp3|flac|ogg|wav] again corresponding to the used | |
15 | +encoding-method. | |
16 | +If one encodes a sampler-cd (cd with various artists) it is often so, that | |
17 | +the artist of the track is mentioned in the cddb-track-title. For this reason | |
18 | +one can specify a delimiting character and the order (artist or title first) to | |
19 | +split the cddb-track-info and generate correct id3tags or similar. | |
20 | + | |
21 | +Additional to the encoded files getcd.sh creates an file cdinfo.xml which | |
22 | +contains all essential information of the original CD. I have written also | |
23 | +some xslt files that can be used to create .xinf files for xcdroast and to | |
24 | +create .wav from .flac or .mp3. It is planned to create additional xslt files | |
25 | +to make html-information about the CD, create insert scripts for postgres and | |
26 | +or mysql (or other rdbs) and converter-scripts that use these xslt-files. | |
27 | +To use the xslt-files one needs an xslt-processor, like xsltproc from | |
28 | +libxml2 (thats the one i used) | |
29 | + | |
30 | +for help use getcd.sh -h | ... | ... |
rton
0 → 100755
No preview for this file type
rton.c
0 → 100755
1 | +/* Achtung unter dos ist \n in wirklichkeit \r\n bei den meisten | |
2 | + Compilern, da funktioniert das natürlich nicht!!!! */ | |
3 | +#include <stdio.h> | |
4 | + | |
5 | +int main(int argc, char* argv[]) { | |
6 | + int c=0; | |
7 | + | |
8 | + while(fread(&c, 1, 1, stdin)) { | |
9 | + putchar((c=='\r')?'\n':c); | |
10 | + fflush(stdout); | |
11 | + } | |
12 | + | |
13 | + return 0; | |
14 | +} | |
15 | + | ... | ... |
usage
0 → 100755
1 | +usage: ./getcd.sh [-d delimiter [-o {t|a}]] [-t {m|f|o}] [-p path] [-e encoder] [-c cddb-entry] [-h] | |
2 | + -d : A single character delimiting trackname from | |
3 | + artistname with sampler cds | |
4 | + | |
5 | + -o : specifies if theres the track or the artist first | |
6 | + Must be: | |
7 | + t for titel first or | |
8 | + a for artist first | |
9 | + If there is none specified t is assumed | |
10 | + -t : you can specify either m for encoding to mp3 | |
11 | + using lame, or f for making lossless encoding using flac, | |
12 | + or o for making ogg/vorbis, or w for uncompressed wav. | |
13 | + Omitting this results in encoding to flac. | |
14 | + mp3s will be placed under a subfolder mp3 and flacs | |
15 | + under a subfolder flac | |
16 | + -p : specifies the path to save the encoded data. | |
17 | + Defaults to the users home directory. | |
18 | + -e : specifies the mp3 encoder to use. | |
19 | + valid encoders are actually: lame,bladeenc | |
20 | + Defaults to lame. | |
21 | + -c : specifies the CDDB-Entry to use. | |
22 | + sometimes there is more than 1 entry for a cd in cddb. | |
23 | + Then you can specify wich one to use by this option. | |
24 | + You can checkout all entries using cddb.pl. | |
25 | + -h : Shows this help. | ... | ... |
Please
register
or
login
to post a comment