musicbrainz 0.7.7 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/test.yml +26 -0
  3. data/.gitignore +2 -2
  4. data/Gemfile +11 -0
  5. data/Gemfile.lock +54 -0
  6. data/LICENSE +2 -2
  7. data/README.md +21 -10
  8. data/lib/musicbrainz/bindings/artist.rb +0 -1
  9. data/lib/musicbrainz/bindings/artist_search.rb +0 -1
  10. data/lib/musicbrainz/bindings/discid_releases.rb +13 -0
  11. data/lib/musicbrainz/bindings/recording.rb +19 -0
  12. data/lib/musicbrainz/bindings/{track_search.rb → recording_search.rb} +1 -2
  13. data/lib/musicbrainz/bindings/relations.rb +1 -2
  14. data/lib/musicbrainz/bindings/release_group_search.rb +0 -1
  15. data/lib/musicbrainz/client_modules/caching_proxy.rb +27 -13
  16. data/lib/musicbrainz/models/base_model.rb +12 -2
  17. data/lib/musicbrainz/models/recording.rb +20 -0
  18. data/lib/musicbrainz/models/release.rb +8 -1
  19. data/lib/musicbrainz/models/track.rb +0 -4
  20. data/lib/musicbrainz/version.rb +1 -1
  21. data/lib/musicbrainz.rb +4 -1
  22. data/musicbrainz.gemspec +3 -6
  23. data/spec/bindings/recording_search_spec.rb +48 -0
  24. data/spec/bindings/relations_spec.rb +45 -26
  25. data/spec/bindings/release_group_search_spec.rb +24 -6
  26. data/spec/bindings/release_spec.rb +94 -18
  27. data/spec/client_modules/cache_spec.rb +18 -17
  28. data/spec/deprecated/cache_config_spec.rb +4 -6
  29. data/spec/deprecated/proxy_config_spec.rb +4 -6
  30. data/spec/fixtures/artist/find_69b39eab-6577-46a4-a9f5-817839092033.xml +168 -0
  31. data/spec/fixtures/artist/release_groups_69b39eab-6577-46a4-a9f5-817839092033.xml +412 -0
  32. data/spec/fixtures/artist/search_kasabian.xml +104 -0
  33. data/spec/fixtures/recording/find_b3015bab-1540-4d4e-9f30-14872a1525f7.xml +8 -0
  34. data/spec/fixtures/recording/search_bound_for_the_floor_local_h.xml +647 -0
  35. data/spec/fixtures/release/find_2225dd4c-ae9a-403b-8ea0-9e05014c778f.xml +44 -0
  36. data/spec/fixtures/release/find_2225dd4c-ae9a-403b-8ea0-9e05014c778f_tracks.xml +151 -0
  37. data/spec/fixtures/release/find_b94cb547-cf7a-4357-894c-53c3bf33b093.xml +52 -0
  38. data/spec/fixtures/release/find_by_discid_pmzhT6ZlFiwSRCdVwV0eqire5_Y-.xml +141 -0
  39. data/spec/fixtures/release/list_6f33e0f0-cde2-38f9-9aee-2c60af8d1a61.xml +344 -0
  40. data/spec/fixtures/release_group/search_kasabian_empire_album.xml +117 -0
  41. data/spec/models/artist_spec.rb +77 -46
  42. data/spec/models/base_model_spec.rb +50 -22
  43. data/spec/models/recording_spec.rb +42 -0
  44. data/spec/models/release_group_spec.rb +61 -55
  45. data/spec/models/release_spec.rb +63 -28
  46. data/spec/models/track_spec.rb +19 -15
  47. data/spec/spec_helper.rb +7 -7
  48. data/spec/support/mock_helpers.rb +13 -0
  49. metadata +55 -93
  50. data/.rspec +0 -1
  51. data/.travis.yml +0 -4
  52. data/spec/bindings/track_search_spec.rb +0 -17
  53. data/spec/fixtures/artist/search.xml +0 -67
  54. data/spec/fixtures/kasabian.xml +0 -1
  55. data/spec/fixtures/release/list.xml +0 -344
  56. /data/spec/fixtures/release_group/{entity.xml → find_6f33e0f0-cde2-38f9-9aee-2c60af8d1a61.xml} +0 -0
  57. /data/spec/fixtures/release_group/{search.xml → search_kasabian_empire.xml} +0 -0
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
1
  require "spec_helper"
