Видео смотреть бесплатно

Смотреть русский видео

Официальный сайт aksakal 24/7/365

Смотреть видео бесплатно

27.11.2009 14:16

Dariaконвертируем ALAC 2 FLAC

Мой второй бешскрипт.

Мне очень нравится 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 файла с пробелами в имени.


Тэги: alac bash convert debian ffmpeg flac
+ 12 -
Похожие Поделиться

ner_uto 27.11.2009 19:27 #
+ 1 -
# немножко цветов, я люблю цветы

Порадовало:)
dammer 28.11.2009 01:32 #
+ 0 -
Спасибо, работает отлично, как в прочем первый ваш скрипт.
Daria 28.11.2009 08:43 #
+ -1 -
пробовала этим и прежним скриптом получить инвайт на хабру, увы, даже в песочницу не попало.

=хочется взять и
zivot_je_cudo 30.11.2009 10:18 #
+ 0 -
Тоже несколько раз отправлял статьи в песочницу, в последний раз даже получил инвайт, который был уже активирован. Статья из песочницы сразу же благополучно исчезла, а повторно ее в хабрапесок никто не принял.
Sokoloff 29.11.2009 02:13 #
+ 0 -
Наткнулся тут на такой вот набор питоновских скриптов , сам не пробовал, но судя по документации умеют много чего.
inst 31.07.2010 15:39 #
+ 0 -
Какой командой задать степень сжатия выходного FLAC файла?
xrensgory 21.12.2011 14:51 #
+ 1 -
бррр... можно было и оптимизировать некоторые
моменты

например
1
OUTPUTFILE=$(echo $INPUTFILE | sed "s/.m4a$/.flac/i")



было бы красивее вот так

1
OUTPUTFILE="${INPUTFILE%.m4a}.flac"

zoreg 22.05.2012 23:29 #
+ 0 -
Ваша правка работать не будет, если в расширении файла будут присутствовать символы в другом регистре (на то там i в седе и стоит).

То есть, надо так:
OUTPUTFILE="${INPUTFILE%.*}.flac"

Смотреть видео онлайн

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн