gingerhendrix-echonest 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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