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.
- data/VERSION.yml +1 -1
- data/examples/artist_audio.rb +33 -0
- data/lib/echonest.rb +39 -29
- data/lib/echonest/artist.rb +57 -53
- data/lib/echonest/paged_result.rb +33 -0
- data/lib/echonest/xml/artist_doc.rb +23 -0
- data/lib/echonest/xml/artist_search_results.rb +14 -0
- data/lib/echonest/xml/audio_doc.rb +20 -0
- data/lib/echonest/xml/audio_result.rb +13 -0
- data/lib/echonest/xml/audio_results.rb +16 -0
- data/lib/echonest/xml/blogs_doc.rb +15 -0
- data/lib/echonest/xml/blogs_result.rb +14 -0
- data/lib/echonest/xml/blogs_results.rb +18 -0
- data/lib/echonest/xml/familiarity_result.rb +12 -0
- data/lib/echonest/xml/hotttnesss_result.rb +12 -0
- data/lib/echonest/xml/news_doc.rb +15 -0
- data/lib/echonest/xml/news_result.rb +14 -0
- data/lib/echonest/xml/news_results.rb +16 -0
- data/lib/echonest/xml/profile_result.rb +12 -0
- data/lib/echonest/xml/reviews_doc.rb +16 -0
- data/lib/echonest/xml/reviews_result.rb +15 -0
- data/lib/echonest/xml/reviews_results.rb +17 -0
- data/lib/echonest/xml/similar_doc.rb +15 -0
- data/lib/echonest/xml/similar_result.rb +14 -0
- data/lib/echonest/xml/similar_results.rb +16 -0
- data/lib/echonest/xml/urls_result.rb +14 -0
- data/lib/echonest/xml/video_doc.rb +16 -0
- data/lib/echonest/xml/video_result.rb +14 -0
- data/lib/echonest/xml/video_results.rb +17 -0
- data/spec/echonest/paged_result_spec.rb +66 -0
- data/spec/echonest/xml/artist_search_results_spec.rb +25 -0
- data/spec/echonest/{audio_result_spec.rb → xml/audio_result_spec.rb} +9 -9
- data/spec/echonest/{blog_result_spec.rb → xml/blogs_result_spec.rb} +10 -10
- data/spec/echonest/{familiarity_result_spec.rb → xml/familiarity_result_spec.rb} +7 -7
- data/spec/echonest/{hotttness_result_spec.rb → xml/hotttness_result_spec.rb} +7 -7
- data/spec/echonest/{news_result_spec.rb → xml/news_result_spec.rb} +9 -9
- data/spec/echonest/{profile_result_spec.rb → xml/profile_result_spec.rb} +5 -5
- data/spec/echonest/xml/refactor.rb +12 -0
- data/spec/echonest/{reviews_result_spec.rb → xml/reviews_result_spec.rb} +9 -9
- data/spec/echonest/{similar_result_spec.rb → xml/similar_result_spec.rb} +7 -7
- data/spec/echonest/{urls_result_spec.rb → xml/urls_result_spec.rb} +6 -6
- data/spec/echonest/{video_result_spec.rb → xml/video_result_spec.rb} +9 -9
- data/spec/spec_helper.rb +2 -0
- metadata +57 -48
- data/lib/echonest/artist_search.rb +0 -18
- data/lib/echonest/audio_doc.rb +0 -18
- data/lib/echonest/audio_result.rb +0 -12
- data/lib/echonest/audio_results.rb +0 -15
- data/lib/echonest/blog_doc.rb +0 -13
- data/lib/echonest/blog_result.rb +0 -12
- data/lib/echonest/blog_results.rb +0 -15
- data/lib/echonest/familiarity_result.rb +0 -11
- data/lib/echonest/hotttnesss_result.rb +0 -11
- data/lib/echonest/news_doc.rb +0 -13
- data/lib/echonest/news_result.rb +0 -12
- data/lib/echonest/news_results.rb +0 -15
- data/lib/echonest/profile_result.rb +0 -11
- data/lib/echonest/reviews_doc.rb +0 -15
- data/lib/echonest/reviews_result.rb +0 -12
- data/lib/echonest/reviews_results.rb +0 -15
- data/lib/echonest/similar_doc.rb +0 -13
- data/lib/echonest/similar_result.rb +0 -12
- data/lib/echonest/similar_results.rb +0 -11
- data/lib/echonest/urls_result.rb +0 -11
- data/lib/echonest/video_doc.rb +0 -14
- data/lib/echonest/video_result.rb +0 -12
- data/lib/echonest/video_results.rb +0 -15
- data/spec/echonest/search_spec.rb +0 -51
data/VERSION.yml
CHANGED
@@ -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/
|
19
|
-
|
20
|
-
require "echonest/
|
21
|
-
|
22
|
-
require "echonest/
|
23
|
-
require "echonest/
|
24
|
-
require "echonest/
|
25
|
-
|
26
|
-
require "echonest/
|
27
|
-
|
28
|
-
require "echonest/
|
29
|
-
|
30
|
-
require "echonest/
|
31
|
-
|
32
|
-
require "echonest/
|
33
|
-
|
34
|
-
require "echonest/
|
35
|
-
require "echonest/
|
36
|
-
require "echonest/
|
37
|
-
|
38
|
-
require "echonest/
|
39
|
-
|
40
|
-
require "echonest/
|
41
|
-
|
42
|
-
require "echonest/
|
43
|
-
|
44
|
-
require "echonest/
|
45
|
-
require "echonest/
|
46
|
-
require "echonest/
|
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"
|
data/lib/echonest/artist.rb
CHANGED
@@ -1,70 +1,74 @@
|
|
1
1
|
|
2
2
|
module EchoNest
|
3
3
|
class Artist
|
4
|
-
|
4
|
+
attr_accessor :id
|
5
5
|
|
6
6
|
def initialize(id=nil)
|
7
7
|
@id = id if id
|
8
8
|
end
|
9
9
|
|
10
|
-
|
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
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
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
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
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
|
-
|
55
|
-
|
56
|
-
|
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
|
60
|
-
|
61
|
-
|
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
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
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,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
|