Приветствую всех хабравчан. Одним прекрасным вечером в мою голову пришла идея отсортировать свои гигабайты музыки. А если точнее, то захотелось просто-напросто удалить все треки с низким битрейтом, дабы не раздражали слух и место почем зря не занимали. Можно было бы, конечно, сделать все вручную, но, во-первых, лень, во-вторых, на это ушло бы несколько недель, если не месяцев. Да и вообще, программист я или где? С такими вот незатейливыми рассуждениями я и пришел к мысли, что стоило бы автоматизировать процесс. Вопрос языка на котором будет производиться автоматизация особо не стоял: на работе пишу на C#, дома тоже есть экспресс версия Visual Studio, значит так тому и быть. Осталось только узнать как с помощью этих самых шарпа да студии узнать битрейт файлов, чтобы не удалить чего лишнего. Недолгий, но продуктивный гуглеж привел меня к одной замечательной библиотеке.
Итак, зовется наша библиотека Taglib-sharp и, как видно из названия, предназначена для работы с тэгами медиафайлов(видео, аудио и фото). Проект является open source и распространяется бесплатно по лицензии LGPL. Скачиваем библиотеку (например, отсюда или отсюда), добавляем ссылку на нее в нашем проекте, прописываем TagLib в using и вот мы уже готовы приступить.
Ниже приведу небольшой пример получения информации из тегов. Пример не полный, остальное можно легко узнать из справки к библиотеке.
В результате выполнения кода выше, в консоли получится что-то вроде:
Что ж, худо-бедно информацию получать научились, время ее использовать.
После того как мы наигрались с библиотекой, пора бы вернуться к первоначальной задаче. Что там мы хотели сделать? Ага! Удалить все записи с низким битрейтом. И вот тут на сцену выходит идеально подходящее для нас свойство .Properties.AudioBitrate. По нему-то мы и будем отсеивать негодные файлы.
Для наших скромных целей вполне достаточно будет обычной консольной утилитки, которой в качестве параметра мы будем передавать путь до папки с файлами, а она уже будет разгребать файлы по тегам и удалять ненужные. Сам метод удаления у меня получился такой:
Ну вот и все, программа работает, задачу свою выполняет. Прошу за код сильно не пинать, главной задачей было сделать быстро и «чтоб работало».
UPD: После публикации статьи, я получил один довольно важный вопрос от моего товарища: «А как обстоят дела с субдиректориями?».
Действительно, изначально приведенный метод работает только с файлами, лежащими в корне заданного каталога. Для захвата файлов в подкаталогах можно воспользоваться методом:
Мы рассмотрели одно из возможных применений библиотеки Taglib-sharp и попутно избавили свои уши от некачественных mp3 записей. Разумеется, это не единственное применение данной библиотеки. К примеру, можно автоматизировать переименование файлов по тегам или сортировку файлов по папкам исполнителей. Да много чего, главное начать и не бояться. А мне за сим позвольте откланяться. Надеюсь, до новых встреч.
Краткое описание
Итак, зовется наша библиотека Taglib-sharp и, как видно из названия, предназначена для работы с тэгами медиафайлов(видео, аудио и фото). Проект является open source и распространяется бесплатно по лицензии LGPL. Скачиваем библиотеку (например, отсюда или отсюда), добавляем ссылку на нее в нашем проекте, прописываем TagLib в using и вот мы уже готовы приступить.
Ниже приведу небольшой пример получения информации из тегов. Пример не полный, остальное можно легко узнать из справки к библиотеке.
//Создаем переменную с информацией о файле. В качестве параметра указываем полный путь.
var audioFile = TagLib.File.Create(@"C:\Users\Ethiopian\Music\Feindbild.mp3");
//Выводим нужную нам информацию на экран
Console.WriteLine("Альбом: {0}\nИсполнитель: {1}\nНазвание: {2}\nГод: {3}\nДлительность: {4}"
, audioFile.Tag.Album
, String.Join(", ", audioFile.Tag.Performers)
, audioFile.Tag.Title
, audioFile.Tag.Year
, audioFile.Properties.Duration.ToString("mm\\:ss"));
В результате выполнения кода выше, в консоли получится что-то вроде:
Альбом: Gotterdammerung
Исполнитель: Megaherz
Название: Feindbild
Год: 2002
Длительность: 04:41
Что ж, худо-бедно информацию получать научились, время ее использовать.
Практическое применение
После того как мы наигрались с библиотекой, пора бы вернуться к первоначальной задаче. Что там мы хотели сделать? Ага! Удалить все записи с низким битрейтом. И вот тут на сцену выходит идеально подходящее для нас свойство .Properties.AudioBitrate. По нему-то мы и будем отсеивать негодные файлы.
Для наших скромных целей вполне достаточно будет обычной консольной утилитки, которой в качестве параметра мы будем передавать путь до папки с файлами, а она уже будет разгребать файлы по тегам и удалять ненужные. Сам метод удаления у меня получился такой:
private static void RemoveBadAudio(string foldPath)
{
//Создаем объект для доступа в директорию, путь которой написали в консоль.
DirectoryInfo dir = new DirectoryInfo(foldPath);
//Создаем две переменные для подсчетов удаленных и оставленных файлов
int deletedCounter = 0;
int savedCounter = 0;
//Проверяем каждый mp3 файл в директории
foreach (FileInfo file in dir.GetFiles("*.mp3"))
{
//Проверяем битрейт
if (TagLib.File.Create(file.FullName).Properties.AudioBitrate < 320)
{
file.Delete();
deletedCounter++;
}
else
{
savedCounter++;
}
}
Console.WriteLine("\n\Удалено файлов: {0} \nСохранено файлов: {1}", deletedCounter, savedCounter);
}
Ну вот и все, программа работает, задачу свою выполняет. Прошу за код сильно не пинать, главной задачей было сделать быстро и «чтоб работало».
UPD: После публикации статьи, я получил один довольно важный вопрос от моего товарища: «А как обстоят дела с субдиректориями?».
Действительно, изначально приведенный метод работает только с файлами, лежащими в корне заданного каталога. Для захвата файлов в подкаталогах можно воспользоваться методом:
private static void RemoveBadFilesInSubDirectories(string foldPath)
{
DirectoryInfo parentDirectory = new DirectoryInfo(foldPath);
foreach (DirectoryInfo dir in parentDirectory.GetDirectories())
{
//Здесь мы вызываем метод удаления ненужных файлов, описанный выше.
//С той лишь разницей, что в качестве параметра мы теперь передаем не путь до каталога, а объект dir.
}
}
В заключение
Мы рассмотрели одно из возможных применений библиотеки Taglib-sharp и попутно избавили свои уши от некачественных mp3 записей. Разумеется, это не единственное применение данной библиотеки. К примеру, можно автоматизировать переименование файлов по тегам или сортировку файлов по папкам исполнителей. Да много чего, главное начать и не бояться. А мне за сим позвольте откланяться. Надеюсь, до новых встреч.