Однажды зимним вечером я пришел домой от друга с пачкой заполненных эмпешками компактов. Перегнать их на свой жесткий диск не составило большого труда. После первых часов эйфории наступила пора систематизировать все ЭТО, но тут меня ждало разочарование: все файлы назывались каким-то странным цифровым кодом (с расширением *.mp3, естественно). Для того чтобы узнать, что за песня, приходилось запускать Winamp и смотреть по названиям (служебная информация, включенная в файл и отображаемая в окне программы).
Ситуацию надо было как-то спасать. На помощь пришел Perl со своим модулем MP3::info. Где его брать? На CPAN, конечно. Исследуемый модуль предназначен для управления выборкой и записью информации об MP3-файлах. Подключается к скрипту аналогично прочим Perl-модулям.
use MP3::Info Описание вызова функции get_mp3tag (FILE [, VERSION, RAW_V2]), где FILE название файла, а VERSION, RAW_V2 т. н. ID3-тэг, необязательная информация о версии заголовка. От него зависит количество служебной информации, записываемой в mp3-файл. В принципе, Perl обрабатывает версию автоматически и выбирает только ту информацию, которая может там быть. А с помощью функции remove_mp3tag (FILE [, VERSION, BUFFER]) вообще можно его удалить, и файл будет на 128 байт короче (экономия места на винте :-)). Но хватит теории. Пишем программу.
Вот и все скрипт читает тэг и в соответствии с ним переименовывает файл. Для большего удобства можно извлечь и название альбома $tag->{ALBUM}, создать каталог с таким именем и перенести все файлы туда. На практике название альбома пишут реже, однако можете попробовать. Еще можно проверить наличие TITLE вообще (с помощью функции defined или while ($title)), и при отсутствии оного перейти к следующему файлу, но с этим Perl и сам отлично справляется.
Все это хорошо работает с названиями, напечатанными латиницей и под Windows, а для Linux, как всегда, существует проблема кодировок: если заголовки представлены в CP1251, то в Linux'е вы увидите абракадабру. Поэтому необходимо добавить следующие строки в текст программы.
Выглядит страшно, да? Первыми идут объявления скаляров, которые содержат шестнадцатеричную кодировку всех букв русского алфавита в СР1251 и КОI8 соответственно. Затем объявляется функция, которая осуществляет перекодирование. Здесь используется операция транслитерации. Она производит замену символов первого списка на символы той же позиции второго. А после всего следует вызов функции перекодировки для каждой строки текста.
Теперь разберем обратную проблему. В современных проигрывателях можно выбрать сразу песни одного исполнителя или стиля, но вот незадача самая большая группа оказывается в папке Untitled, а перебирать файлы вручную почему-то не хочется :-). И здесь нам опять же поможет MP3::Info с Perl’ом. Вызов соответствующей функции выглядит так:
Параметры очевидны: файл название песни артист альбом год комментарий жанр номер дорожки. Все поля имеют 30-байтовый предел, так что сильно не увлекайтесь.
Небольшое пояснение. В Perl'е, как и в С, любое непустое и ненулевое значение соответствует условию «истина», нулевое и пустое условию «ложь». Это мы и используем при вызове программы. Команда выглядит так:
Название песни пропущено, оставлено извлеченное из файла значение мы ведь собираемся пройтись по всем песням текущего каталога. Если какой-нибудь пункт необходимо пропустить, то на его месте поставьте «0» (нуль), и тогда в действие вступит обычный алгоритм работы оператора ИЛИ: если первый аргумент «ложь», то результат будет равняться второму операнду, т. е. значению, которое мы извлекли из файла. Если параметр состоит из двух и более слов, то заключите их в кавычки.
И в заключение еще одна функция она выбирает из файла информацию, которую невозможно изменить: время звучания, битрейт, версия, стерео\моно, частота и еще много чего, в зависимости от версии.
Описание ее таково:
Вот так можно узнать время звучания файла
В принципе, это все если заинтересовались, почитайте документацию к модулю и вперед. Ведь юзер должен быть чуточку ленив ровно настолько и в том смысле, чтобы не лениться автоматизировать монотонные операции (зачем же тогда компьютер?), а клаву лучше всего использовать для боев с товарищами по локалке.