вівторок, 30 квітня 2013 р.

Отримання улюблених аудіозаписів з Last.fm

Почитав тут статтю Получение любимых аудиозаписей с pandora.com, подумав і придумав subj.
Отже, з Last.fm будемо отримувати список назв пісень і виконавців, потім за допомогою API ВКонтакте будемо їх скачувати.

Крок 1. Йдем на Last.fm, і витягуємо список улюблених пісень користувача.

Для тих хто не знає, Last.fm має API, що дозволяє будь-якому користувачеві створювати свої власні програми з використанням даних Last.fm. Для роботи з API потрібно отримати API Key і Secret. Йдемо на http://www.last.fm/api і створюємо новий аккаунт для некомерційного використання.

ruby-lastfm - інтерфейс для Web-сервісів Last.fm v2.0.
Тепер нам потрібно отримати token:
lastfm = Lastfm.new(lastfm_api_key, lastfm_api_secret)
lastfm_token = lastfm.auth.get_token

Далі нам пропонують відкрити 'http://www.last.fm/api/auth/?api_key=xxxxxxxxxxx&token=xxxxxxxx' і надати права додатку.

Спробуємо змоделювати цей запит. Але спочатку потрібно авторизуватися на сайті Last.fm за допомогою імені і паролю. Використовуємо бібліотеку Mechanize:
mech = Mechanize.new do |a|
  a.user_agent_alias = 'Linux Firefox'
  a.verify_mode = OpenSSL::SSL::VERIFY_NONE
  a.follow_meta_refresh = true
end

login_page = mech.get('https://last.fm/login')
login_form = login_page.form_with(action: '/login')

login_form.username = lastfm_username
login_form.password = lastfm_password

page = login_form.submit

if page.uri.to_s == 'http://www.last.fm/home'
  puts "Login successful!"
else
  puts page.uri.to_s
  exit
end

Якщо авторизація пройшла успішно, надаємо права додатку:
grantaccess_url = "http://www.last.fm/api/auth/?api_key=#{lastfm_api_key}&token=#{lastfm_token}"
grantaccess_page = mech.get(grantaccess_url)

grantaccess_form = grantaccess_page.form_with(action: '/api/grantaccess')
grantaccess_form.submit

Отже, тепер ми можемо витягнути всю цікаву для нас інформацію:
lastfm.session = lastfm.auth.get_session(:token => lastfm_token)['key']
tracks = lastfm.user.get_loved_tracks(user: lastfm_username)

Перший крок пройдений! :)

Крок другий. Пошук і скачування записів з vk.com.
Авторизуємося ВКонаткте:
vk = Vkontakte::Client.new(vk_client_id)
vk.login!(vk_email, vk_password, scope = 'audio')

Використовуємо API функцію пошуку аудіо:
str = "#{track['artist']['name']} - #{track['name']}"
audio = vk.api.audio_search(q: str, sort: 2)[1]

Вона повертає найпопулярніший результат пошуку рядка str (серед аудіозаписів).

Тепер ми знаємо url для скачування. Завантажити можна за допомогою стандартної функції.
path = "#{downloaded_folder}/" + "#{audio['artist']} - #{audio['title']}.mp3"
File.open(path, 'wb') do |saved_file|
  open(audio['url'], 'rb') do |read_file|
    saved_file.write(read_file.read)
  end
end

В результаті вийшов ось такий скрипт:
https://gist.github.com/mamantoha/5488722

Як з ним працювати:
  • Скрипт вимагає встановленого Ruby і гемів mechanize, ruby-lastfm, vkontakte
  • Потрібно отримати ключі для Last.fm(lastfm_api_key, lastfm_secret) і ВКонтакте(vk_client_id)
  • downloaded_folder - директорія, куди буде зберігатися скачана музика
  • lastfm_username і lastfm_password - ваш логін і пароль на Last.fm
  • vk_email і vk_password - ваш логін і пароль на Vk.com

Відповідні параметри прописати в тілі скрипта.