Class: RSpotify::Playlist

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

Instance Attribute Summary collapse

Attributes inherited from Base

#external_urls, #href, #id, #type, #uri

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Base

#method_missing, #respond_to?

Constructor Details

#initialize(options = {}) ⇒ Playlist



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/rspotify/playlist.rb', line 75

def initialize(options = {})
  @collaborative = options['collaborative']
  @description   = options['description']
  @followers     = options['followers']
  @images        = options['images']
  @name          = options['name']
  @public        = options['public']

  @owner = if options['owner']
    User.new options['owner']
  end

  tracks = options['tracks']['items'] if options['tracks']

  @tracks_cache = if tracks
    tracks.map { |t| Track.new t['track'] }
  end

  @tracks_added_at = hash_for(tracks, 'added_at') do |added_at|
    Time.parse added_at
  end

  @tracks_added_by = hash_for(tracks, 'added_by') do |added_by|
    User.new added_by
  end

  super(options)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class RSpotify::Base

Instance Attribute Details

#collaborativeBoolean

true if the owner allows other users to modify the playlist



12
13
14
# File 'lib/rspotify/playlist.rb', line 12

def collaborative
  @collaborative
end

#descriptionString

The playlist description



12
13
14
# File 'lib/rspotify/playlist.rb', line 12

def description
  @description
end

#followersHash

Information about the followers of the playlist



12
13
14
# File 'lib/rspotify/playlist.rb', line 12

def followers
  @followers
end

#imagesArray<Hash>

The playlist images



12
13
14
# File 'lib/rspotify/playlist.rb', line 12

def images
  @images
end

#nameString

The name of the playlist



12
13
14
# File 'lib/rspotify/playlist.rb', line 12

def name
  @name
end

#ownerUser

The user who owns the playlist



12
13
14
# File 'lib/rspotify/playlist.rb', line 12

def owner
  @owner
end

#publicBoolean

true if the playlist is not marked as secret



12
13
14
# File 'lib/rspotify/playlist.rb', line 12

def public
  @public
end

#tracks_added_atHash

A hash containing the date and time each track was added to the playlist



12
13
14
# File 'lib/rspotify/playlist.rb', line 12

def tracks_added_at
  @tracks_added_at
end

#tracks_added_byHash

A hash containing the user that added each track to the playlist



12
13
14
# File 'lib/rspotify/playlist.rb', line 12

def tracks_added_by
  @tracks_added_by
end

Class Method Details

Get a list of Spotify featured playlists (shown, for example, on a Spotify player’s “Browse” tab).

Examples:

playlists = RSpotify::Playlist.browse_featured
playlists = RSpotify::Playlist.browse_featured(locale: 'es_MX', limit: 10)
playlists = RSpotify::Playlist.browse_featured(country: 'US', timestamp: '2014-10-23T09:00:00')


27
28
29
30
31
32
33
34
# File 'lib/rspotify/playlist.rb', line 27

def self.browse_featured(limit: 20, offset: 0, **options)
  url = "browse/featured-playlists?limit=#{limit}&offset=#{offset}"
  options.each do |option, value|
    url << "&#{option}=#{value}"
  end
  json = RSpotify.auth_get(url)
  json['playlists']['items'].map { |i| Playlist.new i }
end

.find(user_id, id) ⇒ Playlist

Returns Playlist object with user_id and id provided. If id is “starred”, returns starred playlist from user.

Examples:

playlist = RSpotify::Playlist.find('wizzler', '00wHcTN0zQiun4xri9pmvX')
playlist.class #=> RSpotify::Playlist
playlist.name  #=> "Movie Soundtrack Masterpieces"


46
47
48
49
50
51
52
53
54
# File 'lib/rspotify/playlist.rb', line 46

def self.find(user_id, id)
  url = if id == "starred"
    "users/#{user_id}/starred"
  else
    "users/#{user_id}/playlists/#{id}"
  end
  json = RSpotify.resolve_auth_request(user_id, url)
  Playlist.new json
end

.search(query, limit: 20, offset: 0) ⇒ Array<Playlist>

Returns array of Playlist objects matching the query

Examples:

playlists = RSpotify::Playlist.search('Indie')
playlists.size        #=> 20
playlists.first.class #=> RSpotify::Playlist
playlists.first.name  #=> "The Indie Mix"

playlists = RSpotify::Playlist.search('Indie', limit: 10)
playlists.size #=> 10


71
72
73
# File 'lib/rspotify/playlist.rb', line 71

def self.search(query, limit: 20, offset: 0)
  super(query, 'playlist', limit: limit, offset: offset)
end

Instance Method Details

#add_tracks!(tracks, position: nil) ⇒ Array<Track>

Adds one or more tracks to a playlist in user’s Spotify account. This method is only available when the current user has granted access to the playlist-modify and playlist-modify-private scopes.

Examples:

tracks = RSpotify::Track.search('Know', 30)
playlist = user.create_playlist!('my-awesome-playlist')

playlist.add_tracks!(tracks)
playlist.tracks.size       #=> 30
playlist.tracks.first.name #=> "Somebody That I Used To Know"

playlist.add_tracks!(tracks, position: 20)
playlist.tracks[20].name #=> "Somebody That I Used To Know"


121
122
123
124
125
126
127
128
129
# File 'lib/rspotify/playlist.rb', line 121

def add_tracks!(tracks, position: nil)
  track_uris = tracks.map(&:uri).join(',')
  url = @href + "/tracks?uris=#{track_uris}"
  url << "&position=#{position}" if position

  User.oauth_post(@owner.id, url, {})
  @tracks_cache = nil
  tracks
end

#change_details!(**data) ⇒ Playlist

Change name and public/private state of playlist in user’s Spotify account. Changing a public playlist requires the playlist-modify scope; changing a private playlist requires the playlist-modify-private scope.

Examples:

playlist.name   #=> "Movie Soundtrack Masterpieces"
playlist.public #=> true

playlist.change_details!(name: 'Movie Tracks', public: false)

playlist.name   #=> "Movie Tracks"
playlist.public #=> false


146
147
148
149
150
151
152
# File 'lib/rspotify/playlist.rb', line 146

def change_details!(**data)
  User.oauth_put(@owner.id, @href, data.to_json)
  data.each do |field, value|
    instance_variable_set("@#{field}", value)
  end
  self
end

#complete!Object

Note:

It is seldom necessary to use this method explicitly, since RSpotify takes care of it automatically when needed (see Base#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:

playlist = user.playlists.first
playlist.instance_variable_get("@description") #=> nil
playlist.complete!
playlist.instance_variable_get("@description") #=> "Iconic soundtracks..."


164
165
166
# File 'lib/rspotify/playlist.rb', line 164

def complete!
  initialize RSpotify.resolve_auth_request(@owner.id, @href)
end

#replace_tracks!(tracks) ⇒ Array<Track>

Replace all the tracks in a playlist, overwriting its existing tracks. Changing a public playlist requires the playlist-modify scope; changing a private playlist requires the playlist-modify-private scope.

Examples:

playlist.tracks.map(&:name) #=> ["All of Me", "Wasted Love", "Love Runs Out"]
tracks = RSpotify::Track.search('Know', limit: 2)
playlist.replace_tracks!(tracks)
playlist.tracks.map(&:name) #=> ["Somebody That I Used To Know", "Do I Wanna Know?"]


205
206
207
208
209
210
211
# File 'lib/rspotify/playlist.rb', line 205

def replace_tracks!(tracks)
  track_uris = tracks.map(&:uri).join(',')
  url = @href + "/tracks?uris=#{track_uris}"
  User.oauth_put(@owner.id, url, {})
  @tracks_cache = nil
  tracks
end

#tracks(limit: 100, offset: 0) ⇒ Array<Track>

Returns array of tracks from the playlist

Examples:

playlist = RSpotify::Playlist.find('wizzler', '00wHcTN0zQiun4xri9pmvX')
playlist.tracks.first.name #=> "Main Theme from Star Wars - Instrumental"


177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
# File 'lib/rspotify/playlist.rb', line 177

def tracks(limit: 100, offset: 0)
  last_track = offset + limit - 1
  if @tracks_cache && last_track < 100
    return @tracks_cache[offset..last_track]
  end

  url = @href + "/tracks?limit=#{limit}&offset=#{offset}"
  json = RSpotify.resolve_auth_request(@owner.id, url)

  tracks = json['items'].map do |i|
    Track.new i['track'] unless i['track'].nil?
  end.compact

  @tracks_cache = tracks if limit == 100 && offset == 0
  tracks
end