Class: Nanoc::DataSources::LastFM Deprecated

Inherits:
Nanoc::DataSource show all
Defined in:
lib/nanoc/data_sources/deprecated/last_fm.rb

Overview

Deprecated.

Fetch data from online data sources manually instead

Instance Attribute Summary

Attributes inherited from Nanoc::DataSource

#config, #items_root, #layouts_root

Instance Method Summary (collapse)

Methods inherited from Nanoc::DataSource

#create_item, #create_layout, #down, #initialize, #layouts, #loading, #setup, #sync, #unuse, #up, #update, #use

Methods included from PluginRegistry::PluginMethods

#all, #identifier, #identifiers, #named, #register

Constructor Details

This class inherits a constructor from Nanoc::DataSource

Instance Method Details

- (Object) items



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/nanoc/data_sources/deprecated/last_fm.rb', line 8

def items
  @items ||= begin
    require 'json'
    require 'uri'

    # Check configuration
    if config[:username].nil?
      raise 'LastFM data source requires a username in the configuration'
    end
    if config[:api_key].nil?
      raise 'LastFM data source requires an API key in the configuration'
    end

    # Get data
    @http_client ||= Nanoc::Extra::CHiCk::Client.new
    _status, _headers, data = *@http_client.get(
      'http://ws.audioscrobbler.com/2.0/' +
        '?method=user.getRecentTracks' +
        '&format=json' +
        '&user=' + URI.escape(config[:username]) +
        '&api_key=' + URI.escape(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' +
          (
            if raw_item['artist']['mbid'].empty?
              '&artist=' + URI.escape(raw_item['artist']['#text'])
            else
              '&mbid=' + URI.escape(raw_item['artist']['mbid'])
            end
          ) +
          '&api_key=' + URI.escape(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
        track_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
      Nanoc::Item.new(content, attributes, identifier, mtime)
    end
  end
end