rbrainz 0.4.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. data/CHANGES +13 -1
  2. data/LICENSE +1 -1
  3. data/README +2 -2
  4. data/Rakefile +2 -2
  5. data/TODO +9 -2
  6. data/doc/README.rdoc +5 -5
  7. data/examples/getartist.rb +3 -2
  8. data/examples/getlabel.rb +3 -2
  9. data/examples/getrelease.rb +5 -2
  10. data/examples/getreleasegroup.rb +53 -0
  11. data/examples/gettrack.rb +3 -2
  12. data/examples/getuser.rb +2 -1
  13. data/examples/rate.rb +44 -0
  14. data/examples/searchartists.rb +3 -2
  15. data/examples/searchcdstubs.rb +41 -0
  16. data/examples/searchlabels.rb +3 -2
  17. data/examples/searchreleasegroups.rb +36 -0
  18. data/examples/searchreleases.rb +6 -4
  19. data/examples/searchtracks.rb +3 -2
  20. data/examples/submit_isrcs.rb +52 -0
  21. data/examples/tag.rb +3 -2
  22. data/lib/rbrainz.rb +2 -1
  23. data/lib/rbrainz/core_ext.rb +2 -1
  24. data/lib/rbrainz/core_ext/mbid.rb +2 -1
  25. data/lib/rbrainz/core_ext/net_http_digest.rb +3 -2
  26. data/lib/rbrainz/core_ext/range.rb +3 -2
  27. data/lib/rbrainz/core_ext/range/equality.rb +2 -1
  28. data/lib/rbrainz/data/countrynames.rb +6 -3
  29. data/lib/rbrainz/data/languagenames.rb +3 -2
  30. data/lib/rbrainz/data/releasetypenames.rb +3 -2
  31. data/lib/rbrainz/data/scriptnames.rb +3 -2
  32. data/lib/rbrainz/model.rb +3 -2
  33. data/lib/rbrainz/model/alias.rb +3 -2
  34. data/lib/rbrainz/model/artist.rb +11 -3
  35. data/lib/rbrainz/model/collection.rb +3 -2
  36. data/lib/rbrainz/model/default_factory.rb +18 -6
  37. data/lib/rbrainz/model/disc.rb +3 -2
  38. data/lib/rbrainz/model/entity.rb +2 -102
  39. data/lib/rbrainz/model/incomplete_date.rb +3 -2
  40. data/lib/rbrainz/model/individual.rb +11 -2
  41. data/lib/rbrainz/model/isrc.rb +100 -0
  42. data/lib/rbrainz/model/label.rb +5 -2
  43. data/lib/rbrainz/model/mbid.rb +28 -9
  44. data/lib/rbrainz/model/rateable.rb +34 -0
  45. data/lib/rbrainz/model/rating.rb +56 -0
  46. data/lib/rbrainz/model/relateable.rb +118 -0
  47. data/lib/rbrainz/model/relation.rb +2 -1
  48. data/lib/rbrainz/model/release.rb +17 -3
  49. data/lib/rbrainz/model/release_event.rb +3 -2
  50. data/lib/rbrainz/model/release_group.rb +97 -0
  51. data/lib/rbrainz/model/scored_collection.rb +3 -2
  52. data/lib/rbrainz/model/tag.rb +5 -4
  53. data/lib/rbrainz/model/taggable.rb +27 -0
  54. data/lib/rbrainz/model/track.rb +15 -2
  55. data/lib/rbrainz/model/user.rb +3 -2
  56. data/lib/rbrainz/utils.rb +2 -1
  57. data/lib/rbrainz/utils/data.rb +3 -2
  58. data/lib/rbrainz/utils/helper.rb +8 -2
  59. data/lib/rbrainz/version.rb +3 -2
  60. data/lib/rbrainz/webservice.rb +12 -7
  61. data/lib/rbrainz/webservice/filter.rb +53 -4
  62. data/lib/rbrainz/webservice/includes.rb +72 -11
  63. data/lib/rbrainz/webservice/mbxml.rb +129 -67
  64. data/lib/rbrainz/webservice/query.rb +156 -16
  65. data/lib/rbrainz/webservice/webservice.rb +104 -116
  66. data/test/lib/mock_webservice.rb +9 -2
  67. data/test/lib/test_entity.rb +2 -97
  68. data/test/lib/test_factory.rb +9 -1
  69. data/test/lib/test_rateable.rb +31 -0
  70. data/test/lib/test_relateable.rb +103 -0
  71. data/test/lib/test_taggable.rb +36 -0
  72. data/test/lib/testing_helper.rb +17 -2
  73. data/test/test-data/invalid/artist/ratings_1.xml +6 -0
  74. data/test/test-data/invalid/artist/ratings_2.xml +6 -0
  75. data/test/test-data/valid/artist/Tchaikovsky-2.xml +6 -0
  76. data/test/test-data/valid/label/Atlantic_Records_3.xml +6 -0
  77. data/test/test-data/valid/release-group/The_Cure_1.xml +36 -0
  78. data/test/test-data/valid/release/Highway_61_Revisited_2.xml +6 -0
  79. data/test/test-data/valid/track/Silent_All_These_Years_4.xml +3 -0
  80. data/test/test-data/valid/track/Silent_All_These_Years_6.xml +8 -0
  81. data/test/test_alias.rb +2 -1
  82. data/test/test_artist.rb +24 -2
  83. data/test/test_artist_filter.rb +2 -1
  84. data/test/test_artist_includes.rb +13 -3
  85. data/test/test_collection.rb +3 -2
  86. data/test/test_default_factory.rb +8 -1
  87. data/test/test_disc.rb +2 -1
  88. data/test/test_incomplete_date.rb +2 -1
  89. data/test/test_isrc.rb +87 -0
  90. data/test/test_label.rb +8 -1
  91. data/test/test_label_filter.rb +2 -1
  92. data/test/test_label_includes.rb +10 -3
  93. data/test/test_mbid.rb +2 -1
  94. data/test/test_mbxml.rb +93 -2
  95. data/test/test_query.rb +68 -5
  96. data/test/test_range_equality.rb +2 -1
  97. data/test/test_rating.rb +46 -0
  98. data/test/test_relation.rb +2 -1
  99. data/test/test_release.rb +37 -2
  100. data/test/test_release_event.rb +2 -1
  101. data/test/test_release_filter.rb +15 -2
  102. data/test/test_release_group.rb +104 -0
  103. data/test/test_release_group_filter.rb +61 -0
  104. data/test/test_release_group_includes.rb +46 -0
  105. data/test/test_release_includes.rb +16 -3
  106. data/test/test_scored_collection.rb +3 -2
  107. data/test/test_tag.rb +2 -1
  108. data/test/test_track.rb +28 -1
  109. data/test/test_track_filter.rb +2 -1
  110. data/test/test_track_includes.rb +13 -3
  111. data/test/test_utils.rb +2 -1
  112. data/test/test_webservice.rb +11 -1
  113. metadata +38 -20
  114. data/debian/changelog +0 -11
  115. data/debian/compat +0 -1
  116. data/debian/control +0 -13
  117. data/debian/copyright +0 -25
  118. data/debian/rules +0 -48
