itunes_api 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c771828d631c80dd7ef7b555ca9172c79b58baf8
4
- data.tar.gz: 60fdc7036173756e07a4f0d64561b8b20b58552f
3
+ metadata.gz: f0119772a5f3282816339b02adb15ed086292f73
4
+ data.tar.gz: dfcbbf5230c641efba8adf69ecbb6f6405329ca9
5
5
  SHA512:
6
- metadata.gz: 3b5989a5a4b21a7073321545974ae04f55df3d3d504598017ec6e0aba56df4f7c5233a2f7cd6886b5d8e610c2cf29b9f374cac5eb74eaf729669ac20c66e4556
7
- data.tar.gz: 11b1ae2aa25b1671dc00f9fb200ab0020876e6a926f2ac8a8cae8774178726a0bc12f1b97478d551db0d51717a125d94ea4758d765b6650174ca056a90607a39
6
+ metadata.gz: 78a8a929d19ce114f8821f9dac825ee5bdb05164ca1b435886768d3d976e2912595ffd4421f090b2656568c3d1704ebb7f12c8f8251166732d2e30604e47df74
7
+ data.tar.gz: e08ab36a8e01cc425fc05cdfaaf195b31f1566ccbcfd280a505c5d8ea2ceb85f3d2cff3ef686d086dc3405cc7ce6503b6efa33f61bc5096ed2e03d663cc8df8b
data/README.md CHANGED
@@ -37,16 +37,10 @@ end
37
37
 
38
38
  ## Usage
39
39
 
40
- To return all the Apple ids associated with the search for a Artist name
41
-
42
- ```ruby
43
- ItunesApi::Music.all_apple_ids('Pink Floyd')
44
- ```
45
-
46
40
  To get all artists returning from a search term
47
41
 
48
42
  ```ruby
49
- ItunesApi::Music.all_artists_by_name('Led Zeppelin')
43
+ ItunesApi::Music.find_by_name('Led Zeppelin')
50
44
  ```
51
45
 
52
46
  To return a specific artist, based on the artist's Apple id
@@ -61,27 +55,38 @@ They are lazily fetched when calling artist.albums.
61
55
  To return only the albums for a specific artist, based on the artist's Apple id
62
56
 
63
57
  ```ruby
64
- ItunesApi::Music.albums_for_artist(265766061)
58
+ ItunesApi::Music.find_albums_by_apple_id(265766061)
65
59
  ```
66
60
 
67
61
  To return a specific album, based on the album's collection id
68
62
 
69
63
  ```ruby
70
- ItunesApi::Music.find_by_collection_id(collection_id, store)
64
+ ItunesApi::Music.find_by_collection_id(286930912)
71
65
  ```
72
66
 
73
67
  Note that each request that returns albums does not automatically return songs.
74
68
  They are lazily fetched when calling album.tracklist.
75
69
 
70
+ To return only the songs for a specific album, based on the album's collection id
71
+
72
+ ```ruby
73
+ ItunesApi::Music.find_songs_by_collection_id(286930912)
74
+ ```
75
+
76
+ To return a specific track, based on its track id
77
+
78
+ ```ruby
79
+ ItunesApi::Music.find_by_track_id(286931522)
80
+ ```
81
+
76
82
  ---
77
83
 
78
84
  An argument holding the country code can be used to look into different stores than the default one
79
85
 
80
86
  ```ruby
81
- ItunesApi::Music.all_apple_ids('Pink Floyd', :it)
82
- ItunesApi::Music.all_artists_by_name('Led Zeppelin', :fr)
87
+ ItunesApi::Music.find_by_name('Led Zeppelin', :fr)
83
88
  ItunesApi::Music.find_by_apple_id(265766061, :us)
84
- ItunesApi::Music.albums_for_artist(265766061, :es)
89
+ ItunesApi::Music.find_albums_by_apple_id(265766061, :es)
85
90
  ```
86
91
 
87
92
  ## Development
@@ -16,23 +16,19 @@ module ItunesApi
16
16
 
17
17
  class << self
18
18
  def find_by_collection_id(collection_id, store)
