From 2b3f3a1a1f145c04aa87b75ac76e089019548d85 Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Fri, 1 Jun 2007 20:41:30 +0000 Subject: [PATCH] first checkin for 0.1.0 candidate --- CDDB_get-2.23.tar.gz | Bin 19438 -> 0 bytes CDDB_get-2.23p1.patch | 70 --- CDDB_get-2.27.tar.gz | Bin 21820 -> 0 bytes CDDB_get-2.27p1.patch | 70 --- cddb.pl | 451 ---------------- getcd.sh | 691 +++++++++++++------------ getcd.sh.neu | 350 ------------- getcd.xml | 35 -- install | 72 --- readme | 30 -- rton | Bin 8621 -> 0 bytes rton.c | 15 - shellUtils.sh | 393 ++++++++++++++ usage | 25 - cdinfo2xinf.xsl => xsl/cdinfo2xinf.xsl | 0 flac2mp3.xsl => xsl/flac2mp3.xsl | 0 flac2wav.xsl => xsl/flac2wav.xsl | 0 mp32wav.xsl => xsl/mp32wav.xsl | 0 18 files changed, 754 insertions(+), 1448 deletions(-) delete mode 100644 CDDB_get-2.23.tar.gz delete mode 100644 CDDB_get-2.23p1.patch delete mode 100644 CDDB_get-2.27.tar.gz delete mode 100644 CDDB_get-2.27p1.patch delete mode 100755 cddb.pl delete mode 100755 getcd.sh.neu delete mode 100755 getcd.xml delete mode 100755 install delete mode 100755 readme delete mode 100755 rton delete mode 100755 rton.c create mode 100644 shellUtils.sh delete mode 100755 usage rename cdinfo2xinf.xsl => xsl/cdinfo2xinf.xsl (100%) rename flac2mp3.xsl => xsl/flac2mp3.xsl (100%) rename flac2wav.xsl => xsl/flac2wav.xsl (100%) rename mp32wav.xsl => xsl/mp32wav.xsl (100%) diff --git a/CDDB_get-2.23.tar.gz b/CDDB_get-2.23.tar.gz deleted file mode 100644 index a1dbc96e74017847c437236b0bacd7d26254f5fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19438 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 F0RSfQ2ps?b diff --git a/CDDB_get-2.23p1.patch b/CDDB_get-2.23p1.patch deleted file mode 100644 index 6774ed2..0000000 --- a/CDDB_get-2.23p1.patch +++ /dev/null @@ -1,70 +0,0 @@ -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 deleted file mode 100644 index 62a64e6584121f25b33b72a896e362b7476da865..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 deleted file mode 100755 index f9efa7f..0000000 --- a/cddb.pl +++ /dev/null @@ -1,451 +0,0 @@ -#!/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/getcd.sh b/getcd.sh index 9175bfd..a0f902a 100755 --- a/getcd.sh +++ b/getcd.sh @@ -1,344 +1,375 @@ -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 +#!/bin/bash + +# === some global setting & configurations for the script === +umask 000 # create files with all right for anyone +shopt -s nullglob # expand patterns which match no file to a null string +shopt -s extdebug + +# -------------------------------------------------------------- +# das Verzeichnis in dem dieses script liegt herausfinden +scriptDir=${0%/*} +scriptDir="${scriptDir/#\./${PWD}}" +case "${scriptDir}" in /*);; *) scriptDir="${PWD}/${scriptDir}";; esac +# -------------------------------------------------------------- + +# include helpers +. ${scriptDir}/shellUtils.sh + +# -------------------------------------------------------------- +# string definitions +usage=$"usage: $0 [-t {m|f|o}] [-p path] [-e encoder] [-c cddb-entry] [-h|-?] + [-I interface] [-D device] [-v[v]] +\t-t: you can specify either m for encoding to mp3 +\t using lame, or f for making lossless encoding using flac, +\t or o for making ogg/vorbis, or w for uncompressed wav. +\t Omitting this results in encoding to flac. +\t mp3s will be placed under a subfolder mp3 and flacs +\t under a subfolder flac +\t-p: specifies the path to save the encoded data. +\t Defaults to the users home directory. +\t-e: specifies the mp3 encoder to use. +\t valid encoders are actually: lame,bladeenc +\t Defaults to lame. +\t-c: specifies the CDDB-Entry to use. +\t sometimes there is more than 1 entry for a cd in cddb. +\t Then you can specify wich one to use by this option. +\t You can checkout all entries using cddb.pl. +\t-I: specifies cdda2wav interface to use. +\t Valid interfaces are generic_scsi and cooked_ioctl. +\t Please note that cooked_ioctl is not available on all systems. +\t Defaults to generic_scsi +\t-D: specifies device to use with cdda2wav. +\t Defaults to /dev/cdrom +\t-v: make the script more verbose. The verbosity level defaults +\t to 1. When -v is given the level is 2 and -vv increases the +\t level to 3, what means give debug output. +\t-q: make the script silent. Equivalent to -v0 +\t-h| +\t-?: Shows this help." + +ready=$"done" + +# level 1 messages +getCDInfoMsg=$"getting cd info..." +outputDirMsg=$"output to: \$encodingDir" +createXmlMsg=$"create xml file..." +startRipMsg1=$"start ripping cd audio data..." + +# level 2 messages +encodeMp3Msg=$"Encode to mp3" +encodeFlacMsg=$"Encode to flac" +encodeOggMsg=$"Encode to ogg" +encodeWavMsg=$"Encode to wav" +startRipMsg2=$"start ripping cd audio data:" + +cdInfoMsg=$"DISK: +===== +Tracks: \$dTracks +Length: \$dLength +Index: \$dIndex +Artist: \$dArtist +Title: \$dTitle +Year: \$dYear +Genre: \$dGenre +CDDB: \$cddbId +Text: \$dText +Extra: \$dExtra + +TRACKS: +=======" +# -------------------------------------------------------------- + +taOrder="t" +encodingDir=$HOME +encodingType="f" +encoder="lame" +cddbEntry=1 +cddaIf="generic_scsi" +cddaDev="/dev/cdrom" +verbose=1 + +# ---------------------------------------------------------------- +# get commandline options +while getopts qvt:p:he:c:I:D: 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 - ;; + case $option in + t) + if [ "${OPTARG}" != "m" -a "${OPTARG}" != "f" -a \ + "${OPTARG}" != "o" -a "${OPTARG}" != "w" ] + then + echo -e "$usage" + exit 1 + fi + encodingType=$OPTARG + ;; + p) + if [ ! \( -d ${OPTARG} \) ] + then + echo -e "$usage" + exit 1 + fi + encodingDir=$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 + cddbEntry=$OPTARG + ;; + v) + if [ "${OPTARG}" -a "${OPTARG}" != "0" -a "${OPTARG}" != "v" ] + then + echo -e "$usage" + exit 1 + fi + test -z "${OPTARG}" && verbose=2 + test "${OPTARG}" = "0" && verbose=0 + test "${OPTARG}" = "v" && verbose=3 + ;; + q) + verbose=0 + ;; + I) + if [ "${OPTARG}" != "generic_scsi" -a \ + "${OPTARG}" != "cooked_ioctl" ] + then + echo -e "$usage" + exit 1 + fi + cddaIf=$OPTARG + ;; + D) + if [ ${OPTARG} -lt 1 ] + then + echo -e "$usage" + exit 1 + fi + cddaDev=$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 +echo "verbose: $verbose" -comment="" +# ---------------------------------------------------------------- +# set encodingDir for used encodingType +case ${encodingType} in + m) + encodingDir="$encodingDir/mp3" + test ${verbose} -ge 2 && echo ${encodeMp3Msg} + ;; + f) + encodingDir="$encodingDir/flac" + test ${verbose} -ge 2 && echo ${encodeFlacMsg} + ;; + o) + encodingDir="$encodingDir/ogg" + test ${verbose} -ge 2 && echo ${encodeOggMsg} + ;; + w) + encodingDir="$encodingDir/wav" + test ${verbose} -ge 2 && echo ${encodeWavMsg} + ;; +esac +# ---------------------------------------------------------------- -function idxof() { - str=$1 - idx=0 +test ${verbose} -ge 1 && echo -n ${getCDInfoMsg} +getCDInfo # gets all info about the CD. Look in shellUtils for more info. +test ${verbose} -ge 1 && echo ${ready} - for i in "${indices[@]}"; do - test "$i" == "$str" && echo $idx && return 0 - idx=`expr $idx \+ 1` - done +if [ ${verbose} -ge 2 ] +then + cat <<-EOF + $cdInfoMsg + EOF - echo -1 - return 0 -} + i=0 + while [ $i -lt ${#tTitle[@]} ] + do + echo -n "${tArtist[$i]} - ${tTitle[$i]} " + echo "([${tStartSec[$i]}-${tEndSec[$i]}] ${tLength[$i]})" + i=$((i+1)) + done +fi -title_pat="/^[^:]*: *(.*[^ ]).*/" -artist_pat="//" +encodingDir="${encodingDir}/${dArtist}/${dTitle}" +mkdir -p "${encodingDir}" +test ${verbose} -ge 1 && eval "echo ${outputDirMsg}" -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 +# ---------------------------------------------------------------- +# fill xml file with data +test ${verbose} -ge 1 && echo -n "${createXmlMsg}" -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 ] +xmlFile="${encodingDir}/cdinfo.xml" +xml_dText="`echo "${dText}" | recode utf8..h0`" +xml_dExtra="`echo "${dExtra}" | recode utf8..h0`" +xml_dArtist="`echo "${dArtist}" | recode utf8..h0`" +xml_dTitle="`echo "${dTitle}" | recode utf8..h0`" +cat >"${xmlFile}" < + + + ${dIndex} + ${cddbId} + ${xml_dText} + ${xml_dExtra} + ${xml_dArtist} + ${xml_dTitle} + ${dYear} + ${dGenre} + ${dLength} + ${dTracks} + +EOF + +i=0 +while [ $i -lt ${#tTitle[@]} ] +do + trackNr="`printf %02d $((i+1))`" + xml_tTitle="`echo ${tTitle[$i]} | recode utf8..h0`" + xml_tArtist="`echo ${tArtist[$i]} | recode utf8..h0`" + trackEnd=${tEndSec[$i]} + trackStart=${tStartSec[$i]} + trackLen=$((trackEnd-$trackStart)) + + cat >>"${xmlFile}" < + $trackNr + ${tLength[$i]} + ${tStartSec[$i]} + ${trackLen} + $xml_tArtist + $xml_tTitle + + +EOF + + i=$((i+1)) +done + +echo "" >>"${xmlFile}" + +test ${verbose} -ge 1 && echo "${ready}" +# ---------------------------------------------------------------- + +# ---------------------------------------------------------------- +# now do the ripping +test ${verbose} -eq 1 && echo -n "${startRipMsg1}" +test ${verbose} -ge 2 && echo "${startRipMsg2}" + +i=0 +while [ $i -lt ${#tTitle[@]} ] 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` + trackNr=$((i+1)) + + # now that i don't forget it again. I use tr to translate \r to \n + # because sed does't recognise a line with only \r at its end as a line. + # Therefor sed reads until output of cdda2wav ends and does all the + # processing at once, so the percentage is not shown correctly + if [ ${verbose} -ge 2 ] + then + outCmd="tr '\r' '\n' | + sed '/^ [0-9]/!d;s/^.* \([0-9]*%\).*$/\r'\"\${outStr}\"'\1/' | + tr -d '\n'" + else + outCmd="cat >/dev/null" + fi + + case ${encodingType} in + f) + outFile="`printf %02d ${trackNr}`-${tTitle[$i]}.flac" + outStr="track-$trackNr => ${outFile}: " + + ( + exec 2>&1 + cdda2wav -H -D/dev/cdrom -I${cddaIf} -t${trackNr} - |\ + flac -c -f \ + -T artist="${tArtist[$i]}" -T album="${dTitle}" \ + -T genre="${dGenre}" -T title="${tTitle[$i]}" \ + -T tracknumber="${trackNr}" -T tracknum="${trackNr}" \ + -T date="${dYear}" -T comment="" \ + -o "${encodingDir}/${outFile}" - 2>/dev/null + ) | $outCmd + ;; + m) + outFile="`printf %02d ${trackNr}`-${tTitle[$i]}.mp3" + outStr="track-$trackNr => ${outFile}: " + + case ${encoder} in + lame) + ( + exec 2>&1 + cdda2wav -H -D/dev/cdrom -I${cddaIf} -t${trackNr} - |\ + lame -V2 \ + --ta "${tArtist[$i]}" --tl "${dTitle}" \ + --tg "${dGenre}" --tt "${tTitle[$i]}" \ + --tn "${trackNr}" --ty "${dYear}" \ + --tc "" \ + - "${encodingDir}/${outFile}" 2>/dev/null + ) | tr '\r' '\n' |\ + sed '/^ [0-9]/!d;s/^.* \([0-9]*%\).*$/\r'"${outStr}"'\1/' |\ + tr -d '\n' + ;; + bladeenc) + ( + exec 2>&1 + cdda2wav -H -D/dev/cdrom -I${cddaIf} -t${trackNr} - |\ + bladeenc -progress=0 STDIN \ + "${encodingDir}/${outFile}" 2>/dev/null + ) | tr '\r' '\n' |\ + sed '/^ [0-9]/!d;s/^.* \([0-9]*%\).*$/\r'"${outStr}"'\1/' |\ + tr -d '\n' + ;; + esac + ;; + o) + outFile="`printf %02d ${trackNr}`-${tTitle[$i]}.ogg" + outStr="track-$trackNr => ${outFile}: " + + ( + exec 2>&1 + cdda2wav -H -D/dev/cdrom -I${cddaIf} -t${trackNr} - |\ + oggenc -a "${tArtist[$i]}" -l "${dTitle}" \ + -G "${dGenre}" -t "${tTitle[$i]}" \ + -N "${trackNr}" -d "${dYear}" \ + -c "" \ + -o "${encodingDir}/${outFile}" - 2>/dev/null + ) | tr '\r' '\n' |\ + sed '/^ [0-9]/!d;s/^.* \([0-9]*%\).*$/\r'"${outStr}"'\1/' |\ + tr -d '\n' + ;; + w) + outFile="`printf %02d ${trackNr}`-${tTitle[$i]}.wav" + outStr="track-$trackNr => ${outFile}: " + + ( + exec 2>&1 + cdda2wav -H -D/dev/cdrom -I${cddaIf} -t${trackNr} - >\ + "${encodingDir}/${outFile}" + ) | tr '\r' '\n' |\ + sed '/^ [0-9]/!d;s/^.* \([0-9]*%\).*$/\r'"${outStr}"'\1/' |\ + tr -d '\n' + ;; + esac + + echo # do a newline after each file + i=$((i+1)) done -echo "" >> "${xmlfile}" +test ${verbose} -eq 1 && echo "${ready}" +# ---------------------------------------------------------------- diff --git a/getcd.sh.neu b/getcd.sh.neu deleted file mode 100755 index 56081c8..0000000 --- a/getcd.sh.neu +++ /dev/null @@ -1,350 +0,0 @@ -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 deleted file mode 100755 index 0299145..0000000 --- a/getcd.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - -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 deleted file mode 100755 index 6fb00fb..0000000 --- a/install +++ /dev/null @@ -1,72 +0,0 @@ -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/readme b/readme deleted file mode 100755 index b79a508..0000000 --- a/readme +++ /dev/null @@ -1,30 +0,0 @@ -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 deleted file mode 100755 index e035ee58f6c7b2d2d187650645bb09a778de262e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8621 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 OCc>Ev-W*E)KmQ+P|3Uo# diff --git a/rton.c b/rton.c deleted file mode 100755 index fef4aba..0000000 --- a/rton.c +++ /dev/null @@ -1,15 +0,0 @@ -/* 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/shellUtils.sh b/shellUtils.sh new file mode 100644 index 0000000..88af98e --- /dev/null +++ b/shellUtils.sh @@ -0,0 +1,393 @@ +if [ "x" == "x$__SHELLUTILS__" ] +then + __SHELLUTILS__="shellUtils" + + # ------------------------------- + # Fehlermeldungen + _shellUtils_errMsg[1]="Fehler beim Aufruf von \${FUNCNAME}: falsche Parameteranzahl: $#" + _shellUtils_errMsg[2]="Fehler: Es läuft bereits eine Instanz (\${oldPid}) des scripts" + _shellUtils_errMsg[3]="Fehler beim Aufruf von doSmbCommand: smbCommand nicht initialisiert" + _shellUtils_errMsg[4]="Fehler: konnte keine Konfigurations-Datei (\${cName}) finden" + #_shellUtils_errMsg[2]= + # ------------------------------- + + # ------------------------------- + # Kommandodefinitions Teil + SH="/bin/bash" + SMBCLIENT="/usr/bin/smbclient" + PS="/bin/ps" + BASENAME="/usr/bin/basename" + PWDCMD="/bin/pwd" + CONVERT="/usr/bin/convert" + ICONV="/usr/bin/iconv" + ECHO="/bin/echo" + TEST="/usr/bin/test" + SED="/usr/bin/sed" + PRINTF="/usr/bin/printf" + SORT="/usr/bin/sort" + FTP="/usr/bin/ftp" + CONVERT="/usr/bin/convert" + CJPEG="/usr/bin/cjpeg" + CAT="/bin/cat" + MKDIR="/bin/mkdir" + DATE="/bin/date" + RM="/bin/rm" + MAILCMD="/bin/bin/mailto" + CUT="/usr/bin/cut" + TR="/usr/bin/tr" + LOCALE="/usr/bin/locale" + GREP="/bin/grep" + WC="/usr/bin/wc" + MV="/usr/bin/mv" + CP="/usr/bin/cp" + EXPR="/usr/bin/expr" + UNZIP="/usr/bin/unzip" + XSLTPROC="/usr/bin/xsltproc" + GAWK="/usr/bin/gawk" + AWK="/usr/bin/awk" + LS="/bin/ls" + TOUCH="/usr/bin/touch" + RECODE="/usr/bin/recode" + GETOPT="/usr/bin/getopt" + # ------------------------------- + + # ------------------------------- + # Variablen + _smbCommand="" + # ------------------------------- + + # ------------------------------- + # Funktionen + # Aufruf: checkLock lockfile + function checkLock + { + if [ $# -ne 1 ] + then + eval "echo \"${_shellUtils_errMsg[1]}\" >&2" + exit 1 + fi + + local filename="$1" + + if [ -e "$filename" ] + then + local oldPid="`$CAT "$lockFile"`" + local scriptName="`$BASENAME $0`" + local running="`$PS -p "$oldPid" | $SED '1d; /'$scriptName'/!d'`" + + if [ -n "$running" ] + then + eval "echo \"${_shellUtils_errMsg[2]}\" >&2" + exit 2 + fi + fi + + echo $$ >"$lockFile" + + return $$ + } + + # Aufruf: doSmbCommand share domain user pass + function initSmbCommand + { + if [ $# -ne 4 ] + then + eval "echo \"${_shellUtils_errMsg[1]}\" >&2" + exit 1 + fi + + _smbCommand="$SMBCLIENT $1 $4 -U $3 -W $2" + } + + # Aufruf: doSmbCommand path command + function doSmbCommand + { + if [ $# -lt 1 -o $# -gt 2 ] + then + eval "echo \"${_shellUtils_errMsg[1]}\" >&2" + exit 1 + fi + + if [ -z "$_smbCommand" ] + then + eval "echo \"${_shellUtils_errMsg[3]}\" >&2" + exit 3 + fi + + if [ $# -eq 2 ] + then + eval "$_smbCommand -D $1 -c \"$2\"" + else + eval "$_smbCommand -D $1" <&0 + fi + } + + # Meine Implementation von Hashes fuer die bash verwendet zwei Arrays, + # deren "Basisname" immer bei den aufrufen der Hash-Funktionen mit + # angegeben werden muessen. Die beiden Arrays heissen dann + # _<>_key und _<>_value und enthalten entsprechen + # jeweils zu einem Index ein key/value Paar. + # Die groesste Magie in den Funktionen liegt darin die Arraynamen + # immer richtig zu erzeugen. + # Wenn man dieses Hashes benutzt sollte man bedenken, das das + # Laufzeitverhalten O(n) ist, die Implementierung also nicht sehr + # performant. + # PS. O(n) => im unguenstigsten Fall hat man n Schleifendurchlaeufe um + # auf ein Element in einem Hash mit n Elementen zuzugreifen. + # Ich mags kaum zugeben aber an manchen Stellen ist das Laufzeitverhalten + # sogar O(2n). (Es besteht wohl noch dringender Optimirungsbedarf) + + # eine Funktion um einen Hash zu leeren + # Aufruf: unsetHash hashname + function unsetHash + { + if [ $# -ne 1 ] + then + eval "echo \"${_shellUtils_errMsg[1]}\" >&2" + exit 1 + fi + + unset _${1}_key + unset _${1}_value + } + + # eine Funktion um einen HashWert zu setzen. ein key und ein value array + # werden erzeugt. Ueber getHashVal kann man wieder Werte abfragen. + # Aufruf: setHashVal hashname key value + function setHashVal + { + if [ $# -ne 3 ] + then + eval "echo \"${_shellUtils_errMsg[1]}\" >&2" + exit 1 + fi + + getHashVal "${1}" "${2}" >/dev/null 2>&1 + local idx=$? + eval "_${1}_key[$idx]=\"$2\"" + eval "_${1}_value[$idx]=\"$3\"" + } + + # und eine funktion um über einen key einen Wert aus einem Hash + # (siehe setHashVal) zu bekommen. + # Aufruf: getHashVal hash key + function getHashVal + { + if [ $# -ne 2 ] + then + eval "echo \"${_shellUtils_errMsg[1]}\" >&2" + exit 1 + fi + + local i=0 + local count=`getHashSize $1` + local key=`$ECHO $2 | $SED 's/#/\\\\#/'` + + while [ $i -lt $count ] + do + if eval [ "\${_${1}_key[$i]}" = "$key" ] + then + eval "echo \${_${1}_value[$i]}" + return $i + fi + + i=$((i+1)); + done; + + return $i + } + + # Aufruf: getHashSize hash + function getHashSize + { + if [ $# -ne 1 ] + then + eval "echo \"${_shellUtils_errMsg[1]}\" >&2" + exit 1 + fi + + eval "count=\${#_${1}_key[*]}" + echo $count + + return $count + } + + # Aufruf: getHashKeys hash + function getHashKeys + { + if [ $# -ne 1 ] + then + eval "echo \"${_shellUtils_errMsg[1]}\" >&2" + exit 1 + fi + + eval "ret=\"\${_${1}_key[0]}\"" + + local i=1 + local count=`getHashSize $1` + while [ $i -lt $count ] + do + eval "ret=\"$ret \${_${1}_key[$i]}\"" + i=$((i+1)) + done + + echo $ret + + return $count + } + + # Funktion um die Zahlrepraesentation eines Monatsname zu bekommen. + # Also Oktober => 10 + # Abhaengig davon das ein entsprechendes locale installiert ist. + # Aufruf: getMonthNum Monatsname [locale] + function getMonthNum + { + if [ $# -lt 1 ] + then + eval "echo \"${_shellUtils_errMsg[1]}\" >&2" + exit 1 + fi + + if [ $# -eq 2 ] + then + LC_ALL=${2} + fi + + mon=`$LOCALE -c LC_TIME | $SED '5!d;y/;/\n/' |\ + $GREP -n ${1} | $CUT -d\: -f1` + + echo $mon + + return $mon + } + + # Funkktion um ein Kommando nach einem bestimmten Zeitraum abzubrechen + # Aufruf: timeout cmd t + # Retruns: >128 -> falls Timeout, return value von cmd->falls kein Timeout + function timeout + { + if [ $# -lt 2 ] + then + eval "echo \"${_shellUtils_errMsg[1]}\" >&2" + exit 1 + fi + + # gewuenschtes Kommando als separaten Prozess starten + $1 <&0 & + local __cPid=$! + + # subshell starten die gewuenschte Zeit wartet bis sie obigen + # Prozess killt. + ( sleep $2; kill -9 ${__cPid} ) >/dev/null 2>&1 & + local __tPid=$! + + # neuen Trap setzen....evtl. vorhande alte Kommandos werden auch + # ausgefuehrt! (Bei Programmabbruch auch auf jeden Fall beide + # Sub-Prozesse killen) + oldTrap="`trap -p EXIT`" + oldTrapCmd="`echo $oldTrap | sed 's/^trap -- \(.*\) EXIT$/\1/'`" + + trapCmd="kill -9 ${__cPid} >/dev/null 2>&1" + trapCmd="${trapCmd};kill -9 ${__cPid} >/dev/null 2>&1" + trapCmd="${trapCmd};eval $oldTrapCmd" + trap "${trapCmd}" EXIT + + # warte bis Subprozess mit Kommando endet + wait ${__cPid} >/dev/null 2>&1 + local __cExit=$? + + # alte trap Kommandos wiederherstellen + test "$oldTrapCmd" && eval "$oldTrapCmd" || trap '-' EXIT + + # falls sie noch laeuft wartende subshell killen. + kill -9 $__tPid >/dev/null 2>&1 + return $__cExit + } + # ------------------------------- + +fi + +function getCDInfo +{ + local uri device cmd i hello cddb ret diskData tNum + + uri="freedb.freedb.org/~cddb/cddb.cgi" + device="/dev/cdrom" + + test $# -ge 1 && uri="$1" + test $# -ge 2 && device="$2" + + hello="hello=${USER}+${HOSTNAME}+test+0.0.1" + + # first get the genre list from server + eval "`curl -s "http://${uri}?cmd=cddb+lscat&${hello}&proto=6" |\ + sed '1d;$d' | tr -d '\r' | tr '\n' ',' |\ + sed 's/,$//;s/,/" "/g;s/^\(.*\)$/local -a genre=("\1")/'`" + + unset cddbId dTitle dYear dGenre tTitle + + diskData="`cdda2wav -D ${device} -N -J -v toc,sectors 2>&1`" + + cddbId="`echo "$diskData" |\ + sed '/^CDDB/!d;s/^.*0x\(.*\)$/\1/'`" + dTracks="`echo "$diskData" |\ + sed '/tracks/!d;s/^.*tracks:\([0-9]*\).*$/\1/'`" + dLength="`echo "$diskData" |\ + sed '/tracks/!d;s/^.*time \([0-9:\.]*\).*$/\1/'`" + dIndex="`echo "$diskData" |\ + sed '/CDINDEX/!d;s/^.*: *\([a-zA-Z0-9_\.]*-\).*$/\1/'`" + dText="`echo "$diskData" | sed ' + /CD-Text/!d;s/^[^:]*: *\(.*[^ ]\).*$/\1/'`" + dExtra="`echo "$diskData" | sed ' + /CD-Extra/!d;s/^[^:]*: *\(.*[^ ]\).*$/\1/'`" + + # search for info in all genres + for i in "${genre[@]}" + do + cmd="cmd=cddb+read+${i}+${cddbId}" + #wget -O- "http://${uri}?${cmd}&${hello}&proto=6" 2>/dev/null + cddb="`curl -s "http://${uri}?${cmd}&${hello}&proto=6"`" + + ret="`echo "$cddb" | head -c 3`" + if [ "$ret" != "210" ] + then + if [ ${verbose:-0} -ge 3 ] + then + debug="`echo "$cddb" | head -n 1`" + echo $"[ERROR] cddb: ${debug}" + fi + continue + else + eval "`echo "$cddb" | tr -d '\r' | sed ' + /DTITLE/s/^.*=\(\(.*\) \/ \)*\(.*\)$/dArtist="\2";dTitle="\3"/p + /DYEAR/s/^.*=\(.*\)$/dYear="\1"/p + /DGENRE/s/^.*=\(.*\)$/dGenre="\1"/p + /TTITLE/s/^TTITLE\([0-9]*\)=\(\(.*\) \/ \)*\(.*\)$/tArtist[\1]="\3";tTitle[\1]="\4"/p + d'`" + break + fi + done + + # Nu pack ich in alle tArtist die leer sind den dArtist. + i=0 + while [ $i -lt ${#tArtist[@]} ] + do + tNum=$((i+1)) + tLength[$i]=`echo "$diskData" | sed ' + /[^0-9]'$tNum'\.(.*:.*)/ !d + s/.*[^0-9]'$tNum'\.( *\([^)]*\).*$/\1/'` + tStartSec[$i]=`echo "$diskData" | sed ' + /[^0-9]'$tNum'\.([^:]*)/ !d + s/.*[^0-9]'$tNum'\.( *\([^)]*\).*$/\1/'` + + test $tNum -eq ${#tArtist[@]} && tNum="lead-out" || tNum=$((tNum+1)) + + tEndSec[$i]=`echo "$diskData" | sed ' + /[^0-9]'$tNum'\.*([^:]*)/ !d + s/.*[^0-9]'$tNum'\.*( *\([^)]*\).*$/\1/'` + + test -z "${tArtist[$i]}" && tArtist[$i]="$dArtist" + i=$((i+1)) + done +} + diff --git a/usage b/usage deleted file mode 100755 index 6465737..0000000 --- a/usage +++ /dev/null @@ -1,25 +0,0 @@ -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. diff --git a/cdinfo2xinf.xsl b/xsl/cdinfo2xinf.xsl similarity index 100% rename from cdinfo2xinf.xsl rename to xsl/cdinfo2xinf.xsl diff --git a/flac2mp3.xsl b/xsl/flac2mp3.xsl similarity index 100% rename from flac2mp3.xsl rename to xsl/flac2mp3.xsl diff --git a/flac2wav.xsl b/xsl/flac2wav.xsl similarity index 100% rename from flac2wav.xsl rename to xsl/flac2wav.xsl diff --git a/mp32wav.xsl b/xsl/mp32wav.xsl similarity index 100% rename from mp32wav.xsl rename to xsl/mp32wav.xsl