Pull to refresh

Пишем онлайновый музыкальный проигрыватель на .Net используя «вебдванольные» сервисы

Здравствуйте, уважаемые читатели.
Когда-то давно интернет-трафик стоил денег, мы считали каждый мегабайт… Сейчас же безлимитный интернет доступен практически каждому. Когда в очередной раз, ползая фоном в интернете, я искал в поисковике что можно послушать из музыки, посетила меня мысль, вроде бы не отличающаяся новизной — хочу просто ввести название артиста, получить список песен, нажать одну кнопку и слушать. Не отличающаяся новизной — потому что «самый популярный в рунете поисковик»(с) вроде бы предоставляет подобный музыкальный сервис, однако выбор, мягко говоря, не велик по авторским соображениям. А мне еще хотелось поразбираться с разрекламированной на хабре библиотекой построения графов для .Net Graph#, REST-сервисом Last.Fm-a для вычисления похожих групп, а также API вконтакта и немножко вспомнить WPF… В общем никаких торрентов не будет, а будет учебный проект с исходным кодом. Заинтересовавшихся прошу под кат!

Выглядит получившийся плеер примерно так:

image

Итак, в качестве базы данных для поиска музыки мы будем использовать сервисы Last.Fm.
Здесь все достаточно просто. Их Api не требует никакой авторизации, сопровождается подробнейшей документацией и доступен извне любому. Всё что от нас, по большому счету, требуется — объявить интерфейс доступа к сервису и далее использовать стандартную Wcf-ную ChannelFactory
Выглядеть объявление метода интерфейса для получения «похожих» артистов вот так:

[OperationContract(Name = "artist.getsimilar(artist)")]
[WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml, UriTemplate = "?raw=true&api_key={apikey}&method=artist.getsimilar&artist={artist}")]
SimilarArtists artist_getsimilar(string apikey, string artist);

Итак, с поиском похожих артистов примерно разобрались. Теперь надо где-то получить саму музыку.
Здесь нам на помощь придет самая популярная в России социальная сеть. Вы ведь знаете, почему фэйсбук в россии никогда не победит? Потому что во вконтакте в разделе «музыка» есть, буквально всё.

Остаётся только добраться до содержимого, по сравнению с Last.Fm это ой как не просто.

Во-первых, здесь нет публичного ключа для доступа к api. Чтобы получить ключ, надо зарегистрировать своё приложение. Однако плюсом является то, что если регистрируешь свое приложение как Desktop — ключ дают сразу.

Во вторых, для доступа к содержимому нужна авторизация. И авторизация у нас исключительно браузерная. И не просто браузерная, а еще и использует куки, и лишь после успешной авторизации — отдает еще один, новый ключ доступа к своему API для текущего пользователя, вдобавок привязанный к IP-адресу в формате JSON. Искать обходные пути здесь не будем, всё должно быть честно — требуют браузер — получат браузер. Немного покопавшись в интернете (не люблю изобретать велосипеды), мной была найдена небольшая несложная библиотечка, которая способна делать браузерную авторизацию — то есть появляется окошко браузера и пользователь сам вводит данные, либо не вводит — если он уже авторизован, а также адаптирует API в удобочитаемый вид. В итоге поиск песен выглядит так:

var sessionInfo = new SessionManager(appId, ApiPerms.Audio).GetSession(SessionAuthType.WithBrowser);
var manager = new ApiManager(sessionInfo);
var audioFactory = new AudioFactory(manager);
var result = audioFactory.Search(artist + " " + song, AudioSortOrder.ByDate, false, 50, 0);

Итак, с информацией об артисте и похожих на артиста, а также песнями разобрались.
Теперь приступим к следующему шагу — требуется нарисовать граф, вершинами которого являются Исполнители, а рёбрами — «похожесть» артистов друг на друга. Будем использовать бесплатную библиотеку визуализации графов QuickGraph. И вот здесь нас подстерегает подстава — не думал, что для того, чтобы отобразить на ребре помимо самой линии ребра некое число — придется изголяться. Как говорится, Opensource такой Opensource…

Скажу сразу, я не специалист в Wpf. Сделать подобное у меня получилось лишь ценой создания нового контрола EdgeLabelControl, описанием PathGeometry.Figures, а также периодическим отваливанием дизайнера с null reference, хотя в рантайме всё работает. Приводить пример кода не буду, интересующиеся посмотрят сами, а может быть что-нибудь и подправят.

Итак, что в итоге. В итоге получился полностью работоспособный онлайн-музыкальный плеер на c#.
Пользуется ли кто-нибудь им по назначению? Да, как минимум сам автор.
Что в планах. В планах его как-нибудь улучшать. Например, сделать автоматическое составление плейлистов по «похожим артистам» ala last.fm, вывод информации о выбранном артисте, вывод текста текущей проигрываемой песни (используя REST wikilyrics) ну и т.д.

Получившийся проект был загружен на гуглокод. Кому интересно — может присоединиться и поучаствовать. Даже просто недоделанного, не то что нового, функционала еще много — например, не работают все кнопки проигрывателя. Групповая работа, так сказать, стимулирует к доделке, потому что проекты «для себя» обычно заканчиваются на стадии «работает, можно кое-как пользоваться — и ладно».
Спасибо за внимание!
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.