bassnode-ruby-echonest 0.1.2 → 0.1.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.
- data/README.rdoc +0 -1
- data/Rakefile +4 -3
- data/bassnode-ruby-echonest.gemspec +2 -2
- data/console +45 -0
- data/lib/echonest.rb +16 -0
- data/lib/echonest/api.rb +61 -3
- data/lib/echonest/version.rb +1 -1
- data/spec/api_spec.rb +2 -1
- data/spec/catalog_spec.rb +32 -0
- metadata +8 -8
data/README.rdoc
CHANGED
data/Rakefile
CHANGED
@@ -3,8 +3,8 @@ require 'rake'
|
|
3
3
|
require 'rake/clean'
|
4
4
|
require 'rake/testtask'
|
5
5
|
require 'rake/packagetask'
|
6
|
-
require '
|
7
|
-
require '
|
6
|
+
require 'rubygems/package_task'
|
7
|
+
require 'rdoc/task'
|
8
8
|
require 'rake/contrib/sshpublisher'
|
9
9
|
require 'spec/rake/spectask'
|
10
10
|
require 'fileutils'
|
@@ -24,7 +24,7 @@ Spec::Rake::SpecTask.new do |t|
|
|
24
24
|
end
|
25
25
|
|
26
26
|
spec = eval(File.read("bassnode-ruby-echonest.gemspec"))
|
27
|
-
|
27
|
+
Gem::PackageTask.new(spec) do |p|
|
28
28
|
p.need_tar = true
|
29
29
|
p.gem_spec = spec
|
30
30
|
end
|
@@ -34,3 +34,4 @@ desc "Show information about the gem"
|
|
34
34
|
task :debug_gem do
|
35
35
|
puts spec.to_ruby
|
36
36
|
end
|
37
|
+
|
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{bassnode-ruby-echonest}
|
5
|
-
s.version = "0.1.
|
5
|
+
s.version = "0.1.3"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["youpy", "bassnode"]
|
9
|
-
s.date = %q{
|
9
|
+
s.date = %q{2012-02-12}
|
10
10
|
s.description = %q{An Ruby interface for Echo Nest Developer API}
|
11
11
|
s.summary = %q{An Ruby interface for Echo Nest Developer API}
|
12
12
|
s.email = %q{youpy@buycheapviagraonlinenow.com}
|
data/console
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'irb'
|
3
|
+
|
4
|
+
# ensure we use local gem
|
5
|
+
$LOAD_PATH.unshift('lib')
|
6
|
+
|
7
|
+
def consolize &block
|
8
|
+
|
9
|
+
yield
|
10
|
+
|
11
|
+
IRB.setup(nil)
|
12
|
+
irb = IRB::Irb.new
|
13
|
+
IRB.conf[:MAIN_CONTEXT] = irb.context
|
14
|
+
irb.context.evaluate("require 'irb/completion'", 0)
|
15
|
+
|
16
|
+
trap("SIGINT") do
|
17
|
+
irb.signal_handle
|
18
|
+
end
|
19
|
+
catch(:IRB_EXIT) do
|
20
|
+
irb.eval_input
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
consolize do
|
25
|
+
require 'echonest'
|
26
|
+
|
27
|
+
key = nil
|
28
|
+
|
29
|
+
locations = ["~/.mreko/echonest_api.key", "~/.echonest/api_key"]
|
30
|
+
locations.each do |config|
|
31
|
+
if File.exists?(File.expand_path(config))
|
32
|
+
key = File.read(File.expand_path(config))
|
33
|
+
break
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
raise "Need an EN key in one of these locations: #{locations.inspect}" unless key
|
38
|
+
|
39
|
+
@en = Echonest(key)
|
40
|
+
|
41
|
+
def en; @en; end
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
|
data/lib/echonest.rb
CHANGED
@@ -13,4 +13,20 @@ require 'echonest/element/tatum'
|
|
13
13
|
def Echonest(api_key) Echonest::Api.new(api_key) end
|
14
14
|
|
15
15
|
module Echonest
|
16
|
+
extend self
|
17
|
+
|
18
|
+
def debug(obj)
|
19
|
+
return unless debug?
|
20
|
+
|
21
|
+
if obj.is_a?(String)
|
22
|
+
puts obj
|
23
|
+
else
|
24
|
+
puts obj.inspect
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# MOAR DEBUGGING! *just for now
|
29
|
+
def debug?
|
30
|
+
true || ENV['DEBUG']
|
31
|
+
end
|
16
32
|
end
|
data/lib/echonest/api.rb
CHANGED
@@ -36,6 +36,10 @@ module Echonest
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
+
def catalog
|
40
|
+
ApiMethods::Catalog.new(self)
|
41
|
+
end
|
42
|
+
|
39
43
|
def song
|
40
44
|
ApiMethods::Song.new(self)
|
41
45
|
end
|
@@ -61,7 +65,7 @@ module Echonest
|
|
61
65
|
hash_to_list = lambda{|kv| [kv[0].to_s, kv[1]]}
|
62
66
|
params.each do |param|
|
63
67
|
if param.instance_of? Array
|
64
|
-
param[1].map do |p1|
|
68
|
+
Array(param[1]).map do |p1|
|
65
69
|
result << [param[0].to_s, p1]
|
66
70
|
end
|
67
71
|
else
|
@@ -105,6 +109,8 @@ module Echonest
|
|
105
109
|
res = connection.pop
|
106
110
|
response_body = res.content.read
|
107
111
|
else
|
112
|
+
Echonest.debug "#{method.to_s.upcase} #{uri}?#{build_params_to_list(params).inject(''){ |str, (key,val)| str << "#{key}=#{val}&"; str }}"
|
113
|
+
|
108
114
|
response_body = @user_agent.__send__(
|
109
115
|
method.to_s + '_content',
|
110
116
|
uri,
|
@@ -323,8 +329,60 @@ module Echonest
|
|
323
329
|
end
|
324
330
|
|
325
331
|
class Playlist < Base
|
326
|
-
|
327
|
-
|
332
|
+
@basic_parameters = %w[ format type artist_id artist song_id track_id results bucket limit dmca]
|
333
|
+
|
334
|
+
@static_parameters = %w[ artist_pick variety distribution adventurousness
|
335
|
+
seed_catalog description style mood
|
336
|
+
max_tempo min_tempo max_duration min_duration max_loudness min_loudness max_danceability min_danceability
|
337
|
+
max_energy min_energy artist_max_familiarity artist_min_familiarity artist_max_hotttnesss artist_min_hotttnesss
|
338
|
+
artist_start_year_before artist_start_year_after artist_end_year_before artist_end_year_after song_max_hotttnesss song_min_hotttnesss
|
339
|
+
min_longitude max_longitude min_latitude max_latitude mode key sort ] + @basic_parameters
|
340
|
+
|
341
|
+
@dynamic_parameters = %w[ session_id dmca adventurousness rating chain_xspf
|
342
|
+
steer steer_description steer_style steer_mood ] + @static_parameters
|
343
|
+
|
344
|
+
method_with_option(:basic, @basic_parameters)
|
345
|
+
method_with_option(:static, @static_parameters)
|
346
|
+
method_with_option(:dynamic, @dynamic_parameters)
|
347
|
+
end
|
348
|
+
|
349
|
+
# http://developer.echonest.com/docs/v4/catalog.html
|
350
|
+
class Catalog < Base
|
351
|
+
# type can be 'song' or 'artist' (Default)
|
352
|
+
def create(name, type="artist")
|
353
|
+
@api.request('catalog/create', :post, {:name => name, :type => type, :format => "json"}).body
|
354
|
+
end
|
355
|
+
|
356
|
+
# Updates (adds or deletes) items from a catalog. The body of the post should include an item block that describes modifications to the catalog.
|
357
|
+
# data: [{:item=>{:item_id => "hogehoge", :artist_name => "Oscar Peterson"}}]
|
358
|
+
def update(catalog_id, data)
|
359
|
+
json_data = data.to_json
|
360
|
+
@api.request('catalog/update', :post, {:id => catalog_id, :data_type => "json", :format => "json", :data => json_data}).body
|
361
|
+
end
|
362
|
+
|
363
|
+
# Checks the status of a catalog update.
|
364
|
+
method_with_option(:status, %w[format ticket])
|
365
|
+
|
366
|
+
# Get basic information on a catalog
|
367
|
+
method_with_option(:profile, %w[format id name])
|
368
|
+
|
369
|
+
# Returns data stored in the catalog. Also returns Echo Nest IDs for items that have been resolved to Echo Nest IDs
|
370
|
+
# along with information requested via bucket. If item_id is not set, all items (subject to the limits of the start and results parameters)
|
371
|
+
# are returned, otherwise, only the items explicitly specified by item_id are returned.
|
372
|
+
method_with_option(:read, %w[format id name item_id bucket results start])
|
373
|
+
|
374
|
+
# Returns feeds based on the artists in a taste profile. Unlike catalog/read method, the catalog/feed method interleaves items and sorts them by date.
|
375
|
+
# since: YYYY-mm-dd
|
376
|
+
# high_relevance: boolean (default false)
|
377
|
+
# bucket: news, blogs, reviews, audio and video blogs. If omitted defaults to news.
|
378
|
+
# result: default of 25
|
379
|
+
method_with_option(:feed, %w[format id bucket results start since high_relevance])
|
380
|
+
|
381
|
+
# Deletes the entire catalog. Only the API key used to create a catalog can be used to delete that catalog.
|
382
|
+
method_with_required_any('catalog', :delete, :post, %w[id], [], %w[format], lambda{})
|
383
|
+
|
384
|
+
# Returns a list of all catalogs created with the current key (account)
|
385
|
+
method_with_option(:list, %w[format results start])
|
328
386
|
end
|
329
387
|
end
|
330
388
|
end
|
data/lib/echonest/version.rb
CHANGED
data/spec/api_spec.rb
CHANGED
@@ -40,10 +40,11 @@ describe Echonest::Api do
|
|
40
40
|
end
|
41
41
|
|
42
42
|
it "should pass arguments including a file to user agent" do
|
43
|
+
pending "Failes due to incorrect stubbing."
|
44
|
+
|
43
45
|
file = open(fixture('sample.mp3'))
|
44
46
|
file.should_receive(:read).and_return('content')
|
45
47
|
|
46
|
-
|
47
48
|
@api.user_agent.should_receive(:post_async).
|
48
49
|
with(
|
49
50
|
URI('http://developer.echonest.com/api/v4/xxx/zzz?api_key=8TPE3VC60ODJTNTFE&bar=baz&format=json'),
|
@@ -0,0 +1,32 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require "echonest"
|
5
|
+
|
6
|
+
include SpecHelper
|
7
|
+
|
8
|
+
describe Echonest::ApiMethods::Catalog do
|
9
|
+
before do
|
10
|
+
@api = Echonest::Api.new('8TPE3VC60ODJTNTFE')
|
11
|
+
@catalog = Echonest::ApiMethods::Catalog.new(@api)
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "#create" do
|
15
|
+
it "should request to catalog/create with option" do
|
16
|
+
catalog_name = "catalog_name"
|
17
|
+
catalog_type = "artist"
|
18
|
+
@api.should_receive(:request).with("catalog/create", :post, {:name => catalog_name, :type => catalog_type, :format => "json"}).and_return{ Echonest::Response.new('{"hello":"world"}') }
|
19
|
+
@catalog.create(catalog_name, catalog_type)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "#update" do
|
24
|
+
it "should request to catalog/update with option" do
|
25
|
+
catalog_id = "catalog_id"
|
26
|
+
data = [{:item=>{:item_id => "hogehoge", :artist_name => "Oscar Peterson"}}]
|
27
|
+
@api.should_receive(:request).with("catalog/update", :post, {:id => catalog_id, :data_type => "json", :format => "json", :data => data.to_json}).and_return{ Echonest::Response.new('{"hello":"world"}') }
|
28
|
+
@catalog.update(catalog_id, data)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bassnode-ruby-echonest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 3
|
10
|
+
version: 0.1.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- youpy
|
@@ -16,8 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date:
|
20
|
-
default_executable:
|
19
|
+
date: 2012-02-12 00:00:00 Z
|
21
20
|
dependencies:
|
22
21
|
- !ruby/object:Gem::Dependency
|
23
22
|
name: libxml-ruby
|
@@ -90,6 +89,7 @@ files:
|
|
90
89
|
- README.rdoc
|
91
90
|
- Rakefile
|
92
91
|
- bassnode-ruby-echonest.gemspec
|
92
|
+
- console
|
93
93
|
- lib/echonest.rb
|
94
94
|
- lib/echonest/analysis.rb
|
95
95
|
- lib/echonest/api.rb
|
@@ -106,6 +106,7 @@ files:
|
|
106
106
|
- spec/api_spec.rb
|
107
107
|
- spec/apimethods_base_spec.rb
|
108
108
|
- spec/artist_spec.rb
|
109
|
+
- spec/catalog_spec.rb
|
109
110
|
- spec/echonest_spec.rb
|
110
111
|
- spec/fixtures/analysis.json
|
111
112
|
- spec/fixtures/profile.json
|
@@ -118,7 +119,6 @@ files:
|
|
118
119
|
- spec/spec.opts
|
119
120
|
- spec/spec_helper.rb
|
120
121
|
- spec/track_spec.rb
|
121
|
-
has_rdoc: true
|
122
122
|
homepage: http://github.com/bassnode/ruby-echonest
|
123
123
|
licenses: []
|
124
124
|
|
@@ -159,7 +159,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
159
159
|
requirements: []
|
160
160
|
|
161
161
|
rubyforge_project: bassnode-ruby-echonest
|
162
|
-
rubygems_version: 1.
|
162
|
+
rubygems_version: 1.8.11
|
163
163
|
signing_key:
|
164
164
|
specification_version: 3
|
165
165
|
summary: An Ruby interface for Echo Nest Developer API
|