From 216d56d699cd98371dd2f92c8558873ab2d67c77 Mon Sep 17 00:00:00 2001 From: Vikraman Choudhury Date: Thu, 4 Mar 2021 01:34:57 +0000 Subject: [PATCH] Add lastfm adapter --- app/adapters/lastfm_adapter.rb | 37 +++++++++++++++++++++++++++++ app/assets/images/logos/lastfm.png | Bin 0 -> 11666 bytes app/metrics/lastfm/scrobbles.rb | 8 +++++++ config/initializers/providers.rb | 2 +- 4 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 app/adapters/lastfm_adapter.rb create mode 100644 app/assets/images/logos/lastfm.png create mode 100644 app/metrics/lastfm/scrobbles.rb diff --git a/app/adapters/lastfm_adapter.rb b/app/adapters/lastfm_adapter.rb new file mode 100644 index 0000000..ec01a2d --- /dev/null +++ b/app/adapters/lastfm_adapter.rb @@ -0,0 +1,37 @@ +class LastfmAdapter < BaseAdapter + class << self + def required_keys + %i(username api_key) + end + + def auth_type + :none + end + + def website_link + "https://www.last.fm" + end + + def title + "Last.fm" + end + + def valid_credentials?(credentials) + username, api_key = credentials.values_at(:username, :api_key) + username.present? && api_key.present? + end + end + + def scrobbles + username, api_key = credentials.values_at(:username, :api_key) + resp = Faraday.get("http://ws.audioscrobbler.com/2.0/?method=user.getinfo&user=#{username}&api_key=#{api_key}&format=json") + + user_info = JSON.parse(resp.body) + if user_info + user_info.fetch("user.playcount").to_i + else + raise "Can't fetch user playcount" + end + end + +end diff --git a/app/assets/images/logos/lastfm.png b/app/assets/images/logos/lastfm.png new file mode 100644 index 0000000000000000000000000000000000000000..57097c76264d613c216c2858f818960e72131518 GIT binary patch literal 11666 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 y@(OZsF|o4?va{=}cANem1MD2kZ7e