class Notu::TopTracks

Constants

PERIODS

Attributes

period[R]
user_api[R]

Public Class Methods

new(user_api, options = {}) click to toggle source
# File lib/notu/top_tracks.rb, line 11
def initialize(user_api, options = {})
  raise ArgumentError.new("#{self.class}#user_api must be specified") unless user_api
  @user_api = user_api
  options = options.symbolize_keys.reverse_merge(period: PERIODS.first)
  self.period = options[:period]
end

Public Instance Methods

each() { |track(artist:, plays_count:, title:)| ... } click to toggle source
# File lib/notu/top_tracks.rb, line 18
def each
  return unless block_given?
  pages_count = nil
  page = 1
  loop do
    json = JsonDocument.get(user_api.url(limit: 50, method: 'user.getTopTracks', page:, period:))
    pages_count = json['toptracks']['@attr']['totalPages'].to_i
    json['toptracks']['track'].each do |track_json|
      artist = track_json['artist']['name'] || next
      title = track_json['name'] || next
      plays_count = track_json['playcount'] || next
      yield(Track.new(artist:, plays_count:, title:))
    end
    page += 1
    break if page > pages_count
  end
  nil
end

Private Instance Methods

period=(value) click to toggle source
# File lib/notu/top_tracks.rb, line 39
def period=(value)
  string_value = value.to_s
  raise ArgumentError.new("#{self.class.name}#period is invalid: #{value.inspect}") unless PERIODS.include?(string_value)
  @period = string_value
end