insound_api 0.0.2
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/.travis.yml +3 -0
- data/Gemfile +12 -0
- data/LICENSE.txt +20 -0
- data/README.md +36 -0
- data/Rakefile +52 -0
- data/VERSION +1 -0
- data/insound_api.gemspec +83 -0
- data/lib/insound_api.rb +41 -0
- data/lib/insound_api/artist.rb +18 -0
- data/lib/insound_api/config.rb +5 -0
- data/lib/insound_api/object_base.rb +27 -0
- data/lib/insound_api/product.rb +17 -0
- data/lib/insound_api/query.rb +17 -0
- data/lib/insound_api/request.rb +76 -0
- data/lib/insound_api/response.rb +70 -0
- data/lib/insound_api/results.rb +68 -0
- data/test/config_test.rb +11 -0
- data/test/helper.rb +69 -0
- data/test/query_test.rb +140 -0
- data/test/request_test.rb +41 -0
- data/test/response_test.rb +40 -0
- data/test/webmock/bad_credentials.xml +8 -0
- data/test/webmock/jimmy_eat_world_vinyl.xml +45 -0
- data/test/webmock/maxresults.xml +332 -0
- data/test/webmock/no_results_found.xml +12 -0
- data/test/webmock/zen_arcade.xml +36 -0
- metadata +159 -0
@@ -0,0 +1,68 @@
|
|
1
|
+
module InsoundApi
|
2
|
+
class Results
|
3
|
+
|
4
|
+
attr_reader :warnings, :doc
|
5
|
+
|
6
|
+
# takes a nokogiri document
|
7
|
+
def initialize(document)
|
8
|
+
@doc = document
|
9
|
+
end
|
10
|
+
|
11
|
+
def search_url
|
12
|
+
@search_url ||= parse_str('search_url')
|
13
|
+
end
|
14
|
+
|
15
|
+
def products
|
16
|
+
@products ||= parse_objects('product_matches product', Product)
|
17
|
+
end
|
18
|
+
|
19
|
+
def products_total
|
20
|
+
@products_total ||= parse_int('total_product_results')
|
21
|
+
end
|
22
|
+
|
23
|
+
def artists
|
24
|
+
@artists ||= parse_objects('artist_matches artist', Artist)
|
25
|
+
end
|
26
|
+
|
27
|
+
def artists_total
|
28
|
+
@artists_total ||= parse_int('total_artist_results')
|
29
|
+
end
|
30
|
+
|
31
|
+
def total_results
|
32
|
+
@total_results ||= parse_int('total_results')
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
def parse_objects(selector, klass)
|
38
|
+
nodes = doc.css(selector)
|
39
|
+
nodes.map{|n| klass.new(n) }
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
def parse_int(selector)
|
44
|
+
Results.parse_int(selector, doc)
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.parse_int(selector, doc)
|
48
|
+
nodes = doc.css(selector)
|
49
|
+
if nodes.any?
|
50
|
+
nodes.first.inner_html.strip.to_i
|
51
|
+
else
|
52
|
+
0
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def parse_str(selector)
|
57
|
+
Results.parse_str(selector, doc)
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.parse_str(selector, doc)
|
61
|
+
nodes = doc.css(selector)
|
62
|
+
if nodes.any?
|
63
|
+
nodes.first.inner_html.strip
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
data/test/config_test.rb
ADDED
data/test/helper.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
begin
|
4
|
+
Bundler.setup(:default, :development)
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
$stderr.puts e.message
|
7
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
+
exit e.status_code
|
9
|
+
end
|
10
|
+
require 'test/unit'
|
11
|
+
require 'shoulda'
|
12
|
+
|
13
|
+
|
14
|
+
unless ENV['NO_MOCKING']
|
15
|
+
require 'webmock/test_unit'
|
16
|
+
end
|
17
|
+
|
18
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
19
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
20
|
+
require 'insound_api'
|
21
|
+
|
22
|
+
class Test::Unit::TestCase
|
23
|
+
|
24
|
+
def mocking?
|
25
|
+
!ENV['NO_MOCKING']
|
26
|
+
end
|
27
|
+
|
28
|
+
def setup_credentials
|
29
|
+
if mocking?
|
30
|
+
setup_test_credentials
|
31
|
+
else
|
32
|
+
setup_credentials_from_config
|
33
|
+
# give their webserver a little break
|
34
|
+
sleep(1) unless mocking?
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def setup_test_credentials
|
39
|
+
InsoundApi.setup do |config|
|
40
|
+
config.affiliate_id = 42
|
41
|
+
config.api_password = 'fart'
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
def setup_credentials_from_config
|
47
|
+
h = YAML.load_file('config.yml')
|
48
|
+
InsoundApi.setup do |config|
|
49
|
+
config.affiliate_id = h['affiliate_id']
|
50
|
+
config.api_password = h['api_password']
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def mock(name, query_string)
|
55
|
+
return unless mocking?
|
56
|
+
|
57
|
+
dir = File.dirname(__FILE__) + "/webmock/#{name}.xml"
|
58
|
+
file = File.open(dir)
|
59
|
+
body = file.read
|
60
|
+
url = "https://www.insound.com/ws/affiliate/#{query_string}&id=42&password=fart"
|
61
|
+
stub_request(:get, url).to_return(:status => 200, :body => body)
|
62
|
+
end
|
63
|
+
|
64
|
+
def teardown
|
65
|
+
InsoundApi.instance_variable_set(:@config, nil)
|
66
|
+
WebMock.reset! if mocking?
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
data/test/query_test.rb
ADDED
@@ -0,0 +1,140 @@
|
|
1
|
+
$:.unshift '.';require File.dirname(__FILE__) + '/helper'
|
2
|
+
|
3
|
+
module InsoundApi
|
4
|
+
class QueryTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
context 'with credentials' do
|
7
|
+
setup do
|
8
|
+
setup_credentials
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
context 'search by artist returning no results' do
|
14
|
+
setup do
|
15
|
+
mock(:no_results_found, "?artist=xxcxccxcx")
|
16
|
+
@results = Query.search(:artist => 'xxcxccxcx')
|
17
|
+
end
|
18
|
+
|
19
|
+
should 'return empty stuff' do
|
20
|
+
assert_equal [], @results.products
|
21
|
+
assert_equal [], @results.artists
|
22
|
+
|
23
|
+
assert_equal 0, @results.products_total
|
24
|
+
assert_equal 0, @results.artists_total
|
25
|
+
assert_equal 0, @results.total_results
|
26
|
+
assert @results.search_url
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'using module search' do
|
31
|
+
setup do
|
32
|
+
mock(:no_results_found, "?artist=xxcxccxcx")
|
33
|
+
@results = InsoundApi.search(:artist => 'xxcxccxcx')
|
34
|
+
end
|
35
|
+
|
36
|
+
should 'return empty stuff' do
|
37
|
+
assert_equal [], @results.products
|
38
|
+
assert_equal [], @results.artists
|
39
|
+
|
40
|
+
assert_equal 0, @results.products_total
|
41
|
+
assert_equal 0, @results.artists_total
|
42
|
+
assert_equal 0, @results.total_results
|
43
|
+
assert @results.search_url
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'search artist vinyl format' do
|
48
|
+
setup do
|
49
|
+
mock(:jimmy_eat_world_vinyl, "?artist=Jimmy%20Eat%20World&format=vinyl")
|
50
|
+
@results = Query.search(:artist => 'Jimmy Eat World', :format => 'vinyl')
|
51
|
+
end
|
52
|
+
|
53
|
+
should 'return actual stuff' do
|
54
|
+
assert_equal 3, @results.products.length
|
55
|
+
assert_equal 1, @results.artists.length
|
56
|
+
|
57
|
+
assert_equal 3, @results.products_total
|
58
|
+
assert_equal 1, @results.artists_total
|
59
|
+
assert_equal 4, @results.total_results
|
60
|
+
assert_nil @results.search_url
|
61
|
+
|
62
|
+
product = @results.products.first
|
63
|
+
assert product.url
|
64
|
+
assert_equal 'Jimmy Eat World', product.artist_name
|
65
|
+
assert_equal 'Invented', product.title
|
66
|
+
assert_equal 'Vinyl LP', product.format
|
67
|
+
assert_equal 'INS79668', product.id
|
68
|
+
|
69
|
+
artist = @results.artists.first
|
70
|
+
assert artist.url
|
71
|
+
assert_equal 'Jimmy Eat World', artist.name
|
72
|
+
assert_equal 19191, artist.id
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context 'search with bumped maxresults' do
|
77
|
+
setup do
|
78
|
+
mock(:maxresults, "?artist=arcade&maxresults=100")
|
79
|
+
@results = Query.search(:artist => 'arcade', :maxresults => 100)
|
80
|
+
end
|
81
|
+
|
82
|
+
should 'return multiple artists and products' do
|
83
|
+
assert_equal 30, @results.products.length
|
84
|
+
assert_equal 7, @results.artists.length
|
85
|
+
|
86
|
+
assert_equal 30, @results.products_total
|
87
|
+
assert_equal 7, @results.artists_total
|
88
|
+
assert_equal 37, @results.total_results
|
89
|
+
assert_nil @results.search_url
|
90
|
+
|
91
|
+
product = @results.products.first
|
92
|
+
assert product.url
|
93
|
+
assert_equal 'Arcade Fire', product.artist_name
|
94
|
+
assert_equal 'Funeral', product.title
|
95
|
+
assert_equal 'CD', product.format
|
96
|
+
assert_equal 'INS23877', product.id
|
97
|
+
|
98
|
+
artist = @results.artists.first
|
99
|
+
assert artist.url
|
100
|
+
assert_equal 'Arcade Fire', artist.name
|
101
|
+
assert_equal 29908, artist.id
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
|
106
|
+
context 'search using title' do
|
107
|
+
setup do
|
108
|
+
mock(:zen_arcade, "?artist=husker&title=zen%20arcade")
|
109
|
+
@results = Query.search(:artist => 'husker', :title => 'zen arcade')
|
110
|
+
end
|
111
|
+
|
112
|
+
should 'return multiple artists and products' do
|
113
|
+
assert_equal 2, @results.products.length
|
114
|
+
assert_equal 1, @results.artists.length
|
115
|
+
|
116
|
+
assert_equal 2, @results.products_total
|
117
|
+
assert_equal 1, @results.artists_total
|
118
|
+
assert_equal 3, @results.total_results
|
119
|
+
assert_nil @results.search_url
|
120
|
+
|
121
|
+
product = @results.products.first
|
122
|
+
assert product.url
|
123
|
+
assert_equal 'Husker Du', product.artist_name
|
124
|
+
assert_equal 'Zen Arcade', product.title
|
125
|
+
assert_equal 'Vinyl LP', product.format
|
126
|
+
assert_equal 'INS13241', product.id
|
127
|
+
|
128
|
+
artist = @results.artists.first
|
129
|
+
assert artist.url
|
130
|
+
assert_equal 'Husker Du', artist.name
|
131
|
+
assert_equal 21544, artist.id
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
end
|
140
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
$:.unshift '.';require File.dirname(__FILE__) + '/helper'
|
2
|
+
|
3
|
+
module InsoundApi
|
4
|
+
class RequestTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
context 'with credentials' do
|
7
|
+
setup do
|
8
|
+
setup_credentials
|
9
|
+
end
|
10
|
+
|
11
|
+
should 'raise if errors in response' do
|
12
|
+
if !mocking?
|
13
|
+
setup_test_credentials
|
14
|
+
end
|
15
|
+
|
16
|
+
mock(:bad_credentials, "?artist=townes%20van%20zandt&id=42&password=yyyyyy")
|
17
|
+
ex = assert_raise(RequestException) { Request.get(:artist => "townes van zandt") }
|
18
|
+
assert ex.message =~ /Invalid account information/i
|
19
|
+
end
|
20
|
+
|
21
|
+
should 'correctly build_url' do
|
22
|
+
if mocking?
|
23
|
+
request = Request.new(:artist => "townes van zandt")
|
24
|
+
assert_equal 'https://www.insound.com/ws/affiliate/?id=42&password=fart&artist=townes%20van%20zandt', request.build_url
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
should 'raise RequestException if artist not provided' do
|
29
|
+
ex = assert_raise(RequestException) { Request.get }
|
30
|
+
assert_equal ":artist is a required param for any request", ex.message
|
31
|
+
end
|
32
|
+
|
33
|
+
should 'raise RequestException if invalid format provided' do
|
34
|
+
ex = assert_raise(RequestException) { Request.get(:artist => 'blah', :format => 'fat32') }
|
35
|
+
assert_equal ":format must be one of the follwing: all, vinyl, seveninch, digital, poster, shirt, cd", ex.message
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
module InsoundApi
|
4
|
+
class ResponseTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
should 'parse xml into a nokogiri document' do
|
7
|
+
response = Response.new(:raw_xml => '<blah>1</blah>')
|
8
|
+
doc = response.doc
|
9
|
+
|
10
|
+
assert_equal Nokogiri::XML::Document, doc.class
|
11
|
+
assert_equal '1', doc.css('blah').first.inner_html
|
12
|
+
end
|
13
|
+
|
14
|
+
should 'report errors if any' do
|
15
|
+
xml = <<THEXML
|
16
|
+
<insound_query_response>
|
17
|
+
<errors>
|
18
|
+
<request_error>
|
19
|
+
<error_code>102</error_code>
|
20
|
+
<error_text>Invalid account information.</error_text>
|
21
|
+
</request_error>
|
22
|
+
<request_error>
|
23
|
+
<error_code>101</error_code>
|
24
|
+
<error_text>Missing required parameters</error_text>
|
25
|
+
</request_error>
|
26
|
+
</errors>
|
27
|
+
</insound_query_response>
|
28
|
+
THEXML
|
29
|
+
|
30
|
+
response = Response.new(:raw_xml => xml)
|
31
|
+
|
32
|
+
assert response.errors?
|
33
|
+
|
34
|
+
errors = [{:code=>"102", :text=>"Invalid account information."},
|
35
|
+
{:code=>"101", :text=>"Missing required parameters"}]
|
36
|
+
assert_equal errors, response.errors
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
<insound_query_response>
|
2
|
+
<warnings/>
|
3
|
+
<errors/>
|
4
|
+
<product_matches>
|
5
|
+
<product>
|
6
|
+
<url>
|
7
|
+
http://www.insound.com/Invented-Vinyl-LP-Jimmy-Eat-World/P/INS79668/&from=86902
|
8
|
+
</url>
|
9
|
+
<artist_name>Jimmy Eat World</artist_name>
|
10
|
+
<title>Invented</title>
|
11
|
+
<format>Vinyl LP</format>
|
12
|
+
<product_id>INS79668</product_id>
|
13
|
+
</product>
|
14
|
+
<product>
|
15
|
+
<url>
|
16
|
+
http://www.insound.com/Chase-This-Light-Vinyl-LP-Jimmy-Eat-World/P/INS39744/&from=86902
|
17
|
+
</url>
|
18
|
+
<artist_name>Jimmy Eat World</artist_name>
|
19
|
+
<title>Chase This Light</title>
|
20
|
+
<format>Vinyl LP</format>
|
21
|
+
<product_id>INS39744</product_id>
|
22
|
+
</product>
|
23
|
+
<product>
|
24
|
+
<url>
|
25
|
+
http://www.insound.com/Bleed-American-Vinyl-3xLP-Jimmy-Eat-World/P/INS111472/&from=86902
|
26
|
+
</url>
|
27
|
+
<artist_name>Jimmy Eat World</artist_name>
|
28
|
+
<title>Bleed American</title>
|
29
|
+
<format>Vinyl 3xLP</format>
|
30
|
+
<product_id>INS111472</product_id>
|
31
|
+
</product>
|
32
|
+
</product_matches>
|
33
|
+
<artist_matches>
|
34
|
+
<artist>
|
35
|
+
<artist_name>Jimmy Eat World</artist_name>
|
36
|
+
<url>
|
37
|
+
http://www.insound.com/Jimmy-Eat-World/A/19191/&from=86902
|
38
|
+
</url>
|
39
|
+
<artist_id>19191</artist_id>
|
40
|
+
</artist>
|
41
|
+
</artist_matches>
|
42
|
+
<total_results>4</total_results>
|
43
|
+
<total_product_results>3</total_product_results>
|
44
|
+
<total_artist_results>1</total_artist_results>
|
45
|
+
</insound_query_response>
|
@@ -0,0 +1,332 @@
|
|
1
|
+
<insound_query_response>
|
2
|
+
<warnings/>
|
3
|
+
<errors/>
|
4
|
+
<product_matches>
|
5
|
+
<product>
|
6
|
+
<url>
|
7
|
+
http://www.insound.com/Funeral-CD-Arcade-Fire/P/INS23877/&from=86902
|
8
|
+
</url>
|
9
|
+
<artist_name>Arcade Fire</artist_name>
|
10
|
+
<title>Funeral</title>
|
11
|
+
<format>CD</format>
|
12
|
+
<product_id>INS23877</product_id>
|
13
|
+
</product>
|
14
|
+
<product>
|
15
|
+
<url>
|
16
|
+
http://www.insound.com/The-Suburbs-Vinyl-2xLP-Arcade-Fire/P/INS76692/&from=86902
|
17
|
+
</url>
|
18
|
+
<artist_name>Arcade Fire</artist_name>
|
19
|
+
<title>The Suburbs</title>
|
20
|
+
<format>Vinyl 2xLP</format>
|
21
|
+
<product_id>INS76692</product_id>
|
22
|
+
</product>
|
23
|
+
<product>
|
24
|
+
<url>
|
25
|
+
http://www.insound.com/Neon-Bible-Vinyl-LP-Arcade-Fire/P/INS33679/&from=86902
|
26
|
+
</url>
|
27
|
+
<artist_name>Arcade Fire</artist_name>
|
28
|
+
<title>Neon Bible</title>
|
29
|
+
<format>Vinyl LP</format>
|
30
|
+
<product_id>INS33679</product_id>
|
31
|
+
</product>
|
32
|
+
<product>
|
33
|
+
<url>
|
34
|
+
http://www.insound.com/Neon-Bible-CD-Arcade-Fire/P/INS33678/&from=86902
|
35
|
+
</url>
|
36
|
+
<artist_name>Arcade Fire</artist_name>
|
37
|
+
<title>Neon Bible</title>
|
38
|
+
<format>CD</format>
|
39
|
+
<product_id>INS33678</product_id>
|
40
|
+
</product>
|
41
|
+
<product>
|
42
|
+
<url>
|
43
|
+
http://www.insound.com/Neon-Bible-Deluxe-Edition-CD-Arcade-Fire/P/INS33683/&from=86902
|
44
|
+
</url>
|
45
|
+
<artist_name>Arcade Fire</artist_name>
|
46
|
+
<title>Neon Bible (Deluxe Edition)</title>
|
47
|
+
<format>CD</format>
|
48
|
+
<product_id>INS33683</product_id>
|
49
|
+
</product>
|
50
|
+
<product>
|
51
|
+
<url>
|
52
|
+
http://www.insound.com/Funeral-Reissue-Vinyl-LP-Arcade-Fire/P/INS70891/&from=86902
|
53
|
+
</url>
|
54
|
+
<artist_name>Arcade Fire</artist_name>
|
55
|
+
<title>Funeral (Reissue)</title>
|
56
|
+
<format>Vinyl LP</format>
|
57
|
+
<product_id>INS70891</product_id>
|
58
|
+
</product>
|
59
|
+
<product>
|
60
|
+
<url>
|
61
|
+
http://www.insound.com/Arcade-Fire-CDep-Arcade-Fire/P/INS26865/&from=86902
|
62
|
+
</url>
|
63
|
+
<artist_name>Arcade Fire</artist_name>
|
64
|
+
<title>Arcade Fire</title>
|
65
|
+
<format>CDep</format>
|
66
|
+
<product_id>INS26865</product_id>
|
67
|
+
</product>
|
68
|
+
<product>
|
69
|
+
<url>
|
70
|
+
http://www.insound.com/May-29-30-2007-Show-Poster-poster-Arcade-Fire/P/INS36391/&from=86902
|
71
|
+
</url>
|
72
|
+
<artist_name>Arcade Fire</artist_name>
|
73
|
+
<title>May 29 & 30, 2007 Show Poster</title>
|
74
|
+
<format>Poster</format>
|
75
|
+
<product_id>INS36391</product_id>
|
76
|
+
</product>
|
77
|
+
<product>
|
78
|
+
<url>
|
79
|
+
http://www.insound.com/The-Suburbs-CD-Arcade-Fire/P/INS76693/&from=86902
|
80
|
+
</url>
|
81
|
+
<artist_name>Arcade Fire</artist_name>
|
82
|
+
<title>The Suburbs</title>
|
83
|
+
<format>CD</format>
|
84
|
+
<product_id>INS76693</product_id>
|
85
|
+
</product>
|
86
|
+
<product>
|
87
|
+
<url>
|
88
|
+
http://www.insound.com/Miroir-Noir-Deluxe-Edition-2xDVD-Arcade-Fire/P/INS54522/&from=86902
|
89
|
+
</url>
|
90
|
+
<artist_name>Arcade Fire</artist_name>
|
91
|
+
<title>Miroir Noir (Deluxe Edition)</title>
|
92
|
+
<format>2xDVD</format>
|
93
|
+
<product_id>INS54522</product_id>
|
94
|
+
</product>
|
95
|
+
<product>
|
96
|
+
<url>
|
97
|
+
http://www.insound.com/The-Suburbs-MP3-Arcade-Fire/P/INS78922/&from=86902
|
98
|
+
</url>
|
99
|
+
<artist_name>Arcade Fire</artist_name>
|
100
|
+
<title>The Suburbs</title>
|
101
|
+
<format>MP3</format>
|
102
|
+
<product_id>INS78922</product_id>
|
103
|
+
</product>
|
104
|
+
<product>
|
105
|
+
<url>
|
106
|
+
http://www.insound.com/The-Suburbs-Deluxe-Edition-CD-and-DVD-Arcade-Fire/P/INS96835/&from=86902
|
107
|
+
</url>
|
108
|
+
<artist_name>Arcade Fire</artist_name>
|
109
|
+
<title>The Suburbs (Deluxe Edition)</title>
|
110
|
+
<format>CD+DVD</format>
|
111
|
+
<product_id>INS96835</product_id>
|
112
|
+
</product>
|
113
|
+
<product>
|
114
|
+
<url>
|
115
|
+
http://www.insound.com/Outlands-Vinyl-LP-Deep-Sea-Arcade/P/INS108373/&from=86902
|
116
|
+
</url>
|
117
|
+
<artist_name>Deep Sea Arcade</artist_name>
|
118
|
+
<title>Outlands</title>
|
119
|
+
<format>Vinyl LP</format>
|
120
|
+
<product_id>INS108373</product_id>
|
121
|
+
</product>
|
122
|
+
<product>
|
123
|
+
<url>
|
124
|
+
http://www.insound.com/Power-Out-CDep-Arcade-Fire/P/INS26778/&from=86902
|
125
|
+
</url>
|
126
|
+
<artist_name>Arcade Fire</artist_name>
|
127
|
+
<title>Power Out</title>
|
128
|
+
<format>CDep</format>
|
129
|
+
<product_id>INS26778</product_id>
|
130
|
+
</product>
|
131
|
+
<product>
|
132
|
+
<url>
|
133
|
+
http://www.insound.com/Spring-Tour-2011-3-Chicago-poster-Arcade-Fire/P/INS95618/&from=86902
|
134
|
+
</url>
|
135
|
+
<artist_name>Arcade Fire</artist_name>
|
136
|
+
<title>Spring Tour 2011 #3 (Chicago)</title>
|
137
|
+
<format>Poster</format>
|
138
|
+
<product_id>INS95618</product_id>
|
139
|
+
</product>
|
140
|
+
<product>
|
141
|
+
<url>
|
142
|
+
http://www.insound.com/Miroir-Noir-DVD-Arcade-Fire/P/INS54521/&from=86902
|
143
|
+
</url>
|
144
|
+
<artist_name>Arcade Fire</artist_name>
|
145
|
+
<title>Miroir Noir</title>
|
146
|
+
<format>DVD</format>
|
147
|
+
<product_id>INS54521</product_id>
|
148
|
+
</product>
|
149
|
+
<product>
|
150
|
+
<url>
|
151
|
+
http://www.insound.com/December-5-6-2010-Show-Poster-poster-Arcade-Fire/P/INS90082/&from=86902
|
152
|
+
</url>
|
153
|
+
<artist_name>Arcade Fire</artist_name>
|
154
|
+
<title>December 5-6, 2010 Show Poster</title>
|
155
|
+
<format>Poster</format>
|
156
|
+
<product_id>INS90082</product_id>
|
157
|
+
</product>
|
158
|
+
<product>
|
159
|
+
<url>
|
160
|
+
http://www.insound.com/June-30-2011-Show-Poster-poster-Arcade-Fire/P/INS98765/&from=86902
|
161
|
+
</url>
|
162
|
+
<artist_name>Arcade Fire</artist_name>
|
163
|
+
<title>June 30, 2011 Show Poster</title>
|
164
|
+
<format>Poster</format>
|
165
|
+
<product_id>INS98765</product_id>
|
166
|
+
</product>
|
167
|
+
<product>
|
168
|
+
<url>
|
169
|
+
http://www.insound.com/Spring-Tour-2011-1-West-Coast-poster-Arcade-Fire/P/INS95619/&from=86902
|
170
|
+
</url>
|
171
|
+
<artist_name>Arcade Fire</artist_name>
|
172
|
+
<title>Spring Tour 2011 #1 (West Coast)</title>
|
173
|
+
<format>Poster</format>
|
174
|
+
<product_id>INS95619</product_id>
|
175
|
+
</product>
|
176
|
+
<product>
|
177
|
+
<url>
|
178
|
+
http://www.insound.com/Funeral-MP3-Arcade-Fire/P/INS55433/&from=86902
|
179
|
+
</url>
|
180
|
+
<artist_name>Arcade Fire</artist_name>
|
181
|
+
<title>Funeral</title>
|
182
|
+
<format>MP3</format>
|
183
|
+
<product_id>INS55433</product_id>
|
184
|
+
</product>
|
185
|
+
<product>
|
186
|
+
<url>
|
187
|
+
http://www.insound.com/July-12-2010-Show-Poster-poster-Arcade-Fire/P/INS80896/&from=86902
|
188
|
+
</url>
|
189
|
+
<artist_name>Arcade Fire</artist_name>
|
190
|
+
<title>July 12, 2010 Show Poster</title>
|
191
|
+
<format>Poster</format>
|
192
|
+
<product_id>INS80896</product_id>
|
193
|
+
</product>
|
194
|
+
<product>
|
195
|
+
<url>
|
196
|
+
http://www.insound.com/September-21-and-22-2011-Show-Poster-poster-Arcade-Fire/P/INS106729/&from=86902
|
197
|
+
</url>
|
198
|
+
<artist_name>Arcade Fire</artist_name>
|
199
|
+
<title>September 21 and 22, 2011 Show Poster</title>
|
200
|
+
<format>Poster</format>
|
201
|
+
<product_id>INS106729</product_id>
|
202
|
+
</product>
|
203
|
+
<product>
|
204
|
+
<url>
|
205
|
+
http://www.insound.com/Spring-Tour-2011-4-Tennessee-and-Texas-poster-Arcade-Fire/P/INS95616/&from=86902
|
206
|
+
</url>
|
207
|
+
<artist_name>Arcade Fire</artist_name>
|
208
|
+
<title>Spring Tour 2011 #4 (Tennessee and Texas)</title>
|
209
|
+
<format>Poster</format>
|
210
|
+
<product_id>INS95616</product_id>
|
211
|
+
</product>
|
212
|
+
<product>
|
213
|
+
<url>
|
214
|
+
http://www.insound.com/Europe-Tour-2011-poster-Arcade-Fire/P/INS98764/&from=86902
|
215
|
+
</url>
|
216
|
+
<artist_name>Arcade Fire</artist_name>
|
217
|
+
<title>Europe Tour 2011</title>
|
218
|
+
<format>Poster</format>
|
219
|
+
<product_id>INS98764</product_id>
|
220
|
+
</product>
|
221
|
+
<product>
|
222
|
+
<url>
|
223
|
+
http://www.insound.com/The-Suburbs-Deluxe-MP3-Arcade-Fire/P/INS98280/&from=86902
|
224
|
+
</url>
|
225
|
+
<artist_name>Arcade Fire</artist_name>
|
226
|
+
<title>The Suburbs Deluxe</title>
|
227
|
+
<format>MP3</format>
|
228
|
+
<product_id>INS98280</product_id>
|
229
|
+
</product>
|
230
|
+
<product>
|
231
|
+
<url>
|
232
|
+
http://www.insound.com/Solo-Singles-Series-7-Vinyl-7inch-Trance-and-The-Arcade/P/INS17162/&from=86902
|
233
|
+
</url>
|
234
|
+
<artist_name>Trance and The Arcade</artist_name>
|
235
|
+
<title>Solo Singles Series 7</title>
|
236
|
+
<format>Vinyl 7"</format>
|
237
|
+
<product_id>INS17162</product_id>
|
238
|
+
</product>
|
239
|
+
<product>
|
240
|
+
<url>
|
241
|
+
http://www.insound.com/Neon-Bible-MP3-Arcade-Fire/P/INS55434/&from=86902
|
242
|
+
</url>
|
243
|
+
<artist_name>Arcade Fire</artist_name>
|
244
|
+
<title>Neon Bible</title>
|
245
|
+
<format>MP3</format>
|
246
|
+
<product_id>INS55434</product_id>
|
247
|
+
</product>
|
248
|
+
<product>
|
249
|
+
<url>
|
250
|
+
http://www.insound.com/Canadian-Tour-September-2010-Show-Poster-poster-Arcade-Fire/P/INS89256/&from=86902
|
251
|
+
</url>
|
252
|
+
<artist_name>Arcade Fire</artist_name>
|
253
|
+
<title>Canadian Tour, September 2010 Show Poster</title>
|
254
|
+
<format>Poster</format>
|
255
|
+
<product_id>INS89256</product_id>
|
256
|
+
</product>
|
257
|
+
<product>
|
258
|
+
<url>
|
259
|
+
http://www.insound.com/December-8-12-2010-Show-Poster-poster-Arcade-Fire/P/INS90081/&from=86902
|
260
|
+
</url>
|
261
|
+
<artist_name>Arcade Fire</artist_name>
|
262
|
+
<title>December 8-12, 2010 Show Poster</title>
|
263
|
+
<format>Poster</format>
|
264
|
+
<product_id>INS90081</product_id>
|
265
|
+
</product>
|
266
|
+
<product>
|
267
|
+
<url>
|
268
|
+
http://www.insound.com/The-String-Quartet-Tribute-to-Arcade-Fires-Funereal-MP3-Arcade-Fire-String-Quartet-Tribute/P/INS39454/&from=86902
|
269
|
+
</url>
|
270
|
+
<artist_name>Arcade Fire String Quartet Tribute</artist_name>
|
271
|
+
<title>
|
272
|
+
The String Quartet Tribute to Arcade Fire's Funereal
|
273
|
+
</title>
|
274
|
+
<format>MP3</format>
|
275
|
+
<product_id>INS39454</product_id>
|
276
|
+
</product>
|
277
|
+
</product_matches>
|
278
|
+
<artist_matches>
|
279
|
+
<artist>
|
280
|
+
<artist_name>Arcade Fire</artist_name>
|
281
|
+
<url>
|
282
|
+
http://www.insound.com/Arcade-Fire/A/29908/&from=86902
|
283
|
+
</url>
|
284
|
+
<artist_id>29908</artist_id>
|
285
|
+
</artist>
|
286
|
+
<artist>
|
287
|
+
<artist_name>Arcade Fire String Quartet Tribute</artist_name>
|
288
|
+
<url>
|
289
|
+
http://www.insound.com/Arcade-Fire-String-Quartet-Tribute/A/34443/&from=86902
|
290
|
+
</url>
|
291
|
+
<artist_id>34443</artist_id>
|
292
|
+
</artist>
|
293
|
+
<artist>
|
294
|
+
<artist_name>Deep Sea Arcade</artist_name>
|
295
|
+
<url>
|
296
|
+
http://www.insound.com/Deep-Sea-Arcade/A/51254/&from=86902
|
297
|
+
</url>
|
298
|
+
<artist_id>51254</artist_id>
|
299
|
+
</artist>
|
300
|
+
<artist>
|
301
|
+
<artist_name>Flashlight Arcade</artist_name>
|
302
|
+
<url>
|
303
|
+
http://www.insound.com/Flashlight-Arcade/A/30088/&from=86902
|
304
|
+
</url>
|
305
|
+
<artist_id>30088</artist_id>
|
306
|
+
</artist>
|
307
|
+
<artist>
|
308
|
+
<artist_name>LCD Soundsystem / Arcade Fire</artist_name>
|
309
|
+
<url>
|
310
|
+
http://www.insound.com/LCD-Soundsystem-Arcade-Fire/A/34698/&from=86902
|
311
|
+
</url>
|
312
|
+
<artist_id>34698</artist_id>
|
313
|
+
</artist>
|
314
|
+
<artist>
|
315
|
+
<artist_name>LCD Soundsystem/Arcade Fire</artist_name>
|
316
|
+
<url>
|
317
|
+
http://www.insound.com/LCD-SoundsystemArcade-Fire/A/38758/&from=86902
|
318
|
+
</url>
|
319
|
+
<artist_id>38758</artist_id>
|
320
|
+
</artist>
|
321
|
+
<artist>
|
322
|
+
<artist_name>Trance and The Arcade</artist_name>
|
323
|
+
<url>
|
324
|
+
http://www.insound.com/Trance-and-The-Arcade/A/20727/&from=86902
|
325
|
+
</url>
|
326
|
+
<artist_id>20727</artist_id>
|
327
|
+
</artist>
|
328
|
+
</artist_matches>
|
329
|
+
<total_results>37</total_results>
|
330
|
+
<total_product_results>30</total_product_results>
|
331
|
+
<total_artist_results>7</total_artist_results>
|
332
|
+
</insound_query_response>
|