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

Смотреть на русском языке видео

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

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

10.06.10 21:32 NickNill

Скрипты на bashКонвертер из flac в mp3 v 0.50a

Привет всем!
Ну вообщем дело было к вечеру, делать было нечего..
Вспомнил я, что у меня музыка в основном в flac, по трекам. И иногда нужно ее в mp3 кому-то скинуть.
Чтобы не разбираться с mencoder, да плюс еще и скучно немного, решил пошаманить со скриптами.
Знаю что уже есть похожее http://welinux.ru/post/1196/, но нашел его только что, да и там только по одному файлу можно конвертить.
Если интересно что из этого получилось - под кат.


Итак сам скрипт

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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156

#!/bin/bash

#This program 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 Street, Fifth Floor, Boston, MA  02110-1301, USA.

#default settings
dir_name="./"
dir_out="320"
bitrate="320"
rate="--cbr"

#some colors
RED='\e[1;31m'
GREEN='\e[1;32m'
BLUE='\e[1;35m'
NC='\e[0m'

#Help function
function script_help {
    echo -e "${GREEN}Simple script to decode FLAC to MP3 format"
    echo -e "Author: ${RED} NickNill (http://welinux.ru/user/NickNill)"
    echo -e "${GREEN}WARNING: ${RED}it can just decode flac to MP3. You need lame and flac packages!"
    echo -e "${GREEN}Usage: ${BLUE}\n\t./script -d${NC} (Path to directory or files with FLAC.Default is current dir)"
    echo -e "\t\t[${BLUE}-b${NC} MP3 bitrate (default 320)] \n\t\t[${BLUE}-r${NC} Rate type (${BLUE}cbr,abr,vbr${NC}) For abr and vbr must have quality variable. See example.]"
    echo -e "\t\t[${BLUE}-o${NC} Output Dir (default dir is ${BLUE}320${NC} in current directory) ] \n\t\t[${BLUE}-s ${NC}Create subdirs (they will be created same as in source dir)]"
    echo -e "\t\t[${BLUE}-l "options"${NC} Additional options to lame encoder. Must be last in command line! For experts only!] \n${GREEN}Example:${RED} -r abr 160 (The allowed range is 8 - 310) ${NC} or ${RED} -r vbr 5 (The allowed range of n is 0 - 9. 0 - highest quality).${NC}"
    echo -e "${RED}If you dont know what means theese flags - you don't need it ;) Just use ${GREEN} -d ${RED} and maybe ${GREEN} -s ${RED} flags."
    echo -e "${GREEN}Have fun!${NC}"
}

#parsing needed parameters
i=("$@")
num=$#
if [ "$num" -eq "0" ] ; then
    script_help
    exit 0
fi
a=0
while [ "$a" -le  "$num" ];
do
##help
if [ "${i[$a]}" == "-h" ] || [ "${i[$a]}" == "--help" ] ; then
    script_help
    exit 0;
fi
##if checks true then initialise vars
if [ "$dir" == '1' ] && [ -e "${i[$a]}" ] ; then
    dir_name="${i[$a]}"
    dir=0
fi
if [ "$br" == '1' ] ; then
    bitrate=`echo ${i[$a]} | sed 's/[^0-9]\+//g'`
    br=0
fi
if [ "$rt" == '1' ]   ; then
    if [ "${i[$a]}" == 'abr' ] ; then  
        rate="--abr"
    elif [ "${i[$a]}" == 'vbr' ]; then
        rate="-V"
    elif [ "${i[$a]}" != 'cbr' ]; then
        quality="${i[$a]}"
        rate="$rate $quality"
        rt=0
    else
        rt=0
    fi
fi
if [ "$lame" == '1' ] ; then
        lame_p="$lame_p ${i[$a]}"
fi
if [ "$out" == '1' ] ; then
    dir_out="${i[$a]}"
    out='0'
fi

##checks
if [ "${i[$a]}" == '-d' ]; then
    dir='1';
fi
if [ "${i[$a]}" == '-b' ]; then
    br='1';
fi
if [ "${i[$a]}" == '-r' ]; then
    rt='1';
fi
if [ "${i[$a]}" == '-o' ]; then
    out='1';
fi
if [ "${i[$a]}" == '-s' ]; then
    sub='1';
fi
if [ "${i[$a]}" == '-l' ]; then
    lame='1';
fi

a=$(($a+1))
done

#list files
files=`find "$dir_name" -name "*.flac" -type f 2> /dev/null`
echo -e "${GREEN}Now I will do my work =) This is can take a while.${NC}"

