Online video hd

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

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

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

dr_magnus 07.06.2010 01:32

Скрипты на bashПерекодирование аудиокниг

Я уже рассуждал на тему аудиокниг.
Кратко поясню для тех, кто пропустил - я не понимаю, зачем хранить аудиокниги в битрейте более 128. На слух ведь всё равно не различишь, а места занимает больше. Вот я и решил свою коллекцию перегнать в битрейт 96.
И заодно я решил проблему с переносом тегов (большое спасибо Iliander'у).
Кому интересно - под кат.

Я написал небольшой скрипт, который, если запустить его в папке с аудиокнигой, создает в ней директорию 96 и перекодирует туда найденные МР3-файлы с сохранением тегов.
Сам скрипт:
1
2
3
4
5
6
7
8
9
#!/bin/sh
mkdir 96
find -iname '*.mp3' | while read input_file;
do
TITLE=$(mid3v2 -l "$input_file" | grep TIT2 | sed s/^TIT2=//)
ARTIST=$(mid3v2 -l "$input_file" | grep TPE1 | sed s/^TPE1=//)
ALBUM=$(mid3v2 -l "$input_file" | grep TALB | sed s/^TALB=//)
lame -b 96 --cbr --tt "$TITLE" --ta "$ARTIST" --tl "$ALBUM" "$input_file" "./96/$input_file";
done


И немного пояснений:
mid3v2 (входит в пакет mutagen) умеет показывать МР3-теги в таком виде:
IDv2 tag info for b01_00_00.mp3:
TPE1=Сергей Лукьяненко
TALB=Ночной дозор

grep'ом мы выдергиваем отсюда нужный нам тег, а sed'ом отрубаем ненужную часть.

Буду признателен, за любые дополнения. У меня не реализованы следующие вещи:
- Передача каталога как аргумента (никак не могу побороть проблемы с пробелами в именах);
- Удаление файлов после перекодирования (ну это не сложно);
- Переименование файлов согласно тегам (смотрю в сторону eyeD3)

UPD:
Немного подправил скрипт (спасибо за подсказки в коментариях), теперь умеет принимать имя каталога и не боится пробелов.
 1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/sh
dir_name="${1}"
cd "${dir_name}"
mkdir 96
find -iname '*.mp3' | while read input_file;
do
TITLE=$(mid3v2 -l "$input_file" | sed -n 's/^TIT2=//p')
ARTIST=$(mid3v2 -l "$input_file" | sed -n 's/^TPE1=//p')
ALBUM=$(mid3v2 -l "$input_file" | sed -n 's/^TALB=//p')
lame -b 96 --cbr --tt "$TITLE" --ta "$ARTIST" --tl "$ALBUM" "$input_file" "./96/$input_file";
# lame -b 96 --cbr --tt "$TITLE" --ta "$ARTIST" --tl "$ALBUM" "$input_file" "./96/$ARTIST - $TITLE.mp3";
done



Тэги: bash mp3 аудиокнига битрейт кодирование мп3 скрипт
+ 4 -
Похожие Поделиться

xT 07.06.2010 03:01 #
+ 5 -
Места занимает больше - где? на винте?!
Во времена терабайтных ЖД пора уже перестать задумываться о освобождении пары десятков мегабайт.
Если речь идёт про плеер, то не все ли равно сколько там одновременно книг находится?! Ты же их как музыку шафлом не слушаешь. Прочитал\прослушал с десяток - заменил на следующие.

p.s. перенес в скрипты и добавил теги
dr_magnus 07.06.2010 09:28 #
+ 0 -
ну если бы речь шла именно о паре дестяков мегабайт, то можно было бы не заморачиваться. но даже пережатие 128 в 96 уже экономит раза в полтора-два места, а это пара сотен мегобайт. для меня это все еще актуально.
xT 07.06.2010 12:00 #
+ 0 -
Запиши на болванку прочитанные книги
dr_magnus 07.06.2010 12:52 #
+ 0 -
что-то не очень я болванкам доверяю
xT 07.06.2010 14:26 #
+ 3 -
отправь сам себе по гуглопочте : )
m0nhawk 07.06.2010 23:11 #
+ 0 -
Что-то я не доверяю Гуглу с его доступностью 99.9%…
goganchic 16.06.2010 01:22 #
+ 1 -
какой-то бредовый спор: автор поставил задачу и решил ее, не нравится - не пользуй, надо-не-надо это уж каждый сам для себя решит :)
cppmm 07.06.2010 11:11 #
+ 0 -
А у меня на нетбуке 4 гига памяти постоянной. И SD-карточка на два гига. И тоскать с собой террабайтный внешний винт я не хочу. А послушать иногда чего-нибудь, сидя в кафешке с вайфаем за чашечкой кофе можно. Так что, автору таки респект.
xT 07.06.2010 11:59 #
+ 0 -
И ты носишь с собой 20 аудиокниг?
cppmm 07.06.2010 12:03 #
+ 0 -
Иногда, да. Заливаю, к примеру, цикл книг какой-нибудь целиком и пока не прослушаю, валяется. Ну и плюс, кроме аудиокниг у меня есть ещё много разных вещей, чтобы туда складывать.
xT 07.06.2010 14:27 #
+ 0 -
Зачем целиком цикл? : ) не рационально
dr_magnus 07.06.2010 14:58 #
+ 0 -
а по моему очень даже. иногда нет возможности добраться до основного хранилища, а так - цикл всегда под рукой.
xT 07.06.2010 15:00 #
+ 1 -
не - не, зачем хранить книги из цикла, которые уже прослушал?!
haku 08.06.2010 04:38 #
+ 0 -
зачем хранить книги? о_О
xT 08.06.2010 09:06 #
+ 0 -
имелся ввиду нетбук
nemckoff 07.06.2010 03:36 #
+ 5 -
Вы серьёзно? Когда винты на терабайты стоят сущие копейки перегонять 128 в 96? :D
Но дело полезное вот в чем. Можно хранить музыку в lossless или mp3 с битрейтом 320, но для переносного плеера (который не понимает всякие .ape, .flac) перекодировать.
dr_magnus 07.06.2010 09:28 #
+ 0 -
копейка рубль бережет, а по поводу места я отписался выше.
goganchic 16.06.2010 01:24 #
+ 0 -
если все место под музыку уйдет на террабайтном винте, где же тогда порнуху хранить?!
lava 07.06.2010 09:34 #
+ 8 -
зачем тут ещё и греп, если уже сед есть?
sed -n 's/^TPE1=//p ;'
dr_magnus 07.06.2010 09:58 #
+ 2 -
наверное плохо знаю матчасть :-)
Iliander 07.06.2010 10:10 #
+ 2 -
Аж чаем подавился, когда свой ник в RSS увидал.
А скрипт, кстати, хороший, полезный. Помимо, собственно, аудиокниг (которые я слушаю весьма редко, читать больше нравится), помнится, пока не убил свой MP4-плеер, возился с перекодировкой аудио под него. На тот момент так и не решил, как можно сохранять теги — опыта недоставало.
ariessoft 07.06.2010 10:41 #
+ 3 -
Музыку с компьютера перекидываю на плеер таким вот скриптом на питоне (lame_tag):

