spotify-ruby 0.1.1 → 0.2.1
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/.gitignore +10 -2
- data/.rubocop.yml +16 -5
- data/.travis.yml +10 -1
- data/CODE_OF_CONDUCT.md +1 -1
- data/COVERAGE.md +98 -92
- data/LICENSE +1 -1
- data/README.md +223 -63
- data/Rakefile +5 -12
- data/lib/spotify.rb +2 -2
- data/lib/spotify/accounts.rb +130 -0
- data/lib/spotify/accounts/session.rb +173 -0
- data/lib/spotify/sdk.rb +43 -60
- data/lib/spotify/sdk/album.rb +84 -0
- data/lib/spotify/sdk/artist.rb +162 -0
- data/lib/spotify/sdk/base.rb +34 -16
- data/lib/spotify/sdk/connect.rb +51 -2
- data/lib/spotify/sdk/connect/device.rb +282 -7
- data/lib/spotify/sdk/connect/playback_state.rb +141 -0
- data/lib/spotify/sdk/image.rb +44 -0
- data/lib/spotify/sdk/item.rb +134 -0
- data/lib/spotify/sdk/me.rb +83 -0
- data/lib/spotify/sdk/me/info.rb +108 -0
- data/lib/spotify/sdk/model.rb +40 -23
- data/lib/spotify/version.rb +8 -5
- data/spotify-ruby.gemspec +24 -9
- metadata +87 -38
- data/bin/console +0 -15
- data/bin/setup +0 -8
- data/lib/spotify/auth.rb +0 -111
- data/lib/spotify/sdk/initialization.rb +0 -76
- data/lib/spotify/sdk/initialization/base.rb +0 -74
- data/lib/spotify/sdk/initialization/oauth_access_token.rb +0 -34
- data/lib/spotify/sdk/initialization/plain_string.rb +0 -26
- data/lib/spotify/sdk/initialization/query_hash.rb +0 -45
- data/lib/spotify/sdk/initialization/query_string.rb +0 -51
- data/lib/spotify/sdk/initialization/url_string.rb +0 -49
@@ -0,0 +1,84 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Spotify
|
4
|
+
class SDK
|
5
|
+
class Album < Model
|
6
|
+
##
|
7
|
+
# Is this an album?
|
8
|
+
# Note: This is mostly to support other types of albums in the future.
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
# album = @sdk.connect.playback.item.album
|
12
|
+
# album.album?
|
13
|
+
#
|
14
|
+
# @return [TrueClass,FalseClass] is_album Returns true if type is an album.
|
15
|
+
#
|
16
|
+
def album?
|
17
|
+
type == "album"
|
18
|
+
end
|
19
|
+
|
20
|
+
##
|
21
|
+
# Display the album's images.
|
22
|
+
#
|
23
|
+
# @example
|
24
|
+
# album = @sdk.connect.playback.item.album
|
25
|
+
# album.images[0] # => [#<Spotify::SDK::Image>, #<Spotify::SDK::Image>, ...]
|
26
|
+
#
|
27
|
+
# @return [Array] album_images Contains a list of images, wrapped in Spotify::SDK::Image
|
28
|
+
#
|
29
|
+
def images
|
30
|
+
super.map do |image|
|
31
|
+
Spotify::SDK::Image.new(image, parent)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
##
|
36
|
+
# Get the artists/creators for this album.
|
37
|
+
#
|
38
|
+
# @example
|
39
|
+
# @sdk.connect.playback.item.album.artists
|
40
|
+
#
|
41
|
+
# @return [Array] artists A list of artists, wrapped in Spotify::SDK::Artist
|
42
|
+
#
|
43
|
+
def artists
|
44
|
+
super.map do |artist|
|
45
|
+
Spotify::SDK::Artist.new(artist, parent)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
##
|
50
|
+
# Get the primary artist/creator for this album.
|
51
|
+
#
|
52
|
+
# @example
|
53
|
+
# @sdk.connect.playback.item.album.artist
|
54
|
+
#
|
55
|
+
# @return [Spotify::SDK::Artist] artist The primary artist, wrapped in Spotify::SDK::Artist
|
56
|
+
#
|
57
|
+
def artist
|
58
|
+
artists.first
|
59
|
+
end
|
60
|
+
|
61
|
+
##
|
62
|
+
# Get the Spotify URI for this album.
|
63
|
+
# Alias to self.uri
|
64
|
+
#
|
65
|
+
# @example
|
66
|
+
# @sdk.connect.playback.item.album.spotify_uri # => "spotify:track:..."
|
67
|
+
#
|
68
|
+
# @return [String] spotify_uri The direct URI to this Spotify resource.
|
69
|
+
#
|
70
|
+
alias_attribute :spotify_uri, :uri
|
71
|
+
|
72
|
+
##
|
73
|
+
# Get the Spotify HTTP URL for this album.
|
74
|
+
# Alias to self.external_urls[:spotify]
|
75
|
+
#
|
76
|
+
# @example
|
77
|
+
# @sdk.connect.playback.item.album.spotify_url # => "https://open.spotify.com/..."
|
78
|
+
#
|
79
|
+
# @return [String] spotify_url The direct HTTP URL to this Spotify resource.
|
80
|
+
#
|
81
|
+
alias_attribute :spotify_url, "external_urls.spotify"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,162 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Spotify
|
4
|
+
class SDK
|
5
|
+
class Artist < Model
|
6
|
+
##
|
7
|
+
# Do we have the full information for this artist?
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
# artist = @sdk.connect.playback.artist
|
11
|
+
# artist.full_information? # => false
|
12
|
+
#
|
13
|
+
# @return [FalseClass,TrueClass] is_full_info Does this contain everything?
|
14
|
+
#
|
15
|
+
def full_information?
|
16
|
+
to_h.key?(:images)
|
17
|
+
end
|
18
|
+
|
19
|
+
##
|
20
|
+
# Get full information for this artist by calling /v1/artists/:id
|
21
|
+
#
|
22
|
+
# @example
|
23
|
+
# artist = @sdk.connect.playback.artist
|
24
|
+
# artist.retrieve_full_information! unless artist.full_information?
|
25
|
+
#
|
26
|
+
# @return [TrueClass] success Always returns true.
|
27
|
+
#
|
28
|
+
def retrieve_full_information!
|
29
|
+
unless full_information?
|
30
|
+
parent.send_http_request(:get, "/v1/artists/%s" % id).map do |key, value|
|
31
|
+
send("%s=" % key, value)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
true
|
36
|
+
end
|
37
|
+
|
38
|
+
##
|
39
|
+
# Helper method for setting the following status.
|
40
|
+
# Requires the `user-follow-modify` scope.
|
41
|
+
# If true, PUT /v1/me/following otherwise DELETE /v1/me/following
|
42
|
+
#
|
43
|
+
# @example
|
44
|
+
# @sdk.playback.item.artist.following = true
|
45
|
+
# @sdk.playback.item.artist.following = false
|
46
|
+
#
|
47
|
+
def following=(should_follow)
|
48
|
+
raise "#following= must be true or false" unless [true, false].include?(should_follow)
|
49
|
+
should_follow ? follow! : unfollow!
|
50
|
+
end
|
51
|
+
|
52
|
+
##
|
53
|
+
# Follow the artist.
|
54
|
+
# Requires the `user-follow-modify` scope.
|
55
|
+
# PUT /v1/me/following
|
56
|
+
#
|
57
|
+
# @example
|
58
|
+
# @sdk.playback.item.artist.follow!
|
59
|
+
#
|
60
|
+
# @return [Spotify::SDK::Artist] self Return the artist object, for chaining methods.
|
61
|
+
#
|
62
|
+
def follow!
|
63
|
+
parent.send_http_request(:put, "/v1/me/following?type=artist&ids=%s" % id, http_options: {expect_nil: true})
|
64
|
+
self
|
65
|
+
end
|
66
|
+
|
67
|
+
##
|
68
|
+
# Unfollow the artist.
|
69
|
+
# Requires the `user-follow-modify` scope.
|
70
|
+
# DELETE /v1/me/following
|
71
|
+
#
|
72
|
+
# @example
|
73
|
+
# @sdk.playback.item.artist.unfollow!
|
74
|
+
#
|
75
|
+
# @return [Spotify::SDK::Artist] self Return the artist object, for chaining methods.
|
76
|
+
#
|
77
|
+
def unfollow!
|
78
|
+
parent.send_http_request(:delete, "/v1/me/following?type=artist&ids=%s" % id, http_options: {expect_nil: true})
|
79
|
+
self
|
80
|
+
end
|
81
|
+
|
82
|
+
##
|
83
|
+
# Display the artist's images. If not obtained, request them from the API.
|
84
|
+
#
|
85
|
+
# @example
|
86
|
+
# artist = @sdk.connect.playback.artist
|
87
|
+
# artist.images[0] # => [#<Spotify::SDK::Image>, #<Spotify::SDK::Image>, ...]
|
88
|
+
#
|
89
|
+
# @return [Array] images Contains a list of images, wrapped in Spotify::SDK::Image
|
90
|
+
#
|
91
|
+
def images
|
92
|
+
retrieve_full_information! unless full_information?
|
93
|
+
super.map {|image| Spotify::SDK::Image.new(image, parent) }
|
94
|
+
end
|
95
|
+
|
96
|
+
##
|
97
|
+
# Display the artist's popularity. If not obtained, request them from the API.
|
98
|
+
#
|
99
|
+
# @example
|
100
|
+
# artist = @sdk.connect.playback.artist
|
101
|
+
# artist.popularity # => 90
|
102
|
+
#
|
103
|
+
# @return [Integer] popularity The number of popularity, between 0-100.
|
104
|
+
#
|
105
|
+
def popularity
|
106
|
+
retrieve_full_information! unless full_information?
|
107
|
+
super
|
108
|
+
end
|
109
|
+
|
110
|
+
##
|
111
|
+
# Display the artist's genres. If not obtained, request them from the API.
|
112
|
+
#
|
113
|
+
# @example
|
114
|
+
# artist = @sdk.connect.playback.artist
|
115
|
+
# artist.genres # => ["hip hop", "pop rap", "rap", ...]
|
116
|
+
#
|
117
|
+
# @return [Array] genres An array of genres, denoted in strings.
|
118
|
+
#
|
119
|
+
def genres
|
120
|
+
retrieve_full_information! unless full_information?
|
121
|
+
super
|
122
|
+
end
|
123
|
+
|
124
|
+
##
|
125
|
+
# Return the Spotify URL for this artist.
|
126
|
+
#
|
127
|
+
# @example
|
128
|
+
# artist = @sdk.connect.playback.artist
|
129
|
+
# artist.spotify_url # => "https://open.spotify.com/artist/..."
|
130
|
+
#
|
131
|
+
# @return [String] spotify_url The URL to open this artist on open.spotify.com
|
132
|
+
#
|
133
|
+
def spotify_url
|
134
|
+
external_urls[:spotify]
|
135
|
+
end
|
136
|
+
|
137
|
+
##
|
138
|
+
# Return the Spotify URI for this artist.
|
139
|
+
#
|
140
|
+
# @example
|
141
|
+
# artist = @sdk.connect.playback.artist
|
142
|
+
# artist.spotify_uri # => "spotify:uri:..."
|
143
|
+
#
|
144
|
+
# @return [String] spotify_uri The URI to open this artist in official apps.
|
145
|
+
#
|
146
|
+
alias_attribute :spotify_uri, :uri
|
147
|
+
|
148
|
+
##
|
149
|
+
# Return the followers on Spotify for this artist.
|
150
|
+
#
|
151
|
+
# @example
|
152
|
+
# artist = @sdk.connect.playback.artist
|
153
|
+
# artist.followers # => 13913
|
154
|
+
#
|
155
|
+
# @return [Integer] followers The number of users following this artist.
|
156
|
+
#
|
157
|
+
def followers
|
158
|
+
super[:total]
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
data/lib/spotify/sdk/base.rb
CHANGED
@@ -13,19 +13,19 @@ module Spotify
|
|
13
13
|
# Initiate a Spotify SDK Base component.
|
14
14
|
#
|
15
15
|
# @example
|
16
|
-
# @sdk = Spotify::SDK.new(
|
16
|
+
# @sdk = Spotify::SDK.new(@session)
|
17
17
|
# @auth = Spotify::SDK::Base.new(@sdk)
|
18
18
|
#
|
19
|
-
# @sdk = Spotify::SDK.new(
|
19
|
+
# @sdk = Spotify::SDK.new(@session)
|
20
20
|
# @sdk.to_hash # => { access_token: ..., expires_at: ... }
|
21
21
|
#
|
22
|
-
# @param [Spotify::SDK]
|
22
|
+
# @param [Spotify::SDK] parent An instance of Spotify::SDK as a reference point.
|
23
23
|
#
|
24
|
-
def initialize(
|
25
|
-
@
|
24
|
+
def initialize(parent)
|
25
|
+
@parent = parent
|
26
26
|
@options = {
|
27
27
|
headers: {
|
28
|
-
Authorization: "Bearer %s" %
|
28
|
+
Authorization: "Bearer %s" % @parent.session.access_token
|
29
29
|
}
|
30
30
|
}
|
31
31
|
end
|
@@ -38,21 +38,39 @@ module Spotify
|
|
38
38
|
# send_http_request(:get, "/v1/me/player/devices", @options)
|
39
39
|
#
|
40
40
|
# # Return the raw HTTParty::Response object.
|
41
|
-
# send_http_request(:get, "/v1/me/player/devices", @options.merge(raw: true))
|
41
|
+
# send_http_request(:get, "/v1/me/player/devices", @options.merge({http_options: { raw: true }}))
|
42
42
|
#
|
43
|
-
#
|
44
|
-
# @
|
43
|
+
# # Return true for HTTP requests that return a 200 OK with an empty response.
|
44
|
+
# send_http_request(:put, "/v1/me/player/pause", @options.merge({http_options: { expect_nil: true }}))
|
45
45
|
#
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
46
|
+
# @param [Symbol] method The HTTP method you want to perform. Examples are :get, :post, :put, :delete
|
47
|
+
# @param [String] endpoint The HTTP endpoint you'd like to call. Example: /v1/me
|
48
|
+
# @param [Hash] override_opts Any headers, HTTParty config or application-specific config (see `http_options`)
|
49
|
+
# @return [Hash,HTTParty::Response,TrueClass] response The response from the HTTP request.
|
50
|
+
#
|
51
|
+
# TODO: Address and fix cyclomatic & code complexity issues by Rubocop.
|
52
|
+
# rubocop:disable CyclomaticComplexity, PerceivedComplexity, AbcSize
|
53
|
+
def send_http_request(method, endpoint, override_opts={})
|
54
|
+
opts = {
|
55
|
+
raw: false,
|
56
|
+
expect_nil: false
|
57
|
+
}.merge(override_opts[:http_options].presence || {})
|
58
|
+
|
59
|
+
httparty = self.class.send(method, endpoint, @options.merge(override_opts))
|
60
|
+
response = httparty.parsed_response
|
61
|
+
response = response.try(:deep_symbolize_keys) || response
|
62
|
+
raise response[:error][:message] if response.is_a?(Hash) && response[:error].present?
|
63
|
+
return httparty if opts[:raw] == true
|
64
|
+
response = opts[:expect_nil] ? true : raise("No response returned") if response.nil?
|
52
65
|
response
|
53
66
|
end
|
67
|
+
# rubocop:enable CyclomaticComplexity, PerceivedComplexity, AbcSize
|
68
|
+
|
69
|
+
def inspect # :nodoc:
|
70
|
+
"#<%s:0x00%x>" % [self.class.name, (object_id << 1)]
|
71
|
+
end
|
54
72
|
|
55
|
-
attr_reader :
|
73
|
+
attr_reader :parent
|
56
74
|
end
|
57
75
|
end
|
58
76
|
end
|
data/lib/spotify/sdk/connect.rb
CHANGED
@@ -3,6 +3,25 @@
|
|
3
3
|
module Spotify
|
4
4
|
class SDK
|
5
5
|
class Connect < Base
|
6
|
+
##
|
7
|
+
# Get the current playback.
|
8
|
+
# GET /v1/me/player
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
# playback = @sdk.connect.playback
|
12
|
+
#
|
13
|
+
# @see https://developer.spotify.com/console/get-user-player/
|
14
|
+
# @see https://developer.spotify.com/documentation/web-api/reference/player/get-information-about-the-users-current-playback/
|
15
|
+
#
|
16
|
+
# @param [String] market The market you'd like to request.
|
17
|
+
# @param [Hash] override_opts Custom options for HTTParty.
|
18
|
+
# @return [Spotify::SDK::Connect::PlaybackState] playback_state Return the playback state object.
|
19
|
+
#
|
20
|
+
def playback(market="from_token", override_opts={})
|
21
|
+
playback_state = send_http_request(:get, "/v1/me/player?market=%s" % market, override_opts)
|
22
|
+
Spotify::SDK::Connect::PlaybackState.new(playback_state, self)
|
23
|
+
end
|
24
|
+
|
6
25
|
##
|
7
26
|
# Collect all the user's available devices.
|
8
27
|
# GET /v1/me/player/devices
|
@@ -10,10 +29,10 @@ module Spotify
|
|
10
29
|
# @example
|
11
30
|
# @sdk.connect.devices # => [#<Spotify::SDK::Connect::Device:...>, ...]
|
12
31
|
#
|
13
|
-
# @see https://developer.spotify.com/
|
32
|
+
# @see https://developer.spotify.com/console/get-users-available-devices/
|
14
33
|
#
|
15
34
|
# @param [Hash] override_opts Custom options for HTTParty.
|
16
|
-
# @return
|
35
|
+
# @return [Array] devices A list of all devices.
|
17
36
|
#
|
18
37
|
def devices(override_opts={})
|
19
38
|
response = send_http_request(:get, "/v1/me/player/devices", override_opts)
|
@@ -21,6 +40,36 @@ module Spotify
|
|
21
40
|
Spotify::SDK::Connect::Device.new(device, self)
|
22
41
|
end
|
23
42
|
end
|
43
|
+
|
44
|
+
##
|
45
|
+
# Collect all the active devices.
|
46
|
+
#
|
47
|
+
# @example
|
48
|
+
# @sdk.connect.active_devices # => [#<Spotify::SDK::Connect::Device:...>, ...]
|
49
|
+
#
|
50
|
+
# @see https://developer.spotify.com/console/get-users-available-devices/
|
51
|
+
#
|
52
|
+
# @param [Hash] override_opts Custom options for HTTParty.
|
53
|
+
# @return [Array] devices A list of all devices that are marked as `is_active`.
|
54
|
+
#
|
55
|
+
def active_devices(override_opts={})
|
56
|
+
devices(override_opts).select(&:active?)
|
57
|
+
end
|
58
|
+
|
59
|
+
##
|
60
|
+
# Collect the first active device.
|
61
|
+
#
|
62
|
+
# @example
|
63
|
+
# @sdk.connect.active_device # => #<Spotify::SDK::Connect::Device:...>
|
64
|
+
#
|
65
|
+
# @see https://developer.spotify.com/console/get-users-available-devices/
|
66
|
+
#
|
67
|
+
# @param [Hash] override_opts Custom options for HTTParty.
|
68
|
+
# @return [Array,NilClass] device The first device with `is_active`. If no device found, returns `nil`.
|
69
|
+
#
|
70
|
+
def active_device(override_opts={})
|
71
|
+
devices(override_opts).find(&:active?)
|
72
|
+
end
|
24
73
|
end
|
25
74
|
end
|
26
75
|
end
|
@@ -4,14 +4,286 @@ module Spotify
|
|
4
4
|
class SDK
|
5
5
|
class Connect
|
6
6
|
class Device < Model
|
7
|
+
##
|
8
|
+
# Get the device's volume.
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
# device = @sdk.connect.devices[0]
|
12
|
+
# device.volume
|
13
|
+
#
|
14
|
+
# @return [Integer] volume Get the volume. Between 0 and 100.
|
15
|
+
#
|
16
|
+
alias_attribute :volume, :volume_percent
|
17
|
+
|
18
|
+
##
|
19
|
+
# Is the device active?
|
20
|
+
#
|
21
|
+
# @example
|
22
|
+
# device = @sdk.connect.devices[0]
|
23
|
+
# device.active?
|
24
|
+
#
|
25
|
+
# @return [Boolean] is_active Bool of whether device is active.
|
26
|
+
#
|
27
|
+
alias_attribute :active?, :is_active
|
28
|
+
|
29
|
+
##
|
30
|
+
# Is the device's session private?
|
31
|
+
#
|
32
|
+
# @example
|
33
|
+
# device = @sdk.connect.devices[0]
|
34
|
+
# device.private_session?
|
35
|
+
#
|
36
|
+
# @return [Boolean] is_private_session Bool of whether device has a private session.
|
37
|
+
#
|
38
|
+
alias_attribute :private_session?, :is_private_session
|
39
|
+
|
40
|
+
##
|
41
|
+
# Is the device restricted?
|
42
|
+
#
|
43
|
+
# @example
|
44
|
+
# device = @sdk.connect.devices[0]
|
45
|
+
# device.restricted?
|
46
|
+
#
|
47
|
+
# @return [Boolean] is_restricted Bool of whether device is restricted.
|
48
|
+
#
|
49
|
+
alias_attribute :restricted?, :is_restricted
|
50
|
+
|
51
|
+
##
|
52
|
+
# Get the currently playing track.
|
53
|
+
# Alias to Spotify::SDK::Connect#playback
|
54
|
+
#
|
55
|
+
# @example
|
56
|
+
# device = @sdk.connect.devices[0]
|
57
|
+
# device.playback
|
58
|
+
#
|
59
|
+
# # Same as calling the following:
|
60
|
+
# @sdk.connect.playback
|
61
|
+
#
|
62
|
+
# @see lib/spotify/sdk/connect.rb
|
63
|
+
#
|
64
|
+
# @return [Spotify::SDK::Connect::PlaybackState] self Return the playback state object.
|
65
|
+
#
|
66
|
+
def playback
|
67
|
+
parent.playback
|
68
|
+
end
|
69
|
+
|
70
|
+
##
|
71
|
+
# Play the currently playing track on device.
|
72
|
+
# PUT /v1/me/player/play
|
73
|
+
#
|
74
|
+
# @example
|
75
|
+
# device = @sdk.connect.devices[0]
|
76
|
+
#
|
77
|
+
# # Play from a playlist, album from a specific index in that list.
|
78
|
+
# # For example, play the 9th item on X playlist.
|
79
|
+
# device.play!(index: 5, context: "spotify:album:5ht7ItJgpBH7W6vJ5BqpPr")
|
80
|
+
#
|
81
|
+
# # Play any Spotify URI. Albums, artists, tracks, playlists, and more.
|
82
|
+
# device.play!(uri: "spotify:track:5MqkZd7a7u7N7hKMqquL2U")
|
83
|
+
#
|
84
|
+
# # Similar to just uri, but you can define the context.
|
85
|
+
# # Useful for playing a track that is part of a playlist, and you want the next
|
86
|
+
# # songs to play from that particular context.
|
87
|
+
# device.play!(uri: "spotify:track:5MqkZd7a7u7N7hKMqquL2U", context: "spotify:album:5ht7ItJgpBH7W6vJ5BqpPr")
|
88
|
+
#
|
89
|
+
# @see https://developer.spotify.com/console/put-play/
|
90
|
+
#
|
91
|
+
# @param [Hash] config The play config you'd like to set. See code examples.
|
92
|
+
# @return [Spotify::SDK::Connect::Device] self Return itself, so chained methods can be supported.
|
93
|
+
#
|
94
|
+
def play!(config)
|
95
|
+
payload = case config.keys
|
96
|
+
when %i[index context]
|
97
|
+
{context_uri: config[:context], offset: {position: config[:index]}}
|
98
|
+
when %i[uri]
|
99
|
+
{uris: [config[:uri]]}
|
100
|
+
when %i[uri context]
|
101
|
+
{context_uri: config[:context], offset: {uri: config[:uri]}}
|
102
|
+
else
|
103
|
+
raise "Unrecognized play instructions. See documentation for details."
|
104
|
+
end
|
105
|
+
|
106
|
+
parent.send_http_request(:put, "/v1/me/player/play?device_id=%s" % id, http_options: {expect_nil: true},
|
107
|
+
body: payload.to_json)
|
108
|
+
self
|
109
|
+
end
|
110
|
+
|
111
|
+
##
|
112
|
+
# Resume the currently playing track on device.
|
113
|
+
# PUT /v1/me/player/play
|
114
|
+
#
|
115
|
+
# @example
|
116
|
+
# device = @sdk.connect.devices[0]
|
117
|
+
# device.resume!
|
118
|
+
#
|
119
|
+
# @see https://developer.spotify.com/console/put-play/
|
120
|
+
#
|
121
|
+
# @return [Spotify::SDK::Connect::Device] self Return itself, so chained methods can be supported.
|
122
|
+
#
|
123
|
+
def resume!
|
124
|
+
parent.send_http_request(:put, "/v1/me/player/play?device_id=%s" % id, http_options: {expect_nil: true})
|
125
|
+
self
|
126
|
+
end
|
127
|
+
|
128
|
+
##
|
129
|
+
# Pause the currently playing track on device.
|
130
|
+
# PUT /v1/me/player/pause
|
131
|
+
#
|
132
|
+
# @example
|
133
|
+
# device = @sdk.connect.devices[0]
|
134
|
+
# device.pause!
|
135
|
+
#
|
136
|
+
# @see https://developer.spotify.com/console/put-pause/
|
137
|
+
#
|
138
|
+
# @return [Spotify::SDK::Connect::Device] self Return itself, so chained methods can be supported.
|
139
|
+
#
|
140
|
+
def pause!
|
141
|
+
parent.send_http_request(:put, "/v1/me/player/pause?device_id=%s" % id, http_options: {expect_nil: true})
|
142
|
+
self
|
143
|
+
end
|
144
|
+
|
145
|
+
##
|
146
|
+
# Skip to previous track on device.
|
147
|
+
# PUT /v1/me/player/previous
|
148
|
+
#
|
149
|
+
# @example
|
150
|
+
# device = @sdk.connect.devices[0]
|
151
|
+
# device.previous!
|
152
|
+
#
|
153
|
+
# @see https://developer.spotify.com/console/put-previous/
|
154
|
+
#
|
155
|
+
# @return [Spotify::SDK::Connect::Device] self Return itself, so chained methods can be supported.
|
156
|
+
#
|
157
|
+
def previous!
|
158
|
+
parent.send_http_request(:put, "/v1/me/player/previous?device_id=%s" % id, http_options: {expect_nil: true})
|
159
|
+
self
|
160
|
+
end
|
161
|
+
|
162
|
+
##
|
163
|
+
# Skip to next track on device.
|
164
|
+
# PUT /v1/me/player/next
|
165
|
+
#
|
166
|
+
# @example
|
167
|
+
# device = @sdk.connect.devices[0]
|
168
|
+
# device.next!
|
169
|
+
#
|
170
|
+
# @see https://developer.spotify.com/console/put-next/
|
171
|
+
#
|
172
|
+
# @return [Spotify::SDK::Connect::Device] self Return itself, so chained methods can be supported.
|
173
|
+
#
|
174
|
+
def next!
|
175
|
+
parent.send_http_request(:put, "/v1/me/player/next?device_id=%s" % id, http_options: {expect_nil: true})
|
176
|
+
self
|
177
|
+
end
|
178
|
+
|
179
|
+
##
|
180
|
+
# Set volume for current device.
|
181
|
+
# PUT /v1/me/player/volume
|
182
|
+
#
|
183
|
+
# @example
|
184
|
+
# device = @sdk.connect.devices[0]
|
185
|
+
# device.change_volume!(30)
|
186
|
+
#
|
187
|
+
# # or
|
188
|
+
#
|
189
|
+
# device = @sdk.connect.devices[0]
|
190
|
+
# device.volume = 30
|
191
|
+
#
|
192
|
+
# @see https://developer.spotify.com/console/put-volume/
|
193
|
+
#
|
194
|
+
# @param [Integer] volume_percent The 0-100 value to change the volume to. 100 is maximum.
|
195
|
+
# @return [Spotify::SDK::Connect::Device] self Return itself, so chained methods can be supported.
|
196
|
+
#
|
197
|
+
def change_volume!(volume_percent)
|
198
|
+
raise "Must be an integer" unless volume_percent.is_a?(Integer)
|
199
|
+
endpoint = "/v1/me/player/volume?volume_percent=%i&device_id=%s" % [volume_percent, id]
|
200
|
+
opts = {http_options: {expect_nil: true}}
|
201
|
+
parent.send_http_request(:put, endpoint, opts)
|
202
|
+
self
|
203
|
+
end
|
204
|
+
|
205
|
+
alias_method :volume=, :change_volume!
|
206
|
+
|
207
|
+
##
|
208
|
+
# Seek position (in milliseconds) for the currently playing track on the device.
|
209
|
+
# PUT /v1/me/player/seek
|
210
|
+
#
|
211
|
+
# @example
|
212
|
+
# device = @sdk.connect.devices[0]
|
213
|
+
# device.seek_ms!(4000)
|
214
|
+
#
|
215
|
+
# @see https://developer.spotify.com/console/put-seek/
|
216
|
+
#
|
217
|
+
# @param [Integer] position_ms In milliseconds, where to seek in the current track on device.
|
218
|
+
# @return [Spotify::SDK::Connect::Device] self Return itself, so chained methods can be supported.
|
219
|
+
#
|
220
|
+
def seek_ms!(position_ms)
|
221
|
+
raise "Must be an integer" unless position_ms.is_a?(Integer)
|
222
|
+
endpoint = "/v1/me/player/seek?position_ms=%i&device_id=%s" % [position_ms, id]
|
223
|
+
opts = {http_options: {expect_nil: true}}
|
224
|
+
parent.send_http_request(:put, endpoint, opts)
|
225
|
+
self
|
226
|
+
end
|
227
|
+
|
228
|
+
alias_method :position_ms=, :seek_ms!
|
229
|
+
|
230
|
+
##
|
231
|
+
# Set repeat mode for current device.
|
232
|
+
# PUT /v1/me/player/repeat
|
233
|
+
#
|
234
|
+
# @example
|
235
|
+
# device = @sdk.connect.devices[0]
|
236
|
+
# device.repeat!(:track)
|
237
|
+
# device.repeat!(:context)
|
238
|
+
# device.repeat!(:off)
|
239
|
+
#
|
240
|
+
# @see https://developer.spotify.com/console/put-repeat/
|
241
|
+
#
|
242
|
+
# @param [Boolean] state What to set the repeat state to - :track, :context, or :off
|
243
|
+
# @return [Spotify::SDK::Connect::Device] self Return itself, so chained methods can be supported.
|
244
|
+
#
|
245
|
+
def repeat!(state)
|
246
|
+
raise "Must be :track, :context, or :off" unless %i[track context off].include?(state)
|
247
|
+
endpoint = "/v1/me/player/repeat?state=%s&device_id=%s" % [state, id]
|
248
|
+
opts = {http_options: {expect_nil: true}}
|
249
|
+
parent.send_http_request(:put, endpoint, opts)
|
250
|
+
self
|
251
|
+
end
|
252
|
+
|
253
|
+
alias_method :repeat=, :repeat!
|
254
|
+
|
255
|
+
##
|
256
|
+
# Set shuffle for current device.
|
257
|
+
# PUT /v1/me/player/shuffle
|
258
|
+
#
|
259
|
+
# @example
|
260
|
+
# device = @sdk.connect.devices[0]
|
261
|
+
# device.shuffle!(true)
|
262
|
+
#
|
263
|
+
# @see https://developer.spotify.com/console/put-shuffle/
|
264
|
+
#
|
265
|
+
# @param [Boolean] state The true/false of if you'd like to set shuffle on.
|
266
|
+
# @return [Spotify::SDK::Connect::Device] self Return itself, so chained methods can be supported.
|
267
|
+
#
|
268
|
+
def shuffle!(state)
|
269
|
+
raise "Must be true or false" unless [true, false].include?(state)
|
270
|
+
endpoint = "/v1/me/player/shuffle?state=%s&device_id=%s" % [state, id]
|
271
|
+
opts = {http_options: {expect_nil: true}}
|
272
|
+
parent.send_http_request(:put, endpoint, opts)
|
273
|
+
self
|
274
|
+
end
|
275
|
+
|
276
|
+
alias_method :shuffle=, :shuffle!
|
277
|
+
|
7
278
|
##
|
8
279
|
# Transfer a user's playback to another device, and continue playing.
|
9
280
|
# PUT /v1/me/player
|
10
281
|
#
|
11
282
|
# @example
|
12
|
-
# device = @sdk.connect.
|
283
|
+
# device = @sdk.connect.devices[0]
|
284
|
+
# device.transfer_playback!
|
13
285
|
#
|
14
|
-
# @see https://developer.spotify.com/
|
286
|
+
# @see https://developer.spotify.com/console/transfer-a-users-playback/
|
15
287
|
#
|
16
288
|
# @return [Spotify::SDK::Connect::Device] self Return itself, so chained methods can be supported.
|
17
289
|
#
|
@@ -25,9 +297,10 @@ module Spotify
|
|
25
297
|
# PUT /v1/me/player
|
26
298
|
#
|
27
299
|
# @example
|
28
|
-
# device = @sdk.connect.
|
300
|
+
# device = @sdk.connect.devices[0]
|
301
|
+
# device.transfer_state!
|
29
302
|
#
|
30
|
-
# @see https://developer.spotify.com/
|
303
|
+
# @see https://developer.spotify.com/console/transfer-a-users-playback/
|
31
304
|
#
|
32
305
|
# @return [Spotify::SDK::Connect::Device] self Return itself, so chained methods can be supported.
|
33
306
|
#
|
@@ -38,10 +311,12 @@ module Spotify
|
|
38
311
|
|
39
312
|
private
|
40
313
|
|
41
|
-
def transfer_playback_method(playing:)
|
314
|
+
def transfer_playback_method(playing:) # :nodoc:
|
42
315
|
override_opts = {
|
43
|
-
|
44
|
-
|
316
|
+
http_options: {
|
317
|
+
expect_nil: true
|
318
|
+
},
|
319
|
+
body: {
|
45
320
|
device_ids: [id],
|
46
321
|
play: playing
|
47
322
|
}.to_json
|