Pull to refresh

Удобная библиотека для работы с тегами медиафайлов

Reading time3 min
Views18K
Приветствую всех хабравчан. Одним прекрасным вечером в мою голову пришла идея отсортировать свои гигабайты музыки. А если точнее, то захотелось просто-напросто удалить все треки с низким битрейтом, дабы не раздражали слух и место почем зря не занимали. Можно было бы, конечно, сделать все вручную, но, во-первых, лень, во-вторых, на это ушло бы несколько недель, если не месяцев. Да и вообще, программист я или где? С такими вот незатейливыми рассуждениями я и пришел к мысли, что стоило бы автоматизировать процесс. Вопрос языка на котором будет производиться автоматизация особо не стоял: на работе пишу на C#, дома тоже есть экспресс версия Visual Studio, значит так тому и быть. Осталось только узнать как с помощью этих самых шарпа да студии узнать битрейт файлов, чтобы не удалить чего лишнего. Недолгий, но продуктивный гуглеж привел меня к одной замечательной библиотеке.

Краткое описание

Итак, зовется наша библиотека 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 записей. Разумеется, это не единственное применение данной библиотеки. К примеру, можно автоматизировать переименование файлов по тегам или сортировку файлов по папкам исполнителей. Да много чего, главное начать и не бояться. А мне за сим позвольте откланяться. Надеюсь, до новых встреч.
Tags:
Hubs:
+10
Comments6

Articles