# encoding: utf-8 module Nanoc3::DataSources # @deprecated Fetch data from online data sources manually instead class LastFM < Nanoc3::DataSource def items @items ||= begin require 'json' require 'time' require 'uri' require 'enumerator' # Check configuration if self.config[:username].nil? raise RuntimeError, "LastFM data source requires a username in the configuration" end if self.config[:api_key].nil? raise RuntimeError, "LastFM data source requires an API key in the configuration" end # Get data @http_client ||= Nanoc3::Extra::CHiCk::Client.new status, headers, data = *@http_client.get( 'http://ws.audioscrobbler.com/2.0/' + '?method=user.getRecentTracks' + '&format=json' + '&user=' + URI.escape(self.config[:username]) + '&api_key=' + URI.escape(self.config[:api_key]) ) # Parse as JSON parsed_data = JSON.parse(data) raw_items = parsed_data['recenttracks']['track'] # Convert to items raw_items.enum_with_index.map do |raw_item, i| # Get artist data artist_status, artist_headers, artist_data = *@http_client.get( 'http://ws.audioscrobbler.com/2.0/' + '?method=artist.getInfo' + '&format=json' + ( raw_item['artist']['mbid'].empty? ? '&artist=' + URI.escape(raw_item['artist']['#text']) : '&mbid=' + URI.escape(raw_item['artist']['mbid']) ) + '&api_key=' + URI.escape(self.config[:api_key]) ) # Parse as JSON parsed_artist_data = JSON.parse(artist_data) raw_artist_info = parsed_artist_data['artist'] # Build data content = '' # Handle track dates if raw_item['@attr'] && raw_item['@attr']['nowplaying'] == 'true' track_played_at = Time.now now_playing = true else played_at = Time.parse(raw_item['date']['#text']) now_playing = false end attributes = { :name => raw_item['name'], :artist => { :name => raw_artist_info['name'], :url => raw_artist_info['url'] }, :url => raw_item['url'], :played_at => track_played_at, :now_playing => now_playing } identifier = "/#{i}/" mtime = nil # Build item Nanoc3::Item.new(content, attributes, identifier, mtime) end end end end end