19
- result = album(collection_id, store)
19
+ result = albums(collection_id, store).first
20
20
 
21
21
  new(*result.attributes) if result
22
22
  end
23
23
 
24
- def for_artist(apple_id, store)
24
+ def find_by_apple_id(apple_id, store)
25
25
  albums(apple_id, store).map { |album| new(*album.attributes) }
26
26
  end
27
27
 
28
28
  private
29
29
 
30
- def album(collection_id, store)
31
- Requests::Albums.find_by_collection_id(collection_id, store)
32
- end
33
-
34
- def albums(apple_id, store)
35
- Requests::Albums.find_by_apple_id(apple_id, store)
30
+ def albums(id, store)
31
+ Requests::Albums.find_by_id(id, store)
36
32
  end
37
33
  end
38
34
 
@@ -61,7 +57,7 @@ module ItunesApi
61
57
  end
62
58
 
63
59
  def tracklist
64
- @tracklist ||= songs.map { |song| Song.new(*song.attributes) }
60
+ @tracklist ||= Song.find_by_collection_id(collection_id, store)
65
61
  end
66
62
 
67
63
  private
@@ -79,10 +75,6 @@ module ItunesApi
79
75
  def pre_release?
80
76
  release_on > Date.today
81
77
  end
82
-
83
- def songs
84
- @songs ||= Requests::Songs.find_by_collection_id(collection_id, store)
85
- end
86
78
  end
87
79
  end
88
80
  end
@@ -5,30 +5,27 @@ module ItunesApi
5
5
  attr_reader_init :amg_id, :apple_id, :genre, :link, :name, :store
6
6
 
7
7
  class << self
8
- def all_apple_ids(name, store)
9
- find_all_by_name(name, store).map(&:apple_id)
10
- end
11
-
12
- def find_all_by_name(name, store)
8
+ def find_by_name(name, store)
13
9
  Requests::Search.artists(name, store).map do |result|
14
10
  new(*result.attributes)
15
11
  end
16
12
  end
17
13
 
18
14
  def find_by_apple_id(apple_id, store)
19
- artist = artist(apple_id, store)
20
- artist ? new(*artist.attributes) : nil
15
+ result = artists(apple_id, store).first
16
+
17
+ new(*result.attributes) if result
21
18
  end
22
19
 
23
20
  private
24
21
 
25
- def artist(apple_id, store)
26
- Requests::Artist.find_by_apple_id(apple_id, store)
22
+ def artists(id, store)
23
+ Requests::Artist.find_by_id(id, store)
27
24
  end
28
25
  end
29
26
 
30
27
  def albums
31
- @albums ||= Album.for_artist(apple_id, store)
28
+ @albums ||= Album.find_by_apple_id(apple_id, store)
32
29
  end
33
30
 
34
31
  def to_hash
@@ -5,18 +5,14 @@ module ItunesApi
5
5
  class Albums
6
6
  include Request
7
7
  attr_reader_init :search_id, :store
8
- selfie :find_by_apple_id, :find_by_collection_id
8
+ selfie :find_by_id
9
9
 
10
- def find_by_apple_id
11
- unwrapped_results.map do |result|
10
+ def find_by_id
11
+ unwrapped_results(:collection).map do |result|
12
12
  Results::Album.new(result, store)
13
13
  end
14
14
  end
15
15
 
16
- def find_by_collection_id
17
- find_by_apple_id.first
18
- end
19
-
20
16
  private
21
17
 
22
18
  def action
@@ -25,20 +21,12 @@ module ItunesApi
25
21
 
26
22
  def query
27
23
  {
28
- id: search_id,
29
24
  country: store.to_s.upcase,
30
25
  entity: :album,
26
+ id: search_id,
31
27
  limit: LIMIT
32
28
  }
33
29
  end
34
-
35
- def unwrapped_results
36
- return [] unless results.any?
37
-
38
- results.find_all do |wrappers|
39
- wrappers['wrapperType'] == 'collection'
40
- end
41
- end
42
30
  end
43
31
  end
44
32
  end
