rbrainz 0.4.2 → 0.5.0

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.
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>