The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Раздел полезных советов: Скрипт для перекодирования коллекци..."
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"Раздел полезных советов: Скрипт для перекодирования коллекци..."  +/
Сообщение от auto_tips (?), 28-Дек-08, 22:35 
Понадобилось мне однажды перекодировать некоторое количество музыкальных композиций из формата FLAC/APE/WAV в MP3.

encode_list.txt - содержит полные пути до директорий с исходными файлами (путь не должен оканчиватся на "\")

В системе должны быть установлены утилиты flac, mac, lame.

Приветствуется улучшенная версия скрипта. Хотя лично мне он понадобился всего один раз...
но после небольших изменений он может стать еще полезнее, в некоторых случаях.


#!/bin/bash

# шаманское заклинание
IFS="
";
# конец шаманского заклинания

# чего и куда класть
ENCODE_PATH=`pwd`;
ENCODE_LIST="encode_list.txt"

for i in `cat $ENCODE_LIST`; do
    FLAC_count=`find "$i" -name "*.flac" | wc -l`
    APE_count=`find "$i" -name "*.ape" | wc -l`
    WAV_count=`find "$i" -name "*.wav" | wc -l`
    echo "dir = '$i'";
    if [ $WAV_count -lt $FLAC_count ] && [ $APE_count -lt $FLAC_count ]
    then
    echo "FLAC detected";
    for j in "$i"/*.flac; do
        out_name=`basename ${j/.flac/.mp3}`;
        out_dir=`basename $i`
        out_full="$ENCODE_PATH/$out_dir/$out_name";
        mkdir "$ENCODE_PATH/$out_dir";
        echo `date +"%T %y/%m/%d"` encoding "'"$out_name"'" >> $ENCODE_PATH/$out_dir/encode.log;
        flac -d "$j" -o - | lame -ms -v -V0 -h - "$out_full"; #>> $ENCODE_PATH/$out_dir/encode.log 2>> $ENCODE_PATH/$out_dir/encode.log;
    done;
    elif [ $FLAC_count -lt $APE_count ] && [ $WAV_count -lt $APE_count ]
    then
    echo "APE detected";
    for j in "$i"/*.ape; do
        out_name=`basename ${j/.ape/.mp3}`;
        out_dir=`basename $i`
        out_full="$ENCODE_PATH/$out_dir/$out_name";
        mkdir "$ENCODE_PATH/$out_dir";
        echo `date +"%T %y/%m/%d"` encoding "'"$out_name"'" >> $ENCODE_PATH/$out_dir/encode.log;
        mac "$j" - -d | lame -ms -v -V0 -h - "$out_full"; #>> $ENCODE_PATH/$out_dir/encode.log 2>> $ENCODE_PATH/$out_dir/encode.log;
    done;
    else [ $FLAC_count -le $WAV_count ] && [ $APE_count -le $WAV_count ]
    echo "WAV detected";
    for j in "$i"/*.wav; do
        out_name=`basename ${j/.wav/.mp3}`;
        out_dir=`basename $i`
        out_full="$ENCODE_PATH/$out_dir/$out_name";
        mkdir "$ENCODE_PATH/$out_dir";
        echo `date +"%T %y/%m/%d"` encoding "'"$out_name"'" >> $ENCODE_PATH/$out_dir/encode.log;
        lame -ms -v -V0 -h "$j" "$out_full"; #>> $ENCODE_PATH/$out_dir/encode.log 2>> $ENCODE_PATH/$out_dir/encode.log;
    done;
    fi;
done


URL:
Обсуждается: http://www.opennet.me/tips/info/1881.shtml

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по ответам | RSS]

1. Сообщение от blackp (?), 28-Дек-08, 22:35   +/
или так

#!/bin/bash
# Copyright (C) 2007-2008 Vladimir V. Kamarzin <vvk@altlinux.org>
#
# Split one big audiofile (cdimage) to separate tracks
#
# This file is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.

#. shell-error

renice 19 -p $$ > /dev/null 2>&1 ||:

while read cuefile
do
        # get cuesheet filename
        cue="${cuefile##*/}"

        # object (filename without extension)
        obj=${cue%.cue}

        # relative path to object's directory
        objdir="${cuefile%/*}"

        pushd "$objdir"

        # First, find all files that need decoding before process and decode it
        if [ -f "$obj".mp3 ]; then
                lame --decode "$obj".mp3 "$obj".wav || fatal "cannot decode $obj.mp3, exiting"

        elif [ -f "$obj".ogg ]; then
                oggdec "$obj".ogg || fatal "cannot decode $obj.ogg, exiting"
        fi

        # Next, split one-big-file. Use flac for loseless and ogg for lossy
        if [ -f "$obj".ape ]; then
                cuebreakpoints "$cue" | shnsplit -o 'flac flac --best -o %f -' -t %n "$obj".ape \
                || fatal "failed to split $obj.ape"

        elif [ -f "$obj".flac ]; then
                cuebreakpoints "$cue" | shnsplit -o 'flac flac --best -o %f -' -t %n "$obj".flac \
                || fatal "failed to split $obj.flac"

        elif [ -f "$obj".wav ]; then
                cuebreakpoints "$cue" | shnsplit -o 'cust ext=ogg oggenc -q 7 -o %f -' -t %n "$obj".wav \
                || fatal "failed to split $obj.wav"

        else
                fatal "$obj file not found, exiting"
        fi

        # Recode tags. Assume that russian tags has windows-1251 encoding
        case "$LANG" in
                ru_RU.KOI8-R) recode_to=koi8-r
                        ;;
                ru_RU.CP1251) recode_not_needed=1
                        ;;
                *) recode_to=utf8
        esac

        [ "$recode_not_needed" = 1 ] && ln -s "$cue" tmp.cue || recode -f 1251.."$recode_to" < "$cue" > tmp.cue \
        || fatal "cannot recode cue: $cue"

        # Embed tags into tracks, rename tracks
        for (( i=1 ; i <= $(cueprint -d '%N' tmp.cue) ; ++i ))
        do
          NN=$(printf '%02d' $i)

          [ -s "$NN.flac" ] && {
            # Prepare track tags, filter out empty tags, embed the rest
            cueprint -n $i -t \
            'ARRANGER=%A\nCOMPOSER=%C\nGENRE=%G\nMESSAGE=%M\nTRACKNUMBER=%n\nARTIST=%p\nTITLE=%t\nALBUM=%T\n' \
                tmp.cue | egrep -v '=$' | metaflac --import-tags-from=- $NN.flac
            # rename NN.flac to "NN - TrackTitle.flac"
            mv $NN.flac "$NN - $(cueprint -n $i -t %t tmp.cue | sed -e "s,/,,g").flac"
          }

          [ -s "$NN.ogg" ] && {
            cueprint -n $i -t \
            'ARRANGER=%A\nCOMPOSER=%C\nGENRE=%G\nCOMMENT=%M\nTRACKNUMBER=%n\nARTIST=%p\nTITLE=%t\nALBUM=%T\n' \
                tmp.cue | egrep -v '=$' > tags.tmp
            vorbiscomment -a -c tags.tmp "$NN.ogg"
            mv $NN.ogg "$NN - $(cueprint -n $i -t %t tmp.cue | sed -e "s,/,,g").ogg"
          }

        done

       rm -f tmp.cue "$cue" "$obj".{flac,ape,mp3,ogg,wav} tags.tmp
        popd

done < <(find . -type f -iname "*.cue")

Ответить | Правка | Наверх | Cообщить модератору

2. Сообщение от tallmanemail (?), 28-Дек-08, 23:37   +/
я давно использую soundconverter, хотя не уверен что он поддерживает ape
Ответить | Правка | Наверх | Cообщить модератору

3. Сообщение от КтулхЪ (?), 29-Дек-08, 08:47   +/
каждый для себя сам напишет скрипт если надо, универсальным скрипт все равно не сделать, лучше юзать самаю обычную софтину конвертер, там хоть драг-н-дроп, и не недо пути прописывать.
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #7

4. Сообщение от Аноним (4), 29-Дек-08, 11:47   +/
Дайте скрипт по перекодированию названий из KOI-R и windows-1251 в UTF-8! Желательно чтобы сам определял.
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #5, #6

5. Сообщение от Аноним (-), 29-Дек-08, 12:57   +/
>Дайте скрипт по перекодированию названий из KOI-R и windows-1251 в UTF-8! Желательно
>чтобы сам определял.

python-mutagen поможет.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #4 Ответы: #9

6. Сообщение от ptremail (??), 29-Дек-08, 15:31   +/
>Дайте скрипт по перекодированию названий из KOI-R и windows-1251 в UTF-8! Желательно
>чтобы сам определял.

convmv

Но сам не определяет. А надо ли?

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #4

7. Сообщение от i (??), 30-Дек-08, 14:25   +/
+1
для себя сделал скрипт который из (ape|flac|mv + cue) режет на треки в flac|ogg|mp3 с заполнением тегов
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #3 Ответы: #8

8. Сообщение от alex789 (?), 31-Дек-08, 00:11   +/
поделись плиз
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #7

9. Сообщение от Free (??), 31-Дек-08, 23:07   +/
>>Дайте скрипт по перекодированию названий из KOI-R и windows-1251 в UTF-8! Желательно
>>чтобы сам определял.
>
>python-mutagen поможет.

Не поможет. Перепробовал все, что есть. Закончилось все равно дополнительной правкой руками...

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #5

10. Сообщение от Zenitur (?), 13-Сен-10, 01:31   +/
Нашёл скрипт "shntool split -f "Flac.cue" -o flac "music.flac" -t %p_%a_%n_%t". Он, типа, сохраняет файл с нужным названием.
Ну, называет shntool его правильно. А тэги что-то ему не даёт!
Вроде бы такая простая задача... А вместо реализации - какой-то дебилизм 2004 года программирования!
oggenc -q 7 "~/file.flac" "~/file.ogg"
Конвентирует ВСЁ, и тэги сохраняет тоже, и НИКАКОГО WAV НЕ НАДО!!! Ну неужели и здесь трудно так сделать???
Ответить | Правка | Наверх | Cообщить модератору

11. Сообщение от Аноним (11), 05-Май-20, 23:17   +/
Кривой скрипт.
Проверить перед тем как запостить нет привычки?
Ответить | Правка | Наверх | Cообщить модератору


Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру