napster 0.0.0 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,74 @@
1
+ using StringHelper
2
+
3
+ module Napster
4
+ module Models
5
+ # Tag model
6
+ class Tag
7
+ SUPPORTED_CONTENT_TYPES = [:album,
8
+ :artist,
9
+ :genre,
10
+ :playlist,
11
+ :radio,
12
+ :track].freeze
13
+ ATTRIBUTES = [:type,
14
+ :id,
15
+ :name,
16
+ :content_id,
17
+ :protected,
18
+ :shortcut,
19
+ :parent].freeze
20
+
21
+ ATTRIBUTES.each do |attribute|
22
+ attr_accessor attribute
23
+ end
24
+
25
+ attr_accessor :client
26
+
27
+ def initialize(arg)
28
+ @client = arg[:client] if arg[:client]
29
+ return unless arg[:data]
30
+
31
+ ATTRIBUTES.each do |attribute|
32
+ send("#{attribute}=", arg[:data][attribute.to_s.camel_case_lower])
33
+ end
34
+ end
35
+
36
+ def self.collection(arg)
37
+ arg[:data].map do |tag|
38
+ Tag.new(data: tag, client: @client)
39
+ end
40
+ end
41
+
42
+ # Top level methods
43
+
44
+ def all
45
+ response = @client.get('/tags')
46
+ Tag.collection(data: response['tags'])
47
+ end
48
+
49
+ def find(id)
50
+ e = 'Invalid tag id'
51
+ raise ArgumentError, e unless Napster::Moniker.check(id, :tag)
52
+ response = @client.get("/tags/#{id}")
53
+ Tag.new(data: response['tags'].first, client: @client)
54
+ end
55
+
56
+ # /me
57
+
58
+ def contents(named_tag, type, params)
59
+ params[:tag] = named_tag if named_tag
60
+ params[:type] = type.to_s if type
61
+ get_options = {
62
+ params: params,
63
+ headers: {
64
+ Authorization: 'Bearer ' + @client.access_token,
65
+ 'Content-Type' => 'application/json',
66
+ 'Accept-Version' => '2.0.0'
67
+ }
68
+ }
69
+ response = @client.get('/me/tags/search', get_options)
70
+ Content.collection(data: response['data'], client: @client)
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,72 @@
1
+ using StringHelper
2
+
3
+ module Napster
4
+ module Models
5
+ # Track model
6
+ class Track
7
+ ATTRIBUTES = [:type,
8
+ :id,
9
+ :index,
10
+ :disc,
11
+ :href,
12
+ :playback_seconds,
13
+ :explicit,
14
+ :name,
15
+ :isrc,
16
+ :shortcut,
17
+ :amg,
18
+ :blurbs,
19
+ :artist_name,
20
+ :album_name,
21
+ :formats,
22
+ :album_id,
23
+ :contributors].freeze
24
+
25
+ ATTRIBUTES.each do |attribute|
26
+ attr_accessor attribute
27
+ end
28
+
29
+ attr_accessor :client
30
+
31
+ def initialize(arg)
32
+ @client = arg[:client] if arg[:client]
33
+ return unless arg[:data]
34
+
35
+ ATTRIBUTES.each do |attribute|
36
+ send("#{attribute}=", arg[:data][attribute.to_s.camel_case_lower])
37
+ end
38
+ end
39
+
40
+ def self.collection(arg)
41
+ arg[:data].map do |track|
42
+ Track.new(data: track, client: @client)
43
+ end
44
+ end
45
+
46
+ def find(arg)
47
+ return find_by_id(arg) if Napster::Moniker.check(arg, :track)
48
+ find_by_name(arg)
49
+ end
50
+
51
+ def find_by_id(id)
52
+ response = @client.get("/tracks/#{id}")
53
+ Napster::Models::Track.new(data: response['tracks'].first)
54
+ end
55
+
56
+ def find_all_by_name(name)
57
+ options = {
58
+ params: {
59
+ q: name,
60
+ type: 'track'
61
+ }
62
+ }
63
+ response = @client.get('/search', options)
64
+ Napster::Models::Track.collection(data: response['data'])
65
+ end
66
+
67
+ def find_by_name(name)
68
+ find_all_by_name(name).first
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,36 @@
1
+ using StringHelper
2
+
3
+ module Napster
4
+ module Models
5
+ # UploadedImage model
6
+ class UploadedImage
7
+ ATTRIBUTES = [:content_id,
8
+ :image_type,
9
+ :url,
10
+ :default_image,
11
+ :image_id,
12
+ :version].freeze
13
+
14
+ ATTRIBUTES.each do |attribute|
15
+ attr_accessor attribute
16
+ end
17
+
18
+ attr_accessor :client
19
+
20
+ def initialize(arg)
21
+ @client = arg[:client] if arg[:client]
22
+ return unless arg[:data]
23
+
24
+ ATTRIBUTES.each do |attribute|
25
+ send("#{attribute}=", arg[:data][attribute.to_s.camel_case_lower])
26
+ end
27
+ end
28
+
29
+ def self.collection(arg)
30
+ arg[:data].map do |uploaded_image|
31
+ UploadedImage.new(data: uploaded_image, client: @client)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,29 @@
1
+ module Napster
2
+ # Module for checking Napster API id monikers
3
+ module Moniker
4
+ MONIKER_REGEXES = {
5
+ artist: /^\s*(Art\.\d+)\s*$/i,
6
+ track: /^\s*(Tra\.\d+)\s*$/i,
7
+ album: /^\s*(Alb\.\d+)\s*$/i,
8
+ review: /^\s*(RevAl\.\d+)\s*$/i,
9
+ genre: /^\s*(g\.\d+)\s*$/i,
10
+ post: /^\s*(po\.\d+)\s*$/i,
11
+ single_artist_station: /^\s*(sas\.\d+)\s*$/i,
12
+ station: /^\s*((p|sa|ma|sma|st|mt|smt)s\.\d+)\s*$/i,
13
+ playlist: /^\s*((m|p)p\.\d+)\s*$/i,
14
+ tag: /^\s*(tag\.\d+)\s*$/i,
15
+ radio: /^\s*(ts\.\d+)\s*$/i,
16
+ member_guid: /^[0-9A-F]{32}$/,
17
+ member_playlist: /^\s*(mp\.\d+)\s*$/i,
18
+ published_playlist: /^\s*(pp\.\d+)\s*$/i
19
+ }.freeze
20
+
21
+ # Given id and type, check if the id is of the type
22
+ # @param id [String]
23
+ # @param type [Symbol]
24
+ # @return [MatchData]
25
+ def self.check(id, type)
26
+ MONIKER_REGEXES[type].match(id)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,24 @@
1
+ module Napster
2
+ # The Request class implements a request object used to
3
+ # call Napster API
4
+ class Request
5
+ HOST_URL = 'https://api.napster.com'.freeze
6
+
7
+ attr_accessor :faraday
8
+
9
+ def initialize(options)
10
+ @faraday = Faraday.new(url: HOST_URL) do |faraday|
11
+ faraday.request :url_encoded
12
+ faraday.adapter Faraday.default_adapter
13
+
14
+ if options[:access_token]
15
+ faraday.authorization :Bearer, options[:access_token]
16
+ end
17
+
18
+ if options[:api_key] && options[:api_secret]
19
+ faraday.basic_auth(options[:api_key], options[:api_secret])
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ module Napster
2
+ # Raised when the response status is anything over 400
3
+ class ResponseError < Faraday::Error
4
+ attr_accessor :http_status,
5
+ :response_body,
6
+ :faraday_response
7
+
8
+ def initialize(response)
9
+ @http_status = response.status
10
+ @response_body = response.body
11
+ @faraday_response = response
12
+ end
13
+ end
14
+ end
@@ -1,3 +1,3 @@
1
1
  module Napster
