gingerhendrix-echonest 0.2.0 → 0.3.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.
Files changed (68) hide show
  1. data/VERSION.yml +1 -1
  2. data/examples/artist_audio.rb +33 -0
  3. data/lib/echonest.rb +39 -29
  4. data/lib/echonest/artist.rb +57 -53
  5. data/lib/echonest/paged_result.rb +33 -0
  6. data/lib/echonest/xml/artist_doc.rb +23 -0
  7. data/lib/echonest/xml/artist_search_results.rb +14 -0
  8. data/lib/echonest/xml/audio_doc.rb +20 -0
  9. data/lib/echonest/xml/audio_result.rb +13 -0
  10. data/lib/echonest/xml/audio_results.rb +16 -0
  11. data/lib/echonest/xml/blogs_doc.rb +15 -0
  12. data/lib/echonest/xml/blogs_result.rb +14 -0
  13. data/lib/echonest/xml/blogs_results.rb +18 -0
  14. data/lib/echonest/xml/familiarity_result.rb +12 -0
  15. data/lib/echonest/xml/hotttnesss_result.rb +12 -0
  16. data/lib/echonest/xml/news_doc.rb +15 -0
  17. data/lib/echonest/xml/news_result.rb +14 -0
  18. data/lib/echonest/xml/news_results.rb +16 -0
  19. data/lib/echonest/xml/profile_result.rb +12 -0
  20. data/lib/echonest/xml/reviews_doc.rb +16 -0
  21. data/lib/echonest/xml/reviews_result.rb +15 -0
  22. data/lib/echonest/xml/reviews_results.rb +17 -0
  23. data/lib/echonest/xml/similar_doc.rb +15 -0
  24. data/lib/echonest/xml/similar_result.rb +14 -0
  25. data/lib/echonest/xml/similar_results.rb +16 -0
  26. data/lib/echonest/xml/urls_result.rb +14 -0
  27. data/lib/echonest/xml/video_doc.rb +16 -0
  28. data/lib/echonest/xml/video_result.rb +14 -0
  29. data/lib/echonest/xml/video_results.rb +17 -0
  30. data/spec/echonest/paged_result_spec.rb +66 -0
  31. data/spec/echonest/xml/artist_search_results_spec.rb +25 -0
  32. data/spec/echonest/{audio_result_spec.rb → xml/audio_result_spec.rb} +9 -9
  33. data/spec/echonest/{blog_result_spec.rb → xml/blogs_result_spec.rb} +10 -10
  34. data/spec/echonest/{familiarity_result_spec.rb → xml/familiarity_result_spec.rb} +7 -7
  35. data/spec/echonest/{hotttness_result_spec.rb → xml/hotttness_result_spec.rb} +7 -7
  36. data/spec/echonest/{news_result_spec.rb → xml/news_result_spec.rb} +9 -9
  37. data/spec/echonest/{profile_result_spec.rb → xml/profile_result_spec.rb} +5 -5
  38. data/spec/echonest/xml/refactor.rb +12 -0
  39. data/spec/echonest/{reviews_result_spec.rb → xml/reviews_result_spec.rb} +9 -9
  40. data/spec/echonest/{similar_result_spec.rb → xml/similar_result_spec.rb} +7 -7
  41. data/spec/echonest/{urls_result_spec.rb → xml/urls_result_spec.rb} +6 -6
  42. data/spec/echonest/{video_result_spec.rb → xml/video_result_spec.rb} +9 -9
  43. data/spec/spec_helper.rb +2 -0
  44. metadata +57 -48
  45. data/lib/echonest/artist_search.rb +0 -18
  46. data/lib/echonest/audio_doc.rb +0 -18
  47. data/lib/echonest/audio_result.rb +0 -12
  48. data/lib/echonest/audio_results.rb +0 -15
  49. data/lib/echonest/blog_doc.rb +0 -13
  50. data/lib/echonest/blog_result.rb +0 -12
  51. data/lib/echonest/blog_results.rb +0 -15
  52. data/lib/echonest/familiarity_result.rb +0 -11
  53. data/lib/echonest/hotttnesss_result.rb +0 -11
  54. data/lib/echonest/news_doc.rb +0 -13
  55. data/lib/echonest/news_result.rb +0 -12
  56. data/lib/echonest/news_results.rb +0 -15
  57. data/lib/echonest/profile_result.rb +0 -11
  58. data/lib/echonest/reviews_doc.rb +0 -15
  59. data/lib/echonest/reviews_result.rb +0 -12
  60. data/lib/echonest/reviews_results.rb +0 -15
  61. data/lib/echonest/similar_doc.rb +0 -13
  62. data/lib/echonest/similar_result.rb +0 -12
  63. data/lib/echonest/similar_results.rb +0 -11
  64. data/lib/echonest/urls_result.rb +0 -11
  65. data/lib/echonest/video_doc.rb +0 -14
  66. data/lib/echonest/video_result.rb +0 -12
  67. data/lib/echonest/video_results.rb +0 -15
  68. data/spec/echonest/search_spec.rb +0 -51
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
2
  :major: 0
3
- :minor: 2
3
+ :minor: 3
4
4
  :patch: 0
@@ -0,0 +1,33 @@
1
+
2
+ require 'rubygems'
3
+
4
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
5
+ require 'echonest'
6
+ require 'highline'
7
+
8
+ include EchoNest
9
+
10
+ EchoNest.api_key = "CREDOYO7GFJ9OW3TV"
11
+
12
+ HighLine.track_eof = false
13
+ highline = HighLine.new
14
+
15
+ artist_name = highline.ask "Please type an artist name? "
16
+ artist_search = Artist.find artist_name
17
+ search_names = artist_search.map(&:name)
18
+ highline.say "Found #{search_names.length}"
19
+ choice = highline.choose do |menu|
20
+ menu.select_by = :index
21
+ menu.choices(*search_names)
22
+ end
23
+ idx = search_names.index choice
24
+ highline.say "Finding audio for #{artist_search[idx].name} - #{artist_search[idx].id}"
25
+ artist = Artist.new artist_search[idx].id
26
+ audio = artist.audio
27
+ highline.say "Found #{audio.found}, retrieved #{audio.length}"
28
+ highline.say highline.list( audio.map(&:title) )
29
+ while highline.agree "Next?"
30
+ audio.next_page
31
+ highline.say highline.list( audio.map(&:title) )
32
+ end
33
+
data/lib/echonest.rb CHANGED
@@ -1,6 +1,8 @@
1
1
 
2
2
  require 'happymapper'
3
3
  require 'open-uri'
4
+ require 'activesupport'
5
+ require 'delegate'
4
6
 
5
7
  module EchoNest
6
8
  def self.api_key=(api_key)
@@ -14,33 +16,41 @@ module EchoNest
14
16
  end
15
17
 
16
18
  require "echonest/api_request.rb"
19
+ require "echonest/paged_result.rb"
20
+
17
21
  require "echonest/artist.rb"
18
- require "echonest/artist_search.rb"
19
- require "echonest/audio_doc.rb"
20
- require "echonest/audio_results.rb"
21
- require "echonest/audio_result.rb"
22
- require "echonest/blog_doc.rb"
23
- require "echonest/blog_results.rb"
24
- require "echonest/blog_result.rb"
25
- require "echonest/familiarity_result.rb"
26
- require "echonest/hotttnesss_result.rb"
27
-
28
- require "echonest/news_doc.rb"
29
- require "echonest/news_results.rb"
30
- require "echonest/news_result.rb"
31
-
32
- require "echonest/profile_result.rb"
33
-
34
- require "echonest/reviews_doc.rb"
35
- require "echonest/reviews_results.rb"
36
- require "echonest/reviews_result.rb"
37
-
38
- require "echonest/similar_doc.rb"
39
- require "echonest/similar_results.rb"
40
- require "echonest/similar_result.rb"
41
-
42
- require "echonest/urls_result.rb"
43
-
44
- require "echonest/video_doc.rb"
45
- require "echonest/video_results.rb"
46
- require "echonest/video_result.rb"
22
+ require "echonest/xml/artist_doc.rb"
23
+
24
+ require "echonest/xml/artist_search_results.rb"
25
+
26
+ require "echonest/xml/audio_doc.rb"
27
+ require "echonest/xml/audio_results.rb"
28
+ require "echonest/xml/audio_result.rb"
29
+
30
+ require "echonest/xml/blogs_doc.rb"
31
+ require "echonest/xml/blogs_results.rb"
32
+ require "echonest/xml/blogs_result.rb"
33
+
34
+ require "echonest/xml/familiarity_result.rb"
35
+
36
+ require "echonest/xml/hotttnesss_result.rb"
37
+
38
+ require "echonest/xml/news_doc.rb"
39
+ require "echonest/xml/news_results.rb"
40
+ require "echonest/xml/news_result.rb"
41
+
42
+ require "echonest/xml/profile_result.rb"
43
+
44
+ require "echonest/xml/reviews_doc.rb"
45
+ require "echonest/xml/reviews_results.rb"
46
+ require "echonest/xml/reviews_result.rb"
47
+
48
+ require "echonest/xml/similar_doc.rb"
49
+ require "echonest/xml/similar_results.rb"
50
+ require "echonest/xml/similar_result.rb"
51
+
52
+ require "echonest/xml/urls_result.rb"
53
+
54
+ require "echonest/xml/video_doc.rb"
55
+ require "echonest/xml/video_results.rb"
56
+ require "echonest/xml/video_result.rb"
@@ -1,70 +1,74 @@
1
1
 
2
2
  module EchoNest
3
3
  class Artist
4
- include HappyMapper
4
+ attr_accessor :id
5
5
 
6
6
  def initialize(id=nil)
7
7
  @id = id if id
8
8
  end
9
9
 
10
- element :name, String
11
- element :id, String
12
- element :familiarity, Float
13
- element :hotttnesss, Float
14
- element :foreign_id, String
10
+ def self.service(name, options = {})
15
11
 
16
- element :mb_url, String
17
- element :official_url, String
18
- element :myspace_url, String
19
- element :wikipedia_url, String
20
- element :amazon_url, String
21
- element :itunes_url, String
22
-
23
-
24
- def get_audio
25
- request = ApiRequest.new("get_audio", {:id => id})
26
- AudioResult.parse request.fetch
27
- end
28
-
29
- def get_blogs
30
- request = ApiRequest.new("get_audio", {:id => id})
31
- BlogResult.parse request.fetch
32
- end
33
-
34
- def get_familiarity
35
- request = ApiRequest.new("get_familiarity", {:id => id})
36
- FamiliarityResult.parse request.fetch
37
- end
38
-
39
- def get_hotttnesss
40
- request = ApiRequest.new("get_hotttnesss", {:id => id})
41
- HotttnesssResult.parse request.fetch
42
- end
43
-
44
- def get_news
45
- request = ApiRequest.new("get_news", {:id => id})
46
- NewsResult.parse request.fetch
47
- end
12
+ define_method "get_#{name.to_s}" do |*args|
13
+ options = args[0] if args.length == 1
14
+ options = {:id => id}.merge(options)
15
+ request = ApiRequest.new("get_#{name.to_s}", options)
16
+ "Xml::#{name.to_s.titleize}Result".constantize.parse request.fetch
17
+ end
48
18
 
49
- def get_profile
50
- request = ApiRequest.new("get_profile", {:id => id})
51
- ProfileResult.parse request.fetch
52
- end
19
+ if !options[:singular]
20
+ define_method name do
21
+ return instance_variable_get("@#{name.to_s}") if instance_variable_get("@#{name.to_s}")
22
+ result = self.send("get_#{name.to_s}")
23
+ pager = Proc.new { |start, rows|
24
+ self.send("get_#{name.to_s}", :start => start, :rows => rows).results
25
+ }
26
+ page = PagedResult.new result.results, pager
27
+ instance_variable_set("@#{name.to_s}", page)
28
+ end
29
+ else
30
+ if !options[:provides]
31
+ define_method name do
32
+ return instance_variable_get("@#{name.to_s}") if instance_variable_get("@#{name.to_s}")
33
+ result = self.send("get_#{name.to_s}")
34
+ instance_variable_set("@#{name.to_s}", result.artist.send(name))
35
+ end
36
+ else
37
+
38
+ define_method name do
39
+ return instance_variable_get("@#{name.to_s}") if instance_variable_get("@#{name.to_s}")
40
+ result = self.send("get_#{name.to_s}")
41
+ instance_variable_set("@#{name.to_s}", result.artist)
42
+ end
53
43
 
54
- def get_similar
55
- request = ApiRequest.new("get_similar", {:id => id})
56
- SimilarResult.parse request.fetch
44
+ options[:provides].each do |prop|
45
+ define_method prop do
46
+ return instance_variable_get("@#{prop.to_s}") if instance_variable_get("@#{prop.to_s}")
47
+ instance_variable_set("@#{prop.to_s}", self.send(name).send(prop))
48
+ end
49
+ end
50
+ end
51
+ end
57
52
  end
58
53
 
59
- def get_urls
60
- request = ApiRequest.new("get_urls", {:id => id})
61
- UrlsResult.parse request.fetch
54
+ def self.find(query, options={})
55
+ options = {:query => query}.merge(options)
56
+ request = ApiRequest.new("search_artists", options)
57
+ results = Xml::ArtistSearchResults.parse(request.fetch)
58
+ results.artists
62
59
  end
63
60
 
64
- def get_video
65
- request = ApiRequest.new("get_video", {:id => id})
66
- VideoResult.parse request.fetch
67
- end
68
-
61
+ service :audio
62
+ service :blogs
63
+ service :familiarity, :singular => true
64
+ service :hotttnesss, :singular => true
65
+ service :news
66
+ service :profile, :singular => true, :provides => [:id, :name, :foreign_id]
67
+ service :reviews
68
+ service :similar
69
+ service :urls, :singular => true, :provides => [:mb_url, :official_url, :myspace_url, :wikipedia_url, :amazon_url, :itunes_url]
70
+ service :video
71
+
72
+
69
73
  end
70
74
  end
@@ -0,0 +1,33 @@
1
+
2
+
3
+
4
+ module EchoNest
5
+ class PagedResult < DelegateClass(Array)
6
+
7
+ def initialize(results, block, options={})
8
+ @results = results
9
+ @update = block
10
+ @page_name = options[:page] || :docs
11
+ @available = @results.send(@page_name)
12
+ super(@available)
13
+ end
14
+
15
+ def found
16
+ @results.found
17
+ end
18
+
19
+ def next_page
20
+ results = @update.call @available.length, 15
21
+ @available += results.send(@page_name)
22
+ self.__setobj__(@available)
23
+ end
24
+
25
+ def [](i)
26
+ return @available[i] if @available[i]
27
+ next_page
28
+ @available[i]
29
+ end
30
+
31
+
32
+ end
33
+ end
@@ -0,0 +1,23 @@
1
+
2
+ module EchoNest
3
+ module Xml
4
+ class ArtistDoc
5
+ include HappyMapper
6
+
7
+ tag :artist
8
+
9
+ element :name, String
10
+ element :id, String
11
+ element :familiarity, Float
12
+ element :hotttnesss, Float
13
+ element :foreign_id, String
14
+
15
+ element :mb_url, String
16
+ element :official_url, String
17
+ element :myspace_url, String
18
+ element :wikipedia_url, String
19
+ element :amazon_url, String
20
+ element :itunes_url, String
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,14 @@
1
+
2
+ module EchoNest
3
+ module Xml
4
+ class ArtistSearchResults
5
+ include HappyMapper
6
+
7
+ tag :response
8
+
9
+ # has_one :status, RequestStatus
10
+ # has_one :query, RequestQuery
11
+ has_many :artists, ArtistDoc
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,20 @@
1
+
2
+ module EchoNest
3
+ module Xml
4
+ class AudioDoc
5
+ include HappyMapper
6
+
7
+ tag :doc
8
+
9
+ element :artist_id, String
10
+ element :foreign_artist_id, String
11
+ element :artist, String
12
+ element :release, String
13
+ element :title, String
14
+ element :url, String
15
+ element :link, String
16
+ element :date, String
17
+ element :length, String
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,13 @@
1
+
2
+ module EchoNest
3
+ module Xml
4
+ class AudioResult
5
+ include HappyMapper
6
+
7
+ tag :response
8
+
9
+ has_one :artist, ArtistDoc
10
+ has_one :results, AudioResults
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,16 @@
1
+
2
+ module EchoNest
3
+ module Xml
4
+ class AudioResults
5
+ include HappyMapper
6
+
7
+ tag :results
8
+
9
+ attribute :found, String
10
+ attribute :shown, String
11
+ attribute :start, String
12
+
13
+ has_many :docs, AudioDoc
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+
2
+ module EchoNest
3
+ module Xml
4
+ class BlogsDoc
5
+ include HappyMapper
6
+
7
+ tag :doc
8
+
9
+ element :name, String
10
+ element :url, String
11
+ element :summary, String
12
+ element :date_found, String
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+
2
+ module EchoNest
3
+ module Xml
4
+ class BlogsResult
5
+ include HappyMapper
6
+
7
+ tag :response
8
+
9
+ has_one :artist, ArtistDoc
10
+ has_one :results, BlogsResults
11
+
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,18 @@
1
+
2
+ module EchoNest
3
+ module Xml
4
+ class BlogsResults
5
+ include HappyMapper
6
+
7
+ tag :results
8
+
9
+ attribute :found, String
10
+ attribute :shown, String
11
+ attribute :start, String
12
+
13
+ has_many :docs, BlogsDoc
14
+
15
+ end
16
+ end
17
+ end
18
+
@@ -0,0 +1,12 @@
1
+
2
+ module EchoNest
3
+ module Xml
4
+ class FamiliarityResult
5
+ include HappyMapper
6
+
7
+ tag :response
8
+
9
+ has_one :artist, ArtistDoc
10
+ end
11
+ end
12
+ end