Показаны сообщения с ярлыком convert. Показать все сообщения
Показаны сообщения с ярлыком convert. Показать все сообщения

суббота, 7 декабря 2013 г.

Аудио книги

В последнее время пристрастился я слушать аудио книги. Слушаю на сматрфоне LG Optimus G e975

Слушаю с помощью программы Ambling BookPlayer. Автор этой программы залег на дно, и уже не принимает советов и просьб по усовершенствованию программы (а у меня есть пара идеек). Зато GooglePlay уверенно принимает деньги за эту программу, чем я и воспользовался.

Аудио книги почему то принято разбивать на огромное количество файлов. Даже если один файл - одна глава, все равно это как то надумано. Мне почему то не нравится такая файло-помоечная структура. По крайней мере хранить этот бардак неудобно.

Я написал на bash небольшую программку, которая объединяет эти файлы в один, а заодно создает XML файл для экспорта в bookreader.
Работает она из под наутилуса Ubuntu.
#!/bin/bash
#----------------------------------------------------------------------
# Программа объеденения музыкальных файлов (книг)
# Для установки скопировать в папку 
#  ~/.local/share/nautilus/scripts

#----------------------------------------------------------------------
# --- Версионность ---
# Начальная версия
#VERSION=0.1
# улучшение алгоритмов кодирования
#VERSION=0.2
#VERSION=0.3
# Заполнение полей в соответствии с xml описанием для импорта в ambling book reader
#VERSION=0.4
# Добавлено переименование обложки в соответствии с названием книги.
#VERSION=0.41
# Баг. Обложка не конвертится. (fixed)
# Добавить полоску времени, а не пульсар (fixed)
#VERSION=0.42
# Добавлено управление битрейтом, генерацией Обложки, XML, результирующего файла (fixed)
VERSION=0.43

#----------------------------------------------------------------------
# Переменные и константы
ERROR=192
INPUT="concat:"
BITRATE="96k|32k|64k|128k|192k|256k"
MIN_BITRATE="96k|32k|64k|128k|192k|256k"
MAX_BITRATE="96k|32k|64k|128k|192k|256k"
CODEC="libvorbis"
CURENT_DIR=$(pwd)
IN_DURATION=0
CREATE_COVER=TRUE
CREATE_XML=TRUE
CREATE_ONEOGG=TRUE

#----------------------------------------------------------------------
# xml ambling bookplayer Tags
BOOK_NAME=""
AUTHOR_NAME=""
NARRATOR_NAME=""
PUBLISHER=""
COPYRIGHT=""
IMAGE_FILE_NAME=""
SERIES_NAME=""
SERIES_SEQUENCE=""

#----------------------------------------------------------------------
# audiofile Tags (атавизм, времени не было сделать ревизию)
TITLE=""
ARTIST=""
ALBUM_ARTIST=""
ALBUM=""
GENRE="AudioBook"
DATE=""
TRACK=""
PUBLISHER=""
ENCODED_BY=""
COPYRIGHT=""
COMPOSER=""
PERFORMER=""
DISC=""
ENCODER="ffmpeg"
COVER=""

check_installed()
{
  PKG_OK=$(dpkg-query -W --showformat='${Status}\n' $1 |grep "install ok installed")

  if [ "" == "$PKG_OK" ]; then
    zenity --no-wrap --error --text="$1 package not found!\n Install it"
    exit $ERROR
  fi
}

# Выход по ошибке
exit_on_error()
{
  yad --title "Error" --text "$1" 200 200
  exit 192
}

# Возвращает в секундах время звучания звукового файла
duration()
{
  RET=$(ffmpeg -i "$1" 2>&1 | grep Duration | awk '{ print $2 }' | tr -d ',')
  S=$(echo ${RET:0:2}*60*60+${RET:3:2}*60+${RET:6:2} | bc)
  echo $S
}

check_nautilus_env()
{
  #--------------------------------------------------------------------
  # Сохраняем для отладки
  echo "Аргументы командной строки запуска скрипта в Nautius" >> tst.txt
  echo "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" >> tst.txt
  echo "" >> tst.txt

  if [ "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" == "" ]; then
    echo "Этот скрипт запускается из под наутилуса"
    exit_on_error
  fi
}

#######################################################################
#                                Main code
#

#----------------------------------------------------------------------
check_nautilus_env
check_installed yad
check_installed python-mutagen