@@ -1,4 +1,5 @@
1
- # $Id: mock_webservice.rb 147 2007-07-19 17:10:26Z phw $
1
+ # -*- coding: utf-8 -*-
2
+ # $Id: mock_webservice.rb 273 2009-05-24 22:29:04Z phw $
2
3
  #
3
4
  # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
5
  # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
@@ -26,6 +27,12 @@ class MockWebservice < MusicBrainz::Webservice::IWebservice
26
27
  else
27
28
  file = 'valid/artist/search_result_1.xml'
28
29
  end
30
+ when :release_group
31
+ if options[:id]
32
+ file = 'valid/release-group/The_Cure_1.xml'
33
+ else
34
+ file = 'valid/release-group/search_result_1.xml'
35
+ end
29
36
  when :release
30
37
  if options[:id]
31
38
  file = 'valid/release/Under_the_Pink_1.xml'
@@ -50,4 +57,4 @@ class MockWebservice < MusicBrainz::Webservice::IWebservice
50
57
  return File.read(DATA_PATH + file)
51
58
  end
52
59
 
53
- end
60
+ end
@@ -1,4 +1,5 @@
1
- # $Id: test_entity.rb 162 2007-07-29 17:44:11Z phw $
1
+ # -*- coding: utf-8 -*-
2
+ # $Id: test_entity.rb 254 2009-05-13 20:04:36Z phw $
2
3
  #
3
4
  # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
5
  # Copyright:: Copyright (c) 2007, Philipp Wolfer
@@ -52,100 +53,4 @@ module TestEntity
52
53
  assert_equal nil, entity.id
53
54
  end
54
55
 
55
- def test_relations
56
- entity = @tested_class.new
57
-
58
- # Create some test relations
59
- artist_rel = Model::Relation.new
60
- artist_rel.target = Model::Artist.new
61
- artist_rel.type = Model::NS_REL_1 + 'Vocal'
62
- artist_rel.direction = Model::Relation::DIR_BACKWARD
63
- artist_rel.attributes << Model::NS_REL_1 + 'Guest'
64
- artist_rel.attributes << Model::NS_REL_1 + 'Lead'
65
- assert_nothing_raised {entity.add_relation artist_rel}
66
-
67
- track_rel = Model::Relation.new
68
- track_rel.target = Model::Track.new
69
- track_rel.type = Model::NS_REL_1 + 'Vocal'
70
- track_rel.direction = Model::Relation::DIR_FORWARD
71
- track_rel.attributes << Model::NS_REL_1 + 'Lead'
72
- track_rel.attributes << Model::NS_REL_1 + 'Guest'
73
- assert_nothing_raised {entity.add_relation track_rel}
74
-
75
- url_rel = Model::Relation.new
76
- url_rel.target = 'http://www.example.com'
77
- url_rel.type = Model::NS_REL_1 + 'OfficialHomepage'
78
- assert_nothing_raised {entity.add_relation url_rel}
79
-
80
- # Get all relations
81
- rel_list = []
82
- assert_nothing_raised {rel_list = entity.get_relations()}
83
- assert_equal 3, rel_list.size
84
- assert rel_list.include?(artist_rel)
85
- assert rel_list.include?(track_rel)
86
- assert rel_list.include?(url_rel)
87
-
88
- # Get only artist relation by target type
89
- assert_nothing_raised {rel_list = entity.get_relations(
90
- :target_type => Model::Relation::TO_ARTIST)}
91
- assert_equal 1, rel_list.size
92
- assert rel_list.include?(artist_rel)
93
-
94
- # Get only artist relation by target type (without namespace)
95
- assert_nothing_raised {rel_list = entity.get_relations(
96
- :target_type => 'Artist')}
97
- assert_equal 1, rel_list.size
98
- assert rel_list.include?(artist_rel)
99
-
100
- # Get only url relation type
101
- assert_nothing_raised {rel_list = entity.get_relations(
102
- :relation_type => Model::NS_REL_1 + 'OfficialHomepage')}
103
- assert_equal 1, rel_list.size
104
- assert rel_list.include?(url_rel)
105
-
106
- # Get only url relation type (without namespace)
107
- assert_nothing_raised {rel_list = entity.get_relations(
108
- :relation_type => 'OfficialHomepage')}
109
- assert_equal 1, rel_list.size
110
- assert rel_list.include?(url_rel)
111
-
112
- # Get only artist and track relation by attribute
113
- assert_nothing_raised {rel_list = entity.get_relations(
114
- :required_attributes => ['Guest', Model::NS_REL_1 + 'Lead'])}
115
- assert_equal 2, rel_list.size
116
- assert rel_list.include?(artist_rel)
117
- assert rel_list.include?(track_rel)
118
-
119
- # Get only artist relation by target type
120
- assert_nothing_raised {rel_list = entity.get_relations(
121
- :direction => Model::Relation::DIR_BACKWARD)}
122
- assert_equal 1, rel_list.size
123
- assert rel_list.include?(artist_rel)
124
-
125
- # Test the target types
126
- target_types = entity.relation_target_types
127
- assert_equal 3, target_types.size, target_types.inspect
128
- [Model::Relation::TO_ARTIST, Model::Relation::TO_TRACK,
129
- Model::Relation::TO_URL].each {|type|
130
- assert target_types.include?(type), target_types.inspect
131
- }
132
- end
133
-
134
- def test_tags
135
- entity = @tested_class.new
136
- tag1 = Model::Tag.new('doom metal')
137
- tag2 = Model::Tag.new
138
-
139
- assert_equal 0, entity.tags.size
140
- assert_nothing_raised {entity.tags << tag1}
141
- assert_equal 1, entity.tags.size
142
- assert_nothing_raised {entity.tags << tag2}
143
- assert_equal 2, entity.tags.size
144
-
145
- assert_nothing_raised {entity.tags.delete tag2}
146
- assert_equal 1, entity.tags.size
147
- assert_nothing_raised {entity.tags.delete tag1}
148
- assert_equal 0, entity.tags.size
149
- end
150
-
151
56
  end
