itunes_api 0.2.0 → 0.3
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/Gemfile +1 -0
- data/README.md +29 -5
- data/itunes_api.gemspec +5 -4
- data/lib/itunes_api/music/album.rb +8 -35
- data/lib/itunes_api/music/artist.rb +6 -47
- data/lib/itunes_api/music/artist_search.rb +30 -0
- data/lib/itunes_api/requests/base.rb +39 -0
- data/lib/itunes_api/requests/lookup.rb +65 -0
- data/lib/itunes_api/requests/search.rb +41 -0
- data/lib/itunes_api/version.rb +1 -1
- data/lib/itunes_api.rb +14 -1
- metadata +23 -24
- data/.ruby-version +0 -1
- data/.travis.yml +0 -5
- data/lib/itunes_api/all.rb +0 -2
- data/lib/itunes_api/music/all.rb +0 -2
- data/lib/itunes_api/request.rb +0 -40
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0c1598295d32c9506679762afd2abca9f790ba68
|
4
|
+
data.tar.gz: 9a3afea483d0203ed586d925480e5cb2e83a6031
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c2ff9e9ef1bf7be358865930aae4d308e0819ce6537bdad89081a596117444744e6f921c5df4e956da11d716ee44f0436fa2d3e310fed1645e1420b0d1646bb8
|
7
|
+
data.tar.gz: '09e2991f926527d5558d3772c697d5e2aaa24aab87f4e6394981d7f22fe8fe1bdb41f172f0a22c248b8fd82041e152a367e3f611cd15c10f5907ba75a88a2fbb'
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
[](https://circleci.com/gh/mariodarco/itunes-api/tree/master)
|
2
|
+
|
3
|
+
|
1
4
|
# ItunesApi
|
2
5
|
|
3
6
|
A simple interface for the Itunes Api.
|
@@ -12,18 +15,41 @@ gem 'itunes_api'
|
|
12
15
|
|
13
16
|
And then execute:
|
14
17
|
|
15
|
-
|
18
|
+
```ruby
|
19
|
+
$ bundle
|
20
|
+
```
|
16
21
|
|
17
22
|
Or install it yourself as:
|
18
23
|
|
19
|
-
|
24
|
+
```ruby
|
25
|
+
$ gem install itunes_api
|
26
|
+
```
|
20
27
|
|
21
28
|
## Usage
|
22
29
|
|
23
|
-
|
30
|
+
To return all the AMG ids associated with a search term.
|
31
|
+
```ruby
|
32
|
+
ItunesApi.artist_ids('Pink Floyd')
|
33
|
+
```
|
34
|
+
|
35
|
+
To return structured information abut artists and albums associated with a search term.
|
36
|
+
```ruby
|
37
|
+
ItunesApi.artist_ids('Pink Floyd')
|
38
|
+
```
|
24
39
|
|
25
40
|
## Development
|
26
41
|
|
42
|
+
Ruby version:
|
43
|
+
```
|
44
|
+
2.3.3
|
45
|
+
```
|
46
|
+
|
47
|
+
Fork the project, clone the repository and bundle:
|
48
|
+
```
|
49
|
+
>> git clone https://github.com/{your_account}/itunes-api.git
|
50
|
+
>> cd itunes-api
|
51
|
+
```
|
52
|
+
|
27
53
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
28
54
|
|
29
55
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
@@ -32,8 +58,6 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
32
58
|
|
33
59
|
Bug reports and pull requests are welcome on GitHub at https://github.com/mariodarco/itunes-api. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
34
60
|
|
35
|
-
|
36
61
|
## License
|
37
62
|
|
38
63
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
39
|
-
|
data/itunes_api.gemspec
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# coding: utf-8
|
2
|
+
|
2
3
|
lib = File.expand_path('../lib', __FILE__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require 'itunes_api/version'
|
@@ -30,10 +31,10 @@ Gem::Specification.new do |spec|
|
|
30
31
|
|
31
32
|
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
32
33
|
|
33
|
-
spec.add_dependency 'addressable'
|
34
|
+
spec.add_dependency 'addressable'
|
34
35
|
|
35
|
-
spec.add_development_dependency 'bundler'
|
36
|
-
spec.add_development_dependency 'rake'
|
37
|
-
spec.add_development_dependency 'rspec'
|
36
|
+
spec.add_development_dependency 'bundler'
|
37
|
+
spec.add_development_dependency 'rake'
|
38
|
+
spec.add_development_dependency 'rspec'
|
38
39
|
spec.add_development_dependency 'rubocop'
|
39
40
|
end
|
@@ -1,44 +1,17 @@
|
|
1
1
|
module ItunesApi
|
2
2
|
module Music
|
3
|
-
#
|
3
|
+
# Wrapper for album results.
|
4
4
|
class Album
|
5
|
-
|
6
|
-
include Request
|
5
|
+
attr_reader :name, :artwork, :released
|
7
6
|
|
8
|
-
def initialize(
|
9
|
-
@name =
|
10
|
-
@
|
11
|
-
@
|
12
|
-
@track_count = info['trackCount']
|
13
|
-
@release_date = Date.parse(info['releaseDate'])
|
7
|
+
def initialize(data)
|
8
|
+
@name = data['collectionName']
|
9
|
+
@artwork = data['artworkUrl100']
|
10
|
+
@released = Date.parse(data['releaseDate'])
|
14
11
|
end
|
15
12
|
|
16
|
-
def
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
def streamable_tracks
|
21
|
-
tracks.select { |track| track['isStreamable'] }
|
22
|
-
end
|
23
|
-
|
24
|
-
def tracks
|
25
|
-
@tracks ||= filtered_results.sort_by { |track| track['trackNumber'] }
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
def filtered_results
|
31
|
-
@filtered_results ||= results.find_all do |result|
|
32
|
-
result['collectionId'] == @album_id
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def query_values
|
37
|
-
{
|
38
|
-
attribute: 'albumTerm',
|
39
|
-
entity: 'musicTrack',
|
40
|
-
term: name
|
41
|
-
}.merge(super)
|
13
|
+
def self.build(albums_data)
|
14
|
+
albums_data.map { |data| new(data) }
|
42
15
|
end
|
43
16
|
end
|
44
17
|
end
|
@@ -1,54 +1,13 @@
|
|
1
|
-
require 'addressable/uri'
|
2
|
-
|
3
1
|
module ItunesApi
|
4
2
|
module Music
|
5
|
-
#
|
3
|
+
# Artist or Band from the Apple catalog
|
6
4
|
class Artist
|
7
|
-
|
8
|
-
|
9
|
-
def initialize(artist_name, apple_id = nil)
|
10
|
-
@artist_name = artist_name
|
11
|
-
@apple_id = normalize(apple_id.to_i)
|
12
|
-
end
|
13
|
-
|
14
|
-
def albums(limit = 3)
|
15
|
-
@albums ||= filtered_results
|
16
|
-
.sort_by { |result| result['releaseDate'] }
|
17
|
-
.reverse
|
18
|
-
.first(limit)
|
19
|
-
.map { |info| Album.new(info) }
|
20
|
-
end
|
21
|
-
|
22
|
-
def normalize(apple_id)
|
23
|
-
apple_id.zero? ? nil : apple_id
|
24
|
-
end
|
25
|
-
|
26
|
-
def apple_ids
|
27
|
-
return [@apple_id] if @apple_id
|
28
|
-
|
29
|
-
@apple_ids ||= filtered_albums.collect do |album|
|
30
|
-
album['artistId']
|
31
|
-
end.compact.uniq.sort
|
32
|
-
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
def filtered_albums
|
37
|
-
results.find_all { |result| result['collectionType'] == 'Album' }
|
38
|
-
end
|
39
|
-
|
40
|
-
def filtered_results
|
41
|
-
filtered_albums.find_all do |album|
|
42
|
-
(!@apple_id || album['artistId'] == @apple_id)
|
43
|
-
end
|
44
|
-
end
|
5
|
+
attr_reader :name, :artist_id, :albums
|
45
6
|
|
46
|
-
def
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
term: @artist_name
|
51
|
-
}.merge(super)
|
7
|
+
def initialize(data)
|
8
|
+
@name = data['artistName']
|
9
|
+
@artist_id = data['amgArtistId']
|
10
|
+
@albums = Album.build(data[:albums])
|
52
11
|
end
|
53
12
|
end
|
54
13
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module ItunesApi
|
2
|
+
module Music
|
3
|
+
# Artists or Bands resulting from a search
|
4
|
+
class ArtistSearch
|
5
|
+
def initialize(name)
|
6
|
+
@name = name
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.artists(name)
|
10
|
+
new(name).artists
|
11
|
+
end
|
12
|
+
|
13
|
+
def artists
|
14
|
+
@artists ||= artist_ids.map { |id| build_artist(id) }
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def artist_ids
|
20
|
+
@search ||= ItunesApi.artist_ids(@name)
|
21
|
+
end
|
22
|
+
|
23
|
+
def build_artist(id)
|
24
|
+
Artist.new(
|
25
|
+
Requests::Lookup.artist_with_albums(id)
|
26
|
+
)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
require 'json'
|
3
|
+
module ItunesApi
|
4
|
+
module Requests
|
5
|
+
# Allow requests to the iTunes API.
|
6
|
+
module Base
|
7
|
+
def results
|
8
|
+
response.fetch('results') { [] }
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def query
|
14
|
+
Addressable::URI.new(
|
15
|
+
query_values: query_values
|
16
|
+
).query
|
17
|
+
end
|
18
|
+
|
19
|
+
def request
|
20
|
+
open(url).read
|
21
|
+
end
|
22
|
+
|
23
|
+
def response
|
24
|
+
@response ||= JSON.parse(request)
|
25
|
+
end
|
26
|
+
|
27
|
+
def symbolize_keys(hash)
|
28
|
+
hash.each_with_object({}) do |(key, value), new_hash|
|
29
|
+
new_hash[key.to_sym] = value
|
30
|
+
new_hash
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def url
|
35
|
+
"#{BASE_URL}/#{action}?#{query}"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module ItunesApi
|
2
|
+
module Requests
|
3
|
+
# Allows querying the API via lookup.
|
4
|
+
class Lookup
|
5
|
+
include Base
|
6
|
+
|
7
|
+
def initialize(artist_id)
|
8
|
+
@artist_id = artist_id
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.artist_with_albums(id)
|
12
|
+
new(id).artist_with_albums
|
13
|
+
end
|
14
|
+
|
15
|
+
def artist_with_albums
|
16
|
+
artist.merge(albums: albums)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def action
|
22
|
+
'lookup'
|
23
|
+
end
|
24
|
+
|
25
|
+
def albums
|
26
|
+
albums_data.map do |album|
|
27
|
+
symbolize_keys(unwrapped(album))
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def albums_data
|
32
|
+
results.find_all { |wrappers| wrappers['wrapperType'] == 'collection' }
|
33
|
+
end
|
34
|
+
|
35
|
+
def artist
|
36
|
+
symbolize_keys(unwrapped(artist_data))
|
37
|
+
end
|
38
|
+
|
39
|
+
def artist_data
|
40
|
+
symbolize_keys(
|
41
|
+
unwrapped(
|
42
|
+
results.find do |wrappers|
|
43
|
+
wrappers['wrapperType'] == 'artist'
|
44
|
+
end
|
45
|
+
)
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
def query_values
|
50
|
+
{
|
51
|
+
entity: 'album',
|
52
|
+
amgArtistId: @artist_id,
|
53
|
+
country: COUNTRY_CODE,
|
54
|
+
limit: LIMIT,
|
55
|
+
sort: 'recent'
|
56
|
+
}
|
57
|
+
end
|
58
|
+
|
59
|
+
def unwrapped(hash)
|
60
|
+
hash.delete('wrapperType')
|
61
|
+
hash
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'addressable/uri'
|
2
|
+
module ItunesApi
|
3
|
+
module Requests
|
4
|
+
# Fetch all the artist ids corresponding to a search term
|
5
|
+
class Search
|
6
|
+
include Base
|
7
|
+
|
8
|
+
def initialize(artist_name)
|
9
|
+
@artist_name = artist_name
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.artist_ids(artist_name)
|
13
|
+
new(artist_name).artist_ids
|
14
|
+
end
|
15
|
+
|
16
|
+
def artist_ids
|
17
|
+
results.collect do |result|
|
18
|
+
result['amgArtistId']
|
19
|
+
end.compact.uniq.sort
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def action
|
25
|
+
'search'
|
26
|
+
end
|
27
|
+
|
28
|
+
def query_values
|
29
|
+
{
|
30
|
+
attribute: 'artistTerm',
|
31
|
+
entity: 'album',
|
32
|
+
term: @artist_name,
|
33
|
+
country: COUNTRY_CODE,
|
34
|
+
limit: LIMIT,
|
35
|
+
media: 'music',
|
36
|
+
sort: 'recent'
|
37
|
+
}
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/itunes_api/version.rb
CHANGED
data/lib/itunes_api.rb
CHANGED
@@ -1,8 +1,21 @@
|
|
1
|
-
require 'itunes_api/
|
1
|
+
require 'itunes_api/requests/base'
|
2
|
+
require 'itunes_api/requests/lookup'
|
3
|
+
require 'itunes_api/requests/search'
|
4
|
+
require 'itunes_api/music/album'
|
5
|
+
require 'itunes_api/music/artist'
|
6
|
+
require 'itunes_api/music/artist_search'
|
2
7
|
|
3
8
|
# Interface to the Itunes Api
|
4
9
|
module ItunesApi
|
5
10
|
BASE_URL = 'https://itunes.apple.com'.freeze
|
6
11
|
COUNTRY_CODE = 'GB'.freeze
|
7
12
|
LIMIT = 200
|
13
|
+
|
14
|
+
def self.artist_ids(name)
|
15
|
+
Requests::Search.artist_ids(name)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.artist_search(name)
|
19
|
+
Music::ArtistSearch.artists(name)
|
20
|
+
end
|
8
21
|
end
|
metadata
CHANGED
@@ -1,71 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: itunes_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.3'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mario D’Arco
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-05-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: addressable
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rubocop
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -89,8 +89,6 @@ extra_rdoc_files: []
|
|
89
89
|
files:
|
90
90
|
- ".gitignore"
|
91
91
|
- ".rspec"
|
92
|
-
- ".ruby-version"
|
93
|
-
- ".travis.yml"
|
94
92
|
- CODE_OF_CONDUCT.md
|
95
93
|
- Gemfile
|
96
94
|
- LICENSE.txt
|
@@ -100,11 +98,12 @@ files:
|
|
100
98
|
- bin/setup
|
101
99
|
- itunes_api.gemspec
|
102
100
|
- lib/itunes_api.rb
|
103
|
-
- lib/itunes_api/all.rb
|
104
101
|
- lib/itunes_api/music/album.rb
|
105
|
-
- lib/itunes_api/music/all.rb
|
106
102
|
- lib/itunes_api/music/artist.rb
|
107
|
-
- lib/itunes_api/
|
103
|
+
- lib/itunes_api/music/artist_search.rb
|
104
|
+
- lib/itunes_api/requests/base.rb
|
105
|
+
- lib/itunes_api/requests/lookup.rb
|
106
|
+
- lib/itunes_api/requests/search.rb
|
108
107
|
- lib/itunes_api/version.rb
|
109
108
|
homepage: https://github.com/mariodarco/itunes-api
|
110
109
|
licenses:
|
@@ -127,7 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
127
126
|
version: '0'
|
128
127
|
requirements: []
|
129
128
|
rubyforge_project:
|
130
|
-
rubygems_version: 2.
|
129
|
+
rubygems_version: 2.5.2
|
131
130
|
signing_key:
|
132
131
|
specification_version: 4
|
133
132
|
summary: iTunes Api
|
data/.ruby-version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
ruby-2.4
|
data/.travis.yml
DELETED
data/lib/itunes_api/all.rb
DELETED
data/lib/itunes_api/music/all.rb
DELETED
data/lib/itunes_api/request.rb
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'open-uri'
|
2
|
-
require 'json'
|
3
|
-
|
4
|
-
module ItunesApi
|
5
|
-
# Allow requests to the iTunes API.
|
6
|
-
module Request
|
7
|
-
|
8
|
-
def response
|
9
|
-
JSON.parse(request)
|
10
|
-
end
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
def request
|
15
|
-
@request ||= open(url).read
|
16
|
-
end
|
17
|
-
|
18
|
-
def query
|
19
|
-
Addressable::URI.new(
|
20
|
-
query_values: query_values
|
21
|
-
).query
|
22
|
-
end
|
23
|
-
|
24
|
-
def query_values
|
25
|
-
{
|
26
|
-
country: COUNTRY_CODE,
|
27
|
-
limit: LIMIT,
|
28
|
-
media: 'music'
|
29
|
-
}
|
30
|
-
end
|
31
|
-
|
32
|
-
def results
|
33
|
-
response.fetch('results', [])
|
34
|
-
end
|
35
|
-
|
36
|
-
def url
|
37
|
-
"#{BASE_URL}/search?#{query}"
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|