#----------------------------------------------------------------------
# Получаем имена тегов

AUTHOR_NAME=$(mid3iconv --encoding=Windows-1251 --dry-run --debug "$1" | grep TPE1 | sed 's/TPE1=//')
if [ "$AUTHOR_NAME" == "" ]; then
  AUTHOR_NAME="$1"
fi

BOOK_NAME=$(mid3iconv --encoding=Windows-1251 --dry-run --debug "$1" | grep TIT2 | sed 's/TIT2=//')
if [ "$BOOK_NAME" == "" ]; then
  BOOK_NAME="$1"
fi

SERIES_NAME="$BOOK_NAME"

TAGS=$(yad --geometry=400x200 --center\
    --title="Enter Track Tags" \
    --form --text="$CURENT_DIR" \
    --field="Название Книги" \
    --field="Автор Книги" \
    --field="Название серии" \
    --field="Номер книги в серии" \
    --field="Читает" \
    --field="Обложка:FL" \
    --field="Конвертировать обложку:CHK" \
    --field="Создавать XML:CHK" \
    --field="Создавать ogg файл:CHK" \
    --field="Средний битрейт:CB" \
    --field="Минимальный битрейт:CB" \
    --field="Максимальный битрейт:CB" \
    --item-separator='|' \
    "$BOOK_NAME" \
    "$AUTHOR_NAME" \
    "$SERIES_NAME" \
    "$SERIES_SEQUENCE" \
    "$NARRATOR_NAME" \
    "$IMAGE_FILE_NAME" \
    $CREATE_COVER \
    $CREATE_XML \
    $CREATE_ONEOGG \
    $BITRATE \
    $MIN_BITRATE \
    $MAX_BITRATE \
    --button="gtk-ok:0" --button="gtk-cancel:1")

if [[ $? -eq 1 ]]; then
  #  cancel button pressed
  exit 192
fi

BOOK_NAME=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $1 }')
BOOK_NAME=$(echo "$BOOK_NAME" | tr '[ ]' '[_]')
AUTHOR_NAME=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $2 }')
AUTHOR_NAME=$(echo "$AUTHOR_NAME" | tr '[ ]' '[_]')
SERIES_NAME=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $3 }')
SERIES_NAME=$(echo "$SERIES_NAME" | tr '[ ]' '[_]')
SERIES_SEQUENCE=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $4 }')
SERIES_SEQUENCE=$(echo "$SERIES_SEQUENCE" | tr '[ ]' '[_]')
NARRATOR_NAME=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $5 }')
NARRATOR_NAME=$(echo "$NARRATOR_NAME" | tr '[ ]' '[_]')
IMAGE_FILE_NAME=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $6 }')
IMAGE_FILE_NAME=$(basename $IMAGE_FILE_NAME)
CREATE_COVER=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $7 }')
CREATE_XML=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $8 }')
CREATE_ONEOGG=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $9 }')
BITRATE=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $10 }')
MIN_BITRATE=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $11 }')
MAX_BITRATE=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $12 }')
BUTTON_OK=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $13 }')
BUTTON_CANSEL=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $14 }')

#----------------------------------------------------------------------
# Сохраняем для отладки
echo "RAW значения формы----------------------------------" > tst.txt
echo $TAGS >> tst.txt
echo "
Разобраные значения формы----------------------------------
BOOK_NAME: $BOOK_NAME
AUTHOR_NAME: $AUTHOR_NAME
SERIES_NAME: $SERIES_NAME
SERIES_SEQUENCE: $SERIES_SEQUENCE
NARRATOR_NAME: $NARRATOR_NAME
IMAGE_FILE_NAME: $IMAGE_FILE_NAME
" >> tst.txt

for arg
do
  NF=$(echo "$arg" | tr '[ ]' '[_]')
  INPUT=$INPUT"|$NF"
  if [ ! "$arg" == "$NF" ]; 
    then 
      if [ -e "$NF" ]; then
        exit_on_error "$NF: File exist already.\n\nExiting."
      fi
      mv "$arg" "$NF"; 
  fi
  NF_DURATION=$(duration $NF)
  IN_DURATION=$(( $IN_DURATION+$NF_DURATION ))
done

INPUT=$(echo "$INPUT" | sed 's/:|/:/')

