Showing
18 changed files
with
754 additions
and
1448 deletions
CDDB_get-2.23.tar.gz
deleted
100644 → 0
No preview for this file type
CDDB_get-2.23p1.patch
deleted
100644 → 0
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
deleted
100644 → 0
No preview for this file type
CDDB_get-2.27p1.patch
deleted
100644 → 0
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
deleted
100755 → 0
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 | -} |
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 | 1 | +#!/bin/bash |
2 | + | ||
3 | +# === some global setting & configurations for the script === | ||
4 | +umask 000 # create files with all right for anyone | ||
5 | +shopt -s nullglob # expand patterns which match no file to a null string | ||
6 | +shopt -s extdebug | ||
7 | + | ||
8 | +# -------------------------------------------------------------- | ||
9 | +# das Verzeichnis in dem dieses script liegt herausfinden | ||
10 | +scriptDir=${0%/*} | ||
11 | +scriptDir="${scriptDir/#\./${PWD}}" | ||
12 | +case "${scriptDir}" in /*);; *) scriptDir="${PWD}/${scriptDir}";; esac | ||
13 | +# -------------------------------------------------------------- | ||
14 | + | ||
15 | +# include helpers | ||
16 | +. ${scriptDir}/shellUtils.sh | ||
17 | + | ||
18 | +# -------------------------------------------------------------- | ||
19 | +# string definitions | ||
20 | +usage=$"usage: $0 [-t {m|f|o}] [-p path] [-e encoder] [-c cddb-entry] [-h|-?] | ||
21 | + [-I interface] [-D device] [-v[v]] | ||
22 | +\t-t: you can specify either m for encoding to mp3 | ||
23 | +\t using lame, or f for making lossless encoding using flac, | ||
24 | +\t or o for making ogg/vorbis, or w for uncompressed wav. | ||
25 | +\t Omitting this results in encoding to flac. | ||
26 | +\t mp3s will be placed under a subfolder mp3 and flacs | ||
27 | +\t under a subfolder flac | ||
28 | +\t-p: specifies the path to save the encoded data. | ||
29 | +\t Defaults to the users home directory. | ||
30 | +\t-e: specifies the mp3 encoder to use. | ||
31 | +\t valid encoders are actually: lame,bladeenc | ||
32 | +\t Defaults to lame. | ||
33 | +\t-c: specifies the CDDB-Entry to use. | ||
34 | +\t sometimes there is more than 1 entry for a cd in cddb. | ||
35 | +\t Then you can specify wich one to use by this option. | ||
36 | +\t You can checkout all entries using cddb.pl. | ||
37 | +\t-I: specifies cdda2wav interface to use. | ||
38 | +\t Valid interfaces are generic_scsi and cooked_ioctl. | ||
39 | +\t Please note that cooked_ioctl is not available on all systems. | ||
40 | +\t Defaults to generic_scsi | ||
41 | +\t-D: specifies device to use with cdda2wav. | ||
42 | +\t Defaults to /dev/cdrom | ||
43 | +\t-v: make the script more verbose. The verbosity level defaults | ||
44 | +\t to 1. When -v is given the level is 2 and -vv increases the | ||
45 | +\t level to 3, what means give debug output. | ||
46 | +\t-q: make the script silent. Equivalent to -v0 | ||
47 | +\t-h| | ||
48 | +\t-?: Shows this help." | ||
49 | + | ||
50 | +ready=$"done" | ||
51 | + | ||
52 | +# level 1 messages | ||
53 | +getCDInfoMsg=$"getting cd info..." | ||
54 | +outputDirMsg=$"output to: \$encodingDir" | ||
55 | +createXmlMsg=$"create xml file..." | ||
56 | +startRipMsg1=$"start ripping cd audio data..." | ||
57 | + | ||
58 | +# level 2 messages | ||
59 | +encodeMp3Msg=$"Encode to mp3" | ||
60 | +encodeFlacMsg=$"Encode to flac" | ||
61 | +encodeOggMsg=$"Encode to ogg" | ||
62 | +encodeWavMsg=$"Encode to wav" | ||
63 | +startRipMsg2=$"start ripping cd audio data:" | ||
64 | + | ||
65 | +cdInfoMsg=$"DISK: | ||
66 | +===== | ||
67 | +Tracks: \$dTracks | ||
68 | +Length: \$dLength | ||
69 | +Index: \$dIndex | ||
70 | +Artist: \$dArtist | ||
71 | +Title: \$dTitle | ||
72 | +Year: \$dYear | ||
73 | +Genre: \$dGenre | ||
74 | +CDDB: \$cddbId | ||
75 | +Text: \$dText | ||
76 | +Extra: \$dExtra | ||
77 | + | ||
78 | +TRACKS: | ||
79 | +=======" | ||
80 | +# -------------------------------------------------------------- | ||
81 | + | ||
82 | +taOrder="t" | ||
83 | +encodingDir=$HOME | ||
84 | +encodingType="f" | ||
85 | +encoder="lame" | ||
86 | +cddbEntry=1 | ||
87 | +cddaIf="generic_scsi" | ||
88 | +cddaDev="/dev/cdrom" | ||
89 | +verbose=1 | ||
90 | + | ||
91 | +# ---------------------------------------------------------------- | ||
92 | +# get commandline options | ||
93 | +while getopts qvt:p:he:c:I:D: option | ||
34 | do | 94 | 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 | - ;; | 95 | + case $option in |
96 | + t) | ||
97 | + if [ "${OPTARG}" != "m" -a "${OPTARG}" != "f" -a \ | ||
98 | + "${OPTARG}" != "o" -a "${OPTARG}" != "w" ] | ||
99 | + then | ||
100 | + echo -e "$usage" | ||
101 | + exit 1 | ||
102 | + fi | ||
103 | + encodingType=$OPTARG | ||
104 | + ;; | ||
105 | + p) | ||
106 | + if [ ! \( -d ${OPTARG} \) ] | ||
107 | + then | ||
108 | + echo -e "$usage" | ||
109 | + exit 1 | ||
110 | + fi | ||
111 | + encodingDir=$OPTARG | ||
112 | + ;; | ||
113 | + e) | ||
114 | + if [ -z ${OPTARG} ] | ||
115 | + then | ||
116 | + echo -e "$usage" | ||
117 | + exit 1 | ||
118 | + fi | ||
119 | + encoder=$OPTARG | ||
120 | + ;; | ||
121 | + c) | ||
122 | + if [ ${OPTARG} -lt 1 ] | ||
123 | + then | ||
124 | + echo -e "$usage" | ||
125 | + exit 1 | ||
126 | + fi | ||
127 | + cddbEntry=$OPTARG | ||
128 | + ;; | ||
129 | + v) | ||
130 | + if [ "${OPTARG}" -a "${OPTARG}" != "0" -a "${OPTARG}" != "v" ] | ||
131 | + then | ||
132 | + echo -e "$usage" | ||
133 | + exit 1 | ||
134 | + fi | ||
135 | + test -z "${OPTARG}" && verbose=2 | ||
136 | + test "${OPTARG}" = "0" && verbose=0 | ||
137 | + test "${OPTARG}" = "v" && verbose=3 | ||
138 | + ;; | ||
139 | + q) | ||
140 | + verbose=0 | ||
141 | + ;; | ||
142 | + I) | ||
143 | + if [ "${OPTARG}" != "generic_scsi" -a \ | ||
144 | + "${OPTARG}" != "cooked_ioctl" ] | ||
145 | + then | ||
146 | + echo -e "$usage" | ||
147 | + exit 1 | ||
148 | + fi | ||
149 | + cddaIf=$OPTARG | ||
150 | + ;; | ||
151 | + D) | ||
152 | + if [ ${OPTARG} -lt 1 ] | ||
153 | + then | ||
154 | + echo -e "$usage" | ||
155 | + exit 1 | ||
156 | + fi | ||
157 | + cddaDev=$OPTARG | ||
158 | + ;; | ||
159 | + [h\?]) | ||
160 | + echo -e "$usage" | ||
161 | + exit 1 | ||
162 | + ;; | ||
84 | esac | 163 | esac |
85 | done | 164 | done |
165 | +# ---------------------------------------------------------------- | ||
86 | 166 | ||
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 | 167 | +echo "verbose: $verbose" |
110 | 168 | ||
111 | -comment="" | 169 | +# ---------------------------------------------------------------- |
170 | +# set encodingDir for used encodingType | ||
171 | +case ${encodingType} in | ||
172 | + m) | ||
173 | + encodingDir="$encodingDir/mp3" | ||
174 | + test ${verbose} -ge 2 && echo ${encodeMp3Msg} | ||
175 | + ;; | ||
176 | + f) | ||
177 | + encodingDir="$encodingDir/flac" | ||
178 | + test ${verbose} -ge 2 && echo ${encodeFlacMsg} | ||
179 | + ;; | ||
180 | + o) | ||
181 | + encodingDir="$encodingDir/ogg" | ||
182 | + test ${verbose} -ge 2 && echo ${encodeOggMsg} | ||
183 | + ;; | ||
184 | + w) | ||
185 | + encodingDir="$encodingDir/wav" | ||
186 | + test ${verbose} -ge 2 && echo ${encodeWavMsg} | ||
187 | + ;; | ||
188 | +esac | ||
189 | +# ---------------------------------------------------------------- | ||
112 | 190 | ||
113 | -function idxof() { | ||
114 | - str=$1 | ||
115 | - idx=0 | 191 | +test ${verbose} -ge 1 && echo -n ${getCDInfoMsg} |
192 | +getCDInfo # gets all info about the CD. Look in shellUtils for more info. | ||
193 | +test ${verbose} -ge 1 && echo ${ready} | ||
116 | 194 | ||
117 | - for i in "${indices[@]}"; do | ||
118 | - test "$i" == "$str" && echo $idx && return 0 | ||
119 | - idx=`expr $idx \+ 1` | ||
120 | - done | 195 | +if [ ${verbose} -ge 2 ] |
196 | +then | ||
197 | + cat <<-EOF | ||
198 | + $cdInfoMsg | ||
199 | + EOF | ||
121 | 200 | ||
122 | - echo -1 | ||
123 | - return 0 | ||
124 | -} | 201 | + i=0 |
202 | + while [ $i -lt ${#tTitle[@]} ] | ||
203 | + do | ||
204 | + echo -n "${tArtist[$i]} - ${tTitle[$i]} " | ||
205 | + echo "([${tStartSec[$i]}-${tEndSec[$i]}] ${tLength[$i]})" | ||
206 | + i=$((i+1)) | ||
207 | + done | ||
208 | +fi | ||
125 | 209 | ||
126 | -title_pat="/^[^:]*: *(.*[^ ]).*/" | ||
127 | -artist_pat="//" | 210 | +encodingDir="${encodingDir}/${dArtist}/${dTitle}" |
211 | +mkdir -p "${encodingDir}" | ||
212 | +test ${verbose} -ge 1 && eval "echo ${outputDirMsg}" | ||
128 | 213 | ||
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 | 214 | +# ---------------------------------------------------------------- |
215 | +# fill xml file with data | ||
216 | +test ${verbose} -ge 1 && echo -n "${createXmlMsg}" | ||
140 | 217 | ||
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 ] | 218 | +xmlFile="${encodingDir}/cdinfo.xml" |
219 | +xml_dText="`echo "${dText}" | recode utf8..h0`" | ||
220 | +xml_dExtra="`echo "${dExtra}" | recode utf8..h0`" | ||
221 | +xml_dArtist="`echo "${dArtist}" | recode utf8..h0`" | ||
222 | +xml_dTitle="`echo "${dTitle}" | recode utf8..h0`" | ||
223 | +cat >"${xmlFile}" <<EOF | ||
224 | +<?xml version="1.0" encoding="UTF-8"?> | ||
225 | +<!DOCTYPE cdInfo SYSTEM \"cdInfo.dtd\"> | ||
226 | +<cdinfo> | ||
227 | + <cdindex>${dIndex}</cdindex> | ||
228 | + <cddb>${cddbId}</cddb> | ||
229 | + <cd-text>${xml_dText}</cd-text> | ||
230 | + <cd-extra>${xml_dExtra}</cd-extra> | ||
231 | + <cd-artist>${xml_dArtist}</cd-artist> | ||
232 | + <cd-title>${xml_dTitle}</cd-title> | ||
233 | + <cd-year>${dYear}</cd-year> | ||
234 | + <cd-genre>${dGenre}</cd-genre> | ||
235 | + <cd-time>${dLength}</cd-time> | ||
236 | + <cd-tracks>${dTracks}</cd-tracks> | ||
237 | + <cd-comment></cd-comment> | ||
238 | +EOF | ||
239 | + | ||
240 | +i=0 | ||
241 | +while [ $i -lt ${#tTitle[@]} ] | ||
242 | +do | ||
243 | + trackNr="`printf %02d $((i+1))`" | ||
244 | + xml_tTitle="`echo ${tTitle[$i]} | recode utf8..h0`" | ||
245 | + xml_tArtist="`echo ${tArtist[$i]} | recode utf8..h0`" | ||
246 | + trackEnd=${tEndSec[$i]} | ||
247 | + trackStart=${tStartSec[$i]} | ||
248 | + trackLen=$((trackEnd-$trackStart)) | ||
249 | + | ||
250 | + cat >>"${xmlFile}" <<EOF | ||
251 | + <track> | ||
252 | + <track-number>$trackNr</track-number> | ||
253 | + <track-time>${tLength[$i]}</track-time> | ||
254 | + <track-start-sector>${tStartSec[$i]}</track-start-sector> | ||
255 | + <track-length>${trackLen}</track-length> | ||
256 | + <track-artist>$xml_tArtist</track-artist> | ||
257 | + <track-title>$xml_tTitle</track-title> | ||
258 | + <track-comment></track-comment> | ||
259 | + </track> | ||
260 | +EOF | ||
261 | + | ||
262 | + i=$((i+1)) | ||
263 | +done | ||
264 | + | ||
265 | +echo "</cdinfo>" >>"${xmlFile}" | ||
266 | + | ||
267 | +test ${verbose} -ge 1 && echo "${ready}" | ||
268 | +# ---------------------------------------------------------------- | ||
269 | + | ||
270 | +# ---------------------------------------------------------------- | ||
271 | +# now do the ripping | ||
272 | +test ${verbose} -eq 1 && echo -n "${startRipMsg1}" | ||
273 | +test ${verbose} -ge 2 && echo "${startRipMsg2}" | ||
274 | + | ||
275 | +i=0 | ||
276 | +while [ $i -lt ${#tTitle[@]} ] | ||
243 | do | 277 | 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` | 278 | + trackNr=$((i+1)) |
279 | + | ||
280 | + # now that i don't forget it again. I use tr to translate \r to \n | ||
281 | + # because sed does't recognise a line with only \r at its end as a line. | ||
282 | + # Therefor sed reads until output of cdda2wav ends and does all the | ||
283 | + # processing at once, so the percentage is not shown correctly | ||
284 | + if [ ${verbose} -ge 2 ] | ||
285 | + then | ||
286 | + outCmd="tr '\r' '\n' | | ||
287 | + sed '/^ [0-9]/!d;s/^.* \([0-9]*%\).*$/\r'\"\${outStr}\"'\1/' | | ||
288 | + tr -d '\n'" | ||
289 | + else | ||
290 | + outCmd="cat >/dev/null" | ||
291 | + fi | ||
292 | + | ||
293 | + case ${encodingType} in | ||
294 | + f) | ||
295 | + outFile="`printf %02d ${trackNr}`-${tTitle[$i]}.flac" | ||
296 | + outStr="track-$trackNr => ${outFile}: " | ||
297 | + | ||
298 | + ( | ||
299 | + exec 2>&1 | ||
300 | + cdda2wav -H -D/dev/cdrom -I${cddaIf} -t${trackNr} - |\ | ||
301 | + flac -c -f \ | ||
302 | + -T artist="${tArtist[$i]}" -T album="${dTitle}" \ | ||
303 | + -T genre="${dGenre}" -T title="${tTitle[$i]}" \ | ||
304 | + -T tracknumber="${trackNr}" -T tracknum="${trackNr}" \ | ||
305 | + -T date="${dYear}" -T comment="" \ | ||
306 | + -o "${encodingDir}/${outFile}" - 2>/dev/null | ||
307 | + ) | $outCmd | ||
308 | + ;; | ||
309 | + m) | ||
310 | + outFile="`printf %02d ${trackNr}`-${tTitle[$i]}.mp3" | ||
311 | + outStr="track-$trackNr => ${outFile}: " | ||
312 | + | ||
313 | + case ${encoder} in | ||
314 | + lame) | ||
315 | + ( | ||
316 | + exec 2>&1 | ||
317 | + cdda2wav -H -D/dev/cdrom -I${cddaIf} -t${trackNr} - |\ | ||
318 | + lame -V2 \ | ||
319 | + --ta "${tArtist[$i]}" --tl "${dTitle}" \ | ||
320 | + --tg "${dGenre}" --tt "${tTitle[$i]}" \ | ||
321 | + --tn "${trackNr}" --ty "${dYear}" \ | ||
322 | + --tc "" \ | ||
323 | + - "${encodingDir}/${outFile}" 2>/dev/null | ||
324 | + ) | tr '\r' '\n' |\ | ||
325 | + sed '/^ [0-9]/!d;s/^.* \([0-9]*%\).*$/\r'"${outStr}"'\1/' |\ | ||
326 | + tr -d '\n' | ||
327 | + ;; | ||
328 | + bladeenc) | ||
329 | + ( | ||
330 | + exec 2>&1 | ||
331 | + cdda2wav -H -D/dev/cdrom -I${cddaIf} -t${trackNr} - |\ | ||
332 | + bladeenc -progress=0 STDIN \ | ||
333 | + "${encodingDir}/${outFile}" 2>/dev/null | ||
334 | + ) | tr '\r' '\n' |\ | ||
335 | + sed '/^ [0-9]/!d;s/^.* \([0-9]*%\).*$/\r'"${outStr}"'\1/' |\ | ||
336 | + tr -d '\n' | ||
337 | + ;; | ||
338 | + esac | ||
339 | + ;; | ||
340 | + o) | ||
341 | + outFile="`printf %02d ${trackNr}`-${tTitle[$i]}.ogg" | ||
342 | + outStr="track-$trackNr => ${outFile}: " | ||
343 | + | ||
344 | + ( | ||
345 | + exec 2>&1 | ||
346 | + cdda2wav -H -D/dev/cdrom -I${cddaIf} -t${trackNr} - |\ | ||
347 | + oggenc -a "${tArtist[$i]}" -l "${dTitle}" \ | ||
348 | + -G "${dGenre}" -t "${tTitle[$i]}" \ | ||
349 | + -N "${trackNr}" -d "${dYear}" \ | ||
350 | + -c "" \ | ||
351 | + -o "${encodingDir}/${outFile}" - 2>/dev/null | ||
352 | + ) | tr '\r' '\n' |\ | ||
353 | + sed '/^ [0-9]/!d;s/^.* \([0-9]*%\).*$/\r'"${outStr}"'\1/' |\ | ||
354 | + tr -d '\n' | ||
355 | + ;; | ||
356 | + w) | ||
357 | + outFile="`printf %02d ${trackNr}`-${tTitle[$i]}.wav" | ||
358 | + outStr="track-$trackNr => ${outFile}: " | ||
359 | + | ||
360 | + ( | ||
361 | + exec 2>&1 | ||
362 | + cdda2wav -H -D/dev/cdrom -I${cddaIf} -t${trackNr} - >\ | ||
363 | + "${encodingDir}/${outFile}" | ||
364 | + ) | tr '\r' '\n' |\ | ||
365 | + sed '/^ [0-9]/!d;s/^.* \([0-9]*%\).*$/\r'"${outStr}"'\1/' |\ | ||
366 | + tr -d '\n' | ||
367 | + ;; | ||
368 | + esac | ||
369 | + | ||
370 | + echo # do a newline after each file | ||
371 | + i=$((i+1)) | ||
342 | done | 372 | done |
343 | 373 | ||
344 | -echo "</cdinfo>" >> "${xmlfile}" | 374 | +test ${verbose} -eq 1 && echo "${ready}" |
375 | +# ---------------------------------------------------------------- |
getcd.sh.neu
deleted
100755 → 0
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
deleted
100755 → 0
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
deleted
100755 → 0
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) |
readme
deleted
100755 → 0
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
deleted
100755 → 0
No preview for this file type
rton.c
deleted
100755 → 0
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 | - |
shellUtils.sh
0 → 100644
1 | +if [ "x" == "x$__SHELLUTILS__" ] | ||
2 | +then | ||
3 | + __SHELLUTILS__="shellUtils" | ||
4 | + | ||
5 | + # ------------------------------- | ||
6 | + # Fehlermeldungen | ||
7 | + _shellUtils_errMsg[1]="Fehler beim Aufruf von \${FUNCNAME}: falsche Parameteranzahl: $#" | ||
8 | + _shellUtils_errMsg[2]="Fehler: Es läuft bereits eine Instanz (\${oldPid}) des scripts" | ||
9 | + _shellUtils_errMsg[3]="Fehler beim Aufruf von doSmbCommand: smbCommand nicht initialisiert" | ||
10 | + _shellUtils_errMsg[4]="Fehler: konnte keine Konfigurations-Datei (\${cName}) finden" | ||
11 | + #_shellUtils_errMsg[2]= | ||
12 | + # ------------------------------- | ||
13 | + | ||
14 | + # ------------------------------- | ||
15 | + # Kommandodefinitions Teil | ||
16 | + SH="/bin/bash" | ||
17 | + SMBCLIENT="/usr/bin/smbclient" | ||
18 | + PS="/bin/ps" | ||
19 | + BASENAME="/usr/bin/basename" | ||
20 | + PWDCMD="/bin/pwd" | ||
21 | + CONVERT="/usr/bin/convert" | ||
22 | + ICONV="/usr/bin/iconv" | ||
23 | + ECHO="/bin/echo" | ||
24 | + TEST="/usr/bin/test" | ||
25 | + SED="/usr/bin/sed" | ||
26 | + PRINTF="/usr/bin/printf" | ||
27 | + SORT="/usr/bin/sort" | ||
28 | + FTP="/usr/bin/ftp" | ||
29 | + CONVERT="/usr/bin/convert" | ||
30 | + CJPEG="/usr/bin/cjpeg" | ||
31 | + CAT="/bin/cat" | ||
32 | + MKDIR="/bin/mkdir" | ||
33 | + DATE="/bin/date" | ||
34 | + RM="/bin/rm" | ||
35 | + MAILCMD="/bin/bin/mailto" | ||
36 | + CUT="/usr/bin/cut" | ||
37 | + TR="/usr/bin/tr" | ||
38 | + LOCALE="/usr/bin/locale" | ||
39 | + GREP="/bin/grep" | ||
40 | + WC="/usr/bin/wc" | ||
41 | + MV="/usr/bin/mv" | ||
42 | + CP="/usr/bin/cp" | ||
43 | + EXPR="/usr/bin/expr" | ||
44 | + UNZIP="/usr/bin/unzip" | ||
45 | + XSLTPROC="/usr/bin/xsltproc" | ||
46 | + GAWK="/usr/bin/gawk" | ||
47 | + AWK="/usr/bin/awk" | ||
48 | + LS="/bin/ls" | ||
49 | + TOUCH="/usr/bin/touch" | ||
50 | + RECODE="/usr/bin/recode" | ||
51 | + GETOPT="/usr/bin/getopt" | ||
52 | + # ------------------------------- | ||
53 | + | ||
54 | + # ------------------------------- | ||
55 | + # Variablen | ||
56 | + _smbCommand="" | ||
57 | + # ------------------------------- | ||
58 | + | ||
59 | + # ------------------------------- | ||
60 | + # Funktionen | ||
61 | + # Aufruf: checkLock lockfile | ||
62 | + function checkLock | ||
63 | + { | ||
64 | + if [ $# -ne 1 ] | ||
65 | + then | ||
66 | + eval "echo \"${_shellUtils_errMsg[1]}\" >&2" | ||
67 | + exit 1 | ||
68 | + fi | ||
69 | + | ||
70 | + local filename="$1" | ||
71 | + | ||
72 | + if [ -e "$filename" ] | ||
73 | + then | ||
74 | + local oldPid="`$CAT "$lockFile"`" | ||
75 | + local scriptName="`$BASENAME $0`" | ||
76 | + local running="`$PS -p "$oldPid" | $SED '1d; /'$scriptName'/!d'`" | ||
77 | + | ||
78 | + if [ -n "$running" ] | ||
79 | + then | ||
80 | + eval "echo \"${_shellUtils_errMsg[2]}\" >&2" | ||
81 | + exit 2 | ||
82 | + fi | ||
83 | + fi | ||
84 | + | ||
85 | + echo $$ >"$lockFile" | ||
86 | + | ||
87 | + return $$ | ||
88 | + } | ||
89 | + | ||
90 | + # Aufruf: doSmbCommand share domain user pass | ||
91 | + function initSmbCommand | ||
92 | + { | ||
93 | + if [ $# -ne 4 ] | ||
94 | + then | ||
95 | + eval "echo \"${_shellUtils_errMsg[1]}\" >&2" | ||
96 | + exit 1 | ||
97 | + fi | ||
98 | + | ||
99 | + _smbCommand="$SMBCLIENT $1 $4 -U $3 -W $2" | ||
100 | + } | ||
101 | + | ||
102 | + # Aufruf: doSmbCommand path command | ||
103 | + function doSmbCommand | ||
104 | + { | ||
105 | + if [ $# -lt 1 -o $# -gt 2 ] | ||
106 | + then | ||
107 | + eval "echo \"${_shellUtils_errMsg[1]}\" >&2" | ||
108 | + exit 1 | ||
109 | + fi | ||
110 | + | ||
111 | + if [ -z "$_smbCommand" ] | ||
112 | + then | ||
113 | + eval "echo \"${_shellUtils_errMsg[3]}\" >&2" | ||
114 | + exit 3 | ||
115 | + fi | ||
116 | + | ||
117 | + if [ $# -eq 2 ] | ||
118 | + then | ||
119 | + eval "$_smbCommand -D $1 -c \"$2\"" | ||
120 | + else | ||
121 | + eval "$_smbCommand -D $1" <&0 | ||
122 | + fi | ||
123 | + } | ||
124 | + | ||
125 | + # Meine Implementation von Hashes fuer die bash verwendet zwei Arrays, | ||
126 | + # deren "Basisname" immer bei den aufrufen der Hash-Funktionen mit | ||
127 | + # angegeben werden muessen. Die beiden Arrays heissen dann | ||
128 | + # _<<Basisname>>_key und _<<Basisname>>_value und enthalten entsprechen | ||
129 | + # jeweils zu einem Index ein key/value Paar. | ||
130 | + # Die groesste Magie in den Funktionen liegt darin die Arraynamen | ||
131 | + # immer richtig zu erzeugen. | ||
132 | + # Wenn man dieses Hashes benutzt sollte man bedenken, das das | ||
133 | + # Laufzeitverhalten O(n) ist, die Implementierung also nicht sehr | ||
134 | + # performant. | ||
135 | + # PS. O(n) => im unguenstigsten Fall hat man n Schleifendurchlaeufe um | ||
136 | + # auf ein Element in einem Hash mit n Elementen zuzugreifen. | ||
137 | + # Ich mags kaum zugeben aber an manchen Stellen ist das Laufzeitverhalten | ||
138 | + # sogar O(2n). (Es besteht wohl noch dringender Optimirungsbedarf) | ||
139 | + | ||
140 | + # eine Funktion um einen Hash zu leeren | ||
141 | + # Aufruf: unsetHash hashname | ||
142 | + function unsetHash | ||
143 | + { | ||
144 | + if [ $# -ne 1 ] | ||
145 | + then | ||
146 | + eval "echo \"${_shellUtils_errMsg[1]}\" >&2" | ||
147 | + exit 1 | ||
148 | + fi | ||
149 | + | ||
150 | + unset _${1}_key | ||
151 | + unset _${1}_value | ||
152 | + } | ||
153 | + | ||
154 | + # eine Funktion um einen HashWert zu setzen. ein key und ein value array | ||
155 | + # werden erzeugt. Ueber getHashVal kann man wieder Werte abfragen. | ||
156 | + # Aufruf: setHashVal hashname key value | ||
157 | + function setHashVal | ||
158 | + { | ||
159 | + if [ $# -ne 3 ] | ||
160 | + then | ||
161 | + eval "echo \"${_shellUtils_errMsg[1]}\" >&2" | ||
162 | + exit 1 | ||
163 | + fi | ||
164 | + | ||
165 | + getHashVal "${1}" "${2}" >/dev/null 2>&1 | ||
166 | + local idx=$? | ||
167 | + eval "_${1}_key[$idx]=\"$2\"" | ||
168 | + eval "_${1}_value[$idx]=\"$3\"" | ||
169 | + } | ||
170 | + | ||
171 | + # und eine funktion um über einen key einen Wert aus einem Hash | ||
172 | + # (siehe setHashVal) zu bekommen. | ||
173 | + # Aufruf: getHashVal hash key | ||
174 | + function getHashVal | ||
175 | + { | ||
176 | + if [ $# -ne 2 ] | ||
177 | + then | ||
178 | + eval "echo \"${_shellUtils_errMsg[1]}\" >&2" | ||
179 | + exit 1 | ||
180 | + fi | ||
181 | + | ||
182 | + local i=0 | ||
183 | + local count=`getHashSize $1` | ||
184 | + local key=`$ECHO $2 | $SED 's/#/\\\\#/'` | ||
185 | + | ||
186 | + while [ $i -lt $count ] | ||
187 | + do | ||
188 | + if eval [ "\${_${1}_key[$i]}" = "$key" ] | ||
189 | + then | ||
190 | + eval "echo \${_${1}_value[$i]}" | ||
191 | + return $i | ||
192 | + fi | ||
193 | + | ||
194 | + i=$((i+1)); | ||
195 | + done; | ||
196 | + | ||
197 | + return $i | ||
198 | + } | ||
199 | + | ||
200 | + # Aufruf: getHashSize hash | ||
201 | + function getHashSize | ||
202 | + { | ||
203 | + if [ $# -ne 1 ] | ||
204 | + then | ||
205 | + eval "echo \"${_shellUtils_errMsg[1]}\" >&2" | ||
206 | + exit 1 | ||
207 | + fi | ||
208 | + | ||
209 | + eval "count=\${#_${1}_key[*]}" | ||
210 | + echo $count | ||
211 | + | ||
212 | + return $count | ||
213 | + } | ||
214 | + | ||
215 | + # Aufruf: getHashKeys hash | ||
216 | + function getHashKeys | ||
217 | + { | ||
218 | + if [ $# -ne 1 ] | ||
219 | + then | ||
220 | + eval "echo \"${_shellUtils_errMsg[1]}\" >&2" | ||
221 | + exit 1 | ||
222 | + fi | ||
223 | + | ||
224 | + eval "ret=\"\${_${1}_key[0]}\"" | ||
225 | + | ||
226 | + local i=1 | ||
227 | + local count=`getHashSize $1` | ||
228 | + while [ $i -lt $count ] | ||
229 | + do | ||
230 | + eval "ret=\"$ret \${_${1}_key[$i]}\"" | ||
231 | + i=$((i+1)) | ||
232 | + done | ||
233 | + | ||
234 | + echo $ret | ||
235 | + | ||
236 | + return $count | ||
237 | + } | ||
238 | + | ||
239 | + # Funktion um die Zahlrepraesentation eines Monatsname zu bekommen. | ||
240 | + # Also Oktober => 10 | ||
241 | + # Abhaengig davon das ein entsprechendes locale installiert ist. | ||
242 | + # Aufruf: getMonthNum Monatsname [locale] | ||
243 | + function getMonthNum | ||
244 | + { | ||
245 | + if [ $# -lt 1 ] | ||
246 | + then | ||
247 | + eval "echo \"${_shellUtils_errMsg[1]}\" >&2" | ||
248 | + exit 1 | ||
249 | + fi | ||
250 | + | ||
251 | + if [ $# -eq 2 ] | ||
252 | + then | ||
253 | + LC_ALL=${2} | ||
254 | + fi | ||
255 | + | ||
256 | + mon=`$LOCALE -c LC_TIME | $SED '5!d;y/;/\n/' |\ | ||
257 | + $GREP -n ${1} | $CUT -d\: -f1` | ||
258 | + | ||
259 | + echo $mon | ||
260 | + | ||
261 | + return $mon | ||
262 | + } | ||
263 | + | ||
264 | + # Funkktion um ein Kommando nach einem bestimmten Zeitraum abzubrechen | ||
265 | + # Aufruf: timeout cmd t | ||
266 | + # Retruns: >128 -> falls Timeout, return value von cmd->falls kein Timeout | ||
267 | + function timeout | ||
268 | + { | ||
269 | + if [ $# -lt 2 ] | ||
270 | + then | ||
271 | + eval "echo \"${_shellUtils_errMsg[1]}\" >&2" | ||
272 | + exit 1 | ||
273 | + fi | ||
274 | + | ||
275 | + # gewuenschtes Kommando als separaten Prozess starten | ||
276 | + $1 <&0 & | ||
277 | + local __cPid=$! | ||
278 | + | ||
279 | + # subshell starten die gewuenschte Zeit wartet bis sie obigen | ||
280 | + # Prozess killt. | ||
281 | + ( sleep $2; kill -9 ${__cPid} ) >/dev/null 2>&1 & | ||
282 | + local __tPid=$! | ||
283 | + | ||
284 | + # neuen Trap setzen....evtl. vorhande alte Kommandos werden auch | ||
285 | + # ausgefuehrt! (Bei Programmabbruch auch auf jeden Fall beide | ||
286 | + # Sub-Prozesse killen) | ||
287 | + oldTrap="`trap -p EXIT`" | ||
288 | + oldTrapCmd="`echo $oldTrap | sed 's/^trap -- \(.*\) EXIT$/\1/'`" | ||
289 | + | ||
290 | + trapCmd="kill -9 ${__cPid} >/dev/null 2>&1" | ||
291 | + trapCmd="${trapCmd};kill -9 ${__cPid} >/dev/null 2>&1" | ||
292 | + trapCmd="${trapCmd};eval $oldTrapCmd" | ||
293 | + trap "${trapCmd}" EXIT | ||
294 | + | ||
295 | + # warte bis Subprozess mit Kommando endet | ||
296 | + wait ${__cPid} >/dev/null 2>&1 | ||
297 | + local __cExit=$? | ||
298 | + | ||
299 | + # alte trap Kommandos wiederherstellen | ||
300 | + test "$oldTrapCmd" && eval "$oldTrapCmd" || trap '-' EXIT | ||
301 | + | ||
302 | + # falls sie noch laeuft wartende subshell killen. | ||
303 | + kill -9 $__tPid >/dev/null 2>&1 | ||
304 | + return $__cExit | ||
305 | + } | ||
306 | + # ------------------------------- | ||
307 | + | ||
308 | +fi | ||
309 | + | ||
310 | +function getCDInfo | ||
311 | +{ | ||
312 | + local uri device cmd i hello cddb ret diskData tNum | ||
313 | + | ||
314 | + uri="freedb.freedb.org/~cddb/cddb.cgi" | ||
315 | + device="/dev/cdrom" | ||
316 | + | ||
317 | + test $# -ge 1 && uri="$1" | ||
318 | + test $# -ge 2 && device="$2" | ||
319 | + | ||
320 | + hello="hello=${USER}+${HOSTNAME}+test+0.0.1" | ||
321 | + | ||
322 | + # first get the genre list from server | ||
323 | + eval "`curl -s "http://${uri}?cmd=cddb+lscat&${hello}&proto=6" |\ | ||
324 | + sed '1d;$d' | tr -d '\r' | tr '\n' ',' |\ | ||
325 | + sed 's/,$//;s/,/" "/g;s/^\(.*\)$/local -a genre=("\1")/'`" | ||
326 | + | ||
327 | + unset cddbId dTitle dYear dGenre tTitle | ||
328 | + | ||
329 | + diskData="`cdda2wav -D ${device} -N -J -v toc,sectors 2>&1`" | ||
330 | + | ||
331 | + cddbId="`echo "$diskData" |\ | ||
332 | + sed '/^CDDB/!d;s/^.*0x\(.*\)$/\1/'`" | ||
333 | + dTracks="`echo "$diskData" |\ | ||
334 | + sed '/tracks/!d;s/^.*tracks:\([0-9]*\).*$/\1/'`" | ||
335 | + dLength="`echo "$diskData" |\ | ||
336 | + sed '/tracks/!d;s/^.*time \([0-9:\.]*\).*$/\1/'`" | ||
337 | + dIndex="`echo "$diskData" |\ | ||
338 | + sed '/CDINDEX/!d;s/^.*: *\([a-zA-Z0-9_\.]*-\).*$/\1/'`" | ||
339 | + dText="`echo "$diskData" | sed ' | ||
340 | + /CD-Text/!d;s/^[^:]*: *\(.*[^ ]\).*$/\1/'`" | ||
341 | + dExtra="`echo "$diskData" | sed ' | ||
342 | + /CD-Extra/!d;s/^[^:]*: *\(.*[^ ]\).*$/\1/'`" | ||
343 | + | ||
344 | + # search for info in all genres | ||
345 | + for i in "${genre[@]}" | ||
346 | + do | ||
347 | + cmd="cmd=cddb+read+${i}+${cddbId}" | ||
348 | + #wget -O- "http://${uri}?${cmd}&${hello}&proto=6" 2>/dev/null | ||
349 | + cddb="`curl -s "http://${uri}?${cmd}&${hello}&proto=6"`" | ||
350 | + | ||
351 | + ret="`echo "$cddb" | head -c 3`" | ||
352 | + if [ "$ret" != "210" ] | ||
353 | + then | ||
354 | + if [ ${verbose:-0} -ge 3 ] | ||
355 | + then | ||
356 | + debug="`echo "$cddb" | head -n 1`" | ||
357 | + echo $"[ERROR] cddb: ${debug}" | ||
358 | + fi | ||
359 | + continue | ||
360 | + else | ||
361 | + eval "`echo "$cddb" | tr -d '\r' | sed ' | ||
362 | + /DTITLE/s/^.*=\(\(.*\) \/ \)*\(.*\)$/dArtist="\2";dTitle="\3"/p | ||
363 | + /DYEAR/s/^.*=\(.*\)$/dYear="\1"/p | ||
364 | + /DGENRE/s/^.*=\(.*\)$/dGenre="\1"/p | ||
365 | + /TTITLE/s/^TTITLE\([0-9]*\)=\(\(.*\) \/ \)*\(.*\)$/tArtist[\1]="\3";tTitle[\1]="\4"/p | ||
366 | + d'`" | ||
367 | + break | ||
368 | + fi | ||
369 | + done | ||
370 | + | ||
371 | + # Nu pack ich in alle tArtist die leer sind den dArtist. | ||
372 | + i=0 | ||
373 | + while [ $i -lt ${#tArtist[@]} ] | ||
374 | + do | ||
375 | + tNum=$((i+1)) | ||
376 | + tLength[$i]=`echo "$diskData" | sed ' | ||
377 | + /[^0-9]'$tNum'\.(.*:.*)/ !d | ||
378 | + s/.*[^0-9]'$tNum'\.( *\([^)]*\).*$/\1/'` | ||
379 | + tStartSec[$i]=`echo "$diskData" | sed ' | ||
380 | + /[^0-9]'$tNum'\.([^:]*)/ !d | ||
381 | + s/.*[^0-9]'$tNum'\.( *\([^)]*\).*$/\1/'` | ||
382 | + | ||
383 | + test $tNum -eq ${#tArtist[@]} && tNum="lead-out" || tNum=$((tNum+1)) | ||
384 | + | ||
385 | + tEndSec[$i]=`echo "$diskData" | sed ' | ||
386 | + /[^0-9]'$tNum'\.*([^:]*)/ !d | ||
387 | + s/.*[^0-9]'$tNum'\.*( *\([^)]*\).*$/\1/'` | ||
388 | + | ||
389 | + test -z "${tArtist[$i]}" && tArtist[$i]="$dArtist" | ||
390 | + i=$((i+1)) | ||
391 | + done | ||
392 | +} | ||
393 | + |
usage
deleted
100755 → 0
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