Время от времени мне приходится разрезать скачанные образы музыкальных дисков в формате ape/cue или flac/cue. Проблема в том, что подобная нужда возникает довольно редко и система бывает уже переустановлена с последнего раза, а порта cuetools для моего дистрибутива нет, а апстим у этого пакета, похоже, дохлый и в непатченном виде, он уже не вполне работоспособен.
В общем, долго я это терпел, но таки не удержался и решил написать свой скрипт, которому не нужен был бы сишный cueprint и который бы работал сам по себе. К тому же, думал я, cue sheet — это простой текстовый формат, сам бог велел парсить его скриптами.
Сначала я попробовал использовать awk, но возня с обработкой значений в кавычках на нём выглядела уныло. Вторым пунктом я попробовал python, тут код выходил красивее, но на полпути меня настигло озарение — ведь cue sheet это, по сути, скрипт с командами в формате пригодном для передачи шеллу как есть.
Окрылённый этой мыслью я тут же принялся за написание скрипта на шелле. Время шло, но мне всё никак не удавалось заставить шелл парсить команды с учётом аргументов в двойных кавычках (чтобы TITLE «Two words» был интерпретирован как два аргумента, а не три).
После долгих проб, утомительного чтения стандарта POSIX и stackoverflow.com другого варианта кроме использования eval мне найти не удалось. А это значило, что красивой идее не суждено было быть воплощённой, т.к. использование eval неминуемо вызывало проблемы с безопасностью (TITLE «Two words» ; rm -rf ~), а фильтрация всех опасных конструкций превратила бы код в столь же унылое зрелище, как и вариант на awk.
Отчаявшийся, подавленный я всё же добил этот скрипт на шелле найдя лишь небольшое утешение в том, чтобы сделать его как можно более изящным и лаконичным.
Конечный вариант я и предлагаю широкой общественности ЛОРа. Вот его отличия от cuetag:
- не имеет зависимости от cueprint (читай, не требует компиляции)
- позволяет использовать свои «драйверы» для установки тегов (например, можно не только metaflac вызвать, но и сразу переименовать файлы в соответствии со значениями тегов)
- в угоду простоте не проверяет валидность cue sheet-ов (хоть я и не смотрел проверяет ли cueprint, но свято верю в это), т.е. можно подстроить такой cue sheet, который будет интерпретирован неправильно, но это не страшно, т.к. максимум может привести только к неверным значениям тегов
- состоит всего из 40 строк, 9 из которых комментарии или разделители
Просьба ценителям изящного шелл-скриптинга на чём свет высказывать свои критические замечания по коду.
Смореть в браузере: https://github.com/unterwulf/cuecmd
Тарбол: https://github.com/downloads/unterwulf/cuecmd/cuecmd-0.0.1.tar.gz
Спасибо за внимание.
p.s. Чтоб два раза не вставать, хочу порекламировать ещё один [не мой] скрипт, недавно попавшийся мне на просторах Интернета. Он позволяет удобно переименовывать файлы в любимом текстовом редакторе. Называется virn. Прост как три копейки. Его адрес https://github.com/jkramer/virn. Незаменим при ковырянии с музыкальными коллекциями.