Rekurzivní převod adresáře do MP3

Pavouk106

  • *****
  • 2 398
    • Zobrazit profil
    • Můj blog
    • E-mail
Rekurzivní převod adresáře do MP3
« kdy: 17. 09. 2013, 13:37:40 »
Ahoj,

začínám řešit malý problém. Mám hudební sbírku stylu:
Kód: [Vybrat]
/home/pavouk/hudba
 - flac
 |-- jednotlivá alba
 | |-- jednotlivé stopy
 - jednotlivé stopy .ogg

Chtěl bych mít sbírku stylu:
Kód: [Vybrat]
/home/pavouk/hudba
 - flac
 |-- jednotlivá alba
   |-- jednotlivé stopy
 - ogg
 |-- jednotlivá alba
   |-- jednotlivé stopy
 - mp3
 |-- jednotlivá alba
   |-- jednotlivé stopy

S tím OGG si poradím sám, ale potřeboval bych nějaký skript, který by mi prolezl adresář flac i s podadresáři a udělal mi adresář MP3 s totožnými podadresáři a tam mi nasypal jednotlivé stopy. Ideálně samozřejmě včetně tagů. Vůbec netuším, kterým směrem se vydat. Řešení bych rád co nejvíc lightweight, ideálně bash skript (asi nejednořádkový...) s využitím nějakého prográmku na konverzi.

Pokud by se tu našla dobrá duše, která by skript napsala, rád se z něj něco naučím a příště si snad vystačím sám :-) S bashem jsem doteď neskriptoval.


dustin

Re:Rekurzivní převod adresáře do MP3
« Odpověď #1 kdy: 17. 09. 2013, 13:50:20 »
Místo udržování duplicitní struktury flacu v MP3 bych použil http://khenriks.github.io/mp3fs/ . Funguje výborně.

JardaP .

  • *****
  • 11 064
    • Zobrazit profil
    • E-mail
Re:Rekurzivní převod adresáře do MP3
« Odpověď #2 kdy: 17. 09. 2013, 13:57:42 »
Zkuste tohle. Co to udela s flac tagy nemam tuseni, nezkousel jsem. Mozna to bude chtit nejakou upravu.

Kód: [Vybrat]
#!/bin/bash

# Script that will convert a lot of audio formats to MP3 via the commandline.
# Dependencies: MPlayer, mutagen and lame (It should accept every format that both mutagen and Mplayer accept).

# mp3ify <input_dir> [<output_dir>] transforms structure <input_dir>/X/Y/.../Z into structure <output_dir>/X/Y/.../Z according to the following rules:

#    * flac, ogg, m4a, ape, aac, mpc files will be encoded to mp3 preserving tags.

#    * Everything else will be copied without modification.

# Default output_dir is /tmp/mp3ify.

# lame settings fine-tunning is done editing the configuration variables here below.


DEFAULT_OUTPUT_DIR=/tmp/mp3ify
QUALITY=2
VBR_QUALITY=4
MIN_BITRATE=64
MAX_BITRATE=256
SAMPLE_FREQ=44.1


function any_to_mp3 {

  PIPE=`mktemp -u -t mp3ify.pipe.XXXXXX`
  mkfifo "$PIPE"

  mplayer -nocorrect-pts -vo null -vc null -ao pcm:fast:file="$PIPE" "$INPUT_FILE" -noconsolecontrols > /dev/null 2>&1 &

  lame -m j -q $QUALITY -v -V $VBR_QUALITY -b $MIN_BITRATE \
       -B $MAX_BITRATE -s $SAMPLE_FREQ "$PIPE" "$OUTPUT_FILE" > /dev/null 2>&1

  rm "$PIPE"

  python -c "
import mutagen
input = mutagen.File(\"$INPUT_FILE\", easy = True)
output = mutagen.File(\"$OUTPUT_FILE\", easy = True)
for tag in [ 'artist', 'album', 'tracknumber', 'date', 'genre', 'title', 'comment' ]:
  value = input.get(tag)
  if value: output[tag] = value[0]
output.save(v1=2)"
}


function usage {

  echo "mp3ify <input_dir> [<output_dir>]

  Transforms structure <input_dir>/X/Y/.../Z into structure <output_dir>/X/Y/.../Z
  according to the following rules:

    flac, ogg, m4a, ape, aac, mpc files will be encoded to mp3 preserving tags.

    Everything else will be copied without modification.

  Requires: mplayer, lame, mutagen.
"
  exit 1
}


INPUT_DIR="$1"
[ -d "$INPUT_DIR" ] || usage
OUTPUT_DIR="${2:-$DEFAULT_OUTPUT_DIR}"

find "$INPUT_DIR" -name '*.*' | while read INPUT_FILE
do
    INPUT_EXTENSION="${INPUT_FILE##*.}"
    INPUT_EXTENSION_LOWERCASE=`echo $INPUT_EXTENSION | tr "[A-Z]" "[a-z]"`
    OUTPUT_FILE="$OUTPUT_DIR/${INPUT_FILE#$INPUT_DIR}"
    mkdir -p "`dirname "$OUTPUT_FILE"`"


    case $INPUT_EXTENSION_LOWERCASE in
    flv|flac|m4a|ogg|ape|aac|mpc|mp4|wav)
OUTPUT_FILE="${OUTPUT_FILE%.$INPUT_EXTENSION}.mp3"
        echo -n "Converting ${INPUT_FILE##*/}... "
        any_to_mp3
    ;;
    *)
echo -n "Copying ${INPUT_FILE##*/}... "
        cp "$INPUT_FILE" "$OUTPUT_FILE"
    ;;
  esac

  echo "done."
done

« Poslední změna: 17. 09. 2013, 14:21:03 od Petr Krčmář »

Pavouk106

  • *****
  • 2 398
    • Zobrazit profil
    • Můj blog
    • E-mail
Re:Rekurzivní převod adresáře do MP3
« Odpověď #3 kdy: 17. 09. 2013, 14:21:01 »
Co poslal Jarda, to je přesně to, co jsem myslel. Mám základ, z něj něco vykoukám a můžu si to i předělat...

mp3fs vyzkouším jako první, uvidíme, jak to na Atomu (kde navíc ve VirtualBoxu jedou Win XP) pojede :-D Podle toho se uvidí ;-)

3ugeene

Re:Rekurzivní převod adresáře do MP3
« Odpověď #4 kdy: 17. 09. 2013, 15:28:08 »
Co poslal Jarda, to je přesně to, co jsem myslel. Mám základ, z něj něco vykoukám a můžu si to i předělat...

mp3fs vyzkouším jako první, uvidíme, jak to na Atomu (kde navíc ve VirtualBoxu jedou Win XP) pojede :-D Podle toho se uvidí ;-)


3ugeene

Re:Rekurzivní převod adresáře do MP3
« Odpověď #5 kdy: 17. 09. 2013, 15:28:43 »
mp3fs vyzkouším jako první, uvidíme, jak to na Atomu (kde navíc ve VirtualBoxu jedou Win XP) pojede :-D Podle toho se uvidí ;-)


mother of god!




Pavouk106

  • *****
  • 2 398
    • Zobrazit profil
    • Můj blog
    • E-mail
Re:Rekurzivní převod adresáře do MP3
« Odpověď #6 kdy: 17. 09. 2013, 16:23:51 »
Robin: Koukám, že Tě to tak rozhodilo, že jsi to nedokázal dát dohromady v prvním postu ;D

Jen abych Tě uklidnil - (ne)jsem sadomasochista.

XP ve VB jedou asi tak jako na srovnatelnym stroji (Pentium 3). Jóó, když teď iTunes chtějí prolézt všechny stopy, vypadá to, že to budou dělat celej příští rok... ;-) Hodlám to používat jen pro synchronizaci iPodu, takže si dám jednorázovej masakr s prolezením kolekce a pak to už pojede...

dustin

Re:Rekurzivní převod adresáře do MP3
« Odpověď #7 kdy: 17. 09. 2013, 17:03:52 »
mp3fs vyzkouším jako první, uvidíme, jak to na Atomu (kde navíc ve VirtualBoxu jedou Win XP) pojede :-D Podle toho se uvidí ;-)

Rád si přečtu, jak to dopadlo, díky.

3ugeene

Re:Rekurzivní převod adresáře do MP3
« Odpověď #8 kdy: 17. 09. 2013, 17:11:12 »
Robin: Koukám, že Tě to tak rozhodilo, že jsi to nedokázal dát dohromady v prvním postu ;D

Nojo, vono mě to odhlásilo a přihlásilo a pak zas... no nic... Ale podle mě to sadomasochárna je, nicméně jsem to nezkoušel. Ale kolikrát jsem si říkal, že bych po přechodu na linux právě kvůli iPhonu musel používat VBox s iTunes, je ale pravda, že jsem neměl v hlavě ideu s Atomem :D

Pavouk106

  • *****
  • 2 398
    • Zobrazit profil
    • Můj blog
    • E-mail
Re:Rekurzivní převod adresáře do MP3
« Odpověď #9 kdy: 17. 09. 2013, 17:37:10 »
Robin: Já to beru jednoduše, i5 sedí doma, zatímco Atom tahám všude s sebou. VBox s Win XP jede na tohle využití obstojně. Jen teda iTunes se instalovaly asi 1,5 hodiny :-D

dustin: Jede to (překvapivě?) skvěle! mp3fs /absolutni/cesta/k/flac/adresari/ /cesta/k/mp3/adresari/ A to je vše :-) iTunes mi kolekci rozházely hned podle tagů, takže super. Naprosto to předčilo očekávání. Jen jsem přidal -b 192, chi vyšší kvalitu, než je default 128.

Dokonce v iTunes, jedoucích v XP, jedoucích ve VBoxu můžu poslouchat MP3 dekódované z flacu živě. Na Intel Atom N455 ;D Teď to zkouším, sedím tu a hraje mi muzika do uší, úplně v pohodě... ;-)

Sadomaso ano, ale kupodivu funkční :-) Teď ještě sehnat někoho s iPod shuffle 4g, abych zkusil Voiceover a pak hurá do eshopu a nakupovat :-)

dustin

Re:Rekurzivní převod adresáře do MP3
« Odpověď #10 kdy: 17. 09. 2013, 17:44:43 »
Super, to rád slyším. Mám to doma, ale na P4.

Pořád čtu, jak windowsí lidé řeší synchronizaci svých obrovských knihoven flac a mp3... Když jim popíšu mp3fs, většinou vůbec nepochopí ten geniální princip... :-) Přitom řada z nich by win na média serveru vůbec nepotřebovala...

Pavouk106

  • *****
  • 2 398
    • Zobrazit profil
    • Můj blog
    • E-mail
Re:Rekurzivní převod adresáře do MP3
« Odpověď #11 kdy: 17. 09. 2013, 17:59:24 »
Dustin: Řada Windowsáků by na svých PC Windows nepotřebovala...

Ale tohle je fakt pěkná věcička, naprosto jednoduchá, funkční. Super. Teď na tom jedu a asi nebudu měnit. Jen si zařídím automatickej mount (přidám do autostart) a budu spokojenej jak želva :-)

d_

Re:Rekurzivní převod adresáře do MP3
« Odpověď #12 kdy: 17. 09. 2013, 21:23:42 »
toto Ti konvertuje hudbu/video do mp3:
Kód: [Vybrat]
input=file.daco
output=file.mp3
mplayer -ao pcm:file=a.wav -novideo $hocico # vyberie hudobnu zlozku s pesnicky/videa
lame a.wav $output # vybranu raw zlozku zvuku konvertuje do mp3 :)
rm a.wav # zmaze pomocny subor :)

zoznam rekuzne priecinku dostanes cez find (daj nech vypisuje obycajne subory, ne priecinky a mas :)

peekaa

  • ***
  • 123
    • Zobrazit profil
    • E-mail
Re:Rekurzivní převod adresáře do MP3
« Odpověď #13 kdy: 17. 09. 2013, 21:34:08 »
toto používám již delší dobu, je v tom i normalizace
Kód: [Vybrat]
# -*- coding: utf-8 -*-
import os, random, shutil, stat, re, time, sys

bitrate="128k"
inDir="."
outDir="_normalize_and_%s" % (bitrate)
tempName="normalize+%s-temp.mp3" % (bitrate)
command1=r'call "c:\Program Files\FreeTime\FormatFactory\FFModules\ffmpeg.exe" -v 1 -loglevel warning -y -map_meta_data "%s":"%s" -i "%s" -ab %s "%s"'
command2='c:\prg\mp3gain\mp3gain.exe  /r /c "%s"'


for root, dirs, files in os.walk(inDir):
    if os.path.normpath(root).startswith(outDir):
        continue

    print("="*60)
    print(root)
    for i in sorted(files):
        if os.path.isfile(tempName): os.remove(tempName)
        if i==tempName or i.endswith(".py"):
            continue
        if i.lower().endswith(("mp3","flac","wma","wav","mpa")):
            inNameFull=os.path.join(root,i)
            outname, ext=os.path.splitext(i)
            outNamemp3=outname+".mp3"
            outNameFull=os.path.normpath(os.path.join(outDir,root,outNamemp3))

            print("-"*60)
            print(outNameFull)
            if os.path.isfile(outNameFull):
                print ("...same file")
                continue
            outDirFull, f=os.path.split(outNameFull)

            commandFull1=command1 %(inNameFull, tempName, inNameFull, bitrate, tempName)
            os.system (commandFull1)
            if not os.path.isdir(outDirFull):
                os.makedirs(outDirFull)
            shutil.copy(tempName, outNameFull)

            commandFull2=command2 %(outNameFull)
            os.system (commandFull2)
            print("\n")
        else:
            print ("jen kopiruji: ",i)
            inNameFull=os.path.join(root,i)
            outDirFull=os.path.normpath(os.path.join(outDir,root))
            if not os.path.isdir(outDirFull):
                os.makedirs(outDirFull)
            shutil.copy(inNameFull, outDirFull)


if os.path.isfile(tempName): os.remove(tempName)

peekaa

  • ***
  • 123
    • Zobrazit profil
    • E-mail
Re:Rekurzivní převod adresáře do MP3
« Odpověď #14 kdy: 17. 09. 2013, 21:35:28 »
python jsi snad poznal :-)