From 388a47ab15a0d89ce6bfd0025acdd823c9cedc4a Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Wed, 13 Dec 2006 14:09:03 +0000 Subject: [PATCH] Initial repository layout --- CDDB_get-2.23.tar.gz | Bin 0 -> 19438 bytes CDDB_get-2.23p1.patch | 70 +++++++ CDDB_get-2.27.tar.gz | Bin 0 -> 21820 bytes CDDB_get-2.27p1.patch | 70 +++++++ cddb.pl | 451 ++++++++++++++++++++++++++++++++++++++++++ cdinfo2xinf.xsl | 40 ++++ flac2mp3.xsl | 28 +++ flac2wav.xsl | 21 ++ getcd.sh | 344 ++++++++++++++++++++++++++++++++ getcd.sh.neu | 350 ++++++++++++++++++++++++++++++++ getcd.xml | 35 ++++ install | 72 +++++++ mp32wav.xsl | 21 ++ readme | 30 +++ rton | Bin 0 -> 8621 bytes rton.c | 15 ++ usage | 25 +++ 17 files changed, 1572 insertions(+) create mode 100644 CDDB_get-2.23.tar.gz create mode 100644 CDDB_get-2.23p1.patch create mode 100644 CDDB_get-2.27.tar.gz create mode 100644 CDDB_get-2.27p1.patch create mode 100755 cddb.pl create mode 100755 cdinfo2xinf.xsl create mode 100755 flac2mp3.xsl create mode 100755 flac2wav.xsl create mode 100755 getcd.sh create mode 100755 getcd.sh.neu create mode 100755 getcd.xml create mode 100755 install create mode 100755 mp32wav.xsl create mode 100755 readme create mode 100755 rton create mode 100755 rton.c create mode 100755 usage diff --git a/CDDB_get-2.23.tar.gz b/CDDB_get-2.23.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..a1dbc96e74017847c437236b0bacd7d26254f5fb GIT binary patch literal 19438 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 F0RSfQ2ps?b literal 0 HcmV?d00001 diff --git a/CDDB_get-2.23p1.patch b/CDDB_get-2.23p1.patch new file mode 100644 index 0000000..6774ed2 --- /dev/null +++ b/CDDB_get-2.23p1.patch @@ -0,0 +1,70 @@ +diff -Naur CDDB_get-2.23/CDDB_get.pm CDDB_get-2.23p1/CDDB_get.pm +--- CDDB_get-2.23/CDDB_get.pm 2003-09-07 15:49:27.000000000 +0000 ++++ CDDB_get-2.23p1/CDDB_get.pm 2004-06-30 08:37:28.000000000 +0000 +@@ -261,6 +261,7 @@ + + my $input = $config->{input}; + my $multi = $config->{multi}; ++ my $entry = $config->{entry} if (defined($config->{entry})); + $input = 0 if $multi; + + print STDERR Dumper($config) if $debug; +@@ -426,7 +427,14 @@ + } + } + } else { +- push @to_get,@list; ++ unless(defined($entry)) { ++ push @to_get,@list; ++ } ++ else { ++ if($entry-1 >= 0 && $entry-1 <= $#list) { ++ push @to_get,$list[$entry-1]; ++ } ++ } + } + + my $i=0; +diff -Naur CDDB_get-2.23/cddb.pl CDDB_get-2.23p1/cddb.pl +--- CDDB_get-2.23/cddb.pl 2003-08-16 19:01:49.000000000 +0000 ++++ CDDB_get-2.23p1/cddb.pl 2004-06-30 08:33:03.000000000 +0000 +@@ -27,12 +27,13 @@ + use strict; + + my %option = (); +-getopts("oghdtsiSfDlOFc:", \%option); ++getopts("oghdtsiSfDlOFe:c:", \%option); + + if($option{h}) { + print "$0: gets CDDB info of a CD\n"; + print " no argument - gets CDDB info of CD in your drive\n"; + print " -c device (other than default device)\n"; ++ print " -e which cddb-entry to use\n"; + print " -o offline mode - just stores CD info\n"; + print " -d output in xmcd format\n"; + print " -s save in xmcd format\n"; +@@ -81,11 +82,19 @@ + $config{CD_DEVICE}=$option{c} if $option{c}; + + # user interaction welcome? +- +-$config{input}=1; # 1: ask user if more than one possibility +- # 0: no user interaction +-$config{multi}=0; # 1: do not ask user and get all of them +- # 0: just the first one ++if($option{e}) { ++ $config{entry}=$option{e}; ++ $config{input}=0; # 1: ask user if more than one possibility ++ # 0: no user interaction ++ $config{multi}=0; # 1: do not ask user and get all of them ++ # 0: just the first one ++} ++else { ++ $config{input}=1; # 1: ask user if more than one possibility ++ # 0: no user interaction ++ $config{multi}=0; # 1: do not ask user and get all of them ++ # 0: just the first one ++} + + my %db; + diff --git a/CDDB_get-2.27.tar.gz b/CDDB_get-2.27.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..62a64e6584121f25b33b72a896e362b7476da865 GIT binary patch literal 21820 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 + my $multi = $config->{multi}; ++ my $entry = $config->{entry} if (defined($config->{entry})); + $input = 0 if $multi; + + print STDERR Dumper($config) if $debug; +@@ -441,7 +442,14 @@ + } + } + } else { +- push @to_get,@list; ++ unless(defined($entry)) { ++ push @to_get,@list; ++ } ++ else { ++ if($entry-1 >= 0 && $entry-1 <= $#list) { ++ push @to_get,$list[$entry-1]; ++ } ++ } + } + + my $i=0; +diff -Naur CDDB_get-2.27/cddb.pl CDDB_get-2.27.patched/cddb.pl +--- CDDB_get-2.27/cddb.pl 2005-10-06 08:00:59.000000000 +0200 ++++ CDDB_get-2.27.patched/cddb.pl 2006-05-27 09:56:17.798156565 +0200 +@@ -27,12 +27,13 @@ + use strict; + + my %option = (); +-getopts("oghdtsi:SfDlOFc:H:CIRGP", \%option); ++getopts("oghdtsi:SfDlOFe:c:H:CIRGP", \%option); + + if($option{h}) { + print "$0: gets CDDB info of a CD\n"; + print " no argument - gets CDDB info of CD in your drive\n"; + print " -c device (other than default device)\n"; ++ print " -e which cddb-entry to use\n"; + print " -o offline mode - just stores CD info\n"; + print " -d output in xmcd format\n"; + print " -s save in xmcd format\n"; +@@ -110,11 +111,19 @@ + $config{CD_DEVICE}=$option{c} if $option{c}; + + # user interaction welcome? +- +-$config{input}=1; # 1: ask user if more than one possibility +- # 0: no user interaction +-$config{multi}=0; # 1: do not ask user and get all of them +- # 0: just the first one ++if($option{e}) { ++ $config{entry}=$option{e}; ++ $config{input}=0; # 1: ask user if more than one possibility ++ # 0: no user interaction ++ $config{multi}=0; # 1: do not ask user and get all of them ++ # 0: just the first one ++} ++else { ++ $config{input}=1; # 1: ask user if more than one possibility ++ # 0: no user interaction ++ $config{multi}=0; # 1: do not ask user and get all of them ++ # 0: just the first one ++} + + $config{input}=0 if($option{I}); + diff --git a/cddb.pl b/cddb.pl new file mode 100755 index 0000000..f9efa7f --- /dev/null +++ b/cddb.pl @@ -0,0 +1,451 @@ +#!/usr/bin/perl -I. +# +# CDDB - Read the CDDB entry for an audio CD in your drive +# +# This module/script gets the CDDB info for an audio cd. You need +# LINUX, a cdrom drive and an active internet connection in order +# to do that. +# +# (c) 2004 Armin Obersteiner +# +# LICENSE +# +# This library is released under the same conditions as Perl, that +# is, either of the following: +# +# a) the GNU General Public License Version 2 as published by the +# Free Software Foundation, +# +# b) the Artistic License. +# + +#use CDDB_get qw( get_cddb get_discids ); + +use Data::Dumper; +use Getopt::Std; + +use strict; + +my %option = (); +getopts("oghdtsi:SfDlOFe:c:H:CIRGP", \%option); + +if($option{h}) { + print "$0: gets CDDB info of a CD\n"; + print " no argument - gets CDDB info of CD in your drive\n"; + print " -c device (other than default device)\n"; + print " -e which cddb-entry to use\n"; + print " -o offline mode - just stores CD info\n"; + print " -d output in xmcd format\n"; + print " -s save in xmcd format\n"; + print " -i db. one of: mysql, pg, oracle, sqlite\n"; + print " -O overwrite file or db\n"; + print " -t output toc\n"; + print " -l output lame command\n"; + print " -f http mode (e.g. through firewalls)\n"; + print " -F some stateful firewalls/http proxies need additional newlines\n"; + print " -g get CDDB info for stored CDs\n"; + print " -I non interactive mode\n"; + print " -H CDDB hostname\n"; + print " -C use local cache\n"; + print " -R readonly cache\n"; + print " -G cache has not the diskid as filenames (much slower)\n"; + print " -P cache path (default: /tmp/xmcd)\n"; + print " -D put CDDB_get in debug mode\n"; + exit; +} + +my %config; + +my $diskid; +my $total; +my $toc; +my $savedir="/tmp/cddb"; +my $xmcddir="/tmp/xmcd"; + +if($option{C}) { + # use CDDB_cache qw( get_cddb get_discids ); + require CDDB_cache; + CDDB_cache->import( qw( get_cddb get_discids ) ); + + $CDDB_cache::debug=1 if($option{D}); + $CDDB_cache::readonly=1 if($option{R}); + $CDDB_cache::grep=1 if($option{G}); + + $CDDB_cache::dir="/tmp/xmcd"; # default + # $CDDB_cache::dir="/opt/kde2/share/apps/kscd/cddb"; + $CDDB_cache::dir=$option{P} if($option{P}); + +} else { + # use CDDB_get qw( get_cddb get_discids ); + require CDDB_get; + CDDB_get->import( qw( get_cddb get_discids ) ); +} + +$CDDB_get::debug=1 if($option{D}); + +# following variables just need to be declared if different from defaults +# defaults are listed below (cdrom default is os specific) + +# $config{CDDB_HOST}="freedb.freedb.org"; # set cddb host +if($option{H}) { + $config{CDDB_HOST}=$option{H}; +} +# $config{CDDB_PORT}=8880; # set cddb port +# $config{CDDB_MODE}="cddb"; # set cddb mode: cddb or http, this is switched with -f +# $config{CD_DEVICE}="/dev/cdrom"; # set cd device + +# $config{HELLO_ID} ="root nowhere.com fastrip 0.77"; # hello string: username hostname clientname version +# $config{PROTO_VERSION} = 5; # cddb protokol version + + +# get proxy settings for cddb mode + +$config{HTTP_PROXY}=$ENV{http_proxy} if $ENV{http_proxy}; # maybe wanna use a proxy ? + +$config{CDDB_MODE}="http" if($option{f}); +if($option{F}) { + $config{CDDB_MODE}="http"; + $config{FW}=1; +} + +$config{CD_DEVICE}=$option{c} if $option{c}; + +# user interaction welcome? +if($option{e}) { + $config{entry}=$option{e}; + $config{input}=0; # 1: ask user if more than one possibility + # 0: no user interaction + $config{multi}=0; # 1: do not ask user and get all of them + # 0: just the first one +} +else { + $config{input}=1; # 1: ask user if more than one possibility + # 0: no user interaction + $config{multi}=0; # 1: do not ask user and get all of them + # 0: just the first one +} + +$config{input}=0 if($option{I}); + +my %db; + +if($option{i}) { + require DBI; + + $db{table_cds} = "cds"; + $db{table_tracks} = "tracks"; + + # not needed for sqlite + $db{host} = "localhost"; + $db{port} = "3306"; + + # not needed for oracle/sqlite + $db{name} = "mp3-test"; + + # just for oracle + $db{sid} = "xxx"; + $db{home} = "xxx"; + + # just for sqlite + $db{file} = "xxx"; + + # not needed for sqlite + $db{user} = "root"; + $db{passwd} = "xxx"; + + + if($option{i} eq "mysql") { + $db{connect} = sub { "dbi:mysql:database=$db{name};host=$db{host};port=$db{port}", $db{user}, $db{passwd} }; + } elsif($option{i} eq "pg") { + $db{connect} = sub { "dbi:Pg:dbname=$db{dbname};host=$db{host};port=$db{port}", $db{user}, $db{passwd} }; + } elsif($option{i} eq "oracle") { + $db{connect} = sub { "dbi:Oracle:host=$db{host};sid=$db{sid};port=$db{port}", $db{user}, $db{passwd} }; + $ENV{ORACLE_HOME} = $db{home}; + } elsif($option{i} eq "sqlite") { + $db{connect} = sub { "dbi:SQLite:dbname=$db{file}","","" }; + } else { + die "unkown database: $option{i}"; + } +} + +if($option{o}) { + my $ids=get_discids($config{CD_DEVICE}); + + unless(-e $savedir) { + mkdir $savedir,0755 or die "cannot create $savedir"; + } + + open OUT,">$savedir/$ids->[0]\_$$" or die "cannot open outfile"; + print OUT Data::Dumper->Dump($ids,["diskid","total","toc"]); + close OUT; + + print STDERR "saved in: $savedir/$ids->[0]\_$$\n"; + exit; +} + +if($option{g}) { + print STDERR "retrieving stored cds ...\n"; + + opendir(DIR, $savedir) or die "cannot opendir $savedir"; + while (defined(my $file = readdir(DIR))) { + next if($file =~ /^\./); + print "\n"; + + my $in=`/bin/cat $savedir/$file`; + my $exit = $? >> 8; + + if($exit>0) { + die "error reading file"; + } + + unless($in=~ m/^\$diskid\s+=\s+('\d+'|\d+);\s+ # $diskid + \$total\s+=\s+('\d+'|\d+);\s+ # $total + \$toc\s+=\s+\[\s+ # $toc + (\{\s+ + ('(frame|frames|min|sec|data)'\s+=\>\s+('\d+'|\d+)(,|)\s+){5} + \}(,|)\s+)+ + \];\s+$/xs) { + print "not a save file: $savedir/$file\n"; + next; + } + + eval $in; + + if($@) { + print "not a save file (eval error): $savedir/$file\n"; + next; + } + + my %cd=get_cddb(\%config,[$diskid,$total,$toc]); + + unless(defined $cd{title}) { + print "no cddb entry found: $savedir/$file\n"; + } + + unlink "$savedir/$file"; + + next unless defined $cd{title}; + + if($option{d} || $option{s}) { + print_xmcd(\%cd,$option{s}); + } elsif($option{i}) { + insert_db(\%cd,\%db); + } elsif($option{l}) { + print_lame(\%cd); + } else { + print_cd(\%cd); + } + } + closedir(DIR); + exit; +} + +# get it on + +unless($config{multi}) { + my %cd; + + # for those who don't like 'die' in modules ;-) + eval { + %cd = get_cddb(\%config); + }; + if ($@) { + print "fatal error: $!\n"; + exit; + } + + print Dumper(\%cd) if $option{D}; + + unless(defined $cd{title}) { + die "no cddb entry found"; + } + + # do somthing with the results + + if($option{d} || $option{s}) { + print_xmcd(\%cd,$option{s}); + } elsif($option{i}) { + insert_db(\%cd,\%db); + } elsif($option{l}) { + print_lame(\%cd); + } else { + print_cd(\%cd); + } +} else { + my @cd; + + # for those who don't like 'die' in modules ;-) + eval { + @cd=get_cddb(\%config); + }; + if ($@) { + print "fatal error: $!\n"; + exit; + } + + print Dumper(\@cd) if $option{D}; + + for my $c (@cd) { + unless(defined $c->{title}) { + die "no cddb entry found"; + } + + # do somthing with the results + + if($option{d} || $option{s}) { + print_xmcd($c,$option{s}); + } elsif($option{i}) { + insert_db($c,\%db); + } elsif($option{l}) { + print_lame($c); + print "\n"; + } else { + print_cd($c); + print "\n"; + } + } +} + +exit; + + +# subroutines + +sub print_cd { + my $cd=shift; + + print "artist: $cd->{artist}\n"; + print "title: $cd->{title}\n"; + print "category: $cd->{cat}\n"; + print "genre: $cd->{genre}\n" if($cd->{genre}); + print "year: $cd->{year}\n" if($cd->{year}); + print "cddbid: $cd->{id}\n"; + print "trackno: $cd->{tno}\n"; + + my $n=1; + foreach my $i ( @{$cd->{track}} ) { + if($option{t}) { + my $from=$cd->{frames}[$n-1]; + my $to=$cd->{frames}[$n]-1; + my $dur=$to-$from; + my $min=int($dur/75/60); + my $sec=int($dur/75)-$min*60; + my $frm=($dur-$sec*75-$min*75*60)*100/75; + my $out=sprintf "track %2d: %8d - %8d [%2d:%.2d.%.2d]: $i\n",$n,$from,$to,$min,$sec,$frm; + print "$out"; + } else { + print "track $n: $i\n"; + } + $n++; + } +} + +sub print_xmcd { + my $cd=shift; + my $save=shift; + + *OUT=*STDOUT; + + if($save) { + unless(-e $xmcddir) { + mkdir $xmcddir,0755 or die "cannot create $savedir"; + } + + unless($option{O}) { + if(-e "$xmcddir/$cd->{id}") { + print "XMCD file exists\n"; + exit; + } + } + + open XMCD,">$xmcddir/$cd->{id}" or die "cannot open outfile"; + *OUT=*XMCD; + } + + for(@{$cd->{raw}}) { + print OUT "$_"; + } + + if($save) { + print STDERR "saved in: $xmcddir/$cd->{id}\n"; + close OUT; + } +} + +sub insert_db { + my $cd=shift; + my $db=shift; + + my ($artist, $title, $category, $cddbid, $trackno) = + ($cd->{artist}, $cd->{title}, $cd->{cat}, $cd->{id}, $cd->{tno}); + + my $sql = "SELECT cddbid FROM $db->{table_cds} WHERE CDDBID = \'$cddbid\'"; + my $dbh = DBI->connect($db->{connect}->()) or die "cannot connect to db: $DBI::errstr"; + my $sth = $dbh->prepare($sql); + my $r = $sth->execute or die "cannot check for cd: $DBI::errstr"; + if ($r == 1) { + print "cd already in db\n"; + if($option{O}) { + my $sql = "DELETE FROM $db->{table_cds} WHERE CDDBID = \'$cddbid\'"; + my $sth = $dbh->prepare($sql); + my $r = $sth->execute or die "cannot delete from $db->{table_cds}: $DBI::errstr"; + $sql = "DELETE FROM $db->{table_tracks} WHERE CDDBID = \'$cddbid\'"; + $sth = $dbh->prepare($sql); + $r = $sth->execute or die "cannot delete from $db->{table_tracks}: $DBI::errstr"; + } else { + exit; + } + } + + $title =~ s/'/\\'/g; + $artist =~ s/'/\\'/g; + $category =~ s/'/\\'/g; + + $sql = "INSERT INTO $db->{table_cds} (cddbid, artist, title, category, tracks) VALUES (\'$cddbid\', \'$artist\', \'$title\', \'$category\' , \'$trackno\')"; + $sth = $dbh->prepare($sql); + $r = $sth->execute or die "failed to insert cd: $DBI::errstr"; + + my $n=1; + + print "titel: $title\n"; + print "artist: $artist\n"; + print "category: $category\n\n"; + + for my $t ( @{$cd->{track}} ) { + $t =~ s/'/\\'/g; + my $dur=($cd->{frames}[$n]-1-$cd->{frames}[$n-1])/75; + my $hour=int($dur/3600); + my $min=int($dur/60-$hour*60); + my $sec=$dur-$hour*3600-$min*60; + my $fr=substr(sprintf("%5.2f",$sec-int($sec)),2,3); + my $time=sprintf "%.2d:%.2d:%.2d%s",$hour,$min,int($sec),$fr; + + print "track $n: $t [$time]\n"; + + my $sql = "INSERT INTO $db->{table_tracks} (cddbid, title, trackno, time) + VALUES (\'$cddbid\',\'$t\', \'$n\', \'$time\')"; + my $sth = $dbh->prepare($sql); + my $r = $sth->execute or die "failed to insert track $n: $DBI::errstr"; + $n++; + } + + $dbh->disconnect(); +} + +sub print_lame { + my $cd=shift; + + print_cd($cd); + print "\n"; + + my $n=1; + for my $i ( @{$cd->{track}} ) { + $i =~ s/"/'/g; + print 'lame --tl "'.$cd->{title}.'" --ta "'.$cd->{artist}.'" --tt "'.$i.'" '; + printf "audio_%02d.wav ",$n; + $i =~ s/[^\S]|['"\/]/_/g; + $i =~ s/_+-_+/-/g; + print " $i.mp3\n"; + $n++; + } +} diff --git a/cdinfo2xinf.xsl b/cdinfo2xinf.xsl new file mode 100755 index 0000000..0663532 --- /dev/null +++ b/cdinfo2xinf.xsl @@ -0,0 +1,40 @@ + + + + + + +cddb=`echo | sed 's/0x\(.*\)/\1/g'` +date=`date` + + + + + +track="`echo | /usr/bin/awk '{printf("%02d", $0)}'`" +track="${track}-" + +cat > "${track}.xinf" <<- end + # + # X-CD-Roast 0.98alpha15 - INF-File + # created: $date + # by: getcd.sh + # + file = "./${track}.wav" + track = of + title = "" + artist = "" + size = + type = 1 + rec_type = 0 + preemp = 0 + copyperm = 0 + stereo = 1 + # from CD: + cd_title = "" + cd_artist = "" + cd_discid = "$cddb" +end + + diff --git a/flac2mp3.xsl b/flac2mp3.xsl new file mode 100755 index 0000000..452ac5b --- /dev/null +++ b/flac2mp3.xsl @@ -0,0 +1,28 @@ + + + + + + +outdir="../../../mp3/" +outdir="$outdir/" +mkdirhier "$outdir" + + + + +tracknum=`echo | \ + awk '{printf("%02d", $0)}'` +title="" +flac -d -o - "$tracknum-$title.flac" | \ + lame -h --ta "" \ + --tl "" \ + --tg "" \ + --tt "" \ + --tn "" \ + --ty "" \ + --tc "" - \ + "$outdir/$tracknum-$title.mp3" + + diff --git a/flac2wav.xsl b/flac2wav.xsl new file mode 100755 index 0000000..b5a9b92 --- /dev/null +++ b/flac2wav.xsl @@ -0,0 +1,21 @@ + + + + + + +outdir="../../../wav/" +outdir="$outdir/" +mkdirhier "$outdir" + + + + +tracknum=`echo | \ + awk '{printf("%02d", $0)}'` +title="" +flac -d -o "$outdir/$tracknum-$title.wav" \ + "$tracknum-$title.flac" + + diff --git a/getcd.sh b/getcd.sh new file mode 100755 index 0000000..9175bfd --- /dev/null +++ b/getcd.sh @@ -0,0 +1,344 @@ +USAGE="usage: $0 [-d delimiter [-o {t|a}]] [-t {m|f|o}] [-p path] [-e encoder] [-c cddb-entry] [-h]\n" +USAGE="${USAGE} -d :\tA single character delimiting trackname from\n" +USAGE="${USAGE}\tartistname with sampler cds\n\n" +USAGE="${USAGE} -o :\tspecifies if theres the track or the artist first\n" +USAGE="${USAGE}\tMust be:\n" +USAGE="${USAGE}\t t for titel first or\n" +USAGE="${USAGE}\t a for artist first\n" +USAGE="${USAGE}\tIf there is none specified t is assumed\n" +USAGE="${USAGE} -t :\tyou can specify either m for encoding to mp3\n" +USAGE="${USAGE}\tusing lame, or f for making lossless encoding using flac,\n" +USAGE="${USAGE}\tor o for making ogg/vorbis, or w for uncompressed wav.\n" +USAGE="${USAGE}\tOmitting this results in encoding to flac.\n" +USAGE="${USAGE}\tmp3s will be placed under a subfolder mp3 and flacs\n" +USAGE="${USAGE}\tunder a subfolder flac\n" +USAGE="${USAGE} -p :\tspecifies the path to save the encoded data.\n" +USAGE="${USAGE}\tDefaults to the users home directory.\n" +USAGE="${USAGE} -e :\tspecifies the mp3 encoder to use.\n" +USAGE="${USAGE}\tvalid encoders are actually: lame,bladeenc\n" +USAGE="${USAGE}\tDefaults to lame.\n" +USAGE="${USAGE} -c :\tspecifies the CDDB-Entry to use.\n" +USAGE="${USAGE}\tsometimes there is more than 1 entry for a cd in cddb.\n" +USAGE="${USAGE}\tThen you can specify wich one to use by this option.\n" +USAGE="${USAGE}\tYou can checkout all entries using cddb.pl.\n" +USAGE="${USAGE} -h :\tShows this help." + +HAS_DELIMITER=0 +TA_ORDER="t" +ENCODING_DIR=$HOME +ENCODING_TYPE="f" +ENCODER="lame" +CDDB_ENTRY=1 + +while getopts d:o:t:p:he:c: option +do + case $option in + d) if [ ${#OPTARG} -gt 1 ] + then + echo -e "$USAGE" + exit 1 + fi + HAS_DELIMITER=1 + TA_DELIMITER=$OPTARG + ;; + o) if [ \( "${OPTARG}" != "t" -a "${OPTARG}" != "a" \) -o \ + ${HAS_DELIMITER} -eq 0 ] + then + echo -e "$USAGE" + exit 1 + fi + TA_ORDER=$OPTARG + ;; + t) if [ ${OPTARG} != "m" -a ${OPTARG} != "f" -a ${OPTARG} != "o" -a \ + ${OPTARG} != "w" ] + then + echo -e "$USAGE" + exit 1 + fi + ENCODING_TYPE=$OPTARG + ;; + p) if [ ! \( -d ${OPTARG} \) ] + then + echo -e "$USAGE" + exit 1 + fi + ENCODING_DIR=$OPTARG + ;; + e) if [ -z ${OPTARG} ] + then + echo -e "$USAGE" + exit 1 + fi + ENCODER=$OPTARG + ;; + c) if [ ${OPTARG} -lt 1 ] + then + echo -e "$USAGE" + exit 1 + fi + CDDB_ENTRY=$OPTARG + ;; + [h\?]) echo -e "$USAGE" + exit 1 + ;; + esac +done + +test "$ENCODING_TYPE" = "m" && ENCODING_DIR="$ENCODING_DIR/mp3" +test "$ENCODING_TYPE" = "f" && ENCODING_DIR="$ENCODING_DIR/flac" +test "$ENCODING_TYPE" = "o" && ENCODING_DIR="$ENCODING_DIR/ogg" +test "$ENCODING_TYPE" = "w" && ENCODING_DIR="$ENCODING_DIR/wav" + +indices[0]="album" +indices[1]="artist" +indices[2]="genre" +indices[3]="year" +indices[4]="comment" + +i=1 +max_track=30 + +while [ $i -le $max_track ]; do + indices[`expr \( $i \- 1 \) \* 2 \+ 5`]="`echo $i | \ + sed 's/^\([0-9]\)$/0\1/g;\ + s/\(.*\)/track-\1/g'`" + indices[`expr \( $i \- 1 \) \* 2 \+ 6`]="`echo $i | \ + sed 's/^\([0-9]\)$/0\1/g;\ + s/\(.*\)/tartist-\1/g'`" + i=`expr $i \+ 1` +done + +comment="" + +function idxof() { + str=$1 + idx=0 + + for i in "${indices[@]}"; do + test "$i" == "$str" && echo $idx && return 0 + idx=`expr $idx \+ 1` + done + + echo -1 + return 0 +} + +title_pat="/^[^:]*: *(.*[^ ]).*/" +artist_pat="//" + +if [ $HAS_DELIMITER -ne 0 ] +then + if [ $TA_ORDER == "t" ] + then + title_pat="/^[^:]*: *([^\\${TA_DELIMITER}]*[^ \\${TA_DELIMITER}]).*/" + artist_pat="/^[^:]*: *[^\\${TA_DELIMITER}]*\\${TA_DELIMITER} *(.*[^ ]).*/" + else + artist_pat="/^[^:]*: *([^\\${TA_DELIMITER}]*[^ \\${TA_DELIMITER}]).*/" + title_pat="/^[^:]*: *[^\\${TA_DELIMITER}]*\\${TA_DELIMITER} *(.*[^ ]).*/" + fi +fi + +echo "Preparing...." + +echo -n "getting cddb info..." +eval "`cddb.pl -e $CDDB_ENTRY | sed 's/ \([0-9]\):/ 0\1:/g;s/track /track-/g' |\ + awk -v has_delimiter=$HAS_DELIMITER \ + '/artist/||/title/||/genre/||/year/ { \ + cddb[gensub(/^([^:]*):.*/, \"\\\\1\", \"1\")]=\ + gensub(/^[^:]*: *(.*[^ ]).*/, \"\\\\1\", \"g\")\ + } \ + /trackno/ {\ + trackno=int(gensub(/^trackno: *([0-9]*).*/, \"\\\\1\", \"1\"))\ + }\ + /track-/ {\ + cddb[gensub(/^([^:]*):.*/, \"\\\\1\", \"1\")]=\ + gensub('\"$title_pat\"', \"\\\\1\", \"1\");\ + if(has_delimiter==0) \ + cddb[gensub(/^track([^:]*):.*/, \"tarti\\\\1\", \"1\")]=\ + cddb[\"artist\"]; \ + else \ + cddb[gensub(/^track([^:]*):.*/, \"tarti\\\\1\", \"1\")]=\ + gensub('\"$artist_pat\"', \"\\\\1\", \"1\");\ + } \ + END {\ + cddb_str=\"cddb=(\\\"\" cddb[\"title\"] \"\\\" \\\"\" \ + cddb[\"artist\"] \"\\\" \\\"\" \ + cddb[\"genre\"] \"\\\" \\\"\" \ + cddb[\"year\"] \"\\\" \\\"'$comment'\\\"\"; \ + for(i=1; i<=trackno; i++) {\ + cddb_str=cddb_str \" \\\"\" \ + cddb[\"track-\" sprintf(\"%02s\", i)] \"\\\"\";\ + cddb_str=cddb_str \" \\\"\" \ + cddb[\"tarti-\" sprintf(\"%02s\", i)] \"\\\"\"\ + }\ + print cddb_str \")\"\ + }'`" +echo "done" + +echo -n "getting CD info..." +cddainfo=`cdda2wav -H -D/dev/cdrom -J -v summary,toc,sectors 2>&1` +echo "done" + +track_num=`echo "$cddainfo" | \ + sed '/tracks/{s/^.*tracks:\([0-9]*\).*$/\1/g;p};d'` +cd_time=`echo "$cddainfo" | \ + sed '/tracks/{s/^.*time \([0-9:\.]*\).*$/\1/g;p};d'` +cddbid=`echo "$cddainfo" | \ + sed '/CDDB/{s/^.*discid: *\(0x[a-z0-9]*[^ ]\).*/\1/g;p};d'` +cdindex=`echo "$cddainfo" | \ + sed '/CDINDEX/{s/^.*discid: *\([a-zA-Z0-9_\.]*-\).*/\1/g;p};d'` +cdtext=`echo "$cddainfo" | sed '/CD-Text/{s/^[^:]*: *\(.*[^ ]\).*/\1/g + s/&/\&\;/g;s/\"/\"\;/g + s//\>\;/g + s/\o47/\&apos\;/g + p};d'` +cdextra=`echo "$cddainfo" | sed '/CD-Extra/{s/^[^:]*: *\(.*[^ ]\).*/\1/g + s/&/\&\;/g;s/\"/\"\;/g + s//\>\;/g + s/\o47/\&apos\;/g + p};d'` + +ENCODING_DIR="${ENCODING_DIR}/${cddb[`idxof "artist"`]}/" +ENCODING_DIR="${ENCODING_DIR}${cddb[`idxof "album"`]}/" +mkdirhier "$ENCODING_DIR" +echo "Output directory is: $ENCODING_DIR" + +xmlfile="${ENCODING_DIR}cdinfo.xml" + +# some special chars within xml must be converted to special syntax +# & => & +# " => " +# ' => ' +# < => < +# > => > +xmlartist=`echo ${cddb[\`idxof "artist"\`]} | \ + sed 's/&/\&\;/g + s//\>\;/g + s/\"/\"\;/g + s/\o47/\&apos\;/g'` +xmlalbum=`echo ${cddb[\`idxof "album"\`]} | \ + sed 's/&/\&\;/g + s//\>\;/g + s/\"/\"\;/g + s/\o47/\&apos\;/g'` + +echo "" > "${xmlfile}" +echo "" >> "${xmlfile}" +echo "" >> "${xmlfile}" +echo " $cdindex" >> "${xmlfile}" +echo " $cddbid" >> "${xmlfile}" +echo " $cdtext" >> "${xmlfile}" +echo " $cdextra" >> "${xmlfile}" +echo " ${xmlartist}" >> "${xmlfile}" +echo " ${xmlalbum}" >> "${xmlfile}" +echo " ${cddb[`idxof "year"`]}" >> "${xmlfile}" +echo " ${cddb[`idxof "genre"`]}" >> "${xmlfile}" +echo " $cd_time" >> "${xmlfile}" +echo " $track_num" >> "${xmlfile}" +echo " " >> "${xmlfile}" + +i=1; while [ $i -le $track_num ] +do + j=`expr $i \+ 1` + tracknr=`awk 'BEGIN{printf("%02d\n",'$i')}'` + track=${cddb[`idxof "track-$tracknr"`]} + tartist=${cddb[`idxof "tartist-$tracknr"`]} + + xmltrack=`echo ${track} | sed 's/&/\&\;/g + s//\>\;/g + s/\"/\"\;/g + s/\o47/\&apos\;/g'` + xmltartist=`echo ${tartist} | sed 's/&/\&\;/g + s//\>\;/g + s/\"/\"\;/g + s/\o47/\&apos\;/g'` + + tracklen=`echo "$cddainfo" | \ + sed '/ '"$i"'\.([0-9 ]*:/{s/.*'"$i"'\.( *\([0-9:\.]*\)).*/\1/g;p};d'` + trackstart=`echo "$cddainfo" | \ + sed '/ '"$i"'\.([0-9 ]*)/{s/.*'"$i"'\.( *\([0-9]*\)).*/\1/g;p};d'` + test $i -eq $track_num && \ + trackend=`echo "$cddainfo" | \ + sed '/ lead-out([0-9 ]*)/{s/.*lead-out( *\([0-9]*\)).*/\1/g;p};d'` || \ + trackend=`echo "$cddainfo" | \ + sed '/ '"$j"'\.([0-9 ]*)/{s/.*'"$j"'\.( *\([0-9]*\)).*/\1/g;p};d'` + + echo " " >> "${xmlfile}" + echo " $i" >> "${xmlfile}" + echo " $tracklen" >> "${xmlfile}" + echo " $trackstart" >> "${xmlfile}" + echo " `expr $trackend \- $trackstart`" >> "${xmlfile}" + echo " $xmltartist" >> "${xmlfile}" + echo " $xmltrack" >> "${xmlfile}" + echo " " >> "${xmlfile}" + echo " " >> "${xmlfile}" + + # outfile="${ENCODING_DIR}The Wall/Disk2/" + outfile="${ENCODING_DIR}${tracknr}-${track}" + + test "$ENCODING_TYPE" = "f" && \ + outstr="track-$tracknr => ${tracknr}-${track}.flac" + test "$ENCODING_TYPE" = "m" && \ + outstr="track-$tracknr => ${tracknr}-${track}.mp3" + test "$ENCODING_TYPE" = "o" && \ + outstr="track-$tracknr => ${tracknr}-${track}.ogg" + test "$ENCODING_TYPE" = "w" && \ + outstr="track-$tracknr => ${tracknr}-${track}.wav" + + if [ "$ENCODING_TYPE" = "f" ] + then + bash -c "exec 2>&1;\ + cdda2wav -H -D/dev/cdrom -H -t$i - | \ + flac -c \ + -T artist=\"${tartist}\" -T album=\"${cddb[`idxof "album"`]}\" \ + -T genre=\"${cddb[`idxof "genre"`]}\" -T title=\"${track}\" \ + -T tnum=\"`expr ${tracknr} \+ 0`\" -T date=\"${cddb[`idxof "year"`]}\" \ + -T comment=\"${cddb[`idxof "comment"`]}\" \ + -o \"${outfile}.flac\" - 2>/dev/null" | rton | \ + awk '/ [0-9 ][0-9]%/ && percent!=$5{percent=$5;printf("\r'"$outstr"': %s", percent)}END{print "\r'"$outstr"': 100%"}' + fi + if [ "$ENCODING_TYPE" = "m" -a "$ENCODER" = "lame" ] + then + bash -c "exec 2>&1;\ + cdda2wav -H -D/dev/cdrom -t$i - | \ + lame -h \ + --ta \"${tartist}\" --tl \"${cddb[`idxof "album"`]}\" \ + --tg \"${cddb[`idxof "genre"`]}\" --tt \"${track}\" \ + --tn \"`expr ${tracknr} \+ 0`\" --ty \"${cddb[`idxof "year"`]}\" \ + --tc \"${cddb[`idxof "comment"`]}\" \ + - \"${outfile}.mp3\" 2>/dev/null" | rton | \ + awk '/ [0-9 ][0-9]%/ && percent!=$5{percent=$5;printf("\r'"$outstr"': %s", percent)}END{print "\r'"$outstr"': 100%"}' + fi + if [ "$ENCODING_TYPE" = "m" -a "$ENCODER" = "bladeenc" ] + then + bash -c "exec 2>&1;\ + cdda2wav -H -D/dev/cdrom -t$i - | \ + bladeenc -progress=0 STDIN \"${outfile}.mp3\" 2>/dev/null" | rton | \ + awk '/ [0-9 ][0-9]%/ && percent!=$5{percent=$5;printf("\r'"$outstr"': %s", percent)}END{print "\r'"$outstr"': 100%"}' + fi + if [ "$ENCODING_TYPE" = "o" ] + then + bash -c "exec 2>&1;\ + cdda2wav -H -D/dev/cdrom -t$i - | \ + oggenc -a \"${tartist}\" -l \"${cddb[`idxof "album"`]}\" \ + -G \"${cddb[`idxof "genre"`]}\" -t \"${track}\" \ + -N \"`expr ${tracknr} \+ 0`\" -d \"${cddb[`idxof "year"`]}\" \ + -c \"${cddb[`idxof "comment"`]}\" \ + -o \"${outfile}.ogg\" - 2>/dev/null" | rton | \ + awk '/ [0-9 ][0-9]%/ && percent!=$5{percent=$5;printf("\r'"$outstr"': %s", percent)}END{print "\r'"$outstr"': 100%"}' + fi + if [ "$ENCODING_TYPE" = "w" ] + then + bash -c "exec 2>&1;\ + cdda2wav -H -D/dev/cdrom -t$i - > \"${outfile}.wav\"" | rton | \ + awk '/ [0-9 ][0-9]%/ && percent!=$5{percent=$5;printf("\r'"$outstr"': %s", percent)}END{print "\r'"$outstr"': 100%"}' + fi + + i=`expr $i + 1` +done + +echo "" >> "${xmlfile}" diff --git a/getcd.sh.neu b/getcd.sh.neu new file mode 100755 index 0000000..56081c8 --- /dev/null +++ b/getcd.sh.neu @@ -0,0 +1,350 @@ +USAGE="usage: $0 [-d delimiter [-o {t|a}]] [-t {m|f|o}] [-p path] [-e encoder] [-c cddb-entry] [-h]\n" +USAGE="${USAGE} -d :\tA single character delimiting trackname from\n" +USAGE="${USAGE}\tartistname with sampler cds\n\n" +USAGE="${USAGE} -o :\tspecifies if theres the track or the artist first\n" +USAGE="${USAGE}\tMust be:\n" +USAGE="${USAGE}\t t for titel first or\n" +USAGE="${USAGE}\t a for artist first\n" +USAGE="${USAGE}\tIf there is none specified t is assumed\n" +USAGE="${USAGE} -t :\tyou can specify either m for encoding to mp3\n" +USAGE="${USAGE}\tusing lame, or f for making lossless encoding using flac,\n" +USAGE="${USAGE}\tor o for making ogg/vorbis, or w for uncompressed wav.\n" +USAGE="${USAGE}\tOmitting this results in encoding to flac.\n" +USAGE="${USAGE}\tmp3s will be placed under a subfolder mp3 and flacs\n" +USAGE="${USAGE}\tunder a subfolder flac\n" +USAGE="${USAGE} -p :\tspecifies the path to save the encoded data.\n" +USAGE="${USAGE}\tDefaults to the users home directory.\n" +USAGE="${USAGE} -e :\tspecifies the mp3 encoder to use.\n" +USAGE="${USAGE}\tvalid encoders are actually: lame,bladeenc\n" +USAGE="${USAGE}\tDefaults to lame.\n" +USAGE="${USAGE} -c :\tspecifies the CDDB-Entry to use.\n" +USAGE="${USAGE}\tsometimes there is more than 1 entry for a cd in cddb.\n" +USAGE="${USAGE}\tThen you can specify wich one to use by this option.\n" +USAGE="${USAGE}\tYou can checkout all entries using cddb.pl.\n" +USAGE="${USAGE} -h :\tShows this help." + +PATH="$PATH:." + +HAS_DELIMITER=0 +TA_ORDER="t" +ENCODING_DIR=$HOME +ENCODING_TYPE="f" +ENCODER="lame" +CDDB_ENTRY=1 + +while getopts d:o:t:p:he:c: option +do + case $option in + d) if [ ${#OPTARG} -gt 1 ] + then + echo -e "$USAGE" + exit 1 + fi + HAS_DELIMITER=1 + TA_DELIMITER=$OPTARG + ;; + o) if [ \( "${OPTARG}" != "t" -a "${OPTARG}" != "a" \) -o \ + ${HAS_DELIMITER} -eq 0 ] + then + echo -e "$USAGE" + exit 1 + fi + TA_ORDER=$OPTARG + ;; + t) if [ ${OPTARG} != "m" -a ${OPTARG} != "f" -a ${OPTARG} != "o" -a \ + ${OPTARG} != "w" ] + then + echo -e "$USAGE" + exit 1 + fi + ENCODING_TYPE=$OPTARG + ;; + p) if [ ! \( -d ${OPTARG} \) ] + then + echo -e "$USAGE" + exit 1 + fi + ENCODING_DIR=$OPTARG + ;; + e) if [ -z ${OPTARG} ] + then + echo -e "$USAGE" + exit 1 + fi + ENCODER=$OPTARG + ;; + c) if [ ${OPTARG} -lt 1 ] + then + echo -e "$USAGE" + exit 1 + fi + CDDB_ENTRY=$OPTARG + ;; + [h\?]) echo -e "$USAGE" + exit 1 + ;; + esac +done + +test "$ENCODING_TYPE" = "m" && ENCODING_DIR="$ENCODING_DIR/mp3" +test "$ENCODING_TYPE" = "f" && ENCODING_DIR="$ENCODING_DIR/flac" +test "$ENCODING_TYPE" = "o" && ENCODING_DIR="$ENCODING_DIR/ogg" +test "$ENCODING_TYPE" = "w" && ENCODING_DIR="$ENCODING_DIR/wav" + +indices[0]="album" +indices[1]="artist" +indices[2]="genre" +indices[3]="year" +indices[4]="comment" + +i=1 +max_track=30 + +while [ $i -le $max_track ]; do + indices[`expr \( $i \- 1 \) \* 2 \+ 5`]="`echo $i | \ + sed 's/^\([0-9]\)$/0\1/g;\ + s/\(.*\)/track-\1/g'`" + indices[`expr \( $i \- 1 \) \* 2 \+ 6`]="`echo $i | \ + sed 's/^\([0-9]\)$/0\1/g;\ + s/\(.*\)/tartist-\1/g'`" + i=`expr $i \+ 1` +done + +comment="" + +function idxof() { + str=$1 + idx=0 + + for i in "${indices[@]}"; do + test "$i" == "$str" && echo $idx && return 0 + idx=`expr $idx \+ 1` + done + + echo -1 + return 0 +} + +title_pat="/^[^:]*: *(.*[^ ]).*/" +artist_pat="//" + +if [ $HAS_DELIMITER -ne 0 ] +then + if [ $TA_ORDER == "t" ] + then + title_pat="/^[^:]*: *([^\\${TA_DELIMITER}]*[^ \\${TA_DELIMITER}]).*/" + artist_pat="/^[^:]*: *[^\\${TA_DELIMITER}]*\\${TA_DELIMITER} *(.*[^ ]).*/" + else + artist_pat="/^[^:]*: *([^\\${TA_DELIMITER}]*[^ \\${TA_DELIMITER}]).*/" + title_pat="/^[^:]*: *[^\\${TA_DELIMITER}]*\\${TA_DELIMITER} *(.*[^ ]).*/" + fi +fi + +echo "Preparing...." + +echo -n "getting cddb info..." +eval "`cddb.pl -c /dev/cdrom1 -e $CDDB_ENTRY | sed 's/ \([0-9]\):/ 0\1:/g;s/track /track-/g' |\ + awk -v has_delimiter=$HAS_DELIMITER \ + '/artist/||/title/||/genre/||/year/ { \ + cddb[gensub(/^([^:]*):.*/, \"\\\\1\", \"1\")]=\ + gensub(/^[^:]*: *(.*[^ ]).*/, \"\\\\1\", \"g\")\ + } \ + /trackno/ {\ + trackno=int(gensub(/^trackno: *([0-9]*).*/, \"\\\\1\", \"1\"))\ + }\ + /track-/ {\ + cddb[gensub(/^([^:]*):.*/, \"\\\\1\", \"1\")]=\ + gensub('\"$title_pat\"', \"\\\\1\", \"1\");\ + if(has_delimiter==0) \ + cddb[gensub(/^track([^:]*):.*/, \"tarti\\\\1\", \"1\")]=\ + cddb[\"artist\"]; \ + else \ + cddb[gensub(/^track([^:]*):.*/, \"tarti\\\\1\", \"1\")]=\ + gensub('\"$artist_pat\"', \"\\\\1\", \"1\");\ + } \ + END {\ + cddb_str=\"cddb=(\\\"\" cddb[\"title\"] \"\\\" \\\"\" \ + cddb[\"artist\"] \"\\\" \\\"\" \ + cddb[\"genre\"] \"\\\" \\\"\" \ + cddb[\"year\"] \"\\\" \\\"'$comment'\\\"\"; \ + for(i=1; i<=trackno; i++) {\ + cddb_str=cddb_str \" \\\"\" \ + cddb[\"track-\" sprintf(\"%02s\", i)] \"\\\"\";\ + cddb_str=cddb_str \" \\\"\" \ + cddb[\"tarti-\" sprintf(\"%02s\", i)] \"\\\"\"\ + }\ + print cddb_str \")\"\ + }'`" +echo "done" + +echo -n "getting CD info..." +cddainfo=`cdda2wav -H -D/dev/cdrom1 -J -v summary,toc,sectors 2>&1` +echo "done" + +track_num=`echo "$cddainfo" | \ + sed '/tracks/{s/^.*tracks:\([0-9]*\).*$/\1/g;p};d'` +cd_time=`echo "$cddainfo" | \ + sed '/tracks/{s/^.*time \([0-9:\.]*\).*$/\1/g;p};d'` +cddbid=`echo "$cddainfo" | \ + sed '/CDDB/{s/^.*discid: *\(0x[a-z0-9]*[^ ]\).*/\1/g;p};d'` +cdindex=`echo "$cddainfo" | \ + sed '/CDINDEX/{s/^.*discid: *\([a-zA-Z0-9_\.]*-\).*/\1/g;p};d'` +cdtext=`echo "$cddainfo" | sed '/CD-Text/{s/^[^:]*: *\(.*[^ ]\).*/\1/g + s/&/\&\;/g;s/\"/\"\;/g + s//\>\;/g + s/\o47/\&apos\;/g + p};d'` +cdextra=`echo "$cddainfo" | sed '/CD-Extra/{s/^[^:]*: *\(.*[^ ]\).*/\1/g + s/&/\&\;/g;s/\"/\"\;/g + s//\>\;/g + s/\o47/\&apos\;/g + p};d'` + +# cddb[`idxof "artist"`]="Blue Öyster Cult" +ENCODING_DIR="${ENCODING_DIR}/${cddb[`idxof "artist"`]}/" +ENCODING_DIR="${ENCODING_DIR}${cddb[`idxof "album"`]}/" +mkdirhier "$ENCODING_DIR" +echo "Output directory is: $ENCODING_DIR" + +xmlfile="${ENCODING_DIR}cdinfo.xml" + +# some special chars within xml must be converted to special syntax +# & => & +# " => " +# ' => ' +# < => < +# > => > +xmlartist=`echo ${cddb[\`idxof "artist"\`]} | \ + sed 's/&/\&\;/g + s//\>\;/g + s/\"/\"\;/g + s/\o47/\&apos\;/g'` +xmlalbum=`echo ${cddb[\`idxof "album"\`]} | \ + sed 's/&/\&\;/g + s//\>\;/g + s/\"/\"\;/g + s/\o47/\&apos\;/g'` + +echo "" > "${xmlfile}" +echo "" >> "${xmlfile}" +echo "" >> "${xmlfile}" +echo " $cdindex" >> "${xmlfile}" +echo " $cddbid" >> "${xmlfile}" +echo " $cdtext" >> "${xmlfile}" +echo " $cdextra" >> "${xmlfile}" +echo " ${xmlartist}" >> "${xmlfile}" +echo " ${xmlalbum}" >> "${xmlfile}" +echo " ${cddb[`idxof "year"`]}" >> "${xmlfile}" +echo " ${cddb[`idxof "genre"`]}" >> "${xmlfile}" +echo " $cd_time" >> "${xmlfile}" +echo " $track_num" >> "${xmlfile}" +echo " " >> "${xmlfile}" + +i=1; while [ $i -le $track_num ] +do + j=`expr $i \+ 1` + tracknr=`awk 'BEGIN{printf("%02d\n",'$i')}'` + track=${cddb[`idxof "track-$tracknr"`]} + tartist=${cddb[`idxof "tartist-$tracknr"`]} + + xmltrack=`echo ${track} | sed 's/&/\&\;/g + s//\>\;/g + s/\"/\"\;/g + s/\o47/\&apos\;/g'` + xmltartist=`echo ${tartist} | sed 's/&/\&\;/g + s//\>\;/g + s/\"/\"\;/g + s/\o47/\&apos\;/g'` + + tracklen=`echo "$cddainfo" | \ + sed '/ '"$i"'\.([0-9 ]*:/{s/.*'"$i"'\.( *\([0-9:\.]*\)).*/\1/g;p};d'` + trackstart=`echo "$cddainfo" | \ + sed '/ '"$i"'\.([0-9 ]*)/{s/.*'"$i"'\.( *\([0-9]*\)).*/\1/g;p};d'` + test $i -eq $track_num && \ + trackend=`echo "$cddainfo" | \ + sed '/ lead-out([0-9 ]*)/{s/.*lead-out( *\([0-9]*\)).*/\1/g;p};d'` || \ + trackend=`echo "$cddainfo" | \ + sed '/ '"$j"'\.([0-9 ]*)/{s/.*'"$j"'\.( *\([0-9]*\)).*/\1/g;p};d'` + + test -z "$trackstart" -o -z "$trackend" && echo "Disk Error" && exit 1 + + echo " " >> "${xmlfile}" + echo " $i" >> "${xmlfile}" + echo " $tracklen" >> "${xmlfile}" + echo " $trackstart" >> "${xmlfile}" + echo " `expr $trackend \- $trackstart`" >> "${xmlfile}" + echo " $xmltartist" >> "${xmlfile}" + echo " $xmltrack" >> "${xmlfile}" + echo " " >> "${xmlfile}" + echo " " >> "${xmlfile}" + + # outfile="${ENCODING_DIR}The Wall/Disk2/" + outfile="${ENCODING_DIR}${tracknr}-${track}" + + test "$ENCODING_TYPE" = "f" && \ + outstr="track-$tracknr => ${tracknr}-${track}.flac" + test "$ENCODING_TYPE" = "m" && \ + outstr="track-$tracknr => ${tracknr}-${track}.mp3" + test "$ENCODING_TYPE" = "o" && \ + outstr="track-$tracknr => ${tracknr}-${track}.ogg" + test "$ENCODING_TYPE" = "w" && \ + outstr="track-$tracknr => ${tracknr}-${track}.wav" + + if [ "$ENCODING_TYPE" = "f" ] + then + bash -c "exec 2>&1;\ + cdda2wav -H -D0,4,0 -t$i - | \ + flac -c \ + -T artist=\"${tartist}\" -T album=\"${cddb[`idxof "album"`]}\" \ + -T genre=\"${cddb[`idxof "genre"`]}\" -T title=\"${track}\" \ + -T tracknumber=\"`expr ${tracknr} \+ 0`\" \ + -T tracknum=\"`expr ${tracknr} \+ 0`\" -T date=\"${cddb[`idxof "year"`]}\" \ + -T comment=\"${cddb[`idxof "comment"`]}\" \ + -o \"${outfile}.flac\" - 2>/dev/null" | rton | \ + awk '/ [0-9 ][0-9]%/ && percent!=$5{percent=$5;printf("\r'"$outstr"': %s", percent)}END{print "\r'"$outstr"': 100%"}' + fi + if [ "$ENCODING_TYPE" = "m" -a "$ENCODER" = "lame" ] + then + bash -c "exec 2>&1;\ + cdda2wav -H -D0,4,0 -t$i - | \ + lame -h \ + --ta \"${tartist}\" --tl \"${cddb[`idxof "album"`]}\" \ + --tg \"${cddb[`idxof "genre"`]}\" --tt \"${track}\" \ + --tn \"`expr ${tracknr} \+ 0`\" --ty \"${cddb[`idxof "year"`]}\" \ + --tc \"${cddb[`idxof "comment"`]}\" \ + - \"${outfile}.mp3\" 2>/dev/null" | rton | \ + awk '/ [0-9 ][0-9]%/ && percent!=$5{percent=$5;printf("\r'"$outstr"': %s", percent)}END{print "\r'"$outstr"': 100%"}' + fi + if [ "$ENCODING_TYPE" = "m" -a "$ENCODER" = "bladeenc" ] + then + bash -c "exec 2>&1;\ + cdda2wav -H -D0,4,0 -t$i - | \ + bladeenc -progress=0 STDIN \"${outfile}.mp3\" 2>/dev/null" | rton | \ + awk '/ [0-9 ][0-9]%/ && percent!=$5{percent=$5;printf("\r'"$outstr"': %s", percent)}END{print "\r'"$outstr"': 100%"}' + fi + if [ "$ENCODING_TYPE" = "o" ] + then + bash -c "exec 2>&1;\ + cdda2wav -H -D0,4,0 -t$i - | \ + oggenc -a \"${tartist}\" -l \"${cddb[`idxof "album"`]}\" \ + -G \"${cddb[`idxof "genre"`]}\" -t \"${track}\" \ + -N \"`expr ${tracknr} \+ 0`\" -d \"${cddb[`idxof "year"`]}\" \ + -c \"${cddb[`idxof "comment"`]}\" \ + -o \"${outfile}.ogg\" - 2>/dev/null" | rton | \ + awk '/ [0-9 ][0-9]%/ && percent!=$5{percent=$5;printf("\r'"$outstr"': %s", percent)}END{print "\r'"$outstr"': 100%"}' + fi + if [ "$ENCODING_TYPE" = "w" ] + then + bash -c "exec 2>&1;\ + cdda2wav -H -D0,4,0 -t$i - > \"${outfile}.wav\"" | rton | \ + awk '/ [0-9 ][0-9]%/ && percent!=$5{percent=$5;printf("\r'"$outstr"': %s", percent)}END{print "\r'"$outstr"': 100%"}' + fi + + i=`expr $i + 1` +done + +echo "" >> "${xmlfile}" diff --git a/getcd.xml b/getcd.xml new file mode 100755 index 0000000..0299145 --- /dev/null +++ b/getcd.xml @@ -0,0 +1,35 @@ + + + +2pGK39LLL22K6K8mFDegkBNR39M- +0x0911a912 + + +Various +1998 +Alternative + +1 +3:42.20 +32 +Guano Apes +Lords Of The Boards + + + +2 +4:45.70 +16702 +Rammstein +Das Modell + + + +3 +4:11.08 +38147 +Faith No More +Last Cup Of Sorrow + + + diff --git a/install b/install new file mode 100755 index 0000000..6fb00fb --- /dev/null +++ b/install @@ -0,0 +1,72 @@ +Files in this package +--------------------- + getcd.sh (The main script that does most of the work) + rton.c (A VERY small c-prog, that converts \r (carriage return) + to \n (line feed). It is needed to fetch the percent + complete messages from cdda2wav) + flac2mp3.xsl (xml stylesheet to convert cdinfo.xml in shell commands + that will create .flac from .mp3 files) + flac2wav.xsl (xml stylesheet to convert cdinfo.xml in shell commands + that will create .flac from .wav files) + mp32wav.xsl (xml stylesheet to convert cdinfo.xml in shell commands + that will create .wav from .mp3 files) + cdinfo2xinf.xsl (xml stylesheet to convert cdinfo.xml in shell commands + that create the .xinf Files used by xcdroast) + CDDB_get-2.23p1.patch (a patch for cddb.pl that makes it possible to + select one of multiple cddb-entrys at calltime) + README (Overview and Information) + INSTALL (This file, howto make something useful from it) + USAGE (How to use the script) + + +Requirments +----------- +first you need some software to run this script. + CDDB_get-2.23 (http://armin.emx.at/cddb/) + lame (http://lame.sourceforge.net/) + bladeenc (http://bladeenc.mp3.no/) + flac (http://flac.sourceforge.net/) + vorbis-tools (http://www.vorbis.com/download_unix_1.0.1.psp) + libxml2 (http://xmlsoft.org/) + +I assume you have a working sed and awk, else you need to install them too. + +Install lame, bladeenc, flac, vorbis-tools and libxml2 as discribed within +these packages. + +unpack CDDB_get-2.23.tar.gz and patch it with CDDB_get-2.23p1.patch. +For this copy both files in a directory dir then do the following: + +me@house:~> cd dir +me@house:~/dir> tar xfvz CDDB_get-2.23.tar.gz +me@house:~/dir/CDDB_get-2.23> patch -p1 -E < ../CDDB_get-2.23p1.patch + +now install it as usual (and described within the README from CDDB_get) + +now go in the directory where rton.c exists. +type here: gcc -o rton rton.c +and then copy rton in a directory in your path. + +Finally copy getcd.sh somewhere in you path. + +now you can use getcd.sh. For a short description how to use it either +read USAGE or type getcd.sh -h. + +IMPORTANT: Any user who should use this script needs read-access to the +cdrom device, additional it is actually necessary to create a symlink +/dev/cdrom to your real device eg. /dev/sr0 or /dev/hdb. And the user must have +access to the internet. + +Note +---- +Please note that this is not a release. You can use it and it will not harm +anything as for as I can say, but it might not work with some configurations +or CDs. +In the release there will be some kind of detection which tools are present and +witch not and the script will use only present tools or give an error +description. +Note further that it is desired to modify the script for your needs. It is not +very complex and with some error and trial it will be possible to tailor it +exactly for your needs. In future there will be configuration files to make it +even more ease to configure the script for your situation. (I am thinking +about reqriting the script in c) diff --git a/mp32wav.xsl b/mp32wav.xsl new file mode 100755 index 0000000..799d540 --- /dev/null +++ b/mp32wav.xsl @@ -0,0 +1,21 @@ + + + + + + +outdir="../../../wav/" +outdir="$outdir/" +mkdirhier "$outdir" + + + + +tracknum=`echo | \ + awk '{printf("%02d", $0)}'` +title="" +lame --decode "$tracknum-$title.flac" \ + "$outdir/$tracknum-$title.wav" + + diff --git a/readme b/readme new file mode 100755 index 0000000..b79a508 --- /dev/null +++ b/readme @@ -0,0 +1,30 @@ +This is another shell script that combines cdda2wav with various encoders. + +As I started this i was not pleased by any of the existent grabber/encoder +frontends. So I decided to create my own one. The goal was to rip and encode in +one step without creating any temporary .wav file and to have a simple command +with only a few easy arguments to control this command. + +Now getcd.sh is a not to complicated bash script that uses awk, sed, cdda2wav, +flac, lame, bladeenc, ogg/vorbis, cddb.pl (in a slightly patched version). +It encodes tracks from the cd to a spcifiable base directory without creating +any temporary files. +It creates subdirectorys basedir/[mp3|flac|ogg|wav]/artist/cd-title for the +corresponding encoding-method and save files with the name +trackno-tracktitle.[mp3|flac|ogg|wav] again corresponding to the used +encoding-method. +If one encodes a sampler-cd (cd with various artists) it is often so, that +the artist of the track is mentioned in the cddb-track-title. For this reason +one can specify a delimiting character and the order (artist or title first) to +split the cddb-track-info and generate correct id3tags or similar. + +Additional to the encoded files getcd.sh creates an file cdinfo.xml which +contains all essential information of the original CD. I have written also +some xslt files that can be used to create .xinf files for xcdroast and to +create .wav from .flac or .mp3. It is planned to create additional xslt files +to make html-information about the CD, create insert scripts for postgres and +or mysql (or other rdbs) and converter-scripts that use these xslt-files. +To use the xslt-files one needs an xslt-processor, like xsltproc from +libxml2 (thats the one i used) + +for help use getcd.sh -h diff --git a/rton b/rton new file mode 100755 index 0000000000000000000000000000000000000000..e035ee58f6c7b2d2d187650645bb09a778de262e GIT binary patch literal 8621 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 OCc>Ev-W*E)KmQ+P|3Uo# literal 0 HcmV?d00001 diff --git a/rton.c b/rton.c new file mode 100755 index 0000000..fef4aba --- /dev/null +++ b/rton.c @@ -0,0 +1,15 @@ +/* Achtung unter dos ist \n in wirklichkeit \r\n bei den meisten + Compilern, da funktioniert das natürlich nicht!!!! */ +#include + +int main(int argc, char* argv[]) { + int c=0; + + while(fread(&c, 1, 1, stdin)) { + putchar((c=='\r')?'\n':c); + fflush(stdout); + } + + return 0; +} + diff --git a/usage b/usage new file mode 100755 index 0000000..6465737 --- /dev/null +++ b/usage @@ -0,0 +1,25 @@ +usage: ./getcd.sh [-d delimiter [-o {t|a}]] [-t {m|f|o}] [-p path] [-e encoder] [-c cddb-entry] [-h] + -d : A single character delimiting trackname from + artistname with sampler cds + + -o : specifies if theres the track or the artist first + Must be: + t for titel first or + a for artist first + If there is none specified t is assumed + -t : you can specify either m for encoding to mp3 + using lame, or f for making lossless encoding using flac, + or o for making ogg/vorbis, or w for uncompressed wav. + Omitting this results in encoding to flac. + mp3s will be placed under a subfolder mp3 and flacs + under a subfolder flac + -p : specifies the path to save the encoded data. + Defaults to the users home directory. + -e : specifies the mp3 encoder to use. + valid encoders are actually: lame,bladeenc + Defaults to lame. + -c : specifies the CDDB-Entry to use. + sometimes there is more than 1 entry for a cd in cddb. + Then you can specify wich one to use by this option. + You can checkout all entries using cddb.pl. + -h : Shows this help.