rspotify 0.11.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +24 -3
- data/lib/rspotify/album.rb +5 -5
- data/lib/rspotify/artist.rb +5 -5
- data/lib/rspotify/base.rb +4 -4
- data/lib/rspotify/playlist.rb +2 -2
- data/lib/rspotify/track.rb +5 -5
- data/lib/rspotify/user.rb +31 -2
- data/lib/rspotify/version.rb +1 -1
- data/spec/lib/rspotify/album_spec.rb +14 -0
- data/spec/lib/rspotify/artist_spec.rb +15 -1
- data/spec/lib/rspotify/track_spec.rb +15 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2d7f28937ceecdffd0ec686f189c65158444bb57
|
4
|
+
data.tar.gz: 77e683c22e6504e964dcb72b52ff96b0fd9afe0f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d07731312cd48df3a44650a99043cc47be1280830d118f63150930a53fe1f6ee7b9f0c4ab9912ceabb7f3eb25df673d863f56e45e1a729f0065f695dbd6dd364
|
7
|
+
data.tar.gz: e952d461b1b57602732edc183c3d8ae09f1382f0fac8e007fa6a10fdb31250e46cae6f32c09aded69d932bdcb363ca51485f5b41c1da3b49797d794c2583910b
|
data/README.md
CHANGED
@@ -111,9 +111,17 @@ You'll may want your application to access an user's Spotify account.
|
|
111
111
|
|
112
112
|
For instance, suppose you want your app to create playlists for the user based on his taste, or to add a feature that syncs user's playlists with some external app.
|
113
113
|
|
114
|
-
If so,
|
114
|
+
If so, add the following lines to your application (Remember to [get your credentials](https://developer.spotify.com/my-applications))
|
115
115
|
|
116
116
|
```ruby
|
117
|
+
# config/application.rb
|
118
|
+
|
119
|
+
RSpotify::authenticate("<your_client_id>", "<your_client_secret>")
|
120
|
+
```
|
121
|
+
|
122
|
+
```ruby
|
123
|
+
# config/initializers/omniauth.rb
|
124
|
+
|
117
125
|
Rails.application.config.middleware.use OmniAuth::Builder do
|
118
126
|
provider :spotify, "<your_client_id>", "<your_client_secret>", scope: 'user-read-email playlist-modify'
|
119
127
|
end
|
@@ -121,7 +129,7 @@ end
|
|
121
129
|
|
122
130
|
You should replace the scope values for the ones your own app will require from the user. You can see the list of available scopes in [here](https://developer.spotify.com/web-api/using-scopes).
|
123
131
|
|
124
|
-
|
132
|
+
Next, make a link so the user can log in with his Spotify account:
|
125
133
|
|
126
134
|
```ruby
|
127
135
|
<%= link_to 'Sign in with Spotify', '/auth/spotify' %>
|
@@ -160,7 +168,20 @@ class UsersController < ApplicationController
|
|
160
168
|
end
|
161
169
|
```
|
162
170
|
|
163
|
-
|
171
|
+
The user's access token is automatically refreshed by RSpotify when needed. This is specially useful if you persist the user data on a database: this way he only needs to log in to Spotify once in his entire use of your application.
|
172
|
+
|
173
|
+
RSpotify provides a way to easy persistance:
|
174
|
+
|
175
|
+
```ruby
|
176
|
+
hash = spotify_user.to_hash
|
177
|
+
# hash containing all user attributes, including access tokens
|
178
|
+
|
179
|
+
# Use the hash to persist the data the way you prefer...
|
180
|
+
|
181
|
+
# Then recover the Spotify user whenever you like
|
182
|
+
spotify_user = RSpotify::User.new(hash)
|
183
|
+
spotify_user.create_playlist!('my_awesome_playlist') # automatically refreshes token
|
184
|
+
```
|
164
185
|
|
165
186
|
## Notes
|
166
187
|
|
data/lib/rspotify/album.rb
CHANGED
@@ -34,8 +34,8 @@ module RSpotify
|
|
34
34
|
# Returns array of Album objects matching the query, ordered by popularity
|
35
35
|
#
|
36
36
|
# @param query [String] The search query's keywords. See the q description in {https://developer.spotify.com/web-api/search-item here} for details.
|
37
|
-
# @param limit [Integer] Maximum number of albums to return. Minimum: 1. Maximum: 50.
|
38
|
-
# @param offset [Integer] The index of the first album to return. Use with limit to get the next set of albums.
|
37
|
+
# @param limit [Integer] Maximum number of albums to return. Minimum: 1. Maximum: 50. Default: 20.
|
38
|
+
# @param offset [Integer] The index of the first album to return. Use with limit to get the next set of albums. Default: 0.
|
39
39
|
# @return [Array<Album>]
|
40
40
|
#
|
41
41
|
# @example
|
@@ -44,10 +44,10 @@ module RSpotify
|
|
44
44
|
# albums.first.class #=> RSpotify::Album
|
45
45
|
# albums.first.name #=> "AM"
|
46
46
|
#
|
47
|
-
# albums = RSpotify::Base.search('AM', 10)
|
47
|
+
# albums = RSpotify::Base.search('AM', limit: 10)
|
48
48
|
# albums.size #=> 10
|
49
|
-
def self.search(query, limit
|
50
|
-
super(query, 'album', limit, offset)
|
49
|
+
def self.search(query, limit: 20, offset: 0)
|
50
|
+
super(query, 'album', limit: limit, offset: offset)
|
51
51
|
end
|
52
52
|
|
53
53
|
def initialize(options = {})
|
data/lib/rspotify/artist.rb
CHANGED
@@ -27,8 +27,8 @@ module RSpotify
|
|
27
27
|
# Returns array of Artist objects matching the query, ordered by popularity
|
28
28
|
#
|
29
29
|
# @param query [String] The search query's keywords. See the q description in {https://developer.spotify.com/web-api/search-item here} for details.
|
30
|
-
# @param limit [Integer] Maximum number of artists to return. Minimum: 1. Maximum: 50.
|
31
|
-
# @param offset [Integer] The index of the first artist to return. Use with limit to get the next set of artists.
|
30
|
+
# @param limit [Integer] Maximum number of artists to return. Minimum: 1. Maximum: 50. Default: 20.
|
31
|
+
# @param offset [Integer] The index of the first artist to return. Use with limit to get the next set of artists. Default: 0.
|
32
32
|
# @return [Array<Artist>]
|
33
33
|
#
|
34
34
|
# @example
|
@@ -37,10 +37,10 @@ module RSpotify
|
|
37
37
|
# artists.first.class #=> RSpotify::Artist
|
38
38
|
# artists.first.name #=> "Arctic Monkeys"
|
39
39
|
#
|
40
|
-
# artists = RSpotify::Artist.search('Arctic', 10)
|
40
|
+
# artists = RSpotify::Artist.search('Arctic', limit: 10)
|
41
41
|
# artists.size #=> 10
|
42
|
-
def self.search(query, limit
|
43
|
-
super(query, 'artist', limit, offset)
|
42
|
+
def self.search(query, limit: 20, offset: 0)
|
43
|
+
super(query, 'artist', limit: limit, offset: offset)
|
44
44
|
end
|
45
45
|
|
46
46
|
def initialize(options = {})
|
data/lib/rspotify/base.rb
CHANGED
@@ -63,8 +63,8 @@ module RSpotify
|
|
63
63
|
#
|
64
64
|
# @param query [String] The search query's keywords. See the q description in {https://developer.spotify.com/web-api/search-item here} for details.
|
65
65
|
# @param type [String] Valid types are: album, artist and track. Separate multiple types with commas.
|
66
|
-
# @param limit [Integer] Maximum number of objects to return. Minimum: 1. Maximum: 50.
|
67
|
-
# @param offset [Integer] The index of the first object to return. Use with limit to get the next set of objects.
|
66
|
+
# @param limit [Integer] Maximum number of objects to return. Minimum: 1. Maximum: 50. Default: 20.
|
67
|
+
# @param offset [Integer] The index of the first object to return. Use with limit to get the next set of objects. Default: 0.
|
68
68
|
# @return [Array<Base>]
|
69
69
|
#
|
70
70
|
# @example
|
@@ -73,9 +73,9 @@ module RSpotify
|
|
73
73
|
# artists.first.class #=> RSpotify::Artist
|
74
74
|
# artists.first.name #=> "Arctic Monkeys"
|
75
75
|
#
|
76
|
-
# albums = RSpotify::Base.search('AM', 'album', 10)
|
76
|
+
# albums = RSpotify::Base.search('AM', 'album', limit: 10)
|
77
77
|
# albums.size #=> 10
|
78
|
-
def self.search(query, types, limit
|
78
|
+
def self.search(query, types, limit: 20, offset: 0)
|
79
79
|
if limit < 1 || limit > 50
|
80
80
|
warn 'Limit must be between 1 and 50'
|
81
81
|
return false
|
data/lib/rspotify/playlist.rb
CHANGED
@@ -77,7 +77,7 @@ module RSpotify
|
|
77
77
|
url = "users/#{@owner.id}/playlists/#{@id}/tracks?uris=#{track_uris}"
|
78
78
|
url << "&position=#{position}" if position
|
79
79
|
|
80
|
-
|
80
|
+
User.oauth_post(@owner.id, url, {})
|
81
81
|
@tracks = nil
|
82
82
|
end
|
83
83
|
|
@@ -97,7 +97,7 @@ module RSpotify
|
|
97
97
|
credentials = (credentials_defined ? User.class_variable_get('@@users_credentials') : nil)
|
98
98
|
|
99
99
|
if credentials && credentials[@owner.id]
|
100
|
-
initialize
|
100
|
+
initialize User.oauth_get(@owner.id, url)
|
101
101
|
else
|
102
102
|
initialize RSpotify.auth_get(url)
|
103
103
|
end
|
data/lib/rspotify/track.rb
CHANGED
@@ -34,8 +34,8 @@ module RSpotify
|
|
34
34
|
# Returns array of Track objects matching the query, ordered by popularity
|
35
35
|
#
|
36
36
|
# @param query [String] The search query's keywords. See the q description in {https://developer.spotify.com/web-api/search-item here} for details.
|
37
|
-
# @param limit [Integer] Maximum number of tracks to return. Minimum: 1. Maximum: 50.
|
38
|
-
# @param offset [Integer] The index of the first track to return. Use with limit to get the next set of tracks.
|
37
|
+
# @param limit [Integer] Maximum number of tracks to return. Minimum: 1. Maximum: 50. Default: 20.
|
38
|
+
# @param offset [Integer] The index of the first track to return. Use with limit to get the next set of tracks. Default: 0.
|
39
39
|
# @return [Array<Track>]
|
40
40
|
#
|
41
41
|
# @example
|
@@ -44,10 +44,10 @@ module RSpotify
|
|
44
44
|
# tracks.first.class #=> RSpotify::Track
|
45
45
|
# tracks.first.name #=> "Thriller"
|
46
46
|
#
|
47
|
-
# tracks = RSpotify::Track.search('Thriller', 10)
|
47
|
+
# tracks = RSpotify::Track.search('Thriller', limit: 10)
|
48
48
|
# tracks.size #=> 10
|
49
|
-
def self.search(query, limit
|
50
|
-
super(query, 'track', limit, offset)
|
49
|
+
def self.search(query, limit: 20, offset: 0)
|
50
|
+
super(query, 'track', limit: limit, offset: offset)
|
51
51
|
end
|
52
52
|
|
53
53
|
def initialize(options = {})
|
data/lib/rspotify/user.rb
CHANGED
@@ -27,14 +27,43 @@ module RSpotify
|
|
27
27
|
false
|
28
28
|
end
|
29
29
|
|
30
|
+
def self.refresh_token(user_id)
|
31
|
+
request_body = {
|
32
|
+
grant_type: 'refresh_token',
|
33
|
+
refresh_token: @@users_credentials[user_id]['refresh_token']
|
34
|
+
}
|
35
|
+
response = RestClient.post(TOKEN_URI, request_body, RSpotify.send(:auth_header))
|
36
|
+
json = JSON.parse(response)
|
37
|
+
@@users_credentials[user_id]['token'] = json['access_token']
|
38
|
+
end
|
39
|
+
private_class_method :refresh_token
|
40
|
+
|
30
41
|
def self.oauth_header(user_id)
|
31
|
-
{
|
42
|
+
{
|
32
43
|
'Authorization' => "Bearer #{@@users_credentials[user_id]['token']}",
|
33
44
|
'Content-Type' => 'application/json'
|
34
45
|
}
|
35
46
|
end
|
36
47
|
private_class_method :oauth_header
|
37
48
|
|
49
|
+
def self.oauth_send(user_id, verb, path, *params)
|
50
|
+
RSpotify.send(verb, path, *params)
|
51
|
+
rescue RestClient::Unauthorized => e
|
52
|
+
raise e if e.response !~ /access token expired/
|
53
|
+
refresh_token(user_id)
|
54
|
+
params[-1] = oauth_header(user_id)
|
55
|
+
RSpotify.send(verb, path, *params)
|
56
|
+
end
|
57
|
+
private_class_method :oauth_header
|
58
|
+
|
59
|
+
# User::oauth_{get,post}
|
60
|
+
RSpotify::VERBS.each do |verb|
|
61
|
+
define_singleton_method "oauth_#{verb}" do |user_id, path, *params|
|
62
|
+
params << oauth_header(user_id)
|
63
|
+
oauth_send(user_id, verb, path, *params)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
38
67
|
def initialize(options = {})
|
39
68
|
credentials = options['credentials']
|
40
69
|
options = options['info'] if options['info']
|
@@ -72,7 +101,7 @@ module RSpotify
|
|
72
101
|
def create_playlist!(name, public: true)
|
73
102
|
url = "users/#{@id}/playlists"
|
74
103
|
request_data = %Q({"name":"#{name}", "public":#{public}})
|
75
|
-
Playlist.new
|
104
|
+
Playlist.new User.oauth_post(@id, url, request_data)
|
76
105
|
end
|
77
106
|
|
78
107
|
# Returns all playlists from user
|
data/lib/rspotify/version.rb
CHANGED
@@ -66,5 +66,19 @@ describe RSpotify::Album do
|
|
66
66
|
expect(albums.first) .to be_an RSpotify::Album
|
67
67
|
expect(albums.map(&:name)) .to include('AM', 'Am I Wrong', 'A.M.', 'Melody AM')
|
68
68
|
end
|
69
|
+
|
70
|
+
it 'should accept additional options' do
|
71
|
+
albums = RSpotify::Album.search('AM', limit: 10)
|
72
|
+
expect(albums.size) .to eq 10
|
73
|
+
expect(albums.map(&:name)) .to include('AM', 'Am I Wrong')
|
74
|
+
|
75
|
+
albums = RSpotify::Album.search('AM', offset: 10)
|
76
|
+
expect(albums.size) .to eq 20
|
77
|
+
expect(albums.map(&:name)) .to include('Melody AM', 'I Am...')
|
78
|
+
|
79
|
+
albums = RSpotify::Album.search('AM', limit: 10, offset: 10)
|
80
|
+
expect(albums.size) .to eq 10
|
81
|
+
expect(albums.map(&:name)) .to include('Melody AM')
|
82
|
+
end
|
69
83
|
end
|
70
84
|
end
|
@@ -59,7 +59,21 @@ describe RSpotify::Artist do
|
|
59
59
|
expect(artists) .to be_an Array
|
60
60
|
expect(artists.size) .to eq 20
|
61
61
|
expect(artists.first) .to be_an RSpotify::Artist
|
62
|
-
expect(artists.map(&:name)) .to include('Arctic Monkeys', 'Arctic
|
62
|
+
expect(artists.map(&:name)) .to include('Arctic Monkeys', 'Arctic', 'Arctic Warbler', 'Arctic Express')
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'should accept additional options' do
|
66
|
+
artists = RSpotify::Artist.search('Arctic', limit: 10)
|
67
|
+
expect(artists.size) .to eq 10
|
68
|
+
expect(artists.map(&:name)) .to include('Arctic Monkeys', 'Arctic')
|
69
|
+
|
70
|
+
artists = RSpotify::Artist.search('Arctic', offset: 10)
|
71
|
+
expect(artists.size) .to eq 20
|
72
|
+
expect(artists.map(&:name)) .to include('Arctic Flame', 'James Arctic')
|
73
|
+
|
74
|
+
artists = RSpotify::Artist.search('Arctic', limit: 10, offset: 10)
|
75
|
+
expect(artists.size) .to eq 10
|
76
|
+
expect(artists.map(&:name)) .to include('Arctic Flame')
|
63
77
|
end
|
64
78
|
end
|
65
79
|
end
|
@@ -63,7 +63,21 @@ describe RSpotify::Track do
|
|
63
63
|
expect(tracks) .to be_an Array
|
64
64
|
expect(tracks.size) .to eq 20
|
65
65
|
expect(tracks.first) .to be_an RSpotify::Track
|
66
|
-
expect(tracks.map(&:name)) .to include('Do I Wanna Know?', 'Wanna Know', 'Never Wanna Know')
|
66
|
+
expect(tracks.map(&:name)) .to include('Do I Wanna Know?', 'I Wanna Know', 'Never Wanna Know')
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'should accept additional options' do
|
70
|
+
tracks = RSpotify::Track.search('Wanna Know', limit: 10)
|
71
|
+
expect(tracks.size) .to eq 10
|
72
|
+
expect(tracks.map(&:name)) .to include('Do I Wanna Know?', 'I Wanna Know')
|
73
|
+
|
74
|
+
tracks = RSpotify::Track.search('Wanna Know', offset: 10)
|
75
|
+
expect(tracks.size) .to eq 20
|
76
|
+
expect(tracks.map(&:name)) .to include('They Wanna Know', 'Say I Wanna Know')
|
77
|
+
|
78
|
+
tracks = RSpotify::Track.search('Wanna Know', limit: 10, offset: 10)
|
79
|
+
expect(tracks.size) .to eq 10
|
80
|
+
expect(tracks.map(&:name)) .to include('They Wanna Know')
|
67
81
|
end
|
68
82
|
end
|
69
83
|
end
|