Создание тэгов mp3 в 2 клика мышки с помощью Nautilus scripts (пакетная обработка папок и файлов)

Предистория:
У супруги как-то появился плеер Sansa M250. Был приобретен с целью приобщаться к сокровищнице аудио-книг. Работал он себе без нареканий, пока в связи с предстоящим отпуском на него не были записаны аж две книги! И тут-то супруга и пожаловалась, что всё проигрывается в перемешку. Недолгий допрос с пристрастием (как супруги, так и плеера) выявил корень зла: плеер работает не с папками, а с тэгами (которые у скачанных аудио-книг не всегда прописаны, или прописаны коряво и в разнобой)!

Решение проблемы:
Долгие пробы и метания сконденсировались в практически идеальное решение конкретной проблемы:
без моего участия и без долгих курсов повышения квалификации, супруга в два клика мышки создаёт
для выбранной аудиокниги название альбома.

Для работы нужны следующие программы:

Линукс + GNOME (Убунту 10.10 в моём случае)

eyeD3 — консольный редактор тэгов

zenity — не обязательно, но для визуализации и упрощения процесса очень советую.

Устанавливаем недостающие программы:
sudo apt-get install eyed3 zenity

Изюминка идеи в том, что Наутилус умеет передать скрипту список выделенных файлов.
Делается это так:
В папке /home/%username%/.gnome2/nautilus-scripts/ хранятся скрипты. При правом клике на выделенных файлах в выпадающем меню есть подменю Scripts (там же можно быстро открыть саму папку со скриптами) которое содержит все вышеупомянутые скрипты. Выбрав один из них, мы его запустим. А он в свою очередь получит он Наутилуса список выделенных папок/файлов.

В вышеупомянутой папке создадим скрипт следующего содержания:

#!/bin/bash

function parseDir {
 current=pwd
 cd $1
 list=$(find -iname '*.mp3')
 for file in $list; do
 array[$i]=$file
 i=$(($i + 1))
 done
 cd $current
}

album_name=$(zenity --entry --text "Enter album name" --entry-text "A-book");

IFS=$'\n'
i=0
declare -a array

for name in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS; do
 if [ -d "$name" ]; then
 parseDir $name
 else
 if [ ${name: -4} == ".mp3" ]; then
 array[$i]=$name
 i=$(($i + 1))
 fi
 fi
done
i=0
n=${#array[*]}
for file in ${array[@]}; do
 eyeD3 --remove-all --set-encoding=utf8 -A "$album_name" $file
 i=$(($i + 1))
 echo $(($i * 100 / $n))
done | zenity --progress --title="$album_name" --text="Renaming, please wait..." --auto-close --auto-kill
unset IFS


Обьясняю основные аспекты, так как синтакс и команды есть в изобилии в гугле и ему подобных.
Сначала через zenity запросим желаемое имя альбома (по умолчанию стоит A-book, можно его и оставить).
Для визуализации процесса (прогресс обработки), создадим список файлов которые будем обрабатывать. Пройдемся по списку полученному из $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS. Файлы mp3 сразу добавим в массив, папки просканируем с помощью find (самая верхняя функция) и добавим все найденные mp3 в тот-же массив.
Второй for это уже сама обработка. Для каждого найденного mp3 выполним
eyeD3 --remove-all --set-encoding=utf8 -A "$album_name" $file

т.е. сотрем все тэги (мне так удобнее, но не обязательно) и запишем имя альбома в utf8.
Всё, в любой папке открытой в Nautilus выделим файлы и кликнем правой кнопкой на них. В выпадающем меню перейдем в Scripts и выберем наш. Выскочит окошко с запросом имени альбома, и введя желаемое название полюбуемся на бегущий прогресс-бар!
Сама идея очень универсальна, как и все в линукс. Надеюсь кому нибудь поможет или вдохновит на новые идеи!
Спасибо за внимание!


0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.