Как стать автором
Обновить

Редактор MP3 тегов

Многие современные автомобили имеют возможность отображать обложку проигрываемого mp3 файла. Добавление обложки в mp3 файл является достаточно трудоемкой задачей для человека, особенно если его медиатека очень большая. Конечно, можете сказать, что в машину вы подключаете ipod, загрузив предварительно в него обложку с помощью itunes и получаете оформленный трек, но на сайте itunes нет многих обложек для русских композиций и далеко не у каждого есть ipod. Для таких людей и написан данный пост.

Для редактирования mp3 тегов я использовал библиотеку id3lib, скачать которую можно на официальном сайте . Интерфейс id3lib очень простой и удобный для разработчика:

Mp3File mp3 = new Mp3File(_file);
TagHandler tagHandler = mp3.TagHandler;

Далее в классе TagHandler содержится все поля тегов mp3 файла. Для применение изменений сделанных в тегах вызывается метод:

mp3.Update();

В поле tagHandler.Picture; необходимо вставить Image картинку нашего mp3 тега. Конечно эту картинку можно выбрать в ручную, но если ваша медиатека насчитывает > 1000 песен, процесс добавления картинки займет очень длительное время. Поэтому я решил пробовать скачать картинку из интернета в автоматическом режиме. Сначала я решил парсить страницы поисковика goggle на нахождение там картинки, которая соответствует моему треку. Данное решение мне показалось очень неудобным, так как для скачивания изображения необходимо было делать несколько запросов и постоянно парсить большой объем html кода. Поэтому я решил обратится к google api.

Google позволяет разработчику ПО использовать api его поисковика в своем приложении. Для использования необходимо послать запрсос на следующий адрес:

WebRequest request = WebRequest.Create("http://ajax.googleapis.com/ajax/services/search/images?v=1.0&rsz=large&q=" + query+ "$start = 0");
request.Method = "GET";
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string response = reader.ReadToEnd();

В response сервер возвращает Json ответ, который можете парсить любой удобной для вас библиотекой.
{"responseData": {"results":[{"GsearchResultClass":"GimageSearch","width":"300","height":"300","imageId":"ANd9GcRX3jTKdOZz7JrGi5IVck4OQ3FtFJ5Iu15iwcGKDp7bxgXQDkGhQWtMc0M","tbWidth":"116","tbHeight":"116","unescapedUrl":"http://dionysiandreams.com/gtnradio.trickymicky/pictures/az_20356_I%20Will%20Survive%20The%20Anthology_Gloria%20Gaynor.jpg","url":"http://dionysiandreams.com/gtnradio.trickymicky/pictures/az_20356_I%2520Will%2520Survive%2520The%2520Anthology_Gloria%2520Gaynor.jpg","visibleUrl":"dionysiandreams.com","title":"Trickymicky GTN Radio","titleNoFormatting":"Trickymicky GTN Radio","originalContextUrl":"http://dionysiandreams.com/gtnradio.trickymicky/playlist.php?start\u003d10450\u0026limit\u003d25\u0026letter\u003d\u0026search\u003d","content":"\u003cb\u003eGloria Gaynor\u003c/b\u003e - Never \u003cb\u003eCan\u003c/b\u003e","contentNoFormatting":"Gloria Gaynor - Never Can","tbUrl":"http://t1.gstatic.com/images?q\u003dtbn:ANd9GcRX3jTKdOZz7JrGi5IVck4OQ3FtFJ5Iu15iwcGKDp7bxgXQDkGhQWtMc0M"},{"GsearchResultClass":"GimageSearch","width":"400","height":"400","imageId":"ANd9GcTohVXXU1r3oRbgGPNq8ZozrXRHbLRXKZZLR66mmIf8icSjX8FR-kyKdmc","tbWidth":"124","tbHeight":"124","unescapedUrl":"http://upload.wikimedia.org/wikipedia/en/7/73/I_Will_Survive_Gloria_Gaynor.jpg","url":"http://upload.wikimedia.org/wikipedia/en/7/73/I_Will_Survive_Gloria_Gaynor.jpg","visibleUrl":"en.wikipedia.org","title":"\u003cb\u003eI Will Survive\u003c/b\u003e - Wikipedia, the free encyclopedia","titleNoFormatting":"I Will Survive - Wikipedia, the free encyclopedia","originalContextUrl":"http://en.wikipedia.org/wiki/I_Will_Survive","content":"\u003cb\u003eI Will Survive\u003c/b\u003e","contentNoFormatting":"I Will Survive","tbUrl":"http://t1.gstatic.com/images?q\u003dtbn:ANd9GcTohVXXU1r3oRbgGPNq8ZozrXRHbLRXKZZLR66mmIf8icSjX8FR-kyKdmc"},


Выбрав необходимую мне картинку (для меня критерием является width и height) скачиваю её по адресу, содержится в поле url, следующим способом:

HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(urlPicture);
HttpWebResponse myRes = (HttpWebResponse)myReq.GetResponse();
Stream pictureStream = myRes.GetResponseStream();


Полученный Stream преобразую в Image и сохраняю в теге TagHandler.Picture. Далее запускаю цикл на всю медиатеку и преобразую все файлы. У google api есть ограничение, он не дает качать больше определенного количества картинок и возвращает null в ответе сервера. Через некоторое время работа может быть возобновлена, это необходимо учитывать при разработке приложения. Также Google не всегда выдает картинку альбому, а может выдавать любые другие релевантные картинки, что также необходимо учитывать программисту.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.