4
2
 
5
3
  describe MusicBrainz::Bindings::Release do
@@ -7,37 +5,115 @@ describe MusicBrainz::Bindings::Release do
7
5
  describe 'attributes' do
8
6
  describe 'format' do
9
7
  context 'single cd' do
8
+ let(:response) {
9
+ <<-XML
10
+ <release>
11
+ <medium-list count="1">
12
+ <medium>
13
+ <format>CD</format>
14
+ </medium>
15
+ </medium-list>
16
+ </release>
17
+ XML
18
+ }
19
+ let(:xml) {
20
+ Nokogiri::XML.parse(response)
21
+ }
22
+ let(:release) {
23
+ described_class.parse(xml)
24
+ }
25
+
10
26
  it 'returns CD' do
11
- response = '<release><medium-list count="1"><medium><format>CD</format></medium></medium-list></release>'
12
- xml = Nokogiri::XML.parse(response)
13
- described_class.parse(xml)[:format].should == 'CD'
27
+ expect(release[:format]).to eq 'CD'
14
28
  end
15
29
  end
16
-
30
+
17
31
  context 'multiple cds' do
32
+ let(:response) {
33
+ <<-XML
34
+ <release>
35
+ <medium-list count="2">
36
+ <medium>
37
+ <format>CD</format>
38
+ <track-list count="11"/>
39
+ </medium>
40
+ <medium>
41
+ <title>bonus disc</title>
42
+ <format>CD</format>
43
+ </medium>
44
+ </medium-list>
45
+ </release>
46
+ XML
47
+ }
48
+ let(:xml) {
49
+ Nokogiri::XML.parse(response)
50
+ }
51
+ let(:release) {
52
+ described_class.parse(xml)
53
+ }
54
+
18
55
  it 'returns 2xCD' do
19
- response = '<release><medium-list count="2"><medium><format>CD</format><track-list count="11" /></medium><medium><title>bonus disc</title><format>CD</format></medium></medium-list></release>'
20
- xml = Nokogiri::XML.parse(response)
21
- described_class.parse(xml)[:format].should == '2xCD'
56
+ expect(release[:format]).to eq '2xCD'
22
57
  end
23
58
  end
24
-
59
+
25
60
  context 'different formats' do
61
+ let(:response) {
62
+ <<-XML
63
+ <release>
64
+ <medium-list count="2">
65
+ <medium>
66
+ <format>DVD</format>
67
+ </medium>
68
+ <medium>
69
+ <format>CD</format>
70
+ </medium>
71
+ </medium-list>
72
+ </release>
73
+ XML
74
+ }
75
+ let(:xml) {
76
+ Nokogiri::XML.parse(response)
77
+ }
78
+ let(:release) {
79
+ described_class.parse(xml)
80
+ }
81
+
26
82
  it 'returns DVD + CD' do
27
- response = '<release><medium-list count="2"><medium><format>DVD</format></medium><medium><format>CD</format></medium></medium-list></release>'
28
- xml = Nokogiri::XML.parse(response)
29
- described_class.parse(xml)[:format].should == 'DVD + CD'
83
+ expect(release[:format]).to eq 'DVD + CD'
30
84
  end
31
85
  end
32
-
86
+
33
87
  context 'different formats plus multiple mediums with same format' do
88
+ let(:response) {
89
+ <<-XML
90
+ <release>
91
+ <medium-list count="2">
92
+ <medium>
93
+ <format>CD</format>
94
+ </medium>
95
+ <medium>
96
+ <format>CD</format>
97
+ </medium>
98
+ <medium>
99
+ <format>DVD</format>
100
+ </medium>
101
+ </medium-list>
102
+ </release>
103
+ XML
104
+ }
105
+ let(:xml) {
106
+ Nokogiri::XML.parse(response)
107
+ }
108
+ let(:release) {
109
+ described_class.parse(xml)
110
+ }
111
+
34
112
  it 'returns 2xCD + DVD' do
