spotify-ruby-api 0.7.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 +7 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.travis.yml +3 -0
- data/Gemfile +7 -0
- data/LICENSE +21 -0
- data/README.md +119 -0
- data/Rakefile +7 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/lib/spotify/api/album.rb +164 -0
- data/lib/spotify/api/artist.rb +248 -0
- data/lib/spotify/api/base.rb +150 -0
- data/lib/spotify/api/track.rb +127 -0
- data/lib/spotify/api/user.rb +58 -0
- data/lib/spotify/api/version.rb +5 -0
- data/lib/spotify/api.rb +12 -0
- data/lib/spotify/models/album.rb +42 -0
- data/lib/spotify/models/artist.rb +34 -0
- data/lib/spotify/models/category.rb +23 -0
- data/lib/spotify/models/copyright.rb +27 -0
- data/lib/spotify/models/cursor.rb +19 -0
- data/lib/spotify/models/cursorbased_paging.rb +24 -0
- data/lib/spotify/models/error.rb +122 -0
- data/lib/spotify/models/external_id.rb +41 -0
- data/lib/spotify/models/external_url.rb +39 -0
- data/lib/spotify/models/follower.rb +27 -0
- data/lib/spotify/models/full/album.rb +46 -0
- data/lib/spotify/models/full/artist.rb +37 -0
- data/lib/spotify/models/full/track.rb +34 -0
- data/lib/spotify/models/full/user.rb +31 -0
- data/lib/spotify/models/full.rb +11 -0
- data/lib/spotify/models/image.rb +28 -0
- data/lib/spotify/models/paging.rb +38 -0
- data/lib/spotify/models/playlist_track.rb +24 -0
- data/lib/spotify/models/saved_album.rb +22 -0
- data/lib/spotify/models/saved_track.rb +22 -0
- data/lib/spotify/models/simplified/album.rb +23 -0
- data/lib/spotify/models/simplified/artist.rb +23 -0
- data/lib/spotify/models/simplified/track.rb +23 -0
- data/lib/spotify/models/simplified/user.rb +23 -0
- data/lib/spotify/models/simplified.rb +11 -0
- data/lib/spotify/models/track.rb +50 -0
- data/lib/spotify/models/track_link.rb +33 -0
- data/lib/spotify/models/user.rb +41 -0
- data/lib/spotify/models.rb +27 -0
- data/lib/spotify.rb +6 -0
- data/spotify-api.gemspec +34 -0
- metadata +160 -0
@@ -0,0 +1,150 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Spotify
|
4
|
+
module API
|
5
|
+
|
6
|
+
class Base
|
7
|
+
|
8
|
+
attr_reader :response, :retries, :timeout, :url, :params, :request
|
9
|
+
|
10
|
+
#
|
11
|
+
# The API base URL.
|
12
|
+
#
|
13
|
+
BASE_URL = "https://api.spotify.com/v1/"
|
14
|
+
|
15
|
+
#
|
16
|
+
# The API search endpoint.
|
17
|
+
#
|
18
|
+
SEARCH_URL = "#{BASE_URL}search"
|
19
|
+
|
20
|
+
#
|
21
|
+
# The max retries limit.
|
22
|
+
#
|
23
|
+
MAX_RETRIES = 5
|
24
|
+
|
25
|
+
#
|
26
|
+
# Restrict value for market variable on search methods.
|
27
|
+
#
|
28
|
+
FROM_TOKEN = :from_token
|
29
|
+
|
30
|
+
#
|
31
|
+
# Initializes the optional arguments.
|
32
|
+
#
|
33
|
+
# @param [Hash] the optional arguments.
|
34
|
+
# @option [Fixnum] :timeout the max time a request can take.
|
35
|
+
# @option [Fixnum] :retries the number of retries if necessary.
|
36
|
+
#
|
37
|
+
def initialize(args = {})
|
38
|
+
@args = args.except(:timeout, :retries)
|
39
|
+
@timeout = args[:timeout].to_i
|
40
|
+
@retries = args[:retries].to_i
|
41
|
+
end
|
42
|
+
|
43
|
+
#
|
44
|
+
# Performs a request on the given url with its arguments.
|
45
|
+
#
|
46
|
+
# @param [String] url the request API url.
|
47
|
+
# @param [Hash] params the request arguments.
|
48
|
+
#
|
49
|
+
def get(url, params = {})
|
50
|
+
@url = url
|
51
|
+
@params = params
|
52
|
+
@request = prepare_request
|
53
|
+
|
54
|
+
make_request
|
55
|
+
end
|
56
|
+
|
57
|
+
#
|
58
|
+
# Performs the request respecting the given timeout.
|
59
|
+
#
|
60
|
+
# @param [Proc] block a block of code to perform the request.
|
61
|
+
#
|
62
|
+
def run_with_timeout(&block)
|
63
|
+
Timeout.timeout(@timeout) do
|
64
|
+
yield
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
#
|
69
|
+
# Prepares the Proc instructions to perform the request.
|
70
|
+
#
|
71
|
+
def prepare_request
|
72
|
+
lambda do
|
73
|
+
sleep(3)
|
74
|
+
uri = URI(@url)
|
75
|
+
uri.query = URI.encode_www_form(@params)
|
76
|
+
@response = Net::HTTP.get(uri)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
#
|
81
|
+
# Handles the request behavior.
|
82
|
+
#
|
83
|
+
# @param [Fixnum] attempts the current attempt number.
|
84
|
+
#
|
85
|
+
def make_request(attempts = 0)
|
86
|
+
@attempts = attempts
|
87
|
+
|
88
|
+
if attempts > MAX_RETRIES || attempts > @retries
|
89
|
+
set_response(Spotify::API::Errors::MAX_RETRIES, true)
|
90
|
+
|
91
|
+
else
|
92
|
+
begin
|
93
|
+
if @timeout > 0
|
94
|
+
run_with_timeout { request.call }
|
95
|
+
else
|
96
|
+
request.call
|
97
|
+
end
|
98
|
+
|
99
|
+
rescue Timeout::Error
|
100
|
+
set_response(Spotify::API::Errors::TIMEOUT)
|
101
|
+
rescue
|
102
|
+
set_response(Spotify::API::Errors::UNEXPECTED)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
#
|
109
|
+
# Sets the response in case of something goes wrong during the
|
110
|
+
# extraction process.
|
111
|
+
#
|
112
|
+
# @param [String] error the raised error during the extraction.
|
113
|
+
# @param [Boolean] force if should return error independent of retries.
|
114
|
+
#
|
115
|
+
def set_response(error, force = false)
|
116
|
+
if force == false && @retries > 0
|
117
|
+
make_request(@attempts + 1)
|
118
|
+
else
|
119
|
+
@response = { error: error }.to_json
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
#
|
124
|
+
# Parses the response to JSON to get more flexible.
|
125
|
+
#
|
126
|
+
# @return [Hash] the parsed response.
|
127
|
+
#
|
128
|
+
def body
|
129
|
+
@response = JSON.parse(response)
|
130
|
+
end
|
131
|
+
|
132
|
+
def define_response(&block)
|
133
|
+
response = body
|
134
|
+
|
135
|
+
# The if statement covers a case for Users requests.
|
136
|
+
if response.class != Spotify::Models::Error
|
137
|
+
if response['error']
|
138
|
+
response = Spotify::Models::Error.default(response['error'])
|
139
|
+
else
|
140
|
+
response = yield
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
response
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
150
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
module Spotify
|
2
|
+
module API
|
3
|
+
|
4
|
+
class Track < Spotify::API::Base
|
5
|
+
|
6
|
+
#
|
7
|
+
# API endpoint for tracks.
|
8
|
+
#
|
9
|
+
TRACKS_URL = "#{BASE_URL}tracks"
|
10
|
+
|
11
|
+
#
|
12
|
+
# Gets the tracks related to the given parameters.
|
13
|
+
#
|
14
|
+
# @param [Hash] args the search arguments.
|
15
|
+
# @option [Fixnum] :timeout the max time a request can take.
|
16
|
+
# @option [Fixnum] :retries the number of retries if necessary.
|
17
|
+
#
|
18
|
+
# @return [Spotify::Models::Paging] the extracted tracks.
|
19
|
+
#
|
20
|
+
def self.search(args = {})
|
21
|
+
args[:type] = :track
|
22
|
+
|
23
|
+
service_params = args.slice(:timeout, :retries)
|
24
|
+
args = args.slice(:q, :market, :type, :limit, :offset)
|
25
|
+
|
26
|
+
self.new(service_params).search(args)
|
27
|
+
end
|
28
|
+
|
29
|
+
#
|
30
|
+
# Gets a track.
|
31
|
+
#
|
32
|
+
# @param [Hash] args the search arguments.
|
33
|
+
# @option [Fixnum] :timeout the max time a request can take.
|
34
|
+
# @option [Fixnum] :retries the number of retries if necessary.
|
35
|
+
#
|
36
|
+
# @return [Full::Track] the extracted track.
|
37
|
+
#
|
38
|
+
def self.search_by_id(args = {})
|
39
|
+
service_params = args.slice(:timeout, :retries)
|
40
|
+
args = args.slice(:id, :market)
|
41
|
+
|
42
|
+
self.new(service_params).search_by_id(args)
|
43
|
+
end
|
44
|
+
|
45
|
+
#
|
46
|
+
# Gets several tracks.
|
47
|
+
#
|
48
|
+
# @param [Hash] args the search arguments.
|
49
|
+
# @option [Fixnum] :timeout the max time a request can take.
|
50
|
+
# @option [Fixnum] :retries the number of retries if necessary.
|
51
|
+
#
|
52
|
+
# @return [Array<Full::Track>] an array containing
|
53
|
+
# the extracted tracks.
|
54
|
+
#
|
55
|
+
def self.search_by_ids(args = {})
|
56
|
+
args[:ids] = Array(args[:ids]).join(',')
|
57
|
+
|
58
|
+
service_params = args.slice(:timeout, :retries)
|
59
|
+
args = args.slice(:ids, :market)
|
60
|
+
|
61
|
+
self.new(service_params).search_by_ids(args)
|
62
|
+
end
|
63
|
+
|
64
|
+
#
|
65
|
+
# Gets the tracks related to the given parameters.
|
66
|
+
#
|
67
|
+
# @param [Hash] args the search arguments.
|
68
|
+
# @option [Fixnum] :timeout the max time a request can take.
|
69
|
+
# @option [Fixnum] :retries the number of retries if necessary.
|
70
|
+
#
|
71
|
+
# @return [Spotify::Models::Paging] the extracted tracks.
|
72
|
+
#
|
73
|
+
def search(args = {})
|
74
|
+
if args[:market].to_s.to_sym == FROM_TOKEN
|
75
|
+
# TODO: Authorization.
|
76
|
+
return Spotify::API::Errors::NOT_AVAILABLE
|
77
|
+
end
|
78
|
+
|
79
|
+
get(SEARCH_URL, args)
|
80
|
+
|
81
|
+
define_response do
|
82
|
+
klass = Spotify::Models::Full::Track
|
83
|
+
|
84
|
+
Spotify::Models::Paging.new(response["tracks"], klass)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
#
|
89
|
+
# Gets a track.
|
90
|
+
#
|
91
|
+
# @param [Hash] args the search arguments.
|
92
|
+
# @option [String] :id the track id.
|
93
|
+
# @option [String] :market the market.
|
94
|
+
#
|
95
|
+
# @return [Full::Track] the extracted track.
|
96
|
+
#
|
97
|
+
def search_by_id(args = {})
|
98
|
+
get(TRACKS_URL + '/' + args[:id].to_s, args.slice(:market))
|
99
|
+
|
100
|
+
define_response do
|
101
|
+
Spotify::Models::Full::Track.new(response)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
#
|
106
|
+
# Gets several tracks.
|
107
|
+
#
|
108
|
+
# @param [Hash] args the search arguments.
|
109
|
+
# @option [String] :ids the tracks ids between ",".
|
110
|
+
# @option [String] :market the market.
|
111
|
+
#
|
112
|
+
# @return [Array<Full::Track>] an array containing
|
113
|
+
# the extracted tracks.
|
114
|
+
#
|
115
|
+
def search_by_ids(args = {})
|
116
|
+
get(TRACKS_URL, args)
|
117
|
+
|
118
|
+
define_response do
|
119
|
+
response["tracks"].map do |track|
|
120
|
+
Spotify::Models::Full::Track.new(track)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Spotify
|
2
|
+
module API
|
3
|
+
|
4
|
+
class User < Spotify::API::Base
|
5
|
+
|
6
|
+
#
|
7
|
+
# API endpoint for users.
|
8
|
+
#
|
9
|
+
USERS_URL = "#{BASE_URL}users"
|
10
|
+
|
11
|
+
#
|
12
|
+
# Gets an user.
|
13
|
+
#
|
14
|
+
# @param [Hash] args the search arguments.
|
15
|
+
# @option [Fixnum] :timeout the max time a request can take.
|
16
|
+
# @option [Fixnum] :retries the number of retries if necessary.
|
17
|
+
#
|
18
|
+
# @return [Public::User] the extracted user.
|
19
|
+
#
|
20
|
+
def self.search_by_id(args = {})
|
21
|
+
service_params = args.slice(:timeout, :retries)
|
22
|
+
args = args.slice(:id)
|
23
|
+
|
24
|
+
self.new(service_params).search_by_id(args)
|
25
|
+
end
|
26
|
+
|
27
|
+
#
|
28
|
+
# Gets a track.
|
29
|
+
#
|
30
|
+
# @param [Hash] args the search arguments.
|
31
|
+
# @option [String] :id the track id.
|
32
|
+
# @option [String] :market the market.
|
33
|
+
#
|
34
|
+
# @return [Public::User] the extracted user.
|
35
|
+
#
|
36
|
+
def search_by_id(args = {})
|
37
|
+
get(USERS_URL + '/' + args[:id].to_s)
|
38
|
+
|
39
|
+
define_response do
|
40
|
+
Spotify::Models::Simplified::User.new(response)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
#
|
45
|
+
# Parses the response to JSON to get more flexible.
|
46
|
+
#
|
47
|
+
# @return [Hash] the parsed response.
|
48
|
+
#
|
49
|
+
def body
|
50
|
+
@response = JSON.parse(response)
|
51
|
+
rescue
|
52
|
+
Spotify::Models::Error.parser_error
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
data/lib/spotify/api.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
module Spotify
|
2
|
+
|
3
|
+
module Models
|
4
|
+
|
5
|
+
class Album
|
6
|
+
|
7
|
+
attr_reader :album_type, :available_markets, :external_urls,
|
8
|
+
:genres, :href, :id, :images, :name, :type, :uri
|
9
|
+
|
10
|
+
#
|
11
|
+
# Sets the arguments to its variables.
|
12
|
+
#
|
13
|
+
# @param [Hash] args the arguments that will be placed on each variable.
|
14
|
+
#
|
15
|
+
# @return [Album] an album object.
|
16
|
+
#
|
17
|
+
def initialize(args = {})
|
18
|
+
args = Hash(args).with_indifferent_access
|
19
|
+
|
20
|
+
# Arrays
|
21
|
+
images = Array(args[:images]).map { |i| Spotify::Models::Image.new(i) }
|
22
|
+
|
23
|
+
# Objects
|
24
|
+
external_urls = Spotify::Models::ExternalURL.new(args[:external_urls])
|
25
|
+
|
26
|
+
@album_type = args[:album_type]
|
27
|
+
@available_markets = args[:available_markets]
|
28
|
+
@external_urls = external_urls
|
29
|
+
@genres = args[:genres]
|
30
|
+
@href = args[:href]
|
31
|
+
@id = args[:id]
|
32
|
+
@images = images
|
33
|
+
@name = args[:name]
|
34
|
+
@type = args[:type]
|
35
|
+
@uri = args[:uri]
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Spotify
|
2
|
+
|
3
|
+
module Models
|
4
|
+
|
5
|
+
class Artist
|
6
|
+
|
7
|
+
attr_reader :external_urls, :href, :id, :name, :type, :uri
|
8
|
+
|
9
|
+
#
|
10
|
+
# Sets the arguments to its variables.
|
11
|
+
#
|
12
|
+
# @param [Hash] args the arguments that will be placed on each variable.
|
13
|
+
#
|
14
|
+
# @return [Album] an artist object.
|
15
|
+
#
|
16
|
+
def initialize(args = {})
|
17
|
+
args = Hash(args).with_indifferent_access
|
18
|
+
|
19
|
+
# Objects
|
20
|
+
external_urls = Spotify::Models::ExternalURL.new(args[:external_urls])
|
21
|
+
|
22
|
+
@external_urls = external_urls
|
23
|
+
@href = args[:href]
|
24
|
+
@id = args[:id]
|
25
|
+
@name = args[:name]
|
26
|
+
@type = args[:type]
|
27
|
+
@uri = args[:uri]
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Spotify
|
2
|
+
|
3
|
+
module Models
|
4
|
+
|
5
|
+
class Category
|
6
|
+
|
7
|
+
attr_reader :href, :icons, :id, :name
|
8
|
+
|
9
|
+
def initialize(args = {})
|
10
|
+
args = args.with_indifferent_access
|
11
|
+
icons = args[:icons].map { |icon| Spotify::Models::Image.new(icon) }
|
12
|
+
|
13
|
+
@href = args[:href]
|
14
|
+
@icons = icons
|
15
|
+
@id = args[:id]
|
16
|
+
@name = args[:name]
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Spotify
|
2
|
+
|
3
|
+
module Models
|
4
|
+
|
5
|
+
class Copyright
|
6
|
+
|
7
|
+
attr_reader :text, :type
|
8
|
+
|
9
|
+
#
|
10
|
+
# Sets the arguments to its variables.
|
11
|
+
#
|
12
|
+
# @param [Hash] args the arguments that will be placed on each variable.
|
13
|
+
#
|
14
|
+
# @return [Image] a copyright object.
|
15
|
+
#
|
16
|
+
def initialize(args = {})
|
17
|
+
args = Hash(args).with_indifferent_access
|
18
|
+
|
19
|
+
@text = args[:text]
|
20
|
+
@type = args[:type]
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Spotify
|
2
|
+
|
3
|
+
module Models
|
4
|
+
|
5
|
+
class CursorbasedPaging
|
6
|
+
|
7
|
+
attr_reader :href, :items, :limit, :next, :cursors, :total
|
8
|
+
|
9
|
+
def initialize(args = {}, klass)
|
10
|
+
args = args.with_indifferent_access
|
11
|
+
|
12
|
+
@href = args[:href]
|
13
|
+
@items = args[:items].map { |item| klass.new(item) }
|
14
|
+
@limit = args[:limit]
|
15
|
+
@next = args[:next]
|
16
|
+
@total = args[:total]
|
17
|
+
@cursors = Cursor.new(args[:cursors])
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
module Spotify
|
2
|
+
|
3
|
+
module Models
|
4
|
+
|
5
|
+
class Error
|
6
|
+
|
7
|
+
attr_reader :status, :message
|
8
|
+
|
9
|
+
#
|
10
|
+
# Identifies that the error is returned from some request.
|
11
|
+
#
|
12
|
+
DEFAULT = :default
|
13
|
+
|
14
|
+
#
|
15
|
+
# Defines the text and status for each message known.
|
16
|
+
#
|
17
|
+
ERRORS = {
|
18
|
+
timeout: {
|
19
|
+
status: 700,
|
20
|
+
message: "Timed out."
|
21
|
+
},
|
22
|
+
unexpected: {
|
23
|
+
status: 710,
|
24
|
+
message: "Unexpected error."
|
25
|
+
},
|
26
|
+
max_retries: {
|
27
|
+
status: 720,
|
28
|
+
message: "Max retries exceeded."
|
29
|
+
},
|
30
|
+
not_available: {
|
31
|
+
status: 730,
|
32
|
+
message: "This feature is not available yet."
|
33
|
+
},
|
34
|
+
parser_error: {
|
35
|
+
status: 740,
|
36
|
+
message: "Something went wrong. Please verify the parameters"
|
37
|
+
}
|
38
|
+
}
|
39
|
+
|
40
|
+
#
|
41
|
+
# Creates the message.
|
42
|
+
#
|
43
|
+
# @param [Hash] type the type of the message to be shown.
|
44
|
+
#
|
45
|
+
# @return [Parsers::Error] a message to be shown to the user.
|
46
|
+
#
|
47
|
+
def initialize(type, args = {})
|
48
|
+
if type == DEFAULT
|
49
|
+
error = {
|
50
|
+
status: args[:status],
|
51
|
+
message: args[:message]
|
52
|
+
}
|
53
|
+
else
|
54
|
+
error = ERRORS[type]
|
55
|
+
end
|
56
|
+
|
57
|
+
@status = error[:status]
|
58
|
+
@message = error[:message]
|
59
|
+
end
|
60
|
+
|
61
|
+
#
|
62
|
+
# Creates an error representing a timeout error.
|
63
|
+
#
|
64
|
+
# @return [Parsers::Error] a message to be shown to the user.
|
65
|
+
#
|
66
|
+
def self.timeout
|
67
|
+
self.new(:timeout)
|
68
|
+
end
|
69
|
+
|
70
|
+
#
|
71
|
+
# Creates an error representing an unexpected error.
|
72
|
+
#
|
73
|
+
# @return [Parsers::Error] a message to be shown to the user.
|
74
|
+
#
|
75
|
+
def self.unexpected_error
|
76
|
+
self.new(:unexpected_error)
|
77
|
+
end
|
78
|
+
|
79
|
+
#
|
80
|
+
# Creates an error representing that the retries limit was reached.
|
81
|
+
#
|
82
|
+
# @return [Parsers::Error] a message to be shown to the user.
|
83
|
+
#
|
84
|
+
def self.max_retries
|
85
|
+
self.new(:max_retries)
|
86
|
+
end
|
87
|
+
|
88
|
+
#
|
89
|
+
# Creates an error representing that the requested feature is not
|
90
|
+
# available yet.
|
91
|
+
#
|
92
|
+
# @return [Parsers::Error] a message to be shown to the user.
|
93
|
+
#
|
94
|
+
def self.not_available
|
95
|
+
self.new(:not_available)
|
96
|
+
end
|
97
|
+
|
98
|
+
#
|
99
|
+
# Creates an error representing a parser error.
|
100
|
+
#
|
101
|
+
# @return [Parsers::Error] a message to be shown to the user.
|
102
|
+
#
|
103
|
+
def self.parser_error
|
104
|
+
self.new(:parser_error)
|
105
|
+
end
|
106
|
+
|
107
|
+
#
|
108
|
+
# Creates an error representing the site response error.
|
109
|
+
#
|
110
|
+
# @return [Parsers::Error] a message to be shown to the user.
|
111
|
+
#
|
112
|
+
def self.default(args = {})
|
113
|
+
args = Hash(args).with_indifferent_access
|
114
|
+
|
115
|
+
self.new(:default, args)
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Spotify
|
2
|
+
|
3
|
+
module Models
|
4
|
+
|
5
|
+
class ExternalID
|
6
|
+
|
7
|
+
#
|
8
|
+
# Sets the arguments to its variables.
|
9
|
+
#
|
10
|
+
# @param [Hash] args the arguments that will be placed on each variable.
|
11
|
+
#
|
12
|
+
# @return [ExternalID] an external id object.
|
13
|
+
#
|
14
|
+
def initialize(args = {})
|
15
|
+
args = Hash(args).with_indifferent_access
|
16
|
+
|
17
|
+
hsh = {
|
18
|
+
isrc: args[:isrc],
|
19
|
+
ean: args[:ean],
|
20
|
+
upc: args[:upc]
|
21
|
+
}
|
22
|
+
|
23
|
+
hsh = hsh.reject { |_, v| v.blank? }
|
24
|
+
|
25
|
+
if hsh.present?
|
26
|
+
# Generates the keys dynamically
|
27
|
+
hsh.each do |k, v|
|
28
|
+
key = k
|
29
|
+
value = v
|
30
|
+
|
31
|
+
eval("@#{key} = value")
|
32
|
+
class_eval { attr_reader key.to_sym }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|