@@ -4,13 +4,13 @@ module ItunesApi
4
4
  # Allows querying the API via lookup for artists.
5
5
  class Artist
6
6
  include Request
7
- attr_reader_init :apple_id, :store
8
- selfie :find_by_apple_id
7
+ attr_reader_init :search_id, :store
8
+ selfie :find_by_id
9
9
 
10
- def find_by_apple_id
11
- return nil unless results.any?
12
-
13
- Results::Artist.new(results.first, store)
10
+ def find_by_id
11
+ unwrapped_results(:artist).map do |result|
12
+ Results::Artist.new(result, store)
13
+ end
14
14
  end
15
15
 
16
16
  private
@@ -21,7 +21,7 @@ module ItunesApi
21
21
 
22
22
  def query
23
23
  {
24
- id: apple_id,
24
+ id: search_id,
25
25
  country: store.to_s.upcase,
26
26
  limit: LIMIT
27
27
  }
@@ -4,12 +4,12 @@ module ItunesApi
4
4
  # Allows querying the API via lookup for album songs.
5
5
  class Songs
6
6
  include Request
7
- attr_reader_init :collection_id, :store
8
- selfie :find_by_collection_id
7
+ attr_reader_init :search_id, :store
8
+ selfie :find_by_id
9
9
 
10
- def find_by_collection_id
11
- unwrapped_results.map do |result|
12
- Results::Song.new(result)
10
+ def find_by_id
11
+ unwrapped_results(:track).map do |result|
12
+ Results::Song.new(result, store)
13
13
  end
14
14
  end
15
15
 
@@ -21,21 +21,13 @@ module ItunesApi
21
21
 
22
22
  def query
23
23
  {
24
- entity: 'song',
25
- id: collection_id,
26
24
  country: store.to_s.upcase,
25
+ entity: 'song',
26
+ id: search_id,
27
27
  limit: LIMIT,
28
28
  sort: 'trackNumber'
29
29
  }
30
30
  end
31
-
32
- def unwrapped_results
33
- return [] unless results.any?
34
-
35
- results.find_all do |wrappers|
36
- wrappers['wrapperType'] == 'track'
37
- end
38
- end
39
31
  end
40
32
  end
41
33
  end
@@ -3,15 +3,48 @@ module ItunesApi
3
3
  module Results
4
4
  # Wrapper for song search results.
5
5
  class Song
6
- attr_reader_init :data
6
+ attr_reader_init :data, :store
7
7
  private :data
8
8
 
9
+ def album
10
+ @album ||= data['collectionName']
11
+ end
12
+
13
+ def artist
14
+ @artist ||= data['artistName']
15
+ end
16
+
17
+ def attributes
18
+ [
19
+ album,
20
+ artist,
21
+ duration,
22
+ explicitness,
23
+ genre,
24
+ link,
25
+ name,
26
+ number,
27
+ preview,
28
+ store,
29
+ streamable,
30
+ track_id
31
+ ]
32
+ end
33
+
9
34
  def duration
10
35
  @duration ||= track_lenght(data['trackTimeMillis'])
11
36
  end
12
37
 
13
- def attributes
14
- [duration, name, number, streamable]
38
+ def explicitness
39
+ @explicitness ||= data['trackExplicitness']
40
+ end
41
+
42
+ def genre
43
+ @genre ||= data['primaryGenreName']
44
+ end
45
+
46
+ def link
47
+ @link ||= data['trackViewUrl']
15
48
  end
16
49
 
17
50
  def name
@@ -22,10 +55,18 @@ module ItunesApi
22
55
  @number ||= data['trackNumber']
23
56
  end
24
57
 
58
+ def preview
59
+ @preview ||= data['previewUrl']
60
+ end
61
+
25
62
  def streamable
26
63
  @streamable ||= data['isStreamable']
27
64
  end
28
65
 
66
+ def track_id
67
+ @track_id ||= data['trackId']
68
+ end
69
+
29
70
  private
30
71
 
31
72
  def track_lenght(milliseconds)
@@ -2,15 +2,57 @@ module ItunesApi
2
2
  module Music
3
3
  # Wrapper for song results.