FFMPEG_CMD="ffmpeg -i \"$INPUT\" \\
-maxrate $MAX_BITRATE -minrate $MIN_BITRATE -ab $BITRATE -acodec $CODEC \\
-metadata title=\"$BOOK_NAME\" \\
-metadata artist=\"$AUTHOR_NAME\" \\
-metadata genre=\"Audiobook\" \\
-metadata album_artist=\"$NARRATOR_NAME\" \\
-metadata album=\"$SERIES_NAME\" \\
-metadata date=\"$DATE\" \\
-metadata track=\"$SERIES_SEQUENCE\" \\
-metadata publisher=\"$PUBLISHER\" \\
-metadata encoded_by=\"$ENCODED_BY\" \\
-metadata copyright=\"$COPYRIGHT\" \\
-metadata composer=\"$COMPOSER\" \\
-metadata performer=\"$PERFORMER\" \\
-metadata disc=\"$DISC\" \\
-metadata encoder=\"$ENCODER\" \\
\"$AUTHOR_NAME-$BOOK_NAME.ogg\""

#----------------------------------------------------------------------
# Сохраняем для отладки
echo "--------------------------------"
echo "Время зввучания: $IN_DURATION сек." >> tst.txt

#----------------------------------------------------------------------
# Для отладки удобно эти команды скинуть в отдельные командные файлы
echo "#!/bin/bash" > ffmpeg_cmd.sh
echo "" >> ffmpeg_cmd.sh
echo "$FFMPEG_CMD" >> ffmpeg_cmd.sh
$(chmod +x ffmpeg_cmd.sh)

echo "#!/bin/bash" > cover_convert_cmd.sh
echo "" >> cover_convert_cmd.sh
echo "convert $IMAGE_FILE_NAME -resize 400x400 $AUTHOR_NAME-$BOOK_NAME.jpg">> cover_convert_cmd.sh
$(chmod +x cover_convert_cmd.sh)

#----------------------------------------------------------------------
# Сконвертируем обложку книги
if [ $CREATE_COVER == "TRUE" ]; then
  RET=$(./cover_convert_cmd.sh)
fi

#----------------------------------------------------------------------
# Сгенерим xml описание книги
if [ $CREATE_XML == "TRUE" ]; then
  echo "
    $BOOK_NAME
    $AUTHOR_NAME
    /sdcard/audiobooks/$AUTHOR_NAME-$BOOK_NAME.jpg
    $SERIES_NAME
    $SERIES_SEQUENCE
    $NARRATOR_NAME
    
        $BOOK_NAME 
        
    
    
        /sdcard/audiobooks/$AUTHOR_NAME-$BOOK_NAME.ogg
    
" > $AUTHOR_NAME-$BOOK_NAME.xml
fi

#----------------------------------------------------------------------
# Собственно, запуск конвертирования
if [ $CREATE_ONEOGG == "TRUE" ]; then
  touch /tmp/$$
  ( ( echo 1 
      while [ -f /tmp/$$ ] 
        do 
          sleep 10
   # Вычисления процента сконвертированного
          OUT_DURATION=$(duration "$AUTHOR_NAME-$BOOK_NAME.ogg")
          PERCENTAGE=$(( OUT_DURATION*100/IN_DURATION))
          echo $PERCENTAGE
        done
      echo 100 ) | yad --title "$CURENT_DIR" \
                     --progress \
                     --progress-text="$AUTHOR_NAME-$BOOK_NAME.ogg" \
                     --percent=0 --auto-close --no-buttons --width=300) &
  RET=$(./ffmpeg_cmd.sh)
  rm /tmp/$$
  wait
fi

#----------------------------------------------------------------------
# Конец
yad --no-wrap \
   --title "Конвертирование завершено" \
   --text "$CURENT_DIR/$AUTHOR_NAME-$BOOK_NAME.ogg"

rm ./cover_convert_cmd.sh
rm ./ffmpeg_cmd.sh
rm ./tst.txt


Если захотите ей воспользоваться, то сохрание ее в ~/.local/share/nautilus/scripts/merge_mp3.sh. После чего дайт права на исполнение следующей командой.
chmod +x ~/.local/share/nautilus/scripts/merge_mp3.sh
Кроме того необходимо установить пакеты yad и python-mutagen

Пользоваться ей очень просто. Сначала в Nautilus выделяю файлы книги, которые хочу объединить.




Затем нажимаю правую кнопку и выбираю скрипт:




В появившемся окне заполняю поля, которые будут отображаться bookplayer




