Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Pavouk106 17. 09. 2013, 13:37:40

Název: Rekurzivní převod adresáře do MP3
Přispěvatel: Pavouk106 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.
Název: Re:Rekurzivní převod adresáře do MP3
Přispěvatel: dustin 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ě.
Název: Re:Rekurzivní převod adresáře do MP3
Přispěvatel: JardaP . 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

Název: Re:Rekurzivní převod adresáře do MP3
Přispěvatel: Pavouk106 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í ;-)
Název: Re:Rekurzivní převod adresáře do MP3
Přispěvatel: 3ugeene 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í ;-)
Název: Re:Rekurzivní převod adresáře do MP3
Přispěvatel: 3ugeene 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!



Název: Re:Rekurzivní převod adresáře do MP3
Přispěvatel: Pavouk106 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...
Název: Re:Rekurzivní převod adresáře do MP3
Přispěvatel: dustin 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.
Název: Re:Rekurzivní převod adresáře do MP3
Přispěvatel: 3ugeene 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
Název: Re:Rekurzivní převod adresáře do MP3
Přispěvatel: Pavouk106 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 :-)
Název: Re:Rekurzivní převod adresáře do MP3
Přispěvatel: dustin 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...
Název: Re:Rekurzivní převod adresáře do MP3
Přispěvatel: Pavouk106 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 :-)
Název: Re:Rekurzivní převod adresáře do MP3
Přispěvatel: d_ 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 :)
Název: Re:Rekurzivní převod adresáře do MP3
Přispěvatel: peekaa 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)
Název: Re:Rekurzivní převod adresáře do MP3
Přispěvatel: peekaa 17. 09. 2013, 21:35:28
python jsi snad poznal :-)
Název: Re:Rekurzivní převod adresáře do MP3
Přispěvatel: dustin 17. 09. 2013, 21:36:02
pavouk106 - možná bych zkusil místo autostartu rovnou /etc/fstab  - příklad z toho webu:

mp3fs#/mnt/music /mnt/mp3 fuse allow_other,ro,bitrate=128 0 0

Budeš to mít namontované hned po startu, bez přihlášení do GUI, kdybys to třeba chtěl šířit dál po NFS nebo sambě.
Název: Re:Rekurzivní převod adresáře do MP3
Přispěvatel: Pavouk106 18. 09. 2013, 12:29:52
dustin: Díky za info!

peekaa: Python jsem nepoznal, protože jsem s ním nikdy nedělal :-) Ale díky za příklad. Budu si pamatovat, kam se vracet pro základy, až budu chtít něco vytvořit v Pythonu ;-)

d_: S findem jsem se zatím moc nekamarádil... Ale díky, alespoň vím, že to prolézání jde řešit i jedním příkazem.

Co se člověk nenaučí/nezjistí jedním dotazem na foru... :-)