Pull to refresh

Редактор 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 не всегда выдает картинку альбому, а может выдавать любые другие релевантные картинки, что также необходимо учитывать программисту.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.