10 февраля 2015 в 22:38

VKPLS — Генерация потокового аудио-плейлиста из vk.com из песочницы

image

Хочу поделиться с читателями «Хабрахабра» небольшим веб-сервисом (скриптом), который написал для себя.

С появлением социальных сетей и их широким распространением пользователи довольно много времени проводят в онлайне. Все любят музыку, а лично я без нее жить не могу. Так вышло, что всю свою музыкальную коллекцию храню в профайле «Вконтакте». Поскольку всегда в курсе новинок, не трачу свое время на поиск и скачивание, а возможность доступа к своей музыке почти с любого гаджета в любом месте где есть интернет придает максимум удобства. Я очень рад, что прошли те деревянные времена, когда хороший интернет был роскошью. Больше нет необходимости хранить такую информацию на своем жестком диске. Все, что не конфиденциально, выбрасываю в облако.

Большую часть своей работы я выполняю за компьютером, а это значит, что музыка мне необходима как кислород — чтобы сконцентрироваться на поставленных задачах. Врубаешь любимый альбом в 5.1 и творишь. Но есть одно но: чтобы послушать музыку в VK.com, я должен зайти в онлайн, а если заходишь в онлайн — то непременно получаешь кучу сообщений и затягиваешься в нежелательные беседы. Я человек добрый и отзывчивый, поэтому не могу игнорировать своих друзей с их постоянными проблемами. Но ведь мне нужно сконцентрироваться на работе, а вся моя музыка там, где меня всегда что-то отвлекает.

Я обожаю Linux, но нормальных плагинов для музыкальных плееров или самих плееров для прослушивания музыки с VK.com так и не встретил. Тогда решил, что с этим нужно что-то делать и накидал за пару часов небольшой php скрипт, который и назвал vkpls (не трудно догадаться, что я имел ввиду).

Суть скрипта в получении прямых ссылок на аудиозаписи и генерации потокового плейлиста, алгоритм до безобразия прост, я завязал его на VK.API:

Для начала я создал Standalone приложение в разделе «Для разработчиков» и получил для него права на доступ к аудиозаписям. После этого мне необходимо было пройти авторизацию для создания ACCESS_TOKEN, т.к. доступ к информации об аудиозаписях (метод audio.get в vk.api) невозможен по простому POST или GET запросу.

Теперь я мог с помощью средств старенького PHP направлять запрос с интересующими меня параметрами без ограничений, а в ответ получать интересующую меня информацию в формате JSON. Функция audio.get возвращает список аудиозаписей пользователя или сообщества со всей дополнительной информацией. Бинго, это-то мне и было нужно.

Так, например, в ответ такого запроса:
https://api.vk.com/method/audio.get?user_id=ВАШ_ID&v=5.28&access_token=ВАШ_ACCESS_TOKEN

мы получаем массив в формате JSON со следующей информацией:
Ответ на audio.get в JSON
response: {
count: 505,
items: [{
id: '34',
photo: 'http://cs7009.vk....2/rj4RvYLCobY.jpg',
name: 'Tatyana Plutalova',
name_gen: 'Tatyana'
}, {
id: 232745053,
owner_id: 34,
artist: 'Ambassadeurs',
title: 'Sparks',
duration: 274,
url: 'http://cs6164.vk....lGEJhqRK8d5OQZngI',
lyrics_id: 120266970,
genre_id: 18
}, {
id: 232733966,
owner_id: 34,
artist: 'Aloe Blacc',
title: 'Can You Do This ',
duration: 176,
url: 'http://cs6157.vk....erOa0DvsyOCYTPO1w',
genre_id: 2
}, {
id: 232735496,
owner_id: 34,
artist: 'Aloe Blacc',
title: 'Wake Me Up',
duration: 224,
url: 'http://cs6109.vk....FzHJU55ixz8Av8ujc',
lyrics_id: 119056069,
genre_id: 2
}]
}

Посмотрите — интересующие нас ключи artist, title, duration, url присутствуют для каждой аудиозаписи. Воспользовавшись функцией json_decode я преобразовал полученный массив в понятный для php формат. Все, что мне осталось для достижения результата — это сгенерировать файл плейлиста.

Структура M3U плэйлиста:
#EXTM3U
#EXTINF:duration,artist — title
url



Не было ничего проще записать в файл с помощью цикла foreach все полученные данные и сохранить его в m3u.
Ура, все получилось, теперь я могу слушать музыку в любом музыкальном плеере без необходимости авторизации вконтакте.

Резюме


Я решил поделиться своей идеей и сделать ее доступной для таких же, как я. С помощью CSS фрэймворка Maxmertkit (представленного одним из пользователей «Хабрахабра» здесь) сверстал небольшую страницу для удобства использования скрипта. Для всех желающих она доступна по следующей ссылке — VKPLS. Там же вы можете прочитать инструкцию или посмотреть видео.

Следует отметить, что существует одно но. В связи с тем, что ссылки на аудиозаписи на серверах «Вконтакте» меняются с переодичностью в 0,5 — 3 дня, рекомендую чаще обновлять свой плэйлист.

На этом все, спасибо за внимание.
Yakovlev Aleksey @alsmile
карма
5,0
рейтинг 0,0
Похожие публикации
Самое читаемое Разработка

Комментарии (30)

  • –2
    Я человек добрый и отзывчивый, поэтому не могу игнорировать своих друзей с их постоянными проблемами. Но ведь мне нужно сконцентрироваться на работе, а вся моя музыка там, где меня всегда что-то отвлекает.
    Я в таком случае использовал плеер AIMP с его плагином ВКонтакте, он имел необходимый набор функций.

    В целом, статья какая-то сыроватая, в следующий раз больше работайте над текстом — краткость — сестра таланта. Кстати, не планируете pls использовать(летом писал подобный сервис, пришел к выводу, что раздавать плей-листы гораздно проще)?
    • +1
      Спасибо за отзыв, Ваши пожелания в будущем учту. Я под linux-ом пользуюсь Audacious, к сожалению, в нем такой возможности нет, а слушать потоковый плэйлист можно почти в любом плеере и в любой системе.
      Скрипт уже генерирует два типа плейлиста .m3u и .pls, кому что по душе.
  • 0
    А я вообще ушел от «статичной» музыки (ну это которая в файлах валяется, на харде или в облаках не суть).
    Добавил в листы в плеерах ссылки на онлайн-радио (они у меня по жанрам музыки), и переключаю по настроению. Благо, сегодня таких радио — вагон.
    • +1
      То есть вы ушли от «слушаю то, что я хочу, что сам выбрал/собрал» в сторону «пофиг что играет, включу радио»? Я вот очень боюсь до такого безразличия докатиться :)
      • +1
        Я ведь вот о чем. Даже если в плейлистах тысячи композиций — выбор все-равно ограничен количеством этих композиций. А я сформировал себе линки на жанровые интернет-радиостанции (это зарубежные станции), от хард-рока и гранжа до транса и чиллаута. И теперь звучащая музыка меня полностью устраивает, ибо она в том русле которое мне сейчас эмоционально ближе, но в то же время всегда что-то новое.
        И в чем же тогда безразличие при таком подходе? Я слушаю то что хочу.
        Хотя, к чему споры, — каждый сам себе фломастеры готовит :)
  • –1
    Автору респект! Делал похожее для себя — стриминг своих плейлистов на любые девайсы с управлением через IRC. Так пришлось на Java биндинг в C писать. Код на Гитхабе, демка — myfm.at. Только чур не все сразу, ляжем как пить дать. Если интересно что под капотом, дерните. Кстати, музыка не из VK, так что все треки легальны, но и правообладателезащищенных хитов нету, это минус.
  • –2
    Не вижу смысла выкладывать ссылку на сервис, без кода. Ваш аккаунт, с которого отправляются запросы к API, уже отхабренный или просит капчу.
    • 0
      С момента публикации статьи здесь, сервис опробовало 150+ человек, пока все хорошо, я не рассчитываю на большую аудиторию. Но уже сейчас приготовил класс для вывода и поста капчи в случае необходимости, осталось только подключить.
      • –1
        Почему вы создаете Standalone приложение? И обращаетесь с сервера, не с клиента?
        • 0
          Чтобы не запрашивать авторизацию всякий раз и у каждого, кто захотел сгенерировать плейлист. Прошу прощения, если не правильно понял сути вашего вопроса.
          • +1
            С клиента (open api) можно было бы это все ускорить и еще пару плюсов.
            Standalone приложение не нужно, нужен просто запросить права на audio, через open api, после этого не нужно лазить в настройки и открывать доступ к аудио. Так же пропадает проблема с замросами в секунду с сервера и ввод капчи. Вы утверждаете что готов класс, но если в раз зашло 6 человек капча вылезет у всех трех и у первых 5 уже будет не действительна, с клиента же все намного проще.
            • 0
              Спасибо за идею, данный плюс очевиден — при большой аудитории, можно подумать над реализацией, если есть желание поучаствовать, все контакты открыты.
          • 0
            Запросить нужно будет только один раз права, последующий вход на сайт просто проверять на наличие прав. :)
  • 0
    Можно поинтересоваться, а какое направление в музыке Вы предпочитаете?
    • +1
      К сожалению, я не смогу вам ответить с точностью на данный вопрос, я человек настроения, будем считать, что я меломан.
      • 0
        Если у Вас все хорошо организовано, то можете дать ссылочку послушать? Если вкусы совпадут то для откроется еще один источник музыки)
        • 0
          Пожалуйста: 4094271 (id).
  • 0
    Спасибо за статью, есть небольшой баг, если не указать Page ID и Number of songs, после нажатия на Create PlayList а после на Download, получаем 500 ошибку, думаю лучше добавить проверку этих полей, и сделать их обязательными.
    • 0
      Спасибо, сделаю обязательно.
  • 0
    Я когда-то тоже делал подобное приложение, но раньше аудиозаписи были доступны только для того IP, с которого был произведен запрос на получение урлов. Я так понимаю, больше такого ограничения у VK Api не существует?
    • 0
      Привязка к IP адресу все еще есть) audio.get
      • 0
        Тогда я не понимаю каким образом доступны адреса из плей-листа, если запрос к VK Api производил серверный скрипт на PHP.
        • 0
          Сделал один и тот же запрос с сервера и клиента, привязка идет только при обращении с open api похоже. Если обращаться с Standalone приложения привязки к IP нет.
          • 0
            С клиента запрос до ВК не уходит, я проверил, идет запрос только до vkpls.php скрипта. А вот то, что к Standalone приложениям нет привязки по IP — очень может быть! Спасибо, разобрались!
            • 0
              У Вконтакте есть два домена vk-cdn.net и vk.me. Если сервер вернул ссылку на домен vk-cdn.net, значит файл привязан к IP. Если домен vk.me, то привязки к IP нету.
  • 0
    А как решили проблему со временем жизни ACCESS_TOKEN? Он же совсем недолго живёт.
    • +1
      offline — Доступ к API в любое время со стороннего сервера (при использовании этой опции параметр expires_in, возвращаемый вместе с access_token, содержит 0 — токен бессрочный).
      • 0
        Ухты, раньше такого не видел, спасибо за наводку.
  • 0
    Делал подобный скрипт но для offline, к сожалению, от списка url'ов толку мало, но можно генирить список по шаблону, например, wget {url} -O "{artist} - {title}.mp3" сохраняем в sh… Только artist и title надо чистить от мусора.
  • +1
    Просто на всякий случай: расширение vkopt, которым я уже некоторое время пользуюсь, встраивает эту функциональность прямо на страничку вконтакте. И умеет ещё много чего.

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.