35
- response = '<release><medium-list count="2"><medium><format>CD</format></medium><medium><format>CD</format></medium><medium><format>DVD</format></medium></medium-list></release>'
36
- xml = Nokogiri::XML.parse(response)
37
- described_class.parse(xml)[:format].should == '2xCD + DVD'
113
+ expect(release[:format]).to eq '2xCD + DVD'
38
114
  end
39
115
  end
40
116
  end
41
117
  end
42
118
  end
43
- end
119
+ end
@@ -1,22 +1,22 @@
1
- # encoding: utf-8
2
-
3
1
  require "ostruct"
4
2
  require "spec_helper"
5
3
 
6
4
  describe MusicBrainz::ClientModules::CachingProxy do
7
- let(:old_cache_path){ File.join(File.dirname(__FILE__), '..', '..', 'tmp', 'spec_cache') }
8
- let(:tmp_cache_path){ File.join(File.dirname(__FILE__), '..', '..', 'tmp', 'cache_module_spec_cache') }
9
5
  let(:test_mbid){ "69b39eab-6577-46a4-a9f5-817839092033" }
6
+ let(:tmp_cache_path){ File.join(File.dirname(__FILE__), '..', '..', 'tmp', 'cache_module_spec_cache') }
10
7
  let(:test_cache_file){ "#{tmp_cache_path}/03/48/ec/6c2bee685d9a96f95ed46378f624714e7a4650b0d44c1a8eee5bac2480.xml" }
11
- let(:test_response_file){ File.join(File.dirname(__FILE__), "../fixtures/kasabian.xml") }
12
- let(:test_response){ File.open(test_response_file).read }
8
+ let(:test_response){ read_fixture('artist/find_69b39eab-6577-46a4-a9f5-817839092033.xml') }
13
9
 
14
10
  before(:all) do
15
11
  MusicBrainz.config.cache_path = File.join(File.dirname(__FILE__), '..', '..', 'tmp', 'cache_module_spec_cache')
16
12
  end
17
13
 
14
+ before do
15
+ File.delete(test_cache_file) if File.exist?(test_cache_file)
16
+ end
17
+
18
18
  after(:all) do
19
- MusicBrainz.config.cache_path = old_cache_path
19
+ MusicBrainz.config.cache_path = File.join(File.dirname(__FILE__), '..', '..', 'tmp', 'spec_cache')
20
20
  MusicBrainz.config.perform_caching = true
21
21
  MusicBrainz.config.query_interval = 1.5
22
22
  end
@@ -24,16 +24,17 @@ describe MusicBrainz::ClientModules::CachingProxy do
24
24
  context "with cache enabled" do
25
25
  it "calls http only once when requesting the resource twice" do
26
26
  MusicBrainz.config.perform_caching = true
27
- File.exist?(test_cache_file).should be_false
27
+ expect(File).to_not exist(test_cache_file)
28
28
 
29
29
  # Stubbing
30
- MusicBrainz.client.http.stub(:get).and_return(OpenStruct.new(status: 200, body: test_response))
31
- MusicBrainz.client.http.should_receive(:get).once
30
+ allow(MusicBrainz.client).to receive(:get_live_contents)
31
+ .and_return({status: 200, body: test_response})
32
+ expect(MusicBrainz.client).to receive(:get_live_contents).once
32
33
 
33
34
  2.times do
34
35
  artist = MusicBrainz::Artist.find(test_mbid)
35
- artist.should be_a_kind_of(MusicBrainz::Artist)
36
- File.exist?(test_cache_file).should be_true
36
+ expect(artist).to be_kind_of(MusicBrainz::Artist)
37
+ expect(File).to exist(test_cache_file)
37
38
  end
38
39
 
39
40
  MusicBrainz.client.clear_cache
@@ -43,19 +44,19 @@ describe MusicBrainz::ClientModules::CachingProxy do
43
44
  context "with cache disabled" do
44
45
  it "calls http twice when requesting the resource twice" do
45
46
  MusicBrainz.config.perform_caching = false
46
- File.exist?(test_cache_file).should be_false
47
+ expect(File).to_not exist(test_cache_file)
47
48
 
48
49
  # Hacking for test performance purposes
49
50
  MusicBrainz.config.query_interval = 0.0
50
51
 
51
52
  # Stubbing
52
- MusicBrainz.client.http.stub(:get).and_return(OpenStruct.new(status: 200, body: test_response))
53
- MusicBrainz.client.http.should_receive(:get).twice
53
+ allow(MusicBrainz.client.http).to receive(:get).and_return(OpenStruct.new(status: 200, body: test_response))
54
+ expect(MusicBrainz.client.http).to receive(:get).twice
54
55
 
55
56
  2.times do
56
57
  artist = MusicBrainz::Artist.find(test_mbid)
57
- artist.should be_a_kind_of(MusicBrainz::Artist)
58
- File.exist?(test_cache_file).should be_false
58
+ expect(artist).to be_kind_of(MusicBrainz::Artist)
59
+ expect(File).to_not exist(test_cache_file)
59
60
  end
60
61
  end
61
62
  end
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
1
  require "spec_helper"
4
2
 
5
3
  describe MusicBrainz::Deprecated::CacheConfig do
@@ -18,15 +16,15 @@ describe MusicBrainz::Deprecated::CacheConfig do
18
16
  it "allows deprecated use of cache_path" do
19
17
  MusicBrainz.config.cache_path = "test1"
20
18
 
21
- MusicBrainz::Tools::Cache.cache_path.should == "test1"
22
- MusicBrainz.cache_path.should == "test1"
19
+ expect(MusicBrainz::Tools::Cache.cache_path).to eq "test1"
20
+ expect(MusicBrainz.cache_path).to eq "test1"
23
21
  end
24
22
 
25
23
  it "allows deprecated use of cache_path=" do
26
24
  MusicBrainz::Tools::Cache.cache_path = "test2"
27
- MusicBrainz.config.cache_path.should == "test2"
25
+ expect(MusicBrainz.config.cache_path).to eq "test2"
28
26
 
29
27
  MusicBrainz.cache_path = "test3"
30
- MusicBrainz.config.cache_path.should == "test3"
28
+ expect(MusicBrainz.config.cache_path).to eq "test3"
31
29
  end
32
30
  end
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
1
  require "spec_helper"
4
2
 
5
3
  describe MusicBrainz::Deprecated::ProxyConfig do
@@ -18,15 +16,15 @@ describe MusicBrainz::Deprecated::ProxyConfig do
18
16
  it "allows deprecated use of query_interval" do
19
17
  MusicBrainz.config.query_interval = 2
20
18
 
21
- MusicBrainz::Tools::Proxy.query_interval.should == 2
22
- MusicBrainz.query_interval.should == 2
19
+ expect(MusicBrainz::Tools::Proxy.query_interval).to eq 2
20
+ expect(MusicBrainz.query_interval).to eq 2
23
21
  end
24
22
 
25
23
  it "allows deprecated use of query_interval=" do
26
24
  MusicBrainz::Tools::Proxy.query_interval = 3
27
- MusicBrainz.config.query_interval.should == 3
25
+ expect(MusicBrainz.config.query_interval).to eq 3
28
26
 
29
27
  MusicBrainz.query_interval = 4
30
- MusicBrainz.config.query_interval.should == 4
28
+ expect(MusicBrainz.config.query_interval).to eq 4
31
29
  end
32
30
  end
@@ -0,0 +1,168 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <metadata xmlns="http://musicbrainz.org/ns/mmd-2.0#">
3
+ <artist id="69b39eab-6577-46a4-a9f5-817839092033" type="Group" type-id="e431f5f6-b5d2-343d-8b36-72607fffb74b">
4
+ <name>Kasabian</name>
5
+ <sort-name>Kasabian</sort-name>
6
+ <isni-list>
7
+ <isni>0000000106652390</isni>
8
+ </isni-list>
9
+ <country>GB</country>
10
+ <area id="8a754a16-0027-3a29-b6d7-2b40ea0481ed">
11
+ <name>United Kingdom</name>
12
+ <sort-name>United Kingdom</sort-name>
13
+ <iso-3166-1-code-list>
14
+ <iso-3166-1-code>GB</iso-3166-1-code>
15
+ </iso-3166-1-code-list>
16
+ </area>
17
+ <begin-area id="806b9b3b-5daf-4eaa-807d-7a2a29cde0da">
18
+ <name>Leicester</name>
19
+ <sort-name>Leicester</sort-name>
20
+ <iso-3166-2-code-list>
21
+ <iso-3166-2-code>GB-LCE</iso-3166-2-code>
22
+ </iso-3166-2-code-list>
23
+ </begin-area>
24
+ <life-span>
25
+ <begin>1997</begin>
26
+ </life-span>
27
+ <relation-list target-type="url">
28
+ <relation type="allmusic" type-id="6b3e3c85-0002-4f34-aca6-80ace0d7e846">
29
+ <target id="79e99f63-f76d-4859-b10f-88ee7737f3c5">https://www.allmusic.com/artist/mn0000361541</target>
30
+ <direction>forward</direction>
31
+ </relation>
32
+ <relation type="BBC Music page" type-id="d028a975-000c-4525-9333-d3c8425e4b54">
33
+ <target id="e2110cb1-46db-42e3-abda-313e76f1237d">https://www.bbc.co.uk/music/artists/69b39eab-6577-46a4-a9f5-817839092033</target>
34
+ <direction>forward</direction>
35
+ <end>2020-11-19</end>
36
+ <ended>true</ended>
37
+ </relation>
38
+ <relation type="discogs" type-id="04a5b104-a4c2-4bac-99a1-7b837c37d9e4">
39
+ <target id="d1676007-8b11-431a-b96c-8f56d696485b">https://www.discogs.com/artist/235133</target>
40
+ <direction>forward</direction>
41
+ </relation>
42
+ <relation type="free streaming" type-id="769085a1-c2f7-4c24-a532-2375a77693bd">
43
+ <target id="0c5836a7-6747-46e7-917b-b181ee4b2468">https://open.spotify.com/artist/11wRdbnoYqRddKBrpHt4Ue</target>
44
+ <direction>forward</direction>
45
+ </relation>
46
+ <relation type="free streaming" type-id="769085a1-c2f7-4c24-a532-2375a77693bd">
47
+ <target id="dec26047-a327-4359-8db2-b2350175d100">https://www.deezer.com/artist/1247</target>
48
+ <direction>forward</direction>
49
+ </relation>
50
+ <relation type="image" type-id="221132e9-e30e-43f2-a741-15afc4c5fa7c">
51
+ <target id="4090fabc-d9b2-419b-b9be-db9601035359">https://commons.wikimedia.org/wiki/File:Kasabian_at_Brixton_Academy_2009.jpg</target>
52
+ <direction>forward</direction>
53
+ </relation>
54
+ <relation type="IMDb" type-id="94c8b0cc-4477-4106-932c-da60e63de61c">
55
+ <target id="7e8236d6-4a80-423d-8caf-5b012542befd">https://www.imdb.com/name/nm1868442/</target>
56
+ <direction>forward</direction>
57
+ </relation>
58
+ <relation type="last.fm" type-id="08db8098-c0df-4b78-82c3-c8697b4bba7f">
59
+ <target id="6733880a-f246-4ead-a7ac-23785b80e136">https://www.last.fm/music/Kasabian</target>
60
+ <direction>forward</direction>
61
+ </relation>
62
+ <relation type="lyrics" type-id="e4d73442-3762-45a8-905c-401da65544ed">
63
+ <target id="a716a264-b67a-4ad9-9e29-64a5c589e595">https://genius.com/artists/Kasabian</target>
64
+ <direction>forward</direction>
65
+ </relation>
66
+ <relation type="lyrics" type-id="e4d73442-3762-45a8-905c-401da65544ed">
67
+ <target id="6859ebf7-cfe7-4543-b576-788d0149c773">https://muzikum.eu/en/kasabian/lyrics</target>
68
+ <direction>forward</direction>
69
+ </relation>
70
+ <relation type="myspace" type-id="bac47923-ecde-4b59-822e-d08f0cd10156">
71
+ <target id="2a671cb7-482b-48e3-9fb9-5aa448968e14">https://myspace.com/kasabian</target>
72
+ <direction>forward</direction>
73
+ </relation>
74
+ <relation type="official homepage" type-id="fe33d22f-c3b0-4d68-bd53-a856badf2b15">
75
+ <target id="f489988f-f6ca-49ed-9931-f21712d00f6d">https://www.kasabian.co.uk/</target>
76
+ <direction>forward</direction>
77
+ </relation>
78
+ <relation type="other databases" type-id="d94fb61c-fa20-4e3c-a19a-71a949fb2c55">
79
+ <target id="49a2e69a-a3ef-4096-aefd-15ba6b3e32a4">http://id.loc.gov/authorities/names/n2005068609</target>
80
+ <direction>forward</direction>
81
+ </relation>
82
+ <relation type="other databases" type-id="d94fb61c-fa20-4e3c-a19a-71a949fb2c55">
83
+ <target id="1fdfb0d4-fcdd-4f44-b9e2-f4c9e76b7d94">https://catalogue.bnf.fr/ark:/12148/cb145796883</target>
84
+ <direction>forward</direction>
85
+ </relation>
86
+ <relation type="other databases" type-id="d94fb61c-fa20-4e3c-a19a-71a949fb2c55">
87
+ <target id="be5626f4-70f3-4ee9-9c04-4b41dc9a27b3">https://d-nb.info/gnd/10336310-5</target>
88
+ <direction>forward</direction>
89
+ </relation>
90
+ <relation type="other databases" type-id="d94fb61c-fa20-4e3c-a19a-71a949fb2c55">
91
+ <target id="0ad65037-83d2-46ca-8bf6-9327fe0063bb">https://rateyourmusic.com/artist/kasabian</target>
92
+ <direction>forward</direction>
93
+ </relation>
94
+ <relation type="other databases" type-id="d94fb61c-fa20-4e3c-a19a-71a949fb2c55">
95
+ <target id="6636ae93-6f8a-4d98-9013-609259712cdf">http://www.worldcat.org/identities/lccn-n2005068609/</target>
96
+ <direction>forward</direction>
97
+ <ended>true</ended>
98
+ </relation>
99
+ <relation type="purchase for download" type-id="f8319a2f-f824-4617-81c8-be6560b3b203">
100
+ <target id="04c0e7b7-2b69-4708-8de4-7f37cee8a9eb">https://play.google.com/store/music/artist?id=A2chuocuj6o6rswcqvmb6h2fzn4</target>
101
+ <direction>forward</direction>
102
+ <end>2020-10-12</end>
103
+ <ended>true</ended>
104
+ </relation>
105
+ <relation type="purchase for download" type-id="f8319a2f-f824-4617-81c8-be6560b3b203">
106
+ <target id="b8ac6f68-70bb-41b8-9632-4fa002003949">https://itunes.apple.com/us/artist/id20478838</target>
107
+ <direction>forward</direction>
108
+ </relation>
109
+ <relation type="secondhandsongs" type-id="79c5b84d-a206-4f4c-9832-78c028c312c3">
110
+ <target id="68cf3241-04bc-488c-976d-af33680a51d4">https://secondhandsongs.com/artist/25440</target>
111
+ <direction>forward</direction>
112
+ </relation>
113
+ <relation type="social network" type-id="99429741-f3f6-484b-84f8-23af51991770">
114
+ <target id="b32de4e6-f645-45e8-b2e4-787f4e49aa84">https://twitter.com/kasabianhq</target>
115
+ <direction>forward</direction>
116
+ </relation>
117
+ <relation type="social network" type-id="99429741-f3f6-484b-84f8-23af51991770">
118
+ <target id="74206326-e179-4908-8be8-79db9cef17fa">https://www.facebook.com/kasabian</target>
119
+ <direction>forward</direction>
120
+ </relation>
121
+ <relation type="social network" type-id="99429741-f3f6-484b-84f8-23af51991770">
122
+ <target id="ba78e7e1-27e6-407e-b9de-3f9415b7e7e7">https://www.instagram.com/kasabianofficial/</target>
123
+ <direction>forward</direction>
124
+ </relation>
125
+ <relation type="songkick" type-id="aac9c4bc-a5b9-30b8-9839-e3ac314c6e58">
126
+ <target id="187bd965-fef2-4674-98b9-1b256a1ae96d">https://www.songkick.com/artists/175029</target>
127
+ <direction>forward</direction>
128
+ </relation>
129
+ <relation type="soundcloud" type-id="89e4a949-0976-440d-bda1-5f772c1e5710">
130
+ <target id="8ef55e5b-ef5a-433f-bbea-cf08b920d7a0">https://soundcloud.com/kasabian</target>
131
+ <direction>forward</direction>
132
+ </relation>
133
+ <relation type="streaming" type-id="63cc5d1f-f096-4c94-a43f-ecb32ea94161">
134
+ <target id="6533f0f7-20c1-4834-ba14-c0776d80152b">https://music.apple.com/gb/artist/20478838</target>
135
+ <direction>forward</direction>
136
+ </relation>
137
+ <relation type="streaming" type-id="63cc5d1f-f096-4c94-a43f-ecb32ea94161">
138
+ <target id="1dd6ae94-e90f-4e17-9ad3-4adcce78cfaa">https://music.youtube.com/channel/UCmJDzMXYTdyjtp5VNONQRKg</target>
139
+ <direction>forward</direction>
140
+ </relation>
141
+ <relation type="streaming" type-id="63cc5d1f-f096-4c94-a43f-ecb32ea94161">
142
+ <target id="550130fd-4182-4284-b526-fdf20f2a6709">https://tidal.com/artist/1556</target>
143
+ <direction>forward</direction>
144
+ </relation>
145
+ <relation type="VIAF" type-id="e8571dcc-35d4-4e91-a577-a3382fd84460">
146
+ <target id="02fb245f-87f3-4363-9a81-dc0c0ec4f874">http://viaf.org/viaf/138707200</target>
147
+ <direction>forward</direction>
148
+ </relation>
149
+ <relation type="wikidata" type-id="689870a4-a1e4-4912-b17f-7b2664215698">
150
+ <target id="82e48da2-9fc5-402a-b7c1-d1eb0bb6e123">https://www.wikidata.org/wiki/Q272517</target>
151
+ <direction>forward</direction>
152
+ </relation>
153
+ <relation type="youtube" type-id="6a540e5b-58c6-4192-b6ba-dbc71ec8fcf0">
154
+ <target id="cca53eab-ab96-4d2d-9403-4c5278164812">https://www.youtube.com/channel/UC_niYTRmUdRvVNdGYIA1vcg</target>
155
+ <direction>forward</direction>
156
+ </relation>
157
+ <relation type="youtube" type-id="6a540e5b-58c6-4192-b6ba-dbc71ec8fcf0">
158
+ <target id="b52fa30f-3705-40d9-b3c5-d164be76b360">https://www.youtube.com/user/KasabianVEVO</target>
159
+ <direction>forward</direction>
160
+ </relation>
161
+ <relation type="youtube" type-id="6a540e5b-58c6-4192-b6ba-dbc71ec8fcf0">
162
+ <target id="a013b397-c09b-4308-b14b-8168265b6776">https://www.youtube.com/user/KasabianTour</target>
163
+ <direction>forward</direction>
164
+ <ended>true</ended>
165
+ </relation>
166
+ </relation-list>
167
+ </artist>
168
+ </metadata>