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