@@ -1,4 +1,5 @@
1
- # $Id: test_factory.rb 207 2008-04-23 19:55:38Z phw $
1
+ # -*- coding: utf-8 -*-
2
+ # $Id: test_factory.rb 273 2009-05-24 22:29:04Z phw $
2
3
  #
3
4
  # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
4
5
  # Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
@@ -14,6 +15,9 @@ end
14
15
  class MyLabel < Model::Label
15
16
  end
16
17
 
18
+ class MyReleaseGroup < Model::ReleaseGroup
19
+ end
20
+
17
21
  class MyRelease < Model::Release
18
22
  end
19
23
 
@@ -34,6 +38,10 @@ class MyFactory < Model::DefaultFactory
34
38
  MyLabel.new
35
39
  end
36
40
 
41
+ def new_release_group
42
+ MyReleaseGroup.new
43
+ end
44
+
37
45
  def new_release
38
46
  MyRelease.new
39
47
  end
@@ -0,0 +1,31 @@
1
+ # -*- coding: utf-8 -*-
2
+ # $Id: test_rateable.rb 254 2009-05-13 20:04:36Z phw $
3
+ #
4
+ # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
5
+ # Copyright:: Copyright (c) 2009, Philipp Wolfer
6
+ # License:: RBrainz is free software distributed under a BSD style license.
7
+ # See LICENSE[file:../LICENSE.html] for permissions.
8
+
9
+ require 'test/unit'
10
+ require 'rbrainz/model'
11
+ include MusicBrainz
12
+
13
+ # Unit test for the entity model.
14
+ # This is only a test module which defines general
15
+ # tests on entities which include the Rateable mixin.
16
+ # The tests should be executed by all subclass tests.
17
+ module TestRateable
18
+
19
+ def test_class_has_empty_rating
20
+ entity = @tested_class.new
21
+ assert entity.rating.is_a? Model::Rating
22
+ assert entity.rating.empty?
23
+ end
24
+
25
+ def test_class_has_empty_user_rating
26
+ entity = @tested_class.new
27
+ assert entity.user_rating.is_a? Model::Rating
28
+ assert entity.user_rating.empty?
29
+ end
30
+
31
+ end
@@ -0,0 +1,103 @@
1
+ # -*- coding: utf-8 -*-
2
+ # $Id: test_relateable.rb 254 2009-05-13 20:04:36Z phw $
3
+ #
4
+ # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
5
+ # Copyright:: Copyright (c) 2009, Philipp Wolfer
6
+ # License:: RBrainz is free software distributed under a BSD style license.
7
+ # See LICENSE[file:../LICENSE.html] for permissions.
8
+
9
+ require 'test/unit'
10
+ require 'rbrainz/model'
11
+ include MusicBrainz
12
+
13
+ # Unit test for the entity model.
14
+ # This is only a test module which defines general
15
+ # tests on entities which include the Relateable mixin.
16
+ # The tests should be executed by all subclass tests.
17
+ module TestRelateable
18
+
19
+ def test_relations
20
+ entity = @tested_class.new
21
+
22
+ # Create some test relations
23
+ artist_rel = Model::Relation.new
24
+ artist_rel.target = Model::Artist.new
25
+ artist_rel.type = Model::NS_REL_1 + 'Vocal'
26
+ artist_rel.direction = Model::Relation::DIR_BACKWARD
27
+ artist_rel.attributes << Model::NS_REL_1 + 'Guest'
28
+ artist_rel.attributes << Model::NS_REL_1 + 'Lead'
29
+ assert_nothing_raised {entity.add_relation artist_rel}
30
+
31
+ track_rel = Model::Relation.new
32
+ track_rel.target = Model::Track.new
33
+ track_rel.type = Model::NS_REL_1 + 'Vocal'
34
+ track_rel.direction = Model::Relation::DIR_FORWARD
35
+ track_rel.attributes << Model::NS_REL_1 + 'Lead'
36
+ track_rel.attributes << Model::NS_REL_1 + 'Guest'
37
+ assert_nothing_raised {entity.add_relation track_rel}
38
+
39
+ url_rel = Model::Relation.new
40
+ url_rel.target = 'http://www.example.com'
41
+ url_rel.type = Model::NS_REL_1 + 'OfficialHomepage'
42
+ assert_nothing_raised {entity.add_relation url_rel}
43
+
44
+ # Get all relations
45
+ rel_list = []
46
+ assert_nothing_raised {rel_list = entity.get_relations()}
47
+ assert_equal 3, rel_list.size
48
+ assert rel_list.include?(artist_rel)
49
+ assert rel_list.include?(track_rel)
50
+ assert rel_list.include?(url_rel)
51
+
52
+ # Get only artist relation by target type
53
+ assert_nothing_raised {rel_list = entity.get_relations(
54
+ :target_type => Model::Relation::TO_ARTIST)}
55
+ assert_equal 1, rel_list.size
56
+ assert rel_list.include?(artist_rel)
57
+
58
+ # Get only artist relation by target type (without namespace)
59
+ assert_nothing_raised {rel_list = entity.get_relations(
60
+ :target_type => 'Artist')}
61
+ assert_equal 1, rel_list.size
62
+ assert rel_list.include?(artist_rel)
63
+
64
+ # Get only url relation type
65
+ assert_nothing_raised {rel_list = entity.get_relations(
66
+ :relation_type => Model::NS_REL_1 + 'OfficialHomepage')}
67
+ assert_equal 1, rel_list.size
68
+ assert rel_list.include?(url_rel)
69
+
70
+ # Get only url relation type (without namespace)
71
+ assert_nothing_raised {rel_list = entity.get_relations(
72
+ :relation_type => 'OfficialHomepage')}
73
+ assert_equal 1, rel_list.size
74
+ assert rel_list.include?(url_rel)
75
+
76
+ # Get only artist and track relation by attribute
77
+ assert_nothing_raised {rel_list = entity.get_relations(
78
+ :required_attributes => ['Guest', Model::NS_REL_1 + 'Lead'])}
79
+ assert_equal 2, rel_list.size
80
+ assert rel_list.include?(artist_rel)
81
+ assert rel_list.include?(track_rel)
82
+
83
+ # Get only artist relation by target type
84
+ assert_nothing_raised {rel_list = entity.get_relations(
85
+ :direction => Model::Relation::DIR_BACKWARD)}
86
+ assert_equal 1, rel_list.size
87
+ assert rel_list.include?(artist_rel)
88
+
89
+ # Test the target types
90
+ target_types = entity.relation_target_types
91
+ assert_equal 3, target_types.size, target_types.inspect
92
+ [Model::Relation::TO_ARTIST, Model::Relation::TO_TRACK,
93
+ Model::Relation::TO_URL].each {|type|
94
+ assert target_types.include?(type), target_types.inspect
95
+ }
96
+ end
97
+
98
+ def test_no_direct_acces_to_relations
99
+ entity = @tested_class.new
100
+ assert_raise(NoMethodError) { entity.relations }
101
+ end
102
+
103
+ end
@@ -0,0 +1,36 @@
1
+ # -*- coding: utf-8 -*-
2
+ # $Id: test_taggable.rb 254 2009-05-13 20:04:36Z phw $
3
+ #
4
+ # Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
5
+ # Copyright:: Copyright (c) 2009, Philipp Wolfer
6
+ # License:: RBrainz is free software distributed under a BSD style license.
7
+ # See LICENSE[file:../LICENSE.html] for permissions.
8
+
9
+ require 'test/unit'
10
+ require 'rbrainz/model'
11
+ include MusicBrainz
12
+
13
+ # Unit test for the entity model.
14
+ # This is only a test module which defines general
15
+ # tests on entities which include the Taggable mixin.
16
+ # The tests should be executed by all subclass tests.
17
+ module TestTaggable
18
+
19
+ def test_tags
20
+ entity = @tested_class.new
21
+ tag1 = Model::Tag.new('doom metal')
22
+ tag2 = Model::Tag.new
23
+
24
+ assert_equal 0, entity.tags.size
25
+ assert_nothing_raised {entity.tags << tag1}
26
+ assert_equal 1, entity.tags.size
27
+ assert_nothing_raised {entity.tags << tag2}
28
+ assert_equal 2, entity.tags.size
29
+
30
+ assert_nothing_raised {entity.tags.delete tag2}
31
+ assert_equal 1, entity.tags.size
32
+ assert_nothing_raised {entity.tags.delete tag1}
33
+ assert_equal 0, entity.tags.size
34
+ end
35
+
36
+ end
@@ -1,4 +1,5 @@
1
- # $Id: testing_helper.rb 203 2008-03-17 11:00:15Z phw $
1
+ # -*- coding: utf-8 -*-
2
+ # $Id: testing_helper.rb 254 2009-05-13 20:04:36Z phw $
2
3
  #
3
4
  # Usefull helper methods which are used in different test classes.
4
5
  #
@@ -13,4 +14,18 @@ def query_string_to_hash query_string
13
14
  v.gsub!('+', ' ')
14
15
  v.gsub!(/%([0-9a-f]{2})/i) { [$1.hex].pack 'C' }
15
16
  }
16
- end
17
+ end
18
+
19
+ # True, if parent_class is one of the parent classes of child_class
20
+ def assert_inherited_from child_class, parent_class, message=nil
21
+ result = false
22
+ klass = child_class
23
+ while not klass.nil?
24
+ if klass == parent_class
25
+ result = true
26
+ break
27
+ end
28
+ klass = klass.superclass
29
+ end
30
+ assert(result, message)
31
+ end
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <metadata xmlns="http://musicbrainz.org/ns/mmd-1.0#">
3
+ <artist>
4
+ <rating votes-count="-1">2</rating>
5
+ </artist>
6
+ </metadata>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <metadata xmlns="http://musicbrainz.org/ns/mmd-1.0#">
3
+ <artist>
4
+ <user-rating>2.5</user-rating>
5
+ </artist>
6
+ </metadata>
@@ -8,5 +8,11 @@
8
8
  <tag count="40">romantic era</tag>
9
9
  <tag count="120">composer</tag>
10
10
  </tag-list>
11
+ <user-tag-list>
12
+ <user-tag>classical</user-tag>
13
+ <user-tag>russian</user-tag>
14
+ </user-tag-list>
15
+ <rating votes-count="10">4.5</rating>
16
+ <user-rating>3</user-rating>
11
17
  </artist>
12
18
  </metadata>
@@ -7,5 +7,11 @@
7
7
  <tag>jazz</tag>
8
8
  <tag>blues</tag>
9
9
  </tag-list>
10
+ <user-tag-list>
11
+ <user-tag>american</user-tag>
12
+ <user-tag>jazz</user-tag>
13
+ </user-tag-list>
14
+ <rating votes-count="10">4.5</rating>
15
+ <user-rating>3</user-rating>
10
16
  </label>
11
17
  </metadata>
@@ -0,0 +1,36 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <metadata xmlns="http://musicbrainz.org/ns/mmd-1.0#" xmlns:ext="http://musicbrainz.org/ns/ext-1.0#">
3
+ <release-group id="c6a62b78-70f7-44f7-b159-064f6b7ba03a" type="Album">
4
+ <title>The Cure</title>
5
+ <artist id="69ee3720-a7cb-4402-b48d-a02c366f2bcf" type="Group">
6
+ <name>The Cure</name>
7
+ <sort-name>Cure, The</sort-name>
8
+ <life-span begin="1977"/>
9
+ </artist>
10
+ <release-list>
11
+ <release id="d984e1a3-7281-46bb-ad8b-1478a00f2fbf" type="Album Official">
12
+ <title>The Cure</title>
13
+ <text-representation language="ENG" script="Latn"/>
14
+ <asin>B0002CHGZI</asin>
15
+ <track-list offset="11"/>
16
+ </release>
17
+ <release id="c100a398-3132-48a8-a5fc-c3e908ac17dc" type="Album Official">
18
+ <title>The Cure</title>
19
+ <text-representation language="ENG" script="Latn"/>
20
+ <track-list offset="14"/>
21
+ </release>
22
+ <release id="24bec892-b21d-47d8-a288-dc6450152574" type="Album Official">
23
+ <title>The Cure</title>
24
+ <text-representation language="ENG" script="Latn"/>
25
+ <asin>B0002C9G7O</asin>
26
+ <track-list offset="12"/>
27
+ </release>
28
+ <release id="61a4ec51-fa34-4757-85d7-83231776ed14" type="Album Official">
29
+ <title>The Cure</title>
30
+ <text-representation language="ENG" script="Latn"/>
31
+ <asin>B00028HOFY</asin>
32
+ <track-list offset="10"/>
33
+ </release>
34
+ </release-list>
35
+ </release-group>
36
+ </metadata>
@@ -8,5 +8,11 @@
8
8
  <tag count="40">folk rock</tag>
9
9
  <tag count="4">dylan</tag>
10
10
  </tag-list>
11
+ <user-tag-list>
12
+ <user-tag>rock</user-tag>
13
+ <user-tag>foo</user-tag>
14
+ </user-tag-list>
15
+ <rating votes-count="10">4.5</rating>
16
+ <user-rating>3</user-rating>
11
17
  </release>
12
18
  </metadata>