#!/usr/bin/env python
import os
import eyeD3
import optparse

outdir = "/media/T10/"

parser = optparse.OptionParser()
(options, args) = parser.parse_args();

for f in args:
dname = os.path.dirname(f)
bname = os.path.basename(f)
if not os.path.exists(outdir+dname):
os.makedirs(outdir+dname)

print "Imput file = " , f
outF = outdir + dname + "/" + bname
print "Output file = ", outF

if os.path.isfile(f) and not os.path.isfile(outF):
if eyeD3.isMp3File(f):

tag = eyeD3.Tag()
tag.link(f)

tnum = tag.getTrackNum()

trackNum = tag.getTrackNum()<0>;
trackTotal = tag.getTrackNum()<1>;

artist = tag.getArtist()
album = tag.getAlbum()
title = tag.getTitle()
genre = tag.getGenre()
date = tag.getYear()
images = tag.getImages()


for img in images:
img.writeFile(outdir + dname, bname + ".jpg")

print "Tags =", trackNum, trackTotal, artist, album, title, genre, date, images

print "Start lame"

os.spawnv('P_WAIT','/usr/bin/lame',<'lame','-V5',f,outF>)

print "Tagging..."

tag2 = eyeD3.Tag()
tag2.link(outF,eyeD3.ID3_V2)

tag2.setVersion(eyeD3.ID3_V2_3)
tag2.do_tdtg=False

tag2.setTextEncoding(eyeD3.UTF_16_ENCODING)

tag2.setTrackNum((trackNum, trackTotal));
tag2.setTitle(title)
tag2.setArtist(artist)
tag2.setAlbum(album)
tag2.setGenre(genre)
tag2.setDate(date)

if os.path.exists(outdir+dname+"/"+bname+".jpg"):
tag2.addImage(3,outdir+dname+"/"+bname+".jpg", u"")
os.remove(outdir+dname+"/"+bname+".jpg")

tag2.update(eyeD3.ID3_V2_3)

print "OK"

Копируются теги и даже альбомная картинка.
Запускаю в папке с нужной музыкой командой:
find . -name "*.mp3" -exec lame_tag {} \;
Думаю немного переделать и все ваши задачи решаться
lava 07.06.2010 11:25 #
+ 0 -
имхо, логичнее использовать -iname. Разве только всегда следить за регистром.
Daria 07.06.2010 15:04 #
+ 3 -
Буду признателен, за любые дополнения. У меня не реализованы следующие вещи:
- Передача каталога как аргумента (никак не могу побороть проблемы с пробелами в именах);

используй экранирование или же заключай путь в кавычки

- Переименование файлов согласно тегам (смотрю в сторону eyeD3)

mv "$input_file" "$ARTIST - $TITLE.mp3"
dr_magnus 07.06.2010 15:15 #
+ -2 -
mv "$input_file" "$ARTIST - $TITLE.mp3"

спасибо

а вот с пробелами никак не получается - find постоянно ругается на пробелы
Iliander 07.06.2010 15:50 #
+ 0 -
эм…


if << -n "$1" >> ; then
WHERE="${1}"
else
WHERE="."
fi

mkdir "${WHERE}/96"

find "${WHERE}" -iname '*.mp3' | while read input_file;
do
TITLE=$(mid3v2 -l "$input_file" | grep TIT2 | sed s/^TIT2=//)
ARTIST=$(mid3v2 -l "$input_file" | grep TPE1 | sed s/^TPE1=//)
ALBUM=$(mid3v2 -l "$input_file" | grep TALB | sed s/^TALB=//)
lame -b 96 --cbr --tt "$TITLE" --ta "$ARTIST" --tl "$ALBUM" "$input_file" "${WHERE}/96/$ARTIST - $TITLE.mp3";
done
xT 07.06.2010 17:30 #
+ 0 -
Мне одному заметна повторяемость и желание обернуть в функцию?)
Iliander 07.06.2010 17:46 #
+ 0 -
Может и не одному, но я ничего такого тут не вижу, что можно было бы оборачивать в функцию и в этом был бы смысл. :)
dr_magnus 07.06.2010 17:33 #
+ -2 -
не совсем - теперь уже косяк проявился в этой конструкции:

lame -b 96 --cbr --tt "$TITLE" --ta "$ARTIST" --tl "$ALBUM" "$input_file" "${WHERE}/96/$ARTIST - $TITLE.mp3";
Can't init outfile '/media/sdc1/Music/Audio Books/Лукьяненко Сергей/Цикл "Дозоры"/02 - Дневной дозор/96//media/sdc1/Music/Audio Books/Лукьяненко Сергей/Цикл "Дозоры"/02 - Дневной дозор/00_00_04.mp3'

а использовать переименование выходного файла не стал, т.к. нету тега TITLE.
выкрутился следующим образом
dir_name="${1}"
cd "${dir_name}"

а все остальное без изменений
Iliander 07.06.2010 17:45 #
+ 0 -
Can't init outfile '/media/sdc1/Music/Audio Books/Лукьяненко Сергей/Цикл "Дозоры"/02 - Дневной дозор/96//media/sdc1/Music/Audio Books/Лукьяненко Сергей/Цикл "Дозоры"/02 - Дневной дозор/00_00_04.mp3'

гм… Так и думал, что там без косяков не обойдется, но т.к. тестил его по-быстрому на альбоме из своей дискографии с аккуратными тегами — результатом удовлетворился и оставил.
выкрутился следующим образом

Тогда вставь хотя бы проверку на наличие "$1", чтобы скрипт был немного более универсальным. А то ругаться в консоль будет.
А так, в принципе, решение хорошее, даже лучше моего — KISS в действии :-)
Daria 08.06.2010 00:59 #
+ -4 -
кавычки в имени файла, о боже!
lwilis 08.06.2010 02:16 #
+ 2 -
В XX|-ом веке живем. Привыкайте.
Daria 09.06.2010 02:55 #
+ 0 -
не знала, что в XXI веке сарказм променяют на кавычки. верните мне время назад!
Denchik 19.12.2010 23:39 #
+ 0 -
Я дописал это так ( чтобы работала с кучей папок )
#!/bin/sh
dir_name="${1}"
cd "${dir_name}"
# необходимый битрейт
bit=64
mkdir $bit
find -iname '*.mp3' | while read input_file;
do
TITLE=$(mid3v2 -l "$input_file" | sed -n 's/^TIT2=//p')
ARTIST=$(mid3v2 -l "$input_file" | sed -n 's/^TPE1=//p')
ALBUM=$(mid3v2 -l "$input_file" | sed -n 's/^TALB=//p')
# куда будет сохранять пережатый файл
output_file="./$bit/$input_file"
#если папок много то создать подпапки . / - больше 1
if < `$input_file | grep -o "/" | wc -l` -lt 1 >
then
#длина исходного файла
if_len=${#input_file}
#длина имени файла
name=`readlink -e $input_file`
#выкидываем имя файла
fname=${name##*/}
#считаем его длину
name_len=${#fname}
#отбрасываем из пути первые два символа и длину имени файла
length_without_name=$if_len-$name_len-2
my_path=${input_file:1:length_without_name}
if < ! -d "./$bit$my_path" > ; then
#если нет такой папки то создаем ее
mkdir -p ./$bit$my_path
fi
fi
# echo $my_path >>1
lame -b $bit --cbr --tt "$TITLE" --ta "$ARTIST" --tl "$ALBUM" "$input_file" "$output_file";
done
dr_magnus 19.12.2010 23:50 #
+ -2 -
дружэ, а ты ничего не упустил?
ну и на всякий случай:
#!/bin/sh
dir_name="${1}"
cd "${dir_name}"
tmp_dir="$(mktemp -d -p "$dir_name")"
find -iname '*.mp3' | while read input_file; do
base_dir="$(dirname "$input_file")"
base_file="$(basename "$input_file")"
bitrate=$(mp3info -r m -p "%r\n" "$input_file")
if < "$bitrate" -gt 96 >; then
echo "$base_dir"
title=$(mid3v2 -l "$input_file" | sed -n 's/^TIT2=//p')
artist=$(mid3v2 -l "$input_file" | sed -n 's/^TPE1=//p')
album=$(mid3v2 -l "$input_file" | sed -n 's/^TALB=//p')
lame -b 96 --cbr -h --tt "$title" --ta "$artist" --tl "$album" "$input_file" "$tmp_dir/$base_file"
rm "$input_file"
mv "$tmp_dir/$base_file" "$base_dir"
fi
done
rm -r "$tmp_dir"

использование:
./audio_script.sh /папка/где/у_тебя/лежат/аудиокниги

в любом случае - спасибо.
dr_magnus 19.12.2010 23:52 #
+ -2 -
и еще - а что ты там намутил с длиной файлов?
если честно, то я не понял :-(
Denchik 20.12.2010 15:53 #
+ 0 -
длину я считал для того , чтобы из относительного пути выкинуть имя файла + начальные "./" И потом создать в /папка/где/у_тебя/лежат/аудиокниги -
/папка/где/у_тебя/лежат/аудиокниги/$битрейт и соответсвенно создать там всю структуру директорий самих аудиокниг , в которые будут размещены пожатые нами файлы ...

Вторую тему не видел , поэтому правил то , что на глаза попалось .
А там кодятся множество аудиокниг ?
dr_magnus 22.12.2010 19:31 #
+ -2 -
кодятся.
там просто натравливаешь скрипт на папку и он всё приводит к одному битрейту
Denchik 22.12.2010 01:43 #
+ 0 -
переписал , верхний вариант от меня не в тему ))) -
новый здесь

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

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


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

Online video HD

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

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

Full HD video online

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

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

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