LINUX.ORG.RU

Замена cuetag на одном только шелле

 , cuecmd, cuetags, ,


0

2

Время от времени мне приходится разрезать скачанные образы музыкальных дисков в формате 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. Незаменим при ковырянии с музыкальными коллекциями.

Ответ на: комментарий от xsektorx

В последний раз это был переезд на другую железку. А вообще ещё при переходе на другую версию не роллинг-релиз дистрибутива, мне было бы спокойней не использовать старый рутфс.

unterwulf
() автор топика
Ответ на: комментарий от lazyklimm

Теоретически — да, вот такой http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html. Практически — под dash-ем работает, и это именно из-за него пришлось добавить идиотскую проверку $# перед shift.

unterwulf
() автор топика
Ответ на: комментарий от Deleted

Так и есть. Но это тот случай, когда трудозатраты на построение нового велосипеда сравнимы с починкой старого и написанием порта для него. А т.к. фана от нового больше, почему нет?

unterwulf
() автор топика
Ответ на: комментарий от unterwulf

В последний раз это был переезд на другую железку

ладно, а зачем дистрибутив-то переустанавливать?

мне было бы спокойней не использовать старый рутфс

ты, наверно, имел в виду диск ц?

xsektorx ★★★
()
Ответ на: комментарий от xsektorx

ладно, а зачем дистрибутив-то переустанавливать?

Переезд на новую железку это хороший повод поднять версию дистрибутива, т.к. всё равно возиться обычно приходится. А версию поднимать приходится для того, чтобы новые версии софта при сборке не вопили, что не находят каких-нибудь распоследних символов в glibc и прочих либах, которые не обновляются между версиями дистрибутива. К тому же порты обновляются только для последней версии.

А рутфс не сохраняю, т.к. не верю в чудесное автоматическое обновление.

Короче, это всё к теме не относится. Просто такой не самый дружелюбный дистрибутив.

unterwulf
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.