4
4
  class Song
5
- attr_reader_init :duration, :name, :number, :streamable
5
+ attr_reader_init :album,
6
+ :artist,
7
+ :duration,
8
+ :explicitness,
9
+ :genre,
10
+ :link,
11
+ :name,
12
+ :number,
13
+ :preview,
14
+ :store,
15
+ :streamable,
16
+ :track_id
17
+
6
18
  alias streamable? streamable
7
19
 
20
+ class << self
21
+ def find_by_collection_id(collection_id, store)
22
+ songs(collection_id, store).map { |song| new(*song.attributes) }
23
+ end
24
+
25
+ def find_by_track_id(track_id, store)
26
+ result = songs(track_id, store).first
27
+
28
+ new(*result.attributes) if result
29
+ end
30
+
31
+ private
32
+
33
+ def songs(id, store)
34
+ Requests::Songs.find_by_id(id, store)
35
+ end
36
+ end
37
+
38
+ def explicit?
39
+ explicitness == 'explicit'
40
+ end
41
+
8
42
  def to_hash
9
43
  {
44
+ album: album,
45
+ artist: artist,
10
46
  duration: duration,
47
+ explicit: explicit?,
48
+ genre: genre,
49
+ link: link,
11
50
  name: name,
12
51
  number: number,
13
- stremable: streamable?
52
+ preview: preview,
53
+ store: store,
54
+ streamable: streamable,
55
+ track_id: track_id
14
56
  }
15
57
  end
16
58
  end
@@ -9,26 +9,30 @@ module ItunesApi
9
9
  # Public interface for the Music Api
10
10
  module Music
11
11
  class << self
12
- def all_apple_ids(name, store = default_store)
13
- Artist.all_apple_ids(name, store)
14
- end
15
-
16
- def all_artists_by_name(name, store = default_store)
17
- Artist.find_all_by_name(name, store)
12
+ def find_by_name(name, store = default_store)
13
+ Artist.find_by_name(name, store)
18
14
  end
19
15
 
20
16
  def find_by_apple_id(apple_id, store = default_store)
21
17
  Music::Artist.find_by_apple_id(apple_id, store)
22
18
  end
23
19
 
24
- def albums_for_artist(apple_id, store = default_store)
25
- Music::Album.for_artist(apple_id, store)
20
+ def find_albums_by_apple_id(apple_id, store = default_store)
21
+ Music::Album.find_by_apple_id(apple_id, store)
26
22
  end
27
23
 
28
- def find_by_collection_id(collection_id, store)
24
+ def find_by_collection_id(collection_id, store = default_store)
29
25
  Music::Album.find_by_collection_id(collection_id, store)
30
26
  end
31
27
 
28
+ def find_songs_by_collection_id(collection_id, store = default_store)
29
+ Music::Song.find_by_collection_id(collection_id, store)
30
+ end
31
+
32
+ def find_by_track_id(track_id, store = default_store)
33
+ Music::Song.find_by_track_id(track_id, store)
34
+ end
35
+
32
36
  private
33
37
 
34
38
  def default_store
@@ -9,16 +9,24 @@ module ItunesApi
9
9
 
10
10
  private
11
11
 
12
- def parsed_response
13
- JSON.parse(response.body)
14
- end
15
-
16
12
  def connection
17
13
  Faraday.new(url: BASE_URL)
18
14
  end
19
15
 
16
+ def parsed_response
17
+ JSON.parse(response.body)
18
+ end
19
+
20
20
  def response
21
21
  connection.get(action, query)
22
22
  end
23
+
24
+ def unwrapped_results(type)
25
+ return [] unless results.any?
26
+
27
+ results.find_all do |wrappers|
28
+ wrappers['wrapperType'] == type.to_s
29
+ end
30
+ end
23
31
  end
24
32
  end
@@ -1,3 +1,3 @@
1
1
  module ItunesApi
2
- VERSION = '2.1.0'.freeze
2
+ VERSION = '2.2.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: itunes_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.0
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-08-06 00:00:00.000000000 Z
11
+ date: 2017-08-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday