Showing
2 changed files
with
224 additions
and
13 deletions
| @@ -25,7 +25,7 @@ case "${scriptDir}" in /*);; *) scriptDir="${PWD}/${scriptDir}";; esac | @@ -25,7 +25,7 @@ case "${scriptDir}" in /*);; *) scriptDir="${PWD}/${scriptDir}";; esac | ||
| 25 | # -------------------------------------------------------------- | 25 | # -------------------------------------------------------------- |
| 26 | # string definitions | 26 | # string definitions |
| 27 | enhUsage=$"usage: $0 [-t(m|f|o|w)] [-p path] [-e encoder] [-c cddbitem] [-h] | 27 | enhUsage=$"usage: $0 [-t(m|f|o|w)] [-p path] [-e encoder] [-c cddbitem] [-h] |
| 28 | - [-I interface] [-D device] [-v[v|0]] [-q] | 28 | + [-I interface] [-D device] [-v[v|0]] [-q] [-s] |
| 29 | [--help] [--encoding=(m|f|o|w)] [--encoder=(lame|bladeenc)] | 29 | [--help] [--encoding=(m|f|o|w)] [--encoder=(lame|bladeenc)] |
| 30 | [--path=<string>] [--interface=(cooked_ioctl|generic_scsi)] | 30 | [--path=<string>] [--interface=(cooked_ioctl|generic_scsi)] |
| 31 | [--device=<string>] | 31 | [--device=<string>] |
| @@ -59,11 +59,19 @@ enhUsage=$"usage: $0 [-t(m|f|o|w)] [-p path] [-e encoder] [-c cddbitem] [-h] | @@ -59,11 +59,19 @@ enhUsage=$"usage: $0 [-t(m|f|o|w)] [-p path] [-e encoder] [-c cddbitem] [-h] | ||
| 59 | -D | --device: specifies device to use with cdda2wav. All values that | 59 | -D | --device: specifies device to use with cdda2wav. All values that |
| 60 | are valid for cdda2wav are valid here. | 60 | are valid for cdda2wav are valid here. |
| 61 | Defaults to /dev/cdrom | 61 | Defaults to /dev/cdrom |
| 62 | + -s: if set indicates that this disk contains various artists | ||
| 63 | + (is a sampler). In this case the artist is written in the | ||
| 64 | + title information of cddb most likely. Giving this option | ||
| 65 | + the script will show a title list and give the oppotunity | ||
| 66 | + to enter a delimiting string so that title and artist | ||
| 67 | + information can be split properly and fill the mp3id | ||
| 68 | + or whatever correctly. | ||
| 62 | 69 | ||
| 63 | -This script uses cdda2wav, cddb and various encoders to rip an audio CD." | 70 | +This script uses cdda2wav, cddb and can use various encoders to rip |
| 71 | +an audio CD." | ||
| 64 | 72 | ||
| 65 | usage=$"usage: $0 [-t(m|f|o|w)] [-p path] [-e encoder] [-c cddbitem] [-h] | 73 | usage=$"usage: $0 [-t(m|f|o|w)] [-p path] [-e encoder] [-c cddbitem] [-h] |
| 66 | - [-I interface] [-D device] [-v[v|0]] [-q] | 74 | + [-I interface] [-D device] [-v[v|0]] [-q] [-s] |
| 67 | options: | 75 | options: |
| 68 | -h: this help | 76 | -h: this help |
| 69 | -v: set verbosity level. | 77 | -v: set verbosity level. |
| @@ -94,8 +102,16 @@ usage=$"usage: $0 [-t(m|f|o|w)] [-p path] [-e encoder] [-c cddbitem] [-h] | @@ -94,8 +102,16 @@ usage=$"usage: $0 [-t(m|f|o|w)] [-p path] [-e encoder] [-c cddbitem] [-h] | ||
| 94 | -D: specifies device to use with cdda2wav. All values that | 102 | -D: specifies device to use with cdda2wav. All values that |
| 95 | are valid for cdda2wav are valid here. | 103 | are valid for cdda2wav are valid here. |
| 96 | Defaults to /dev/cdrom | 104 | Defaults to /dev/cdrom |
| 105 | + -s: if set indicates that this disk contains various artists | ||
| 106 | + (is a sampler). In this case the artist is written in the | ||
| 107 | + title information of cddb most likely. Giving this option | ||
| 108 | + the script will show a title list and give the oppotunity | ||
| 109 | + to enter a delimiting string so that title and artist | ||
| 110 | + information can be split properly and fill the mp3id | ||
| 111 | + or whatever correctly. | ||
| 97 | 112 | ||
| 98 | -This script uses cdda2wav, cddb and various encoders to rip an audio CD." | 113 | +This script uses cdda2wav, cddb and can use various encoders to rip |
| 114 | +an audio CD." | ||
| 99 | 115 | ||
| 100 | ready=$"done" | 116 | ready=$"done" |
| 101 | 117 | ||
| @@ -139,10 +155,10 @@ then | @@ -139,10 +155,10 @@ then | ||
| 139 | # enhanced getopt | 155 | # enhanced getopt |
| 140 | usage="${enhUsage}" | 156 | usage="${enhUsage}" |
| 141 | 157 | ||
| 142 | - TEMP="`$GETOPT -o "?hv::qt:p:e:c:I:D:" -l "help,encoding:,encoder:,path:,interface:,device:" -- "$@"`" | 158 | + TEMP="`$GETOPT -o "?hsv::qt:p:e:c:I:D:" -l "help,encoding:,encoder:,path:,interface:,device:" -- "$@"`" |
| 143 | else | 159 | else |
| 144 | # old getopt | 160 | # old getopt |
| 145 | - TEMP="`$GETOPT "?hv::qt:p:e:c:I:D:" "$@"`" | 161 | + TEMP="`$GETOPT "?hsv::qt:p:e:c:I:D:" "$@"`" |
| 146 | fi | 162 | fi |
| 147 | test $? -ne 0 && { echo -e "${usage}"; exit 1; } # on error | 163 | test $? -ne 0 && { echo -e "${usage}"; exit 1; } # on error |
| 148 | 164 | ||
| @@ -152,10 +168,11 @@ taOrder="t" | @@ -152,10 +168,11 @@ taOrder="t" | ||
| 152 | encodingDir=$HOME | 168 | encodingDir=$HOME |
| 153 | encodingType="f" | 169 | encodingType="f" |
| 154 | encoder="lame" | 170 | encoder="lame" |
| 155 | -cddbEntry=1 | 171 | +cddbEntry="" |
| 156 | cddaIf="" | 172 | cddaIf="" |
| 157 | cddaDev="/dev/cdrom" | 173 | cddaDev="/dev/cdrom" |
| 158 | verbose=1 | 174 | verbose=1 |
| 175 | +sampler="no" | ||
| 159 | while true | 176 | while true |
| 160 | do | 177 | do |
| 161 | case "$1" in | 178 | case "$1" in |
| @@ -215,13 +232,15 @@ do | @@ -215,13 +232,15 @@ do | ||
| 215 | ;; | 232 | ;; |
| 216 | 233 | ||
| 217 | -c) | 234 | -c) |
| 218 | - if [ $2 -lt 1 ] | 235 | + if [ "$2" -ge 1 ] 2>/dev/null |
| 219 | then | 236 | then |
| 237 | + cddbEntry="$2" | ||
| 238 | + cddbEntry=$((cddbEntry-1)) | ||
| 239 | + shift 2 | ||
| 240 | + else | ||
| 220 | echo -e "$usage" | 241 | echo -e "$usage" |
| 221 | exit 1 | 242 | exit 1 |
| 222 | fi | 243 | fi |
| 223 | - cddbEntry=$2 | ||
| 224 | - shift 2 | ||
| 225 | ;; | 244 | ;; |
| 226 | 245 | ||
| 227 | -I) | 246 | -I) |
| @@ -236,7 +255,7 @@ do | @@ -236,7 +255,7 @@ do | ||
| 236 | ;; | 255 | ;; |
| 237 | 256 | ||
| 238 | -D) | 257 | -D) |
| 239 | - if [ $2 -lt 1 ] | 258 | + if [ "x" == "x$2" ] |
| 240 | then | 259 | then |
| 241 | echo -e "$usage" | 260 | echo -e "$usage" |
| 242 | exit 1 | 261 | exit 1 |
| @@ -245,6 +264,11 @@ do | @@ -245,6 +264,11 @@ do | ||
| 245 | shift 2 | 264 | shift 2 |
| 246 | ;; | 265 | ;; |
| 247 | 266 | ||
| 267 | + -s) | ||
| 268 | + sampler="yes" | ||
| 269 | + shift | ||
| 270 | + ;; | ||
| 271 | + | ||
| 248 | -h|--help|*) | 272 | -h|--help|*) |
| 249 | echo "${usage}" | 273 | echo "${usage}" |
| 250 | exit 1 | 274 | exit 1 |
| @@ -284,7 +308,8 @@ esac | @@ -284,7 +308,8 @@ esac | ||
| 284 | # ---------------------------------------------------------------- | 308 | # ---------------------------------------------------------------- |
| 285 | 309 | ||
| 286 | test ${verbose} -ge 1 && echo -n ${getCDInfoMsg} | 310 | test ${verbose} -ge 1 && echo -n ${getCDInfoMsg} |
| 287 | -getCDInfo # gets all info about the CD. Look in shellUtils for more info. | 311 | +# gets all info about the CD. Look in shellUtils for more info. |
| 312 | +getCDInfo "$sampler" "$cddbEntry" | ||
| 288 | test ${verbose} -ge 1 && echo ${ready} | 313 | test ${verbose} -ge 1 && echo ${ready} |
| 289 | 314 | ||
| 290 | if [ ${verbose} -ge 2 ] | 315 | if [ ${verbose} -ge 2 ] |
| @@ -307,8 +307,193 @@ then | @@ -307,8 +307,193 @@ then | ||
| 307 | 307 | ||
| 308 | fi | 308 | fi |
| 309 | 309 | ||
| 310 | +function getDiscInfo | ||
| 311 | +{ | ||
| 312 | + local device | ||
| 313 | + | ||
| 314 | + test $# -ge 1 && device="$1" | ||
| 315 | + | ||
| 316 | + unset diskData cddbId dTracks dLength dIndex dText dExtra | ||
| 317 | + | ||
| 318 | + diskData="`cdda2wav -D ${device} -N -J -v toc,sectors 2>&1`" | ||
| 319 | + | ||
| 320 | + cddbId="`echo "$diskData" |\ | ||
| 321 | + sed '/^CDDB/!d;s/^.*0x\(.*\)$/\1/'`" | ||
| 322 | + dTracks="`echo "$diskData" |\ | ||
| 323 | + sed '/tracks/!d;s/^.*tracks:\([0-9]*\).*$/\1/'`" | ||
| 324 | + dLength="`echo "$diskData" |\ | ||
| 325 | + sed '/tracks/!d;s/^.*time \([0-9:\.]*\).*$/\1/'`" | ||
| 326 | + dIndex="`echo "$diskData" |\ | ||
| 327 | + sed '/CDINDEX/!d;s/^.*: *\([a-zA-Z0-9_\.]*-\).*$/\1/'`" | ||
| 328 | + dText="`echo "$diskData" | sed ' | ||
| 329 | + /CD-Text/!d;s/^[^:]*: *\(.*[^ ]\).*$/\1/'`" | ||
| 330 | + dExtra="`echo "$diskData" | sed ' | ||
| 331 | + /CD-Extra/!d;s/^[^:]*: *\(.*[^ ]\).*$/\1/'`" | ||
| 332 | +} | ||
| 333 | + | ||
| 334 | +function getCDDBInfo | ||
| 335 | +{ | ||
| 336 | + local uri i hello | ||
| 337 | + | ||
| 338 | + uri="freedb.freedb.org/~cddb/cddb.cgi" | ||
| 339 | + | ||
| 340 | + test $# -ge 1 && cddbId="$1" || return 1 | ||
| 341 | + test $# -ge 2 && uri="$2" | ||
| 342 | + | ||
| 343 | + hello="hello=${USER}+${HOSTNAME}+test+0.0.1" | ||
| 344 | + | ||
| 345 | + # first get the genre list from server | ||
| 346 | + eval "`curl -s "http://${uri}?cmd=cddb+lscat&${hello}&proto=6" |\ | ||
| 347 | + sed '1d;$d' | tr -d '\r' | tr '\n' ',' |\ | ||
| 348 | + sed 's/,$//;s/,/" "/g;s/^\(.*\)$/local -a genre=("\1")/'`" | ||
| 349 | + | ||
| 350 | + unset cddbInfo | ||
| 351 | + | ||
| 352 | + # search for info in all genres | ||
| 353 | + for i in "${genre[@]}" | ||
| 354 | + do | ||
| 355 | + local cmd="cmd=cddb+read+${i}+${cddbId}" | ||
| 356 | + local cddb="`curl -s "http://${uri}?${cmd}&${hello}&proto=6"`" | ||
| 357 | + | ||
| 358 | + local ret="`echo "$cddb" | head -c 3`" | ||
| 359 | + | ||
| 360 | + if [ "$ret" != "210" ] | ||
| 361 | + then | ||
| 362 | + if [ ${verbose:-0} -ge 3 ] | ||
| 363 | + then | ||
| 364 | + debug="`echo "$cddb" | head -n 1`" | ||
| 365 | + echo $"[ERROR] cddb: ${debug}" | ||
| 366 | + fi | ||
| 367 | + else | ||
| 368 | + cddb="`echo "$cddb" | tr -d '\r' | sed '1d;/^#/d;/^\.$/{d;q}'`" | ||
| 369 | + cddbInfo[${#cddbInfo[@]}]="$cddb" | ||
| 370 | + fi | ||
| 371 | + done | ||
| 372 | +} | ||
| 373 | + | ||
| 310 | function getCDInfo | 374 | function getCDInfo |
| 311 | { | 375 | { |
| 376 | + local uri device sampler cnt cddb | ||
| 377 | + local delimiter | ||
| 378 | + | ||
| 379 | + sampler=0 | ||
| 380 | + cddbEntry="" | ||
| 381 | + device="/dev/cdrom" | ||
| 382 | + uri="freedb.freedb.org/~cddb/cddb.cgi" | ||
| 383 | + | ||
| 384 | + test $# -ge 1 && sampler="$1" | ||
| 385 | + test $# -ge 2 && cddbEntry="$2" | ||
| 386 | + test $# -ge 3 && device="$3" | ||
| 387 | + test $# -ge 4 && uri="$4" | ||
| 388 | + | ||
| 389 | + getDiscInfo "$device" | ||
| 390 | + getCDDBInfo "$cddbId" | ||
| 391 | + | ||
| 392 | + cnt=${#cddbInfo[@]} | ||
| 393 | + if [ ${cnt} -gt 1 ] | ||
| 394 | + then | ||
| 395 | + if [ "$cddbEntry" -lt $cnt ] 2>/dev/null | ||
| 396 | + then | ||
| 397 | + cddb="${cddbInfo[$cddbEntry]}" | ||
| 398 | + echo "done" | ||
| 399 | + else | ||
| 400 | + echo | ||
| 401 | + echo "found more than 1 CDDB Entry. Please select:" | ||
| 402 | + | ||
| 403 | + local i=0; | ||
| 404 | + while [ $i -lt $cnt ] | ||
| 405 | + do | ||
| 406 | + local title="`echo "${cddbInfo[$i]}" | sed '/^DTITLE/!d;s/^.*=//'`" | ||
| 407 | + echo " [$i] - $title" | ||
| 408 | + i=$((i+1)) | ||
| 409 | + done | ||
| 410 | + | ||
| 411 | + echo " [q] - quit script" | ||
| 412 | + echo | ||
| 413 | + | ||
| 414 | + cddb="" | ||
| 415 | + while [ -z "$cddb" ] | ||
| 416 | + do | ||
| 417 | + echo -n "==> " | ||
| 418 | + read i | ||
| 419 | + | ||
| 420 | + test "x$i" == "xq" && exit 1 | ||
| 421 | + i="`echo "$i" | sed '/[^0-9]/d'`" | ||
| 422 | + test -z "$i" && continue | ||
| 423 | + | ||
| 424 | + cddb="${cddbInfo[$i]}" | ||
| 425 | + test -z "$cddb" && echo "wrong input ($i)" | ||
| 426 | + done | ||
| 427 | + fi | ||
| 428 | + else | ||
| 429 | + cddb="${cddbInfo[0]}" | ||
| 430 | + echo "done" | ||
| 431 | + fi | ||
| 432 | + | ||
| 433 | + eval "`echo "$cddb" | tr -d '\r' | sed ' | ||
| 434 | + /DTITLE/s/^.*=\(\(.*\) \/ \)*\(.*\)$/dArtist="\2";dTitle="\3"/p | ||
| 435 | + /DYEAR/s/^.*=\(.*\)$/dYear="\1"/p | ||
| 436 | + /DGENRE/s/^.*=\(.*\)$/dGenre="\1"/p | ||
| 437 | + /TTITLE/s/^TTITLE\([0-9]*\)=\(.*\)$/tArtist[\1]="";tTitle[\1]="\2"/p | ||
| 438 | + d'`" | ||
| 439 | + | ||
| 440 | + if [ "$sampler" == "yes" ] | ||
| 441 | + then | ||
| 442 | + echo | ||
| 443 | + echo "some CDs contain content from various artist. If this is such a CD" | ||
| 444 | + echo "one might want to declare a pattern that separates the artist from" | ||
| 445 | + echo "the title information. Here are the titles as reported by CDDB:" | ||
| 446 | + echo | ||
| 447 | + | ||
| 448 | + for i in "${tTitle[@]}" | ||
| 449 | + do | ||
| 450 | + echo " - $i" | ||
| 451 | + done | ||
| 452 | + | ||
| 453 | + echo | ||
| 454 | + echo "if you want to split those entries in artist and title please give" | ||
| 455 | + echo "now the string pattern to split at." | ||
| 456 | + echo "Otherwise simply press ENTER here" | ||
| 457 | + echo -n "==> " | ||
| 458 | + | ||
| 459 | + __OLDIFS__="$IFS" | ||
| 460 | + IFS="" | ||
| 461 | + read delimiter | ||
| 462 | + IFS="$__OLDIFS__" | ||
| 463 | + | ||
| 464 | + if [ "x$delimiter" != "x" ] | ||
| 465 | + then | ||
| 466 | + eval "`echo "$cddb" | tr -d '\r' | sed ' | ||
| 467 | + /TTITLE/s/^TTITLE\([0-9]*\)=\(\(.*\)'"$delimiter"'\)*\(.*\)$/tArtist[\1]="\3";tTitle[\1]="\4"/p | ||
| 468 | + d'`" | ||
| 469 | + fi | ||
| 470 | + fi | ||
| 471 | + | ||
| 472 | + # Nu pack ich in alle tArtist die leer sind den dArtist. | ||
| 473 | + i=0 | ||
| 474 | + while [ $i -lt ${#tArtist[@]} ] | ||
| 475 | + do | ||
| 476 | + tNum=$((i+1)) | ||
| 477 | + tLength[$i]=`echo "$diskData" | sed ' | ||
| 478 | + /[^0-9]'$tNum'\.(.*:.*)/ !d | ||
| 479 | + s/.*[^0-9]'$tNum'\.( *\([^)]*\).*$/\1/'` | ||
| 480 | + tStartSec[$i]=`echo "$diskData" | sed ' | ||
| 481 | + /[^0-9]'$tNum'\.([^:]*)/ !d | ||
| 482 | + s/.*[^0-9]'$tNum'\.( *\([^)]*\).*$/\1/'` | ||
| 483 | + | ||
| 484 | + test $tNum -eq ${#tArtist[@]} && tNum="lead-out" || tNum=$((tNum+1)) | ||
| 485 | + | ||
| 486 | + tEndSec[$i]=`echo "$diskData" | sed ' | ||
| 487 | + /[^0-9]'$tNum'\.*([^:]*)/ !d | ||
| 488 | + s/.*[^0-9]'$tNum'\.*( *\([^)]*\).*$/\1/'` | ||
| 489 | + | ||
| 490 | + test -z "${tArtist[$i]}" && tArtist[$i]="$dArtist" | ||
| 491 | + i=$((i+1)) | ||
| 492 | + done | ||
| 493 | +} | ||
| 494 | + | ||
| 495 | +function getCDInfo_old | ||
| 496 | +{ | ||
| 312 | local uri device cmd i hello cddb ret diskData tNum | 497 | local uri device cmd i hello cddb ret diskData tNum |
| 313 | 498 | ||
| 314 | uri="freedb.freedb.org/~cddb/cddb.cgi" | 499 | uri="freedb.freedb.org/~cddb/cddb.cgi" |
| @@ -364,10 +549,11 @@ function getCDInfo | @@ -364,10 +549,11 @@ function getCDInfo | ||
| 364 | /DGENRE/s/^.*=\(.*\)$/dGenre="\1"/p | 549 | /DGENRE/s/^.*=\(.*\)$/dGenre="\1"/p |
| 365 | /TTITLE/s/^TTITLE\([0-9]*\)=\(\(.*\) \/ \)*\(.*\)$/tArtist[\1]="\3";tTitle[\1]="\4"/p | 550 | /TTITLE/s/^TTITLE\([0-9]*\)=\(\(.*\) \/ \)*\(.*\)$/tArtist[\1]="\3";tTitle[\1]="\4"/p |
| 366 | d'`" | 551 | d'`" |
| 367 | - break | ||
| 368 | fi | 552 | fi |
| 369 | done | 553 | done |
| 370 | 554 | ||
| 555 | + exit 1 | ||
| 556 | + | ||
| 371 | # Nu pack ich in alle tArtist die leer sind den dArtist. | 557 | # Nu pack ich in alle tArtist die leer sind den dArtist. |
| 372 | i=0 | 558 | i=0 |
| 373 | while [ $i -lt ${#tArtist[@]} ] | 559 | while [ $i -lt ${#tArtist[@]} ] |
Please
register
or
login
to post a comment