Index
Inhaltsverzeichnis
"mp3 Erstellung per Skript"
cd2mp3.sh - MP3 mit CDDB tagen
Das tagen von mp3-Dateien ist immer wieder zeitaufwendig, deshalb lässt man das alles von einem Skript gleich beim Konvertieren erledigen. Durch die CDDB-Abfrage über die Internetverbindung sollten dann eigentlich alle Dateien den richtigen Tag besitzen, nur das Erscheinungsjahr (-year=?) und die Repräsentation des CD-ROM-Laufwerks im Dateisystem (-cddev=?) müssen noch angegeben werden. Dieses Skript benutzt LAME, id3tag, cdda2wav und list_audio_tracks (bei cdda2wav dabei):
Änderungen in den Skripten bitte Kommentieren!
cd2mp3.sh:
# Aus den Optionen Variablen machen: for i in $@ ; do gr=$(echo $1 | sed -e 's/\-//g' | cut -d'=' -f1) declare $gr=$(echo $1 | cut -d'=' -f2) shift done ## Konfiguration: ## # ^^^^^^^^^^^^^ # # Ordner in dem die mp3 gespeichert werden: MP3DIR=$HOME/Musik # Device des CD-ROM-Laufwerks: [ $cddev ] || cddev=/dev/cdrom # Reihenfolge der Titelteile für den mp3-Namen (ohne Leer- & Sonderzeichen): MP3NAME=$ALBUM-$TRACK-$TITLE # $ARTIST $GENRE $year # Die Programme und ihre Optionen: CDDA2WAV=cdda2wav MP_CODER=lame CDDA2WAV_OPTS="-D $cddev -H -P0 -q" MP_OPTIONS="-v" # -v = Variable Bitrate -> ohne ist es schneller, aber schlechtere Qualität # evtl. /usr/lib/X11/xmcd/config/config.sh vorher ausführen. ## Ab hier gibt es eigentlich nichts mehr zu konfigurieren: ## # ^^^^^^ ^^^^^^^^^^^^^ # # Usage anzeigen bei Fehler oder Ctl-C: sorry() { echo -e "\n Usage: $0 [ -cddev=/dev/ice ] [ -year=#### ]" ; exit } trap sorry 1 2 3 15 INT # CDDB-Eintrag mit cda (xmcd-pakage) holen: echo -e "\033[33;1;40mGet CDDB-entry....\033[m" cda -dev $cddev on >/dev/null 2>&1 TOCFILE=$(cda -dev $cddev toc | sed -e s/\`/\'/g -e 's/[;:*#?|><\"\$!]//g') cda -dev $cddev toc | sed -e s/\`/\'/g -e 's/[;:*#?|><\"\$!]//g' -e 's/\//-/g' cda -dev $cddev off >/dev/null 2>&1 # Abbrechen und meckern, wenn cda nicht funktioniert: if [ $? != 0 ] ; then echo "/usr/lib/X11/xmcd/config/$(echo $cddev | cut -d'/' -f3)\ missing -> pleas run /usr/lib/X11/xmcd/config/config.sh" exit 1 fi # Abfrage der zu konvertierenden Tracks: echo -en "\nWhich Title should be converted\nfor all just press ENTER: " read TRACKS sleep 2 # Den CDDB-Eintrag in Variablen quetschen: GENRES=$(echo "$TOCFILE" | grep "^Genre" | cut -d' ' -f2) GENRE=$(echo "$GENRES" | tr '[:upper:]' '[:lower:]') # Wird noch erweitert... (nur einträge ohne Sonderzeichen und Leerzeichen) case "$GENRE" in blues) GENRE=0; ;; # Blues classical) GENRE=32; ;; # Classical country) GENRE=2; ;; # Country folk) GENRE=80; ;; # Folk jazz) GENRE=8; ;; # Jazz newage) GENRE=10; ;; # Newage reggae) GENRE=16; ;; # Reggae rock) GENRE=17; ;; # Rock soundtrack) GENRE=24; ;; # Soundtrack oldies) GENRE=11; ;; # Oldies pop) GENRE=13; ;; # Pop r\&b) GENRE=14; ;; # R&B rap) GENRE=15; ;; # Rap vocal) GENRE=28; ;; # Vocal punk) GENRE=43; ;; # Punk speech) GENRE=101; ;; # Speech chanson) GENRE=102; ;; # Chanson *) GENRE=12 # Other GENRES=Other echo -e "\t\033[31;1;40mWarning:\033[m Genre not found in CDDB-File -> set it to \"Other\"!"; ;; esac ARTIST=$(echo "$TOCFILE" | sed 4p -n | cut -d'/' -f1 |\ sed -e 's/\ /_/g' -e 's/_$//g' -e 's/\//-/g') [ $ARTIST = '(unknown_title)' ] && ARTIST=$$ ALBUM=$(echo "$TOCFILE" | sed 4p -n | cut -d'/' -f2 |\ sed -e 's/^\ //g' -e 's/\ /_/g' -e 's/\//-/g' ) [ $ALBUM = '(unknown_title)' ] && ALBUM=$$ [ $TRACKS ] || TRACKS=$(list_audio_tracks -D $cddev | cut -f1) # Erstellen der Unterferzeichnise: mkdir -p $MP3DIR/$GENRES/$ARTIST echo # Nun ist es soweit -> Konvertierung wird gestartet: for TRACK in $TRACKS ; do let "LINE = 5 + $(echo $TRACK | sed -e 's/^0//g')" TITLE=$(echo "$TOCFILE" | sed "$LINE"p -n |\ sed -e 's/^.*[[:blank:]][[:blank:]]//g' -e 's/\ /_/g' -e 's/?//g' -e 's/\//-/g') [ $TITLE ] || TITLE=Unknown echo -e "\033[33;1;40mStart Encoding\ Track-$TRACK to $MP3NAME.mp3....\033[m" time $CDDA2WAV $CDDA2WAV_OPTS -t$TRACK $DEBUG - |\ $MP_CODER $MP_OPTIONS\ --tt "$(echo $TITLE | sed -e 's/_/\ /g')"\ --ta "$(echo $ARTIST | sed -e 's/_/\ /g')"\ --tl "$(echo $ALBUM | sed -e 's/_/\ /g')"\ --tn "$TRACK"\ --tg "$GENRE"\ --tc "LAME-Encoded by Uli's cd2mp3"\ --ty "$year"\ - $MP3DIR/$GENRES/$ARTIST/$MP3NAME.mp3 if [ $? != 0 ] ; then exit 1 fi # Bestätigung das alles funktioniert hat: echo -e "File \033[33;1;40m$MP3NAME.mp3\033[m successfully created.\n" # M3U-File erstellen: echo "./$MP3NAME.mp3" >>\ $MP3DIR/$GENRES/$ARTIST/$ALBUM-00.m3u done
Audio-CD ohne CDDB eintrag mit Tag versehen oder bestehende MP3-Datei mit Tag versehen
Sollte die CD nicht in CDDB geführt werden, dann hilft vieleicht dieses unfertige Skript weiter. Es benutzt LAME, id3tag, cdda2wav und list_audio_tracks (bei cdda2wav dabei) wie cd2mp3.sh, erwartet aber für jedes Musikstück entweder Optionen oder verlangt interaktiv nach den entsprechenden Eingaben. track2mp3 mit symbolischer Verknüpfung zu mp3tager oder umbekehrt.
Die Optionen die angegeben werden können sind:
[ -cddev=/dev/ice ] [ -artist=Artist ] [ -album=Album ] [ -tracknumber=Nr. ] [ -genre=GenreNr. ] [ -year=Year ] [ -title=Title ]
Wird eine Option nicht angegeben wird diese interaktiv Erfragt.
Änderungen in den Skripten bitte Kommentieren!
# Wer bin ich? (track2mp3 oder mp3tager?) SKRIPT=$(echo $0 | sed "s/^.*\/\([^\\]*\)/\1/") # Aus den Optionen Variablen machen: for i in $@ ; do gr=$(echo $1 | sed -e 's/\-//g' | cut -d'=' -f1) declare $gr=$(echo $1 | cut -d'=' -f2) shift done # Ordner in dem die mp3 gespeichert werden: MP3DIR=$HOME/public_html/shared/Musik [ $cddev ] || cddev=/dev/cdrom CDDA2WAV=cdda2wav MP_CODER=lame CDDA2WAV_OPTS="-D $cddev -H -P0 -q" MP_OPTIONS="-v" ## Ab hier giebt es eigentlich nichts mehr zu konfigurieren: ## # ^^^^^^ ^^^^^^^^^^^^^ # # Usage anzeigen bei Fehler oder Ctl-C: sorry() { echo -e "\n Usage: $0 [ -cddev=/dev/ice ]\ [ -artist=Artist ]\ [ -album=Album ]\n\ [ -title=Title ]\ [ -tracknumber=Nr. ]\ [ -genre=GenreNr. ]\ [ -year=Year ]\n" ; exit } trap sorry 1 2 3 15 INT # Ah, ich wurde als track2mp3 aufgerufen, also Audio Tracks auflisten # und meckern wenn keine CD da ist: if [ $SKRIPT = track2mp3 ] ; then echo -e "\n\033[33;1;40mAbfrage für id3tag:\033[m\n\ ~~~~~~~~~~~~~~~~~~~" list_audio_tracks -D $cddev 2>/dev/null if [ $? != 0 ] ; then echo -e "\033[31;1;40mKeine CD in $cddev gefunden!\n\033[m" exit 1 fi fi # Kontrolieren ob die Option schon gesetzt ist, wennn nicht Fragen: [ $tracknumber ] || echo -en "Track-Nr.: " [ $tracknumber ] && echo "Track-Nr.: $tracknumber" [ $tracknumber ] || read "tracknumber" [ $title ] || echo -en "Titel: " [ $title ] && echo "Titel: $title" [ $title ] || read "title" [ $artist ] || echo -en "Interpret: " [ $artist ] && echo "Interpret: $artist" [ $artist ] || read "artist" [ $album ] || echo -en "Album: " [ $album ] && echo "Album: $album" [ $album ] || read "album" # Harte Arbeit (zum Glück giebt's sed): [ $genre ] || echo -en "Soll die Genre Liste angezeigt werden um die Nr. heraus zu finden? [ Y / n ]: " [ $genre ] || read "yesno" [ $genre ] || if [ -z "$yesno" -o _"$yesno" = _Y -o _"$yesno"_ = _y_ ] ; then echo -e "123 A Cappella 34 Acid 74 Acid Jazz\n\ 73 Acid Punk 99 Acoustic 20 Alternative\n\ 40 Alt. Rock 26 Ambient 145 Anime\n\ 90 Avantgarde 116 Ballad 41 Bass\n\ 135 Beat 85 Bebob 96 Big Band\n\ 138 Black Metal 89 Bluegrass 0 Blues\n\ 107 Booty Bass 132 BritPop 65 Cabaret\n\ 88 Celtic 104 Chamber Music 102 Chanson\n\ 97 Chorus 136 Christian Gangsta Rap 61 Christian Rap\n\ 141 Christian Rock 32 Classical 1 Classic Rock\n\ 112 Club 128 Club-House 57 Comedy\n\ 140 Contemporary Christian 2 Country 139 Crossover 58 Cult 3 Dance 125 Dance Hall\n\ 50 Darkwave 22 Death Metal 4 Disco\n\ 55 Dream 127 Drum & Bass 122 Drum Solo\n\ 120 Duet 98 Easy Listening 52 Electronic\n\ 48 Ethnic 54 Eurodance 124 Euro-House\n\ 25 Euro-Techno 84 Fast-Fusion 80 Folk\n\ 115 Folklore 81 Folk/Rock 119 Freestyle\n\ 5 Funk 30 Fusion 36 Game\n\ 59 Gangsta Rap 126 Goa 38 Gospel\n\ 49 Gothic 91 Gothic Rock 6 Grunge\n\ 129 Hardcore 79 Hard Rock 137 Heavy Metal\n\ 7 Hip-Hop 35 House 100 Humour\n\ 131 Indie 19 Industrial 33 Instrumental\n\ 46 Instrumental Pop 47 Instrumental Rock 8 Jazz\n\ 29 Jazz+Funk 146 JPop 63 Jungle\n\ 86 Latin 71 Lo-Fi 45 Meditative\n\ 142 Merengue 9 Metal 77 Musical\n\ 82 National Folk 64 Native American 133 Negerpunk\n\ 10 New Age 66 New Wave 39 Noise\n\ 11 Oldies 103 Opera 12 Other\n\ 75 Polka 134 Polsk Punk 13 Pop\n\ 53 Pop-Folk 62 Pop/Funk 109 Porn Groove\n\ 117 Power Ballad 23 Pranks 108 Primus\n\ 92 Progressive Rock 67 Psychedelic 93 Psychedelic Rock\n\ 43 Punk 121 Punk Rock 15 Rap\n\ 68 Rave 14 R&B 16 Reggae\n\ 76 Retro 87 Revival 118 Rhythmic Soul\n\ 17 Rock 78 Rock & Roll 143 Salsa\n\ 114 Samba 110 Satire 69 Showtunes\n\ 21 Ska 111 Slow Jam 95 Slow Rock\n\ 105 Sonata 42 Soul 37 Sound Clip\n\ 24 Soundtrack 56 Southern Rock 44 Space\n\ 101 Speech 83 Swing 94 Symphonic Rock\n\ 106 Symphony 147 Synthpop 113 Tango\n\ 18 Techno 51 Techno-Industrial 130 Terror\n\ 144 Thrash Metal 60 Top 40 70 Trailer\n\ 31 Trance 72 Tribal 27 Trip-Hop\n\ 28 Vocal\n\ Hit Q to quit!" | less fi [ $genre ] || echo -en "Genre-Nr.: " [ $genre ] && echo -en "Genre-Nr.: $genre " [ $genre ] || read "genre" case "$genre" in 00) GENRE="Blues"; ;; 01) GENRE="Classic_Rock"; ;; 02) GENRE="Country"; ;; 03) GENRE="Dance"; ;; 04) GENRE="Disco"; ;; 05) GENRE="Funk"; ;; 06) GENRE="Grunge"; ;; 07) GENRE="Hip-Hop"; ;; 08) GENRE="Jazz"; ;; 09) GENRE="Metal"; ;; 10) GENRE="New_Age"; ;; 11) GENRE="Oldies"; ;; 12) GENRE="Other"; ;; 13) GENRE="Pop"; ;; 14) GENRE="R&B"; ;; 15) GENRE="Rap"; ;; 16) GENRE="Reggae"; ;; 17) GENRE="Rock"; ;; 18) GENRE="Techno"; ;; 19) GENRE="Industrial"; ;; 20) GENRE="Alternative"; ;; 21) GENRE="Ska"; ;; 22) GENRE="Death_Metal"; ;; 23) GENRE="Pranks"; ;; 24) GENRE="Soundtrack"; ;; 25) GENRE="Euro-Techno"; ;; 26) GENRE="Ambient"; ;; 27) GENRE="Trip-Hop"; ;; 28) GENRE="Vocal"; ;; 29) GENRE="Jazz+Funk"; ;; 30) GENRE="Fusion"; ;; 31) GENRE="Trance"; ;; 32) GENRE="Classical"; ;; 33) GENRE="Instrumental"; ;; 34) GENRE="Acid"; ;; 35) GENRE="House"; ;; 36) GENRE="Game"; ;; 37) GENRE="Sound_Clip"; ;; 38) GENRE="Gospel"; ;; 39) GENRE="Noise"; ;; 40) GENRE="Alternative_Rock"; ;; 41) GENRE="Bass"; ;; 43) GENRE="Punk"; ;; 44) GENRE="Space"; ;; 45) GENRE="Meditative"; ;; 46) GENRE="Instrumental_Pop"; ;; 47) GENRE="Instrumental_Rock"; ;; 48) GENRE="Ethnic"; ;; 49) GENRE="Gothic"; ;; 50) GENRE="Darkwave"; ;; 51) GENRE="Techno-Industrial"; ;; 52) GENRE="Electronic"; ;; 53) GENRE="Pop-Folk"; ;; 54) GENRE="Eurodance"; ;; 55) GENRE="Dream"; ;; 56) GENRE="Southern_Rock"; ;; 57) GENRE="Comedy"; ;; 58) GENRE="Cult"; ;; 59) GENRE="Gangsta"; ;; 60) GENRE="Top_40"; ;; 61) GENRE="Christian_Rap"; ;; 62) GENRE="Pop/Funk"; ;; 63) GENRE="Jungle"; ;; 64) GENRE="Native_US"; ;; 65) GENRE="Cabaret"; ;; 66) GENRE="New_Wave"; ;; 67) GENRE="Psychadelic"; ;; 68) GENRE="Rave"; ;; 69) GENRE="Showtunes"; ;; 70) GENRE="Trailer"; ;; 71) GENRE="Lo-Fi"; ;; 72) GENRE="Tribal"; ;; 73) GENRE="Acid_Punk"; ;; 74) GENRE="Acid_Jazz"; ;; 75) GENRE="Polka"; ;; 76) GENRE="Retro"; ;; 77) GENRE="Musical"; ;; 78) GENRE="Rock_&_Roll"; ;; 79) GENRE="Hard_Rock"; ;; 80) GENRE="Folk"; ;; 81) GENRE="Folk-Rock"; ;; 82) GENRE="National_Folk"; ;; 83) GENRE="Swing"; ;; 84) GENRE="Fast_Fusion"; ;; 85) GENRE="Bebob"; ;; 86) GENRE="Latin"; ;; 87) GENRE="Revival"; ;; 88) GENRE="Celtic"; ;; 89) GENRE="Bluegrass"; ;; 90) GENRE="Avantgarde"; ;; 91) GENRE="Gothic_Rock"; ;; 92) GENRE="Progressive_Rock"; ;; 93) GENRE="Psychedelic_Rock"; ;; 94) GENRE="Symphonic_Rock"; ;; 95) GENRE="Slow_Rock"; ;; 96) GENRE="Big_Band"; ;; 97) GENRE="Chorus"; ;; 98) GENRE="Easy_Listening"; ;; 99) GENRE="Acoustic"; ;; 100) GENRE="Humour"; ;; 101) GENRE="Speech"; ;; 102) GENRE="Chanson"; ;; 103) GENRE="Opera"; ;; 104) GENRE="Chamber_Music"; ;; 105) GENRE="Sonata"; ;; 106) GENRE="Symphony"; ;; 107) GENRE="Booty_Bass"; ;; 108) GENRE="Primus"; ;; 109) GENRE="Porn_Groove"; ;; 110) GENRE="Satire"; ;; 111) GENRE="Slow_Jam"; ;; 112) GENRE="Club"; ;; 113) GENRE="Tango"; ;; 114) GENRE="Samba"; ;; 115) GENRE="Folklore"; ;; 116) GENRE="Ballad"; ;; 117) GENRE="Power_Ballad"; ;; 118) GENRE="Rhytmic_Soul"; ;; 119) GENRE="Freestyle"; ;; 120) GENRE="Duet"; ;; 121) GENRE="Punk_Rock"; ;; 122) GENRE="Drum_Solo"; ;; 123) GENRE="Acapella"; ;; 124) GENRE="Euro-House"; ;; 125) GENRE="Dance_Hall"; ;; 126) GENRE="Goa"; ;; 127) GENRE="Drum_&_Bass"; ;; 128) GENRE="Club-House"; ;; 129) GENRE="Hardcore"; ;; 130) GENRE="Terror"; ;; 131) GENRE="Indie"; ;; 132) GENRE="BritPop"; ;; 133) GENRE="Negerpunk"; ;; 134) GENRE="Polsk_Punk"; ;; 135) GENRE="Beat"; ;; 136) GENRE="Christian_Gangsta"; ;; 137) GENRE="Heavy_Metal"; ;; 138) GENRE="Black_Metal"; ;; 139) GENRE="Crossover"; ;; 140) GENRE="Contemporary_C"; ;; 141) GENRE="Christian_Rock"; ;; 142) GENRE="Merengue"; ;; 143) GENRE="Salsa"; ;; 144) GENRE="Thrash_Metal"; ;; 145) GENRE="Anime"; ;; 146) GENRE="JPop"; ;; 147) GENRE="SynthPop"; ;; esac echo "entspricht Genre = $GENRE" [ $year ] || echo -en "Jahr: " [ $year ] && echo "Jahr: $year" [ $year ] || read "year" # Ah, mein Name ist also track2mp3: if [ $SKRIPT = track2mp3 ] ; then echo -en "\nReady to convert? [ Y / n ] " read "yesno" if ! [ -z "$yesno" -o _"$yesno" = _Y -o _"$yesno"_ = _y_ ] ; then exit fi mkdir -p $MP3DIR/$GENRE/$artist time $CDDA2WAV $CDDA2WAV_OPTS -t$tracknumber - |\ $MP_CODER $MP_OPTIONS\ --tt "$title"\ --ta "$artist"\ --tl "$album"\ --tn "$tracknumber"\ --tg "$genre"\ --tc "LAME-Encoded by Uli's cd2mp3"\ --ty "$year"\ - $MP3DIR/$GENRE/$(echo $artist | sed -e 's/\ /_/g')/$(echo $album | sed -e 's/\ /_/g')-$tracknumber-$(echo $title | sed -e 's/\ /_/g').mp3 if [ $? != 0 ] ; then exit 1 fi echo -e "File \033[33;1;40m$(echo $album | sed -e 's/\ /_/g')-$tracknumber-$(echo $title | sed -e 's/\ /_/g').mp3\033[m successfully created.\n" # M3U-File erstellen: echo "./$(echo $album | sed -e 's/\ /_/g')-$tracknumber-$(echo $title | sed -e 's/\ /_/g').mp3" >>\ $MP3DIR/$GENRE/$(echo $artist | sed -e 's/\ /_/g')/$(echo $album | sed -e 's/\ /_/g')-00.m3u fi if [ $SKRIPT = mp3tager ] ; then echo -en "\nReady to Tag? [ Y / n ] " read "yesno" if ! [ -z "$yesno" -o _"$yesno" = _Y -o _"$yesno"_ = _y_ ] ; then exit fi mkdir -p $MP3DIR/$GENRE/$(echo $artist | sed -e 's/\ /_/g') cp $file $MP3DIR/$GENRE/$(echo $artist | sed -e 's/\ /_/g')/$(echo $album | sed -e 's/\ /_/g')-$tracknumber-$(echo $title | sed -e 's/\ /_/g').mp3 id3tag \ -s"$title"\ -a"$artist"\ -A"$album"\ -t"$tracknumber"\ -g"$genre"\ -c"LAME-Encoded by Uli's cd2mp3"\ -y"$year"\ $MP3DIR/$GENRE/$(echo $artist | sed -e 's/\ /_/g')/$(echo $album | sed -e 's/\ /_/g')-$tracknumber-$(echo $title | sed -e 's/\ /_/g').mp3 if [ $? != 0 ] ; then exit 1 fi echo -e "File \033[33;1;40m$(echo $album | sed -e 's/\ /_/g')-$tracknumber-$(echo $title | sed -e 's/\ /_/g').mp3\033[m successfully taged.\n" # M3U-File erstellen: echo "./$(echo $album | sed -e 's/\ /_/g')-$tracknumber-$(echo $title | sed -e 's/\ /_/g').mp3" >>\ $MP3DIR/$GENRE/$(echo $artist | sed -e 's/\ /_/g')/$(echo $album | sed -e 's/\ /_/g')-00.m3u fi
CD-Infos auslesen
Wen die Neugierde treibt, kann sich mal die nichtausgelesenen Informationen einer CD ansehen:
Änderungen in den Skripten bitte Kommentieren!
CD-info.sh:
if [ -z $1 ] ; then echo -n "Bitte Device eingeben (cdrom|cdrw): " read CD RD=$CD else RD=$1 fi if [ -z $RD ] ; then RD=0 fi if [ cdrom = $RD ] ; then RD=/dev/cdrom elif [ cdrw = $RD ] ; then RD=/dev/cdrw else RD=/dev/cdrom fi #RD=/dev/cdrw for i in 32768,7 32776,32 32808,32 32958,128 33086,128 33214,128 \ 33342,128 33470,32 33581,16 33598,16 33615,16 33632,16 \ 33647,128 40861,128 do old_IFS="$IFS" IFS="," set -- $i IFS="$old_IFS" OFFSET=$1 LENGTH=$2 echo "*`dd if=$RD bs=1 skip=$OFFSET count=$LENGTH 2> /dev/null`#" done