27.11.2009 14:16
Мой второй бешскрипт.
Мне очень нравится lossless формат FLAC. И опять главная медиатека русского сегмента сети мне чем-то не угодила. Дело в том, что иногда lossless в ней встречается хоть и отдельными файлами (для каждого трека), но в формате ALAC. Это проприетарный формат с яблочным запахом. К сожалению или же к радости, его переваривает EasyTag, которым я активно пользуюсь (кстати, Exfalso с ним работает). Это подтолкнуло создать меня скрипт для конвертирования ALAC во FLAC.
Добрый google подсказал мне решение: библиотеки ffmpeg позволяют конвертировать почти всё во всё. Я уже было хотела ограничится однострочником вроде
ffmpeg -y -i inputfile.alac outputfile.flac, но увы, не всё так просто - ffmpeg не может писать тэги во FLAC. Хотя возможно это скоро изменится, разработчики писали, что "уже работают" над патчем. Чтобы не ждать не скорое скоро, я написала свой костыль.
понадобятся пакеты
ffmpeg,
mpeg4ip-utils,
flac. Я использую Ubuntu, и установила их вот так:
$ sudo apt-get install ffmpeg mpeg4ip-utils flac
на этом подготовка заканчивается, вот листинг:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
#!/bin/bash # alac2flac 0.2 # convert ALAC files to FLAC with keeping tags
# немножко цветов, я люблю цветы RED='\e<1;31m' BLUE='\e<1;34m' NC='\e<0m' # no color
f_flag=0 # флаг параметра переименования, 0 = флаг не поставлен d_flag=0 # флаг параметра удаления входящего файла, 0 = флаг не поставлен
# функция, которая оповещает об использовании и выходит с EX_USAGE usage(){ echo "alac2flac version 0.2" echo echo "usage: alac2flac <option> INPUTFILE" echo echo "options:" echo -e " -f rename output file to '"$BLUE"TRACKNUMBER - ARTIST - TITLE.flac$NC'" echo " -d delete input file" exit 64 # EX_USAGE }
# функция, которая обрабатывает переменные связанные с файлами setFileVars(){ INPUTFILE=$1 OUTPUTFILE=$(echo $INPUTFILE | sed "s/.m4a$/.flac/i") FILEPATH=${INPUTFILE%/*}
# а если в аргументе INPUTFILE нет родительских директорий? if < "$FILEPATH" = "$INPUTFILE" > then FILEPATH="."; fi }
# начнём пилить всё, что пришло с командной строки. if (($# > 0)) # если существуют аргументы, then while < $# -gt 1 > # пока не останется лишь один, машина будет трудится. do case $1 in -f) f_flag=1;; # аргумент -f, поставим флаг -d) d_flag=1;; # аргумент -d, поставим флаг esac shift # сдвинем аргументы $2->$1, $3->$2 done if < -f "$1" > # если "последний" аргумент файл, then setFileVars "$1" # обрабатываем. else # нет? намекаем, как этим пользоваться. echo -e "Bad news, Harry! There are$RED no file in arguments!$NC" echo usage fi else usage # матёрый пользователь напросился на помощь fi
echo $INPUTFILE
# собсвенно, перекодировка произходит в этой строке ffmpeg -y -i "$INPUTFILE" "$OUTPUTFILE" 2> /dev/null
ffmpeg_EXITCODE=$?
if (($ffmpeg_EXITCODE)) then # если мы облажались, это отличное место для лога #echo $INPUTFILE >> failtoconvert.log echo -e "Bad news, Harry! Snape spelled Levicorpus, ya$RED ffmpeg goes wrong! ${NC}" exit $ffmpeg_EXITCODE fi
# убираем возможные излишки наших прежних стараний rm -f "${INPUTFILE}".tag ; rm -f "${INPUTFILE}".tmp
# тэги FLAC и их друзья из лагеря ALAC FIELDS='TITLE Name ARTIST Artist ALBUM Album DATE Year TRACKNUMBER Track GENRE Genre'
# прочитаем все ALAC тэги и сохраним их в пустой файл mp4info "$INPUTFILE" | tail --lines=+5 > "${INPUTFILE}".tmp
# это разделитель строки, ещё его называют line splitter IFS=$'\n'
# отпарсим пары, создадим временый файл с нужными нам тэгами for Var in $FIELDS # в первой итерации Var будет иметь значение "TITLE Name" do FLACTAG=$(echo $Var| sed "s/\ .*//") # разделяем эту сладкую парочку ALACTAG=$(echo $Var| sed "s/.*\ //") TAG=$(sed -n "s/^ $ALACTAG: //p" "${INPUTFILE}".tmp) eval $FLACTAG='"$TAG"' # магия, да? echo $FLACTAG="$TAG" >> "${INPUTFILE}".tag # сохраняем в файл
done
# подчистим TRACKNUMBER TRACKNUMBER=$(printf %02d $(echo $TRACKNUMBER | sed "s/\ .*//"))
# импортируем во FLAC напарсенные тэги из файла metaflac --import-tags-from="${INPUTFILE}".tag "$OUTPUTFILE"
# код для параметра -d, чтоб удалить файл на входе if (($d_flag)) then rm -f "$INPUTFILE" fi
# код для параметра -f, чтоб переименовать файл на выходе. if (($f_flag)) then mv "$OUTPUTFILE" "$FILEPATH/$TRACKNUMBER - $ARTIST - $TITLE.flac" echo -e "$FILEPATH/$TRACKNUMBER - $ARTIST - $TITLE.flac ${BLUE}..done! ${NC}" OUTPUTFILE="$TRACKNUMBER - $ARTIST - $TITLE.flac" fi
# подчистим rm -f "${INPUTFILE}".tag ; rm -f "${INPUTFILE}".tmp
# всё хорошо echo -e "$FILEPATH/$OUTPUTFILE ${BLUE}..done! ${NC}"
exit 0</option>
|
Скопируйте скрипт в нужное вам место, через chmod +x дайте права на запуск и используйте, как хотите!
ps: Всяческие предложения и мнения приветствуются
upd: v 0.2 - исправлен баг при удалении исходного alac файла с пробелами в имени.
Порадовало:)