Конвертируем flac в mp3 одним движением

    Доброго времени суток.

    Накачал я тут себе однажды гору музыки, не разбираясь, в каком она формате, во flac или же в mp3. Думал «ну а что, есть же куча утилит, которые все это конвертируют, потом разберусь». Скачал, поискал в сети, чем можно конвертировать, нашел программку All2mp3 (сижу на маке)… Какого же было моё удивление, когда я узнал, что не могу в неё закинуть просто папку Music и ждать, пока она пробежится по всем подпапкам, найдет все файлы flac и конвертирует их в mp3! Начал гуглить, но никакого вменяемого решения так и не нашел.


    Написал небольшой скрипт на shell, который пробегается по папкам, ищет flac, конвертирует их в mp3, и может удалить .flac если вы попросите. Скрипт был написан на коленке, по-этому новые файлы называются *.flac.mp3. Также для его работы нужны установленные программы flac
    и lame.

    Вот сам скрипт:
    #!/bin/sh
    #flac2mp3
    
    error(){
            echo $@ 1>&2;
            exit 1;
    }
    
    r=0
    rem(){
            if [ $r -eq 1 ]; then
                    rm "$1"
            fi
    }
    
    flac2mp3(){
            data=$1
            echo "          -----------------------Working on $data"
            if [ -d "$data" ]; then
                    for file in "$data"*; do
                            if [ -d "$file" ]; then
                                    file="$file"/
                            fi
                            flac2mp3 "$file"
                            wait
                    done
            elif [[ "$data" == *.flac ]]; then 
                    flac -d --stdout "$data" > temp.wav
                    wait
                    echo "          ---------------------------------$data to wav done"
                    lame temp.wav "$data".mp3
                    wait
                    echo "          ---------------------------------$data to $data.mp3 done"
                    rm temp.wav
                    rem "$data"             
            fi
    }
    
    if [ $# -eq 0 ]; then
            error "Wrong arguments"
    fi
    
    echo ============================================================
    if [ $# -eq 1 ]; then
            flac2mp3 "$1"
    elif [ $# -eq 2 ] && [ $1 == "-r" ]; then
            r=1
            flac2mp3 "$2"
    else
            error "Wrong arguments!"
    fi
    


    Как его использовать:
    • Для конвертации БЕЗ удаления файлов .flac:
      flac2mp3 yourMusicFolder/
      

    • Для конвертации C удалением файлов .flac:
      flac2mp3 -r yourMusicFolder/
      



    Проверил у себя — все работает. По крайней мере mp3 файлы есть и ничего лишнего не удалено, что уже неплохо, я считаю. Надеюсь, кому-нибудь пригодится.

    P.S. Буду рад замечаниям по коду, так как на shell пишу очень редко.

    UPD: Скрипт не сохраняет теги! Прошу прощения у тех, кто уже подорвался на этой мине, сейчас буду исправлять.
    UPD2: Так как мое решение работает не так, как хотелось бы, пользователь mgyk любезно предложил свой вариант в комментариях:
    #!/bin/bash
    if [ "${1}" == '' ]; then
    shellDir="$PWD"
    else
    shellDir="${1}"
    fi
    
    prefix=/home/share/music/_mp3
    find "${shellDir}" -name '*.flac' -print | while read fn;
    do
      ARTIST=`metaflac "$fn" --show-tag=ARTIST | sed s/.*=//g`
      TITLE=`metaflac "$fn" --show-tag=TITLE | sed s/.*=//g`
      ALBUM=`metaflac "$fn" --show-tag=ALBUM | sed s/.*=//g`
      GENRE=`metaflac "$fn" --show-tag=GENRE | sed s/.*=//g`
      TRACKNUMBER=`metaflac "$fn" --show-tag=TRACKNUMBER | sed s/.*=//g`
      DATE=`metaflac "$fn" --show-tag=DATE | sed s/.*=//g`
    
    newpath="${prefix}/$ARTIST/$ALBUM"
    newfile=${TITLE}.mp3
    echo $newfile
    mkdir -p "${newpath}"
    
    flac -c -d "${fn}" | lame -m j -q 0 --vbr-new -V 0 -s 44.1 - "${newpath}/${newfile}"
    id3 -t "$TITLE" -T "${TRACKNUMBER:-0}" -a "$ARTIST" -A "$ALBUM" -y "$DATE" -g "${GENRE:-12}" "${newpath}/${newfile}"
    
    done
    
    


    Так же, в коментариях было предложено несколько программ, которые я не нашел, и которые выполняют поставленную задачу:
    Max
    X Lossless decoder
    Share post

    Similar posts

    Comments 23

      +1
      А как же теги?
        0
        Поторопился… Прощайте, несколько гигов музыки, хорошо протегованной…
        Спасибо что заметили, сейчас постараюсь исправить.
        0
          0
          Когда искал почему-то не нашёл, спасибо.
          +4
          #!/bin/bash
          if [ "${1}" == '' ]; then
          shellDir="$PWD"
          else
          shellDir="${1}"
          fi
          
          prefix=/home/share/music/_mp3
          find "${shellDir}" -name '*.flac' -print | while read fn;
          do
            ARTIST=`metaflac "$fn" --show-tag=ARTIST | sed s/.*=//g`
            TITLE=`metaflac "$fn" --show-tag=TITLE | sed s/.*=//g`
            ALBUM=`metaflac "$fn" --show-tag=ALBUM | sed s/.*=//g`
            GENRE=`metaflac "$fn" --show-tag=GENRE | sed s/.*=//g`
            TRACKNUMBER=`metaflac "$fn" --show-tag=TRACKNUMBER | sed s/.*=//g`
            DATE=`metaflac "$fn" --show-tag=DATE | sed s/.*=//g`
          
          newpath="${prefix}/$ARTIST/$ALBUM"
          newfile=${TITLE}.mp3
          echo $newfile
          mkdir -p "${newpath}"
          
          flac -c -d "${fn}" | lame -m j -q 0 --vbr-new -V 0 -s 44.1 - "${newpath}/${newfile}"
          id3 -t "$TITLE" -T "${TRACKNUMBER:-0}" -a "$ARTIST" -A "$ALBUM" -y "$DATE" -g "${GENRE:-12}" "${newpath}/${newfile}"
          
          done
          
          
            0
            Такой скрипт позволяет еще и разложить все правильно, то есть можно натравливать сразу на большую коллекцию флаков
              0
              Благодарю. Позволите в статью вставить?
                0
                Да, конечно
              0
              Стоит заметить, что сохранятся только явно перечисленные теги (из самых часто используемых — disc number, album artist).

              Имхо самый правильный-чтобы-чего-не-потерялось вариант — foobar2000.
              Отлично работает под всеми ОСями.
              Может параллелить конвертирование по количеству доступных ядер.

              Ед-ое потом надо будет запустить подчищающие скрипты по вкусу (удалить исходные файлы, вмонтировать обложки).
              +3
              Есть X Lossless Decoder. Почему-то всегда считал, что это стандарт де-факто для конвертации аудио на Маке.
                0
                Согласен полностью! Как раз решение из серии — закинул папку и «оно само».
                +1
                Неделя shell скриптинга на хабре)
                  +2
                  чем ffmpeg не угодил?
                    –6
                    побойтесь б-га, это мак, а не линукс
                      +4
                      и что? Даже если так — ffmpeg на маке уже не существует?
                      0
                      Честно говоря ничем, просто не подумал.
                      0
                      Тю, да разве это проблема? Вот попробуйте flac+cue распилить на мп3 чтобы еще и теги были и название файлов согласно тегам. Вопрос открыт, пока пользуюсь вот этим.
                        +2
                          +1
                          Кхм. Я сейчас объясню что произошло:
                          — я посоветовал софт, похоже, линукс онли
                          — мне посоветовали софт, похоже, мак онли
                          — оба в хабе никс
                          Я не тролил, честно :)
                            0
                            Если вам так сильно надо перегнать flac в mp3 можно и хакинтош поставить.
                              0
                              Который, кстати, тоже *NIX, ибо Darwin.
                        0
                        Можно ещё посмотреть в сторону fuse файловой системы для «прозрачной» перекодировки mp3fs. Я её пару раз использовал в Linux. И вроде как оно даже работает в MacOS через MacFUSE, но возможно придётся наложить небольшой патч: uwe-arzt.de/20080327.html
                          0
                          Конвертация с копированием тэгов:
                          ffmpeg -i input.flac -acodec libmp3lame -map_metadata 0:0 -sameq output.mp3

                          Only users with full accounts can post comments. Log in, please.