echo "$files" | while read a;
do
    echo -e "${BLUE}Processing file:${NC} $a"
    ##add subdirs
    if [ "$sub" == "1" ] ; then
        #remove last slash if it's exist
        dir_name=`echo $dir_name | sed 's/\/.\{0\}$//'`
        subdirs=`echo $a | sed 's/#//g' | sed "s#^$dir_name/##g" | sed 's#/\?[^/]\+.flac.\{0\}$##g'`
        dir_out="$dir_out/$subdirs"
    fi
    #if there no out dir then make it
    if [ ! -d "$dir_out" ] ; then    
        mkdir -p "$dir_out"
    fi
    #remove path, need only filenames
    mp3name=`echo $a | sed 's/.\+\///' | sed 's/.flac/.mp3/'`
   
    #read tags from files
    ARTIST=`metaflac "$a" --show-tag=ARTIST | sed 's/.*=//g'`
    TITLE=`metaflac "$a" --show-tag=TITLE | sed 's/.*=//g'`
    ALBUM=`metaflac "$a" --show-tag=ALBUM | sed 's/.*=//g'`
    TRACK=`metaflac "$a" --show-tag=TRACKNUMBER | sed 's/.*=//g'`
    GENRE=`metaflac "$a" --show-tag=GENRE | sed 's/.*=//g'`
    DATE=`metaflac "$a" --show-tag=DATE | sed 's/.*=//g'`
   
    #remove last slash if it's exist
    dir_out=`echo $dir_out | sed 's/\/.\{0\}$//'`
    if [ "$lame" == '0' ]; then
        lame_p="-q 2"
    fi
    #Encode to mp3 with all settings
    flac -f -d -s "$a" -c |  lame $rate -b $bitrate --add-id3v2 --ta "$ARTIST" --tt "$TITLE" --tl "$ALBUM" --tg "$GENRE" --ty "$DATE" $lame_p - "$dir_out/$mp3name";
    if [ -e "$dir_out/$mp3name" ] ; then
        echo -e "${BLUE}File is saved to${NC} $dirout/$mp3name"
    else
        echo -e "${RED}WARNING: There is no encoded file. Something wrong. Please read help, or contact with me!"
        exit 0
    fi
done


 


Знаю, много чего лишнего, но я очень старался =)
Вдруг кому-то пригодится.
Еще можно обьединить со скриптом, который разбирается с куями, и этот скрипт будет универсальным.
Не судите строго.
Спасибо dr_magnus за совет насчет тегов в своем скрипте
Спасибо за внимание.
UPD: Обновил, так как нашел кучу багов + спасибо Kaener за помощь.
UPD2:Исправил еще немного багов, теперь все должно работать хорошо. Обьявил это версией 0.50а =)
UPD3: Убрал временные файлы, добавил выборочные параметры для lame.



goblinyara 10.06.10 21:49 # +1
эмм... у вас голубой цвет почему-то розовый=)
NickNill 10.06.10 22:20 # +1
а мне голубой не понравился =)
поэтому добавил единичку)
karlicos 10.06.10 22:45 # +1
Советую добавить чтобы help выводился при запуске без параметров) А то я попробовал - началось какое-то ололо)
NickNill 10.06.10 23:59 # +0
думал над этим, могу исправить)
NickNill 11.06.10 00:03 # +0
сделал =)
Kaener 11.06.10 01:24 # +2
Есть некоторые вопросы/предложения:

А у Вас точно работает скрипт, для варианта когда не указана директория «входящих» файлов?
Просто, по-моему вот эта строчка:
files=`find "$dir_name" -name "*.flac"`
не будет работать: из-за того что переменная $dir_name не инициализирована до этого момента в кавычках будет NULL, на что find отреагирует матом.

Если же убрать кавычки (или если был указан путь к папке), то появляется баг/фича — поиск осуществляется рекурсивно, а значит сконвертируются файлы внутри всех подкаталогов. Имхо, надо добавить параметр «-maxdepth 1», чтобы избежать этого.

Также проблема может возникнуть со строкой 137 — т.к. пользователь может указать путь к папке для вывода со слэшем в конце (что обычно бывает при автодополнении), то получится «~/%some_dir%//$mp3name» и lame выдаст ошибку. Может помочь пропускание полученного пути через sed вот так
$dir_out=`echo $dir_out | sed s/'\/$'//`
Правда не знаю насколько правильно данное выражение — мой скилл творить regexp’ы совсем плохо прокачан.

И ещё одно: если указать параметры по умолчанию, до разбора полученной строки, т.е. после «#some colors» дописать что-то вроде
1
2
3
4
5
#default settings
dir_name="./"
dir_out="~/320"
bitrate="320"
rate="cbr"
то можно будет убрать проверки в 106-116 строках, а как бонус — пользователю скрипта будет удобнее менять дефолтные настройки. =)
NickNill 11.06.10 01:37 # +0
спасибо, не досмотрел немного. У меня сначала была эта баг\фича, но потом я добавил кавычки из-за других багов. Надо добавить проверку просто еще одну. Сейчас позанимаюсь исправлением накопившихся багов =)
Kaener 11.06.10 01:59 # +1
Да, бывает. Кстати, спасибо за топик — пнули меня таки более-менее разобраться с sed и awk. =)

P.S. И ещё одно дополнение: по-моему, в строке 85 у Вас опечатка.
NickNill 11.06.10 02:24 # +0
нету =)
NickNill 11.06.10 01:39 # +0
насчет начала строки.. а я как то и не подумал сделать так =) ща изменю
NickNill 11.06.10 02:50 # +0
что интересно, если задаётся mkdir -p "~/320", то и создается ~/320, а не 320. Даже если там и кавычек нету. Не знаю что придумать =(
cubiccat 11.06.10 08:32 # +1
mkdir -p "$HOME/320"
NickNill 11.06.10 16:32 # +0
спасибо!

Посты Комментарии
Последние посты
    Посты Комментарии
    Последние комментарии
      Посты Комментарии
      Изменения
        Посты Комментарии Изменения Черновики Избранное
        Черновики (все)
          Посты Комментарии Изменения Черновики Избранное
          Избранное (всё)
            Посты Комментарии Изменения Черновики Избранное
            Лучшие блоги (все 124)
            Топ пользователей Топ блогов
            Топ пользователей Топ блогов
            Элита (все 2212 из 181 города)
            Топ пользователей Топ блогов
            В сети: Extender, psycho, doraneko

            Новенькие: esendjer, nilsrus, antyblin, skylex, sworod
            welinux.ru

            Смотреть онлайн бесплатно

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


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

            Online video HD

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

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

            Full HD video online

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

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

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