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

Итак, в качестве базы данных для поиска музыки мы будем использовать сервисы Last.Fm.
Здесь все достаточно просто. Их Api не требует никакой авторизации, сопровождается подробнейшей документацией и доступен извне любому. Всё что от нас, по большому счету, требуется — объявить интерфейс доступа к сервису и далее использовать стандартную Wcf-ную ChannelFactory
Выглядеть объявление метода интерфейса для получения «похожих» артистов вот так:
Итак, с поиском похожих артистов примерно разобрались. Теперь надо где-то получить саму музыку.
Здесь нам на помощь придет самая популярная в России социальная сеть. Вы ведь знаете, почему фэйсбук в россии никогда не победит? Потому что во вконтакте в разделе «музыка» есть, буквально всё.
Остаётся только добраться до содержимого, по сравнению с Last.Fm это ой как не просто.
Во-первых, здесь нет публичного ключа для доступа к api. Чтобы получить ключ, надо зарегистрировать своё приложение. Однако плюсом является то, что если регистрируешь свое приложение как Desktop — ключ дают сразу.
Во вторых, для доступа к содержимому нужна авторизация. И авторизация у нас исключительно браузерная. И не просто браузерная, а еще и использует куки, и лишь после успешной авторизации — отдает еще один, новый ключ доступа к своему API для текущего пользователя, вдобавок привязанный к IP-адресу в формате JSON. Искать обходные пути здесь не будем, всё должно быть честно — требуют браузер — получат браузер. Немного покопавшись в интернете (не люблю изобретать велосипеды), мной была найдена небольшая несложная библиотечка, которая способна делать браузерную авторизацию — то есть появляется окошко браузера и пользователь сам вводит данные, либо не вводит — если он уже авторизован, а также адаптирует API в удобочитаемый вид. В итоге поиск песен выглядит так:
Итак, с информацией об артисте и похожих на артиста, а также песнями разобрались.
Теперь приступим к следующему шагу — требуется нарисовать граф, вершинами которого являются Исполнители, а рёбрами — «похожесть» артистов друг на друга. Будем использовать бесплатную библиотеку визуализации графов QuickGraph. И вот здесь нас подстерегает подстава — не думал, что для того, чтобы отобразить на ребре помимо самой линии ребра некое число — придется изголяться. Как говорится, Opensource такой Opensource…
Скажу сразу, я не специалист в Wpf. Сделать подобное у меня получилось лишь ценой создания нового контрола EdgeLabelControl, описанием PathGeometry.Figures, а также периодическим отваливанием дизайнера с null reference, хотя в рантайме всё работает. Приводить пример кода не буду, интересующиеся посмотрят сами, а может быть что-нибудь и подправят.
Итак, что в итоге. В итоге получился полностью работоспособный онлайн-музыкальный плеер на c#.
Пользуется ли кто-нибудь им по назначению? Да, как минимум сам автор.
Что в планах. В планах его как-нибудь улучшать. Например, сделать автоматическое составление плейлистов по «похожим артистам» ala last.fm, вывод информации о выбранном артисте, вывод текста текущей проигрываемой песни (используя REST wikilyrics) ну и т.д.
Получившийся проект был загружен на гуглокод. Кому интересно — может присоединиться и поучаствовать. Даже просто недоделанного, не то что нового, функционала еще много — например, не работают все кнопки проигрывателя. Групповая работа, так сказать, стимулирует к доделке, потому что проекты «для себя» обычно заканчиваются на стадии «работает, можно кое-как пользоваться — и ладно».
Спасибо за внимание!
Когда-то давно интернет-трафик стоил денег, мы считали каждый мегабайт… Сейчас же безлимитный интернет доступен практически каждому. Когда в очередной раз, ползая фоном в интернете, я искал в поисковике что можно послушать из музыки, посетила меня мысль, вроде бы не отличающаяся новизной — хочу просто ввести название артиста, получить список песен, нажать одну кнопку и слушать. Не отличающаяся новизной — потому что «самый популярный в рунете поисковик»(с) вроде бы предоставляет подобный музыкальный сервис, однако выбор, мягко говоря, не велик по авторским соображениям. А мне еще хотелось поразбираться с разрекламированной на хабре библиотекой построения графов для .Net Graph#, REST-сервисом Last.Fm-a для вычисления похожих групп, а также API вконтакта и немножко вспомнить WPF… В общем никаких торрентов не будет, а будет учебный проект с исходным кодом. Заинтересовавшихся прошу под кат!
Выглядит получившийся плеер примерно так:

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