2
- VERSION = "0.0.0"
2
+ VERSION = '0.1.0'.freeze
3
3
  end
@@ -0,0 +1,10 @@
1
+ # Monkey patching String to add camel_case_lower conversion
2
+ module StringHelper
3
+ refine String do
4
+ def camel_case_lower
5
+ split('_').inject([]) do |buffer, e|
6
+ buffer.push(buffer.empty? ? e : e.capitalize)
7
+ end.join
8
+ end
9
+ end
10
+ end
data/napster.gemspec CHANGED
@@ -4,30 +4,43 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'napster/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "napster"
8
- spec.version = Napster::VERSION
9
- spec.authors = ["Jason Kim"]
10
- spec.email = ["jasonkim@rhapsody.com"]
7
+ spec.name = 'napster'
8
+ spec.version = Napster::VERSION
9
+ spec.authors = ['Jason Kim']
10
+ spec.email = ['jasonkim@rhapsody.com']
11
11
 
12
- spec.summary = %q{A Ruby interface to the Napster API.}
13
- spec.description = %q{A Ruby interface to the Napster API.}
14
- spec.homepage = "https://developer.rhapsody.com/"
15
- spec.license = "MIT"
12
+ spec.summary = 'A Ruby interface to the Napster API.'
13
+ spec.description = 'A Ruby interface to the Napster API.'
14
+ spec.homepage = 'https://developer.napster.com/'
15
+ spec.license = 'MIT'
16
16
 
17
17
  # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
18
18
  # delete this section to allow pushing this gem to any host.
19
19
  if spec.respond_to?(:metadata)
20
- spec.metadata['allowed_push_host'] = "https://rubygems.org"
20
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org'
21
21
  else
22
- raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
22
+ raise 'RubyGems 2.0 or newer is required to ' \
23
+ 'protect against public gem pushes.'
23
24
  end
24
25
 
25
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
26
- spec.bindir = "exe"
27
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
- spec.require_paths = ["lib"]
26
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
27
+ f.match(%r{^(test|spec|features)/})
28
+ end
29
+ spec.bindir = 'exe'
30
+ spec.executables = spec.files.grep(%r{^exe/}) do |f|
31
+ File.basename(f)
32
+ end
33
+ spec.require_paths = ['lib']
34
+
35
+ spec.add_dependency('faraday', '~> 0.9.2')
36
+ spec.add_dependency('oj', '~> 2.14')
29
37
 
30
- spec.add_development_dependency "bundler", "~> 1.10"
31
- spec.add_development_dependency "rake", "~> 10.0"
32
- spec.add_development_dependency "rspec"
38
+ spec.add_development_dependency 'bundler', '~> 1.11'
39
+ spec.add_development_dependency 'rake', '~> 11.1'
40
+ spec.add_development_dependency 'rspec', '~> 3.4'
41
+ spec.add_development_dependency 'capybara', '~> 2.6'
42
+ spec.add_development_dependency 'poltergeist', '~> 1.9'
43
+ spec.add_development_dependency 'rubocop', '~> 0.38.0'
44
+ spec.add_development_dependency 'faker', '~> 1.6'
45
+ spec.add_development_dependency 'yard', '~> 0.8.7.6'
33
46
  end
metadata CHANGED
@@ -1,57 +1,155 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: napster
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Kim
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-02-17 00:00:00.000000000 Z
11
+ date: 2016-06-15 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.9.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.9.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: oj
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.14'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.14'
13
41
  - !ruby/object:Gem::Dependency
14
42
  name: bundler
15
43
  requirement: !ruby/object:Gem::Requirement
16
44
  requirements:
17
45
  - - "~>"
18
46
  - !ruby/object:Gem::Version
19
- version: '1.10'
47
+ version: '1.11'
20
48
  type: :development
21
49
  prerelease: false
22
50
  version_requirements: !ruby/object:Gem::Requirement
23
51
  requirements:
24
52
  - - "~>"
25
53
  - !ruby/object:Gem::Version
26
- version: '1.10'
54
+ version: '1.11'
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: rake
29
57
  requirement: !ruby/object:Gem::Requirement
30
58
  requirements:
31
59
  - - "~>"
32
60
  - !ruby/object:Gem::Version
33
- version: '10.0'
61
+ version: '11.1'
34
62
  type: :development
35
63
  prerelease: false
36
64
  version_requirements: !ruby/object:Gem::Requirement
37
65
  requirements:
38
66
  - - "~>"
39
67
  - !ruby/object:Gem::Version
40
- version: '10.0'
68
+ version: '11.1'
41
69
  - !ruby/object:Gem::Dependency
42
70
  name: rspec
43
71
  requirement: !ruby/object:Gem::Requirement
44
72
  requirements:
45
- - - ">="
73
+ - - "~>"
46
74
  - !ruby/object:Gem::Version
47
- version: '0'
75
+ version: '3.4'
48
76
  type: :development
49
77
  prerelease: false
50
78
  version_requirements: !ruby/object:Gem::Requirement
51
79
  requirements:
52
- - - ">="
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.4'
83
+ - !ruby/object:Gem::Dependency
84
+ name: capybara
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.6'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.6'
97
+ - !ruby/object:Gem::Dependency
98
+ name: poltergeist
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.9'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.9'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 0.38.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 0.38.0
125
+ - !ruby/object:Gem::Dependency
126
+ name: faker
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.6'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.6'
139
+ - !ruby/object:Gem::Dependency
140
+ name: yard
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 0.8.7.6
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
53
151
  - !ruby/object:Gem::Version
54
- version: '0'
152
+ version: 0.8.7.6
55
153
  description: A Ruby interface to the Napster API.
56
154
  email:
57
155
  - jasonkim@rhapsody.com
@@ -61,6 +159,7 @@ extra_rdoc_files: []
61
159
  files:
62
160
  - ".gitignore"
63
161
  - ".rspec"
162
+ - ".rubocop.yml"
64
163
  - ".travis.yml"
65
164
  - Gemfile
66
165
  - LICENSE.txt
@@ -69,9 +168,31 @@ files:
69
168
  - bin/console
70
169
  - bin/setup
71
170
  - lib/napster.rb
171
+ - lib/napster/client.rb
172
+ - lib/napster/me.rb
173
+ - lib/napster/models/album.rb
174
+ - lib/napster/models/artist.rb
175
+ - lib/napster/models/chart.rb
176
+ - lib/napster/models/content.rb
177
+ - lib/napster/models/favorite.rb
178
+ - lib/napster/models/favorite_status.rb
179
+ - lib/napster/models/follower.rb
180
+ - lib/napster/models/following.rb
181
+ - lib/napster/models/library.rb
182
+ - lib/napster/models/library_date_time.rb
183
+ - lib/napster/models/member.rb
184
+ - lib/napster/models/playlist.rb
185
+ - lib/napster/models/profile.rb
186
+ - lib/napster/models/tag.rb
187
+ - lib/napster/models/track.rb
188
+ - lib/napster/models/uploaded_image.rb
189
+ - lib/napster/moniker.rb
190
+ - lib/napster/request.rb
191
+ - lib/napster/response_error.rb
72
192
  - lib/napster/version.rb
193
+ - lib/string_helper.rb
73
194
  - napster.gemspec
74
- homepage: https://developer.rhapsody.com/
195
+ homepage: https://developer.napster.com/
75
196
  licenses:
76
197
  - MIT
77
198
  metadata: