Приветствую всех хабравчан. Одним прекрасным вечером в мою голову пришла идея отсортировать свои гигабайты музыки. А если точнее, то захотелось просто-напросто удалить все треки с низким битрейтом, дабы не раздражали слух и место почем зря не занимали. Можно было бы, конечно, сделать все вручную, но, во-первых, лень, во-вторых, на это ушло бы несколько недель, если не месяцев. Да и вообще, программист я или где? С такими вот незатейливыми рассуждениями я и пришел к мысли, что стоило бы автоматизировать процесс. Вопрос языка на котором будет производиться автоматизация особо не стоял: на работе пишу на 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 записей. Разумеется, это не единственное применение данной библиотеки. К примеру, можно автоматизировать переименование файлов по тегам или сортировку файлов по папкам исполнителей. Да много чего, главное начать и не бояться. А мне за сим позвольте откланяться. Надеюсь, до новых встреч.