Class: RSpotify::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/rspotify/base.rb

Direct Known Subclasses

Album, Artist, Playlist, Track, User

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Base

Returns a new instance of Base.



110
111
112
113
114
115
116
# File 'lib/rspotify/base.rb', line 110

def initialize(options = {})
  @external_urls = options['external_urls']
  @href          = options['href']
  @id            = options['id']
  @type          = options['type']
  @uri           = options['uri']
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method_name, *args) ⇒ Object

Used internally to retrieve an object’s instance variable. If instance variable equals nil, calls #complete! on object and retrieve it again.

Examples:

user.id #=> "wizzler"

track = artist.tracks.first
track.instance_variable_get("@popularity") #=> nil
track.popularity #=> 62
track.instance_variable_get("@popularity") #=> 62


142
143
144
145
146
147
148
149
150
151
# File 'lib/rspotify/base.rb', line 142

def method_missing(method_name, *args)
  attr = "@#{method_name}"
  super unless instance_variable_defined? attr

  attr_value = instance_variable_get attr
  return attr_value if !attr_value.nil? || @id.nil?

  complete!
  instance_variable_get attr
end

Instance Attribute Details

#external_urlsHash

Known external URLs for object

Returns:

  • (Hash)

    the current value of external_urls



8
9
10
# File 'lib/rspotify/base.rb', line 8

def external_urls
  @external_urls
end

#hrefString

A link to the Web API endpoint

Returns:

  • (String)

    the current value of href



8
9
10
# File 'lib/rspotify/base.rb', line 8

def href
  @href
end

#idString

The Spotify ID for the object

Returns:

  • (String)

    the current value of id



8
9
10
# File 'lib/rspotify/base.rb', line 8

def id
  @id
end

#typeString

The object type (artist, album, etc.)

Returns:

  • (String)

    the current value of type



8
9
10
# File 'lib/rspotify/base.rb', line 8

def type
  @type
end

#uriString

The Spotify URI for the object

Returns:

  • (String)

    the current value of uri



8
9
10
# File 'lib/rspotify/base.rb', line 8

def uri
  @uri
end

Class Method Details

.find(ids, type) ⇒ Album, ...

Returns RSpotify object(s) with id(s) and type provided

Examples:

user = RSpotify::Base.find('wizzler', 'user')
user.class #=> RSpotify::User
user.id    #=> "wizzler"

ids = %w(2UzMpPKPhbcC8RbsmuURAZ 7Jzsc04YpkRwB1zeyM39wE)
tracks = RSpotify::Base.find(ids, 'track')
tracks.class       #=> Array
tracks.first.class #=> RSpotify::Track

Parameters:

  • ids (String, Array)
  • type (String)

Returns:



25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/rspotify/base.rb', line 25

def self.find(ids, type)
  case ids
  when Array
    if type == 'user'
      warn 'Spotify API does not support finding several users simultaneously'
      return false
    end
    limit = (type == 'album' ? 20 : 50)
    find_many(ids, type)
  when String
    id = ids
    find_one(id, type)
  end
end

.search(query, types, limit: 20, offset: 0, market: nil) ⇒ Array<Album>, ...

Returns array of RSpotify objects matching the query, ordered by popularity. It’s also possible to find the total number of search results for the query

Examples:

artists = RSpotify::Base.search('Arctic', 'artist')
albums  = RSpotify::Base.search('AM', 'album', limit: 10, market: 'US')
mixed   = RSpotify::Base.search('Arctic', 'artist, album, track')
albums  = RSpotify::Base.search('AM', 'album', market: { from: user })

RSpotify::Base.search('Arctic', 'album,artist,playlist').total #=> 2142

Parameters:

  • query (String)

    The search query’s keywords. For details access here and look for the q parameter description.

  • types (String)

    Valid types are: album, artist, track and playlist. Separate multiple types with commas.

  • limit (Integer) (defaults to: 20)

    Maximum number of objects to return. Maximum: 50. Default: 20.

  • offset (Integer) (defaults to: 0)

    The index of the first object to return. Use with limit to get the next set of objects. Default: 0.

  • market (String, Hash) (defaults to: nil)

    Optional. An ISO 3166-1 alpha-2 country code or the hash { from: user }, where user is a RSpotify user authenticated using OAuth with scope user-read-private. This will take the user’s country as the market value. (Playlist results are not affected by the market parameter.) For details access here and look for the market parameter description.

Returns:



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/rspotify/base.rb', line 85

def self.search(query, types, limit: 20, offset: 0, market: nil)
  query = URI::encode query
  types.gsub!(/\s+/, '')

  url = "search?q=#{query}&type=#{types}"\
        "&limit=#{limit}&offset=#{offset}"

  json = if market.is_a? Hash
    url << '&market=from_token'
    User.oauth_get(market[:from].id, url)
  else
    url << "&market=#{market}" if market
    RSpotify.get(url)
  end

  types = types.split(',')
  result = types.flat_map do |type|
    type_class = RSpotify.const_get(type.capitalize)
    json["#{type}s"]['items'].map { |i| type_class.new i }
  end

  insert_total(result, types, json)
  result
end

Instance Method Details

#complete!Object

Note:

It is seldom necessary to use this method explicitly, since RSpotify takes care of it automatically when needed (see #method_missing)

When an object is obtained undirectly, Spotify usually returns a simplified version of it. This method updates it into a full object, with all attributes filled.

Examples:

track = artist.tracks.first
track.instance_variable_get("@popularity") #=> nil
track.complete!
track.instance_variable_get("@popularity") #=> 62


128
129
130
# File 'lib/rspotify/base.rb', line 128

def complete!
  initialize RSpotify.get("#{type}s/#{@id}")
end

#respond_to?(method_name, include_private_methods = false) ⇒ Boolean

Overrides Object#respond_to? to also consider methods dynamically generated by #method_missing

Returns:

  • (Boolean)


154
155
156
157
158
# File 'lib/rspotify/base.rb', line 154

def respond_to?(method_name, include_private_methods = false)
  attr = "@#{method_name}"
  return true if instance_variable_defined? attr
  super
end