Наблюдаем за ходом конвертирования



Дизастер! Оказалось, что в Android плохая реализация проигрывания ogg файлов с переменным битрейтом. Плеер не может точно позиционировать на выбранное место. Выглядит это так: вы выставляете проигрывание с позиции 1 час 28 мин 33 сек. Плеер передвигает вперед минут на 20 и начинает воспроизведение. За это я господ их Гугле материл. Бороться с этим можно только установив при кодировании постоянный битрейт.

Для книги вполне достаточно битрейта 96 к.


Полезные ссылки:
1. Кодирование аудио с потерями. Что к чему?
2. mutagen

среда, 20 апреля 2011 г.

Конвертирование библиотеки Траума из fb2 в epub на ReadyNas Duo. Часть 1.

Для чтения книжек я более 3 лет пользуюсь читалкой Sony PRS-505. Пока она не пришла в негодность менять ее смысла нет.Единственное небольшое неудобство в том, что она не поддерживает формат fb2.

К счастью, существуют конверторы форматов. В сети можно скачать великолепный однокнопочный конвертор из fb2 под виндовс, Но мне лениво брать файл и тащить его в окошко конвертора.

Unix way, хоть и не так прост как операция drag & drop, но при выполнении рутины лучшего способа, чем пакетный режим Linux-а я не знаю.

Что мы попытаемся сделать.
Мы напишем скрипт конвертирования всей библиотеки Траума на ReadyNAS Duo. И запустим эту конвертацию.

Слава богу и open source программа конвертации из fb2 в epub доступна на форуме the-ebook

Приступим
Все описанные ниже действия мы выполняем прямо на ReadyNas Duo, подключившись к нему из под терминала.
  1. Сначала нужно создать директорию, где будем все компилить и установим необходимые пакеты: # mkdir -p /c/media/stuff/fb2epub/fb2epub # cd /c/media/stuff/fb2epub/fb2epub # wget http://fb2-to-epub-converter.googlecode.com/files/fb2toepub-1.0_4.zip # apt-get install g++ zlib1g-dev
  2. Лексический анализатор flex, доступный из репозитория имеет устаревшую версию 2.5.31-31sarge1. Поэтому скомпилим и установим последнюю версию: # cd /c/media/stuff/fb2epub # wget http://prdownloads.sourceforge.net/flex/flex-2.5.35.tar.gz # tar -xzvf flex-2.5.35.tar.gz # cd flex-2.5.35 # ./configure --build='sparc-linux' # make # checkinstall checkinstall 1.6.2, Copyright 2009 Felipe Eduardo Sanchez Diaz Duran This software is released under the GNU GPL. The checkinstallrc file was not found at: /usr/local/sbin/../checkinstallrc Assuming default values. The package documentation directory ./doc-pak does not exist. Should I create a default set of package docs? [y]: y Preparing package documentation...OK Please choose the packaging method you want to use. Slackware [S], RPM [R] or Debian [D]? D Please write a description for the package. End your description with an empty line or EOF. >> The Fast Lexical Analyzer >> ***************************************** **** Debian package creation selected *** ***************************************** /usr/local/sbin/checkinstall: line 1: dpkg-architecture: command not found /usr/local/sbin/checkinstall: line 1: rev: command not found /usr/local/sbin/checkinstall: line 1: rev: command not found /usr/local/sbin/checkinstall: line 1: rev: command not found /usr/local/sbin/checkinstall: line 1: rev: command not found This package will be built according to these values: 0 - Maintainer: [ root@ReadyNas1 ] 1 - Summary: [ The Fast Lexical Analyzer ] 2 - Name: [ flex ] 3 - Version: [ 2.5.35 ] 4 - Release: [ 1 ] 5 - License: [ GPL ] 6 - Group: [ checkinstall ] 7 - Architecture: [ sparc ] 8 - Source location: [ flex-2.5.35 ] 9 - Alternate source location: [ ] 10 - Requires: [ ] 11 - Provides: [ flex ] 12 - Conflicts: [ ] 13 - Replaces: [ ] . . . . . . . . . ********************************************************************** Done. The new package has been saved to /c/media/stuff/fb2epub/flex-2.5.35/flex_2.5.35-1_sparc.deb You can install it in your system anytime using: dpkg -i flex_2.5.35-1_sparc.deb ********************************************************************** # dpkg -i flex_2.5.35-1_sparc.deb
  3. И, наконец, скомпилируем конвертер: # cd /c/media/stuff/fb2epub/fb2epub # make

Мы сделали большую часть дела: скомпилировали под ReadyNAS утилиту конвертирования fb2 в формат epub.

Кому лениво все это компилировать, то можно скачать по ссылкам:
fb2toepub
flex_2.5.35-1_sparc.deb

Скорость конвертации на ReadyNAS Duo составляет около 500 книг в час. Библиотека Траума на 16 сентября 2011 года содержит около 125 000 книг. Таким образом вся библиотека на ReadyNas будет сконвертирована за 10 дней.
Для сравнения на ноутбуке Thinkpad x220 с процессором i7 2620 c тактовой частотой 2.7 GHz скорость конвертации составляет примерн 28000 книг в час.

В следующей статье я расскажу как настроить шрифты и сконвертировать всю библиотеку Траума.

пятница, 11 марта 2011 г.

Конвертирование cue в Nautilus

В интернете на треккерах можно найти достаточно большое количество музыкального контента в lossless формате. Так сложилось, что я храню свою музыкальную коллекцию в виде mp3 файлов и мне приходится конвертировать ape, flac или WavPack в формат mp3.

Как правило исходник имеет в своем составе один большой ape, flac или wv файл и файл cue, в котором сохранена информация о дорожках из которых состоит образ диска.

Я использую для конвертирования из ape/flac/wv в mp3/ogg скрипт, работающий в nautilus.

Как это работает.

Процесс конвертирования выглядит следующим образом:
1. Выбираю cue-файл, по правой кнопке из меню Script выбираю Split-Audio-by-CUE.sh.
Дальше все действия происходят автоматически.
2. Все файлы сохраняются в каталоге original. Тамже сохраняются промежуточные файлы конвертации.
Исходный ape/flac файл распаковывается в wav.
3. Wav файл кодируется в mp3 или ogg
4. В соответствии с описанием в cue-файле mp3/ogg разбивается на треки

Как это установить.

Сначала нужно установить необходимые пакеты: $ sudo apt-get install flac lame mp3splt vorbis-tools wavpack $ wget http://axaru.opendrive.com/files/56708443_kKKU9/mac-3.99-u4_3.99-4.5_amd64.deb $ sudo dpkg -i mac-3.99-u4_3.99-4.5_amd64.deb Я использую 64-х битную версию. Если у вас стоит 32-х битная, то скомпилируйте сами deb пакет.
Исходник mac-3.99 тут или тут. Пропатченный APELink.cpp.

Нужно создать каталог, где будут храниться скрипты, необходимые для обработки audio файлов: $ mkdir -p $HOME/.gnome2/nautilus-scripts/EasyTAG сохранить в нем под именем Split-Audio-by-CIE.sh следующий скрипт:
#!/bin/bash

# Split audio archive file (ape or flac) by cue
#
# Filename: Split-audio-by-CUE.sh
#
# Setup:
# sudo apt-get install flac lame mp3splt vorbis-tools wavpack
# wget http://members.iinet.net.au/~aidanjm/mac-3.99-u4_b3-1_i386.deb 
# sudo dpkg -i mac-3.99-u4_b3-1_i386.deb 
#
# Version         Changes
# ------------   ---------------------------------------------------------------
#VERSION=0.1      # Initial version convertion Nautilus ape or flac to mp3 or ogg
#VERSION=0.11     # Eliminate some bug in wav encoding
#VERSION=0.12     # Saving original files to ORG directory.
VERSION=0.13     # Added decompressing from wave pack

# Copyleft AxaRu http://axa-ru.blogspot.com/2011/

# For debug set to 1
DEBUG=0

# Uncoment actual format
ENCODING=mp3     
#ENCODING=ogg    

# Lame encoding quality
#MP3QUALITY=hifi
MP3QUALITY=cd

# Directory for saving original files
ORGDIR=original
BASEDIR="$(pwd)"

#===============================================================================

using()
{
   zenity --info --no-wrap --text="Nautilus script for decopmpressing ape or flac audo file by que.\n\n
Using:
\t\tSimple select some cue file in nautilus, tape right mouse button and select:
\t\tScript->Audio tags manip->Split-audio-by-CUE.sh\n
Adjusting:
\t\tTarget encoding mp3 or Ogg select by uncomment appropriate variable
\t\t\n
Debuging:
\t\tIn the script Split-audio-by-CUE.sh setup DEBUG variable to 1
\t\tand You will see debug message in Gnome popup windows"
}

save_files()
{
  if [ -d "$ORGDIR" ]; then
     zenity --error --text="Directory $ORGDIR exist in current catalog.
Please remove its and start script agan"
     exit 1
  fi
  out="$(mkdir "$ORGDIR")"
  out="$(mv * "$ORGDIR")"
}

exit_error()
{
  out="$(rm *)"
  out="$(mv "$ORGDIR"/* .)"
  out="$(rmdir "$ORGDIR")"
  exit 1
}

((DEBUG)) && zenity --error --text="Lets Go!"

save_files
# Проверить, что был выбран один файл ($# = 1)
  if [ $# -ne 1 ] ; then
    using
    exit_error
  fi

# Считать cue файл
  CUENAME="$1"
    ((DEBUG)) && zenity --error --text="Cue:        $CUENAME"

  # Найти строку, начинающуюся с тега "FILE" прочитать файл
  AUDNAME="$(awk "/FILE/" "$ORGDIR/$CUENAME" | awk -F"\"" '{ print $2 }')"
    ((DEBUG)) && zenity --error --text="Audio file: $AUDNAME"

  # Проверить, что такой файл существует

  if [ ! -f "$ORGDIR/$AUDNAME" ] ; then
    zenity --error --text="Input file $ORGDIR/$AUDNAME doesn't exist"
    exit_error
  fi

  # Разархивировать в wav
( 
  case "$AUDNAME" in
    *.[fF][lL][aA][cC] )
      fn=${AUDNAME%.[fF][lL][aA][cC]}
      echo "# Deflating \"$fn.flac\" to wav"
      echo "30"
      ((DEBUG)) && zenity --error --text="Flac decompressing : $fn"
      out="$(cd "$BASEDIR/$ORGDIR"; flac "-d" "$AUDNAME" -o "${fn}.wav")"
      ;;
    *.[aA][pP][eE] )
      fn=${AUDNAME%.[aA][pP][eE]}
      echo "# Deflating \"$fn.ape\" to wav"
      echo "30"
      ((DEBUG)) && zenity --error --text="Ape decompressing : $fn"
      out="$(cd "$BASEDIR/$ORGDIR"; mac "$AUDNAME" "${fn}.wav" "-d")"
      ;;
    *.[wW][vV] )
      fn=${AUDNAME%.[wW][vV]}
      echo "# Deflating \"$fn.wv\" to wav"
      echo "30"
      ((DEBUG)) && zenity --error --text="Wave Pack decompressing : $fn"
      out="$(cd "$BASEDIR/$ORGDIR"; wvunpack "$AUDNAME")"
      ;;
    *.[wW][aA][vV] )
      fn=${AUDNAME%.[wW][aA][vV]}
      ((DEBUG)) && zenity --error --text="No need decompressing : $fn"
      ;;
    * )
      zenity --error --text="Unknown format"
      exit 1
      ;;
  esac


  # Закодировать в mp3 или ogg
  echo "# Encoding wav to mp3"
  echo "60"
  case $ENCODING in
    "mp3" )
      out="$(cd "$BASEDIR/$ORGDIR"; lame --preset "$MP3QUALITY" "$fn.wav" "$fn.mp3")"
      ;;
    "ogg" )
      out="$(cd "$BASEDIR/$ORGDIR"; oggenc -q 6 -o "$fn.ogg" "$fn.wav")"
      ;;
  esac

  # Разрезать на треки
  echo "# Splitting to tracks"
  echo "90" ; sleep 1
  out="$(cd "$BASEDIR/$ORGDIR"; mp3splt -f -c "$CUENAME" -o "../@n-@t" "$fn.mp3")"

  echo "# Done"
  echo "100" 

) |   zenity --progress \
      --title="$1" \
      --text="dummy_text_dummy_text_dummy_text_dummy_text_dummy_text_dummy_text_" \
      --percentage=0

((DEBUG)) && zenity --error --text="All done"
exit
и дать ему права на исполнение $ chmod +x $HOME/.gnome2/nautilus-scripts/EasyTAG/Split-Audio-by-CIE.sh

Недостатки

Конвертирование звуковых файлов относительно длительный процесс. На моем ноуте он продолжается в течении 3-5 минут. Я попытался, насколько это возможно как то показать ход исполнения. Но здесь мои возможности сильно ограничены.

Буду рад коментариям и замечаниям.


Полезные ссылки:


Updated 22/04/2012

понедельник, 31 января 2011 г.

Как изменить размер обложки диска из Nautilus

При редактировании коллекции музыки с помощью EasyTAG рутинная операция по конвертации изображения обложки достает неимоверно.

Приходится либо запускать графический редактор, либо писать каждый раз команду изменения размера, потом снова переключаться в EasyTAG чтобы включить картинку в звуковой файл

Но нет ничего проще прикрутить команду конвертации изображения на правую клавишу мыши в наутилусе. Для этого создаем файл ~/.gnome2/nautilus-scripts/Multimedia/convert_to_cover_mp3
#!/bin/bash

while [ $# -gt 0 ]; do
 picture=$1
 cover_file="Cover.jpg"
 /usr/bin/convert -resize 500x500! "$picture" "$cover_file"
 shift
done
И даем ему права на исполнение: $ chmod +x ~/.gnome2/nautilus-scripts/Multimedia/convert_to_cover_mp3
Чтобы изменить размер картинки теперь нужно просто на файле кликнуть правую клавишу мыши и выбрать написанный нами скрипт.



среда, 11 марта 2009 г.

Howto:convert audio on Linux

aac/mp4 -> wav/mp3/ogg

(Unix way)

По материалам : http://gimpel.gi.funpic.de/wiki/index.php?title=Howto:convert_aac/mp4_to_wav/mp3/ogg_on_Linux

Можно использовать пакет faad. Устанавливаем его и lame:

$ sudo apt-get install faad lame
Для конвертирования одного файла выполнить:

$ faad -o - inputfile.aac | lame -v - outputfile.mp3

Для конвертирования всех файлов внутри каталога используем этот скрипт:

#!/bin/bash
#
# aac2mp3
#

for i in *.aac; do

faad -o - "$i" | lame -v - "${i%.aac}.mp3"

done

cue ape/flac -> wav/mp3/ogg

(Unix way)

По материалам : http://faq4u.ru/?p=50

Необходимо установить следующие пакеты:

$ wget http://members.iinet.net.au/~aidanjm/mac-3.99-u4_b3-1_i386.deb $ sudo dpkg -i mac-3.99-u4_b3-1_i386.deb $ sudo apt-get install lame mp3splt vorbis-tools
И использовать вот этот скрипт http://gimpel.funpic.de/files/cueape.sh
#!/bin/bash

#cueape 0.1
#This script is intended to convert ape or flac + cue files to 
#ogg vorbis or mp3 files, setting the tags to the correct value,
#obtained from the cue file.
#REQUIREMENTS:
# -Oggenc installed (it comes with vorbis-tools) if you want to encode into Ogg Vorbis.
# -lame installed if you want to encode into mp3
# -mac to decode ape files (Monkey's Audio)
# -flac to decode flac files.

#IF YOU FIND A BUG OR HAVE A SUGGESTION COMMENTO OR SIMPLY WANT TO CONTACT ME PLEASE MAIL ME TO 
#rafadev_*@gmail.com  REMOVING THE "_*"
#This is done to prevent spamming 

#Copyright (C) 2006  Rafael Ponieman - Buenos Aires, Argentina

#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.


#scripted by deX


case "$1" in
*.[aA][pP][eE] | *[fF][lL][aA][cC] )
 if [ ! -f "$1" ] ; then
  echo "Input file $1 doesn't exist"
  exit 1
 fi
 if [ ! -f "$2" ]; then
  echo "Cue input file $2 doesn't exist"
  exit 1
 fi ;;
* ) 
 echo "Error: invalid input parameters"
 exit ;;
esac

#Testing parameters
if [ "$3" != "-m" ] && [ "$3" != "-o" ] ; then
 echo -en "\033[1;31mInvalid parameters\n"
 echo -en "\033[1;37m"
 echo -en "Usage: cueape [input ape file] [input cue file] [parameters]\nParameters can be: -m for mp3 encoding or -o for ogg encoding.\n"
 exit 1
fi

#Need help with this one, coudn't solve it. I need to know how to check if a 
#program actually exists and is accesible
#Checking for mac
#[ -f $(which 'maca' >> /dev/null) ] ||  { 
# echo -en "\033[1;31mYou must have mac in your PATH.\033[1;37m\nPlease install Monkey's Audio Codec\nYou can get it from http://sourceforge.net/projects/mac-port/\n"
#}


#Saving the position so as to return afterwards 
olddir="$(pwd)"

#Going to target directory
cd "$(dirname "$1")"

#Checking for the output folder. If it's not there I create it
[ ! -d "Output" ] && mkdir -p "Output"
cp "$2" "Output/"

#Decompress
echo -en "\nCueape 0.1\n\n"
echo -en "\033[1;32mStarting conversion\n"

#Checking filetype by extension and decompressing
tmp="$(basename "$1")"
tmp="${tmp##*.}"

case "$tmp" in
[fF][lL][aA][cC] ) 
 echo -en "\033[1;32mDecompressing FLAC file\n\n"
 echo -en "\033[1;37m"
 tm="$(basename "$1")"
 tm="${tm%.[fF][lL][aA][cC]}"
 out="$(flac "-d" "$1" -o "Output/${tm}.wav" )" 
 ;;
[aA][pP][eE]  )
 echo -en "\033[1;32mDecompressing APE file\n\n"
 echo -en "\033[1;37m"
 tm="$(basename "$1")"
 tm="${tm%.[aA][pP][eE]}"
 out="$(mac "$1" "Output/${tm}.wav" "-d")" 
 ;;
*   )
 echo "Error: line 99"
esac

cd "Output"
echo -en "\033[1;32m\nDecompression finished\n"
echo -en "\033[1;32mStarting reencoding\n\n"
echo -en "\033[1;37m"
if [ "$3" = "-o" ] ; then 
 #Calling oggenc. Saving output for future checking
 out="$(oggenc -q 6 -o "$tm.ogg" "$tm.wav")"
 echo -en "\033[1;32m\nReencoding finished\n"
 echo -en "\033[1;32mSplitting\n\n"
 echo -en "\033[1;37m"
 out="$(mp3splt -c "$(basename "$2")" -o "@n+-+@t" "$tm.ogg")"
else
 #Calling lame. Saving output for future checking
 out="$(lame --preset standard "$tm.wav" "$tm.mp3")"
 echo -en "\033[1;32m\nReencoding finished\n"
 echo -en "\033[1;32mSplitting\n\n"
 echo -en "\033[1;37m"
 #Using framemode becaus this settings are for VBR
 out="$(mp3splt -f -c "$(basename "$2")" -o "@n+-+@t" "$tm.mp3")"
fi
cd "$oldir"
echo -en "\033[1;32m\nProcessing finished successfully\n"
echo -en "\033[1;37m"
exit 0

$ cueape.sh file.ape file.cue -m

wav, ogg, mp3, mpc, flac, ape, aac, wma

into

wav, ogg, mp3, mpc, flac, ape, aac

(Gnome desktop)
$ sudo apt-get install wavpack mppenc libmpcdec3 faac flac vorbis-tools faad lame mplayer nautilus-script-audio-convert nautilus-script-manager $ nautilus-script-manager enable ConvertAudioFile $ nautilus -q

1. 2. 3.
4. 5. 6.


mp3 -> OGG Vorbis


mpg321 [input-file.mp3] -w - | oggenc raw -o [output-file.ogg]

Online сервисы


http://www.freefileconvert.com/


Перекодирование тегов в юникод

  1. Установить python-mutagen $ sudo apt-get install python-mutagen
  2. Создать файл скрипта для nautilus-а $ cd ~/.gnome2/nautilus-scripts $ touch mp3-tag-to-utf $ chmod +x mp3-tag-to-utf С помощью редактора записать в него текст:
    #!/bin/sh
    #
    # GNU/GPL owning
    # nautilus-script "mp3tag2utf"
    # Converting tags of the selected mp3- files
    # from CP1251 encoding to UTF8.
    #
    # !!!Attention!!! This script requires "python-mutagen" package!
    
    TEMPFILE="/tmp/mp3-tag-to-utf.log"
    
    echo "Converted mp3tag" > $TEMPFILE
    for arg
    do
       mid3iconv -eCP1251 --remove-v1 "$arg"
       echo "$arg" >> $TEMPFILE
    done
    
    zenity --text-info --filename=$TEMPFILE
    
  3. Для перекодирования файлов в директории выбираем необходимые треки, нажимаем правую клавишу мыши и выбираем скрипт.



Upd 27/01/2011