rbrainz 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +31 -0
- data/LICENSE +1 -1
- data/README +3 -2
- data/Rakefile +40 -22
- data/TODO +6 -23
- data/doc/README.rdoc +50 -21
- data/examples/getartist.rb +6 -4
- data/examples/getuser.rb +30 -0
- data/examples/searchartists.rb +35 -0
- data/lib/rbrainz.rb +12 -7
- data/lib/rbrainz/core_ext.rb +8 -0
- data/lib/rbrainz/core_ext/mbid.rb +30 -0
- data/lib/rbrainz/core_ext/net_http_digest.rb +52 -0
- data/lib/rbrainz/core_ext/range.rb +28 -0
- data/lib/rbrainz/core_ext/range/equality.rb +232 -0
- data/lib/rbrainz/data/countrynames.rb +7 -5
- data/lib/rbrainz/data/languagenames.rb +8 -5
- data/lib/rbrainz/data/releasetypenames.rb +34 -0
- data/lib/rbrainz/data/scriptnames.rb +8 -5
- data/lib/rbrainz/model.rb +27 -35
- data/lib/rbrainz/model/alias.rb +31 -7
- data/lib/rbrainz/model/artist.rb +30 -41
- data/lib/rbrainz/model/collection.rb +102 -0
- data/lib/rbrainz/model/default_factory.rb +78 -0
- data/lib/rbrainz/model/disc.rb +45 -8
- data/lib/rbrainz/model/entity.rb +122 -53
- data/lib/rbrainz/model/incomplete_date.rb +31 -47
- data/lib/rbrainz/model/individual.rb +103 -0
- data/lib/rbrainz/model/label.rb +42 -33
- data/lib/rbrainz/model/mbid.rb +111 -40
- data/lib/rbrainz/model/relation.rb +78 -14
- data/lib/rbrainz/model/release.rb +119 -31
- data/lib/rbrainz/model/release_event.rb +38 -9
- data/lib/rbrainz/model/scored_collection.rb +99 -0
- data/lib/rbrainz/model/tag.rb +39 -0
- data/lib/rbrainz/model/track.rb +37 -13
- data/lib/rbrainz/model/user.rb +48 -0
- data/lib/rbrainz/utils.rb +9 -0
- data/lib/rbrainz/utils/data.rb +78 -0
- data/lib/rbrainz/utils/helper.rb +22 -0
- data/lib/rbrainz/version.rb +15 -0
- data/lib/rbrainz/webservice.rb +32 -6
- data/lib/rbrainz/webservice/filter.rb +124 -47
- data/lib/rbrainz/webservice/includes.rb +49 -10
- data/lib/rbrainz/webservice/mbxml.rb +228 -173
- data/lib/rbrainz/webservice/query.rb +312 -25
- data/lib/rbrainz/webservice/webservice.rb +164 -27
- data/test/lib/mock_webservice.rb +53 -0
- data/test/lib/test_entity.rb +27 -8
- data/test/lib/test_factory.rb +47 -0
- data/test/lib/testing_helper.rb +7 -5
- data/test/test-data/invalid/artist/tags_1.xml +6 -0
- data/test/test-data/valid/artist/Tchaikovsky-2.xml +12 -0
- data/test/test-data/valid/label/Atlantic_Records_2.xml +3 -0
- data/test/test-data/valid/label/Atlantic_Records_3.xml +11 -0
- data/test/test-data/valid/release/Highway_61_Revisited_2.xml +12 -0
- data/test/test-data/valid/track/Silent_All_These_Years_6.xml +8 -0
- data/test/test_alias.rb +13 -7
- data/test/test_artist.rb +26 -4
- data/test/test_artist_filter.rb +11 -6
- data/test/test_artist_includes.rb +11 -6
- data/test/test_collection.rb +66 -0
- data/test/test_default_factory.rb +75 -0
- data/test/test_disc.rb +9 -4
- data/test/test_incomplete_date.rb +21 -14
- data/test/test_label.rb +56 -18
- data/test/test_label_filter.rb +10 -5
- data/test/test_label_includes.rb +11 -6
- data/test/test_mbid.rb +34 -19
- data/test/test_mbxml.rb +242 -72
- data/test/test_query.rb +92 -7
- data/test/test_range_equality.rb +144 -0
- data/test/test_relation.rb +18 -7
- data/test/test_release.rb +15 -4
- data/test/test_release_event.rb +16 -4
- data/test/test_release_filter.rb +11 -5
- data/test/test_release_includes.rb +11 -6
- data/test/test_scored_collection.rb +86 -0
- data/test/test_tag.rb +39 -0
- data/test/test_track.rb +15 -4
- data/test/test_track_filter.rb +11 -5
- data/test/test_track_includes.rb +11 -6
- data/test/test_utils.rb +41 -0
- data/test/test_webservice.rb +16 -17
- metadata +93 -57
data/lib/rbrainz/model/entity.rb
CHANGED
@@ -1,61 +1,83 @@
|
|
1
|
-
# $Id: entity.rb
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
1
|
+
# $Id: entity.rb 145 2007-07-19 13:11:44Z phw $
|
2
|
+
#
|
3
|
+
# Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
|
4
|
+
# Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
|
5
|
+
# License:: RBrainz is free software distributed under a BSD style license.
|
6
|
+
# See LICENSE[file:../LICENSE.html] for permissions.
|
5
7
|
|
6
8
|
require 'rbrainz/model/mbid'
|
7
9
|
require 'rbrainz/model/relation'
|
10
|
+
require 'rbrainz/model/collection'
|
11
|
+
require 'rbrainz/model/tag'
|
12
|
+
require 'set'
|
8
13
|
|
9
14
|
module MusicBrainz
|
10
15
|
module Model
|
11
16
|
|
12
|
-
#
|
17
|
+
#
|
18
|
+
# A first-level MusicBrainz class.
|
19
|
+
#
|
20
|
+
# All entities in MusicBrainz have unique IDs (which are MBID's representing
|
21
|
+
# absolute URIs) and may have any number of #relations to other entities.
|
22
|
+
# This class is abstract and should not be instantiated.
|
23
|
+
#
|
24
|
+
# Relations are differentiated by their <i>target type</i>, that means,
|
25
|
+
# where they link to. MusicBrainz currently supports four target types
|
26
|
+
# (artists, releases, tracks, and URLs) each identified using a URI.
|
27
|
+
# To get all relations with a specific target type, you can use
|
28
|
+
# #relations and pass one of the following constants as the
|
29
|
+
# parameter:
|
30
|
+
#
|
31
|
+
# - Relation::TO_ARTIST
|
32
|
+
# - Relation::TO_RELEASE
|
33
|
+
# - Relation::TO_TRACK
|
34
|
+
# - Relation::TO_URL
|
35
|
+
#
|
36
|
+
# See:: Relation
|
37
|
+
#
|
13
38
|
class Entity
|
14
|
-
|
39
|
+
|
40
|
+
# The entity type of this entity. Must be set by child classes correctly.
|
41
|
+
#
|
42
|
+
# Use #entity_type to query the type.
|
43
|
+
ENTITY_TYPE = nil # :nodoc:
|
44
|
+
|
45
|
+
# The MusicBrainz ID. A MBID containing an absolute URI.
|
15
46
|
attr_reader :id
|
16
47
|
|
17
|
-
|
48
|
+
# A Collection of Tag objects assigned to this entity.
|
49
|
+
attr_reader :tags
|
50
|
+
|
51
|
+
# Create a new Entity. You can assign a MusicBrainz identifier to the
|
52
|
+
# created entity with the parameter _mbid_ (see id=).
|
53
|
+
def initialize(mbid=nil)
|
54
|
+
self.id = mbid
|
55
|
+
@tags = Collection.new
|
18
56
|
@relations = {
|
19
|
-
Relation::TO_ARTIST =>
|
20
|
-
Relation::TO_RELEASE =>
|
21
|
-
Relation::TO_TRACK =>
|
22
|
-
Relation::TO_LABEL =>
|
23
|
-
Relation::TO_URL =>
|
57
|
+
Relation::TO_ARTIST => Collection.new,
|
58
|
+
Relation::TO_RELEASE => Collection.new,
|
59
|
+
Relation::TO_TRACK => Collection.new,
|
60
|
+
Relation::TO_LABEL => Collection.new,
|
61
|
+
Relation::TO_URL => Collection.new,
|
24
62
|
}
|
25
63
|
end
|
26
64
|
|
27
65
|
# Set the MBID.
|
28
66
|
#
|
29
|
-
#
|
67
|
+
# _mbid_ should be an instance of MBID or a string
|
30
68
|
# representing either a complete MBID URI or just the
|
31
69
|
# UUID part of it. If it is a complete URI the entity
|
32
70
|
# part of the URI must match the entity type returned
|
33
|
-
# by +entity_type+ or an
|
71
|
+
# by +entity_type+ or an EntityTypeNotMatchingError
|
34
72
|
# will be raised.
|
35
73
|
#
|
36
|
-
# Raises:
|
37
|
-
#
|
74
|
+
# Raises: UnknownEntityError, InvalidMBIDError,
|
75
|
+
# EntityTypeNotMatchingError
|
38
76
|
def id=(mbid)
|
39
|
-
|
40
|
-
|
41
|
-
@id = mbid
|
42
|
-
elsif mbid.nil?
|
43
|
-
@id = nil
|
77
|
+
if mbid
|
78
|
+
@id = MBID.parse(mbid, entity_type)
|
44
79
|
else
|
45
|
-
# Try to create an MBID from URI
|
46
|
-
begin
|
47
|
-
@id = MBID.from_uri(mbid)
|
48
|
-
rescue InvalidMBIDError => e
|
49
|
-
# Try it again and use mbid as the UUID
|
50
|
-
@id = MBID.from_uuid(self.entity_type, mbid)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
# Check if the entity type of @id matches that of the current object.
|
55
|
-
unless @id.nil? or @id.entity == self.entity_type
|
56
|
-
exception = EntityTypeNotMatchingError.new(@id.entity.to_s)
|
57
80
|
@id = nil
|
58
|
-
raise exception
|
59
81
|
end
|
60
82
|
end
|
61
83
|
|
@@ -64,7 +86,7 @@ module MusicBrainz
|
|
64
86
|
# Depending on the class this is <tt>:artist</tt>, <tt>:release</tt>,
|
65
87
|
# <tt>:track</tt> or <tt>:label</tt>.
|
66
88
|
def self.entity_type
|
67
|
-
self
|
89
|
+
self::ENTITY_TYPE
|
68
90
|
end
|
69
91
|
|
70
92
|
# Returns the entity type of the instance.
|
@@ -75,36 +97,83 @@ module MusicBrainz
|
|
75
97
|
self.class.entity_type
|
76
98
|
end
|
77
99
|
|
78
|
-
#
|
100
|
+
#
|
101
|
+
# Adds a relation.
|
102
|
+
#
|
103
|
+
# This method adds _relation_ to the list of relations. The
|
104
|
+
# given relation has to be initialized, at least the target
|
105
|
+
# type has to be set.
|
106
|
+
#
|
79
107
|
def add_relation(relation)
|
80
108
|
@relations[relation.target_type] << relation
|
81
109
|
end
|
82
110
|
|
83
|
-
#
|
111
|
+
#
|
112
|
+
# Returns a list of relations.
|
113
|
+
#
|
114
|
+
# If _target_type_ is given, only relations of that target
|
115
|
+
# type are returned. For MusicBrainz, the following target
|
116
|
+
# types are defined:
|
117
|
+
# - Relation::TO_ARTIST
|
118
|
+
# - Relation::TO_RELEASE
|
119
|
+
# - Relation::TO_TRACK
|
120
|
+
# - Relation::TO_URL
|
121
|
+
#
|
122
|
+
# If _target_type_ is Relation::TO_ARTIST, for example,
|
123
|
+
# this method returns all relations between this Entity and
|
124
|
+
# artists.
|
125
|
+
#
|
126
|
+
# You may use the _relation_type_ parameter to further restrict
|
127
|
+
# the selection. If it is set, only relations with the given
|
128
|
+
# relation type are returned. The _required_attributes_ sequence
|
129
|
+
# lists attributes that have to be part of all returned relations.
|
130
|
+
#
|
131
|
+
# If _direction_ is set, only relations with the given reading
|
132
|
+
# direction are returned. You can use the Relation::DIR_FORWARD,
|
133
|
+
# Relation::DIR_BACKWARD, and Relation::DIR_BOTH constants
|
134
|
+
# for this.
|
135
|
+
#
|
84
136
|
def get_relations(options = {:target_type => nil, :relation_type => nil,
|
85
137
|
:required_attributes => [], :direction => nil})
|
86
|
-
|
87
|
-
|
88
|
-
|
138
|
+
Utils.check_options options,
|
139
|
+
:target_type, :relation_type, :required_attributes, :direction
|
140
|
+
target_type = options[:target_type]
|
141
|
+
relation_type = options[:relation_type]
|
142
|
+
required_attributes =
|
143
|
+
options[:required_attributes] ? options[:required_attributes] : []
|
144
|
+
direction = options[:direction]
|
145
|
+
|
146
|
+
# Select all relevant relations depending on the requested target type
|
147
|
+
if target_type
|
148
|
+
result = @relations[target_type].to_a
|
89
149
|
else
|
90
|
-
result =
|
91
|
-
@relations.each_value {|array| result += array}
|
150
|
+
result = @relations.values.flatten
|
92
151
|
end
|
93
152
|
|
94
|
-
#
|
95
|
-
|
96
|
-
|
97
|
-
or (options[:required_attributes] and
|
98
|
-
(relation.attributes & options[:required_attributes]).sort \
|
99
|
-
!= options[:required_attributes].sort) \
|
100
|
-
or (options[:direction] and relation.direction != options[:direction])
|
101
|
-
}
|
153
|
+
# Filter for direction
|
154
|
+
#
|
155
|
+
result = result.find_all { |r| r.direction == direction } if direction
|
102
156
|
|
103
|
-
|
157
|
+
# Filter for relation type
|
158
|
+
#
|
159
|
+
result = result.find_all{ |r| r.type == relation_type } if relation_type
|
160
|
+
|
161
|
+
# Filter for attributes
|
162
|
+
#
|
163
|
+
required = required_attributes.to_set
|
164
|
+
result.find_all do |r|
|
165
|
+
required.subset?( r.attributes.to_set )
|
166
|
+
end
|
104
167
|
end
|
105
168
|
|
106
|
-
#
|
107
|
-
#
|
169
|
+
#
|
170
|
+
# Returns a list of target types available for this entity.
|
171
|
+
#
|
172
|
+
# Use this to find out to which types of targets this entity
|
173
|
+
# has relations. If the entity only has relations to tracks and
|
174
|
+
# artists, for example, then a list containg the strings
|
175
|
+
# Relation::TO_TRACK and Relation::TO_ARTIST is returned.
|
176
|
+
#
|
108
177
|
def relation_target_types
|
109
178
|
result = []
|
110
179
|
@relations.each_pair {|type, relations|
|
@@ -1,7 +1,9 @@
|
|
1
|
-
# $Id: incomplete_date.rb
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
1
|
+
# $Id: incomplete_date.rb 145 2007-07-19 13:11:44Z phw $
|
2
|
+
#
|
3
|
+
# Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
|
4
|
+
# Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
|
5
|
+
# License:: RBrainz is free software distributed under a BSD style license.
|
6
|
+
# See LICENSE[file:../LICENSE.html] for permissions.
|
5
7
|
|
6
8
|
require 'date'
|
7
9
|
|
@@ -12,28 +14,35 @@ module MusicBrainz
|
|
12
14
|
# a date which can be defined without day or without
|
13
15
|
# month and day. It can be written as <em>YYYY</em>,
|
14
16
|
# <em>YYYY-MM</em> or <em>YYYY-MM-DD</em>.
|
15
|
-
class IncompleteDate
|
16
|
-
|
17
|
+
class IncompleteDate < ::Range
|
17
18
|
attr_reader :year, :month, :day
|
18
|
-
|
19
|
-
#
|
20
|
-
#
|
21
|
-
include Comparable
|
22
|
-
|
23
|
-
# TODO: Validation of the date
|
19
|
+
|
20
|
+
# Create a new IncompleteDate. The parameter _date_ must be a String in
|
21
|
+
# the form <em>YYYY</em>, <em>YYYY-MM</em> or <em>YYYY-MM-DD</em>.
|
24
22
|
def initialize(date)
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
@
|
30
|
-
@month
|
31
|
-
|
32
|
-
|
33
|
-
|
23
|
+
date = date.to_s if date.respond_to? :to_s
|
24
|
+
if date =~ /^(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?$/
|
25
|
+
@year = $1.to_i
|
26
|
+
@month = $2 ? $2.to_i : nil
|
27
|
+
@day = $3 ? $3.to_i : nil
|
28
|
+
if @month
|
29
|
+
if @day
|
30
|
+
start_d = Date.civil( @year, @month, @day)
|
31
|
+
end_d = start_d.succ
|
32
|
+
else
|
33
|
+
start_d = Date.civil( @year, @month)
|
34
|
+
end_d = Date.civil( @year, @month+1)
|
35
|
+
end
|
36
|
+
else
|
37
|
+
start_d = Date.civil( @year)
|
38
|
+
end_d = Date.civil( @year+1)
|
39
|
+
end
|
40
|
+
super( start_d, end_d, true)
|
41
|
+
else
|
42
|
+
raise ArgumentError, "Invalid incomplete date #{date}"
|
34
43
|
end
|
35
44
|
end
|
36
|
-
|
45
|
+
|
37
46
|
# Returns the incomplete date in its textual form
|
38
47
|
# <em>YYYY</em>, <em>YYYY-MM</em> or <em>YYYY-MM-DD</em>.
|
39
48
|
#
|
@@ -45,31 +54,6 @@ module MusicBrainz
|
|
45
54
|
}
|
46
55
|
return date
|
47
56
|
end
|
48
|
-
|
49
|
-
# Compare this incomplete date with another incomplete date.
|
50
|
-
# If two incomplete dates are compared of which one date has
|
51
|
-
# less information than the other only the information
|
52
|
-
# present in both incomplete dates is used for comparison.
|
53
|
-
# That means that the dates 1980-08-22, 1980-08 and 1980 are
|
54
|
-
# all considered equal if compared to one another since it
|
55
|
-
# can't be decided if e.g. the date 1980-08 is earlier or later
|
56
|
-
# than 1980-08-22.
|
57
|
-
#
|
58
|
-
# As a consequence of this a list of +IncompleteDate+ objects
|
59
|
-
# won't get sorted in the lexical order of their string
|
60
|
-
# representations. If you need a lexical order you must convert
|
61
|
-
# these objects to strings before ordering them.
|
62
|
-
def <=>(other)
|
63
|
-
result = self.year <=> other.year
|
64
|
-
if result == 0 and self.month and other.month
|
65
|
-
result = self.month <=> other.month
|
66
|
-
if result == 0 and self.day and other.day
|
67
|
-
result = self.day <=> other.day
|
68
|
-
end
|
69
|
-
end
|
70
|
-
return result
|
71
|
-
end
|
72
|
-
|
73
57
|
end
|
74
58
|
|
75
59
|
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# $Id: individual.rb 145 2007-07-19 13:11:44Z phw $
|
2
|
+
#
|
3
|
+
# Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
|
4
|
+
# Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
|
5
|
+
# License:: RBrainz is free software distributed under a BSD style license.
|
6
|
+
# See LICENSE[file:../LICENSE.html] for permissions.
|
7
|
+
|
8
|
+
require 'rbrainz/model/entity'
|
9
|
+
require 'rbrainz/model/incomplete_date'
|
10
|
+
|
11
|
+
module MusicBrainz
|
12
|
+
module Model
|
13
|
+
|
14
|
+
# Superclass for Artist and Label.
|
15
|
+
#
|
16
|
+
# Aggregates the common attributes of artists and labels.
|
17
|
+
class Individual < Entity
|
18
|
+
|
19
|
+
# The name of the artist or label.
|
20
|
+
attr_accessor :name
|
21
|
+
|
22
|
+
# Name used for sorting (e.g. "White Stripes, The").
|
23
|
+
attr_accessor :sort_name
|
24
|
+
|
25
|
+
# Field to distinguish between identically named artists or labels.
|
26
|
+
attr_accessor :disambiguation
|
27
|
+
|
28
|
+
# The type of this artist or label. See the constants defined in Artist
|
29
|
+
# and Label for a list of possible types.
|
30
|
+
attr_accessor :type
|
31
|
+
|
32
|
+
# Collection of alternate names, including possible typos.
|
33
|
+
attr_reader :aliases
|
34
|
+
|
35
|
+
# The begin date is interpreted differently for bands, individual artists
|
36
|
+
# and labels. For bands and labels this is the founding date, for
|
37
|
+
# individual artists it is the date of birth.
|
38
|
+
# The begin date is an instance of IncompleteDate.
|
39
|
+
attr_reader :begin_date
|
40
|
+
|
41
|
+
# The end date is interpreted differently for bands, individual artists
|
42
|
+
# and labels. For bands and labels this is the breakup date, for
|
43
|
+
# individual artists it is the date of death.
|
44
|
+
# The end date is an instance of IncompleteDate.
|
45
|
+
attr_reader :end_date
|
46
|
+
|
47
|
+
# A Collection of releases of this artist or label.
|
48
|
+
#
|
49
|
+
# This may also include releases where this artist isn't the
|
50
|
+
# <i>main</i> artist but has just contributed one or more tracks
|
51
|
+
# (aka VA-Releases).
|
52
|
+
attr_reader :releases
|
53
|
+
|
54
|
+
def initialize(id=nil, type=nil, name=nil, sort_name=nil)
|
55
|
+
super id
|
56
|
+
self.type = type
|
57
|
+
self.name = name
|
58
|
+
self.sort_name = sort_name
|
59
|
+
@aliases = Collection.new
|
60
|
+
@releases = Collection.new
|
61
|
+
end
|
62
|
+
|
63
|
+
# Set the begin date of this individual to _date_.
|
64
|
+
#
|
65
|
+
# Should be an IncompleteDate object or a date string, which will
|
66
|
+
# get converted into an IncompleteDate.
|
67
|
+
def begin_date=(date)
|
68
|
+
date = IncompleteDate.new date unless date.is_a? IncompleteDate
|
69
|
+
@begin_date = date
|
70
|
+
end
|
71
|
+
|
72
|
+
# Set the end date of this individual to _date_.
|
73
|
+
#
|
74
|
+
# Should be an IncompleteDate object or a date string, which will
|
75
|
+
# get converted into an IncompleteDate.
|
76
|
+
def end_date=(date)
|
77
|
+
date = IncompleteDate.new date unless date.is_a? IncompleteDate
|
78
|
+
@end_date = date
|
79
|
+
end
|
80
|
+
|
81
|
+
# Returns a unique name for the individual (using disambiguation).
|
82
|
+
#
|
83
|
+
# The unique name ist the individual's name together with the
|
84
|
+
# disambiguation attribute in parenthesis if it exists.
|
85
|
+
#
|
86
|
+
# Example:: 'Paradise Lost (British metal / hard rock band)'.
|
87
|
+
def unique_name
|
88
|
+
unique_name = @name
|
89
|
+
unique_name += " (#{@disambiguation})" if @disambiguation
|
90
|
+
return unique_name
|
91
|
+
end
|
92
|
+
|
93
|
+
# Returns the string representation for this individual.
|
94
|
+
#
|
95
|
+
# Returns #unique_name converted into a string.
|
96
|
+
def to_s
|
97
|
+
unique_name.to_s
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
end
|
data/lib/rbrainz/model/label.rb
CHANGED
@@ -1,54 +1,63 @@
|
|
1
|
-
# $Id: label.rb
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
1
|
+
# $Id: label.rb 141 2007-07-17 14:21:12Z phw $
|
2
|
+
#
|
3
|
+
# Author:: Philipp Wolfer (mailto:phw@rubyforge.org)
|
4
|
+
# Copyright:: Copyright (c) 2007, Nigel Graham, Philipp Wolfer
|
5
|
+
# License:: RBrainz is free software distributed under a BSD style license.
|
6
|
+
# See LICENSE[file:../LICENSE.html] for permissions.
|
5
7
|
|
6
|
-
require 'rbrainz/model/
|
7
|
-
require 'rbrainz/model/incomplete_date'
|
8
|
+
require 'rbrainz/model/individual'
|
8
9
|
|
9
10
|
module MusicBrainz
|
10
11
|
module Model
|
11
12
|
|
12
13
|
# A label in the MusicBrainz DB.
|
13
14
|
#
|
14
|
-
#
|
15
|
-
|
15
|
+
# Labels in MusicBrainz can have a type. Currently, the following types
|
16
|
+
# are supported
|
17
|
+
#
|
18
|
+
# - http://musicbrainz.org/ns/mmd-1.0#Unknown
|
19
|
+
# - http://musicbrainz.org/ns/mmd-1.0#Distributor
|
20
|
+
# - http://musicbrainz.org/ns/mmd-1.0#Holding
|
21
|
+
# - http://musicbrainz.org/ns/mmd-1.0#OriginalProduction
|
22
|
+
# - http://musicbrainz.org/ns/mmd-1.0#BootlegProduction
|
23
|
+
# - http://musicbrainz.org/ns/mmd-1.0#ReissueProduction
|
24
|
+
#
|
25
|
+
# See:: Individual
|
26
|
+
# See:: http://musicbrainz.org/doc/Label.
|
27
|
+
class Label < Individual
|
16
28
|
|
29
|
+
# Used if the type of the label is unknown.
|
30
|
+
TYPE_UNKNOWN = NS_MMD_1 + 'Unknown'
|
31
|
+
# Companies mainly distributing other labels production,
|
32
|
+
# usually in a specific region of the world.
|
17
33
|
TYPE_DISTRIBUTOR = NS_MMD_1 + 'Distributor'
|
34
|
+
# Holdings, conglomerates or other financial entities whose main
|
35
|
+
# activity is not to produce records, but to manage a large set of
|
36
|
+
# recording labels owned by them.
|
18
37
|
TYPE_HOLDING = NS_MMD_1 + 'Holding'
|
38
|
+
# Recording labels producing entirely new releases.
|
19
39
|
TYPE_ORIGINAL_PRODUCTION = NS_MMD_1 + 'OriginalProduction'
|
40
|
+
# Bootlegs companies (as in "not sanctioned by the rights owner(s)
|
41
|
+
# of the released work")
|
20
42
|
TYPE_BOOTLEG_PRODUCTION = NS_MMD_1 + 'BootlegProduction'
|
43
|
+
# Labels specializing in catalog reissues.
|
21
44
|
TYPE_REISSUE_PRODUCTION = NS_MMD_1 + 'ReissueProduction'
|
22
45
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
attr_reader :founding_date, :dissolving_date, :releases
|
27
|
-
|
28
|
-
def initialize
|
29
|
-
super
|
30
|
-
@releases = Array.new
|
31
|
-
end
|
46
|
+
# See Entity::ENTITY_TYPE.
|
47
|
+
ENTITY_TYPE = :label # :nodoc:
|
32
48
|
|
33
|
-
#
|
49
|
+
# The code of the label.
|
34
50
|
#
|
35
|
-
#
|
36
|
-
|
37
|
-
# into an IncompleteDate.
|
38
|
-
def founding_date=(date)
|
39
|
-
date = IncompleteDate.new date unless date.is_a? IncompleteDate
|
40
|
-
@founding_date = date
|
41
|
-
end
|
51
|
+
# See:: http://musicbrainz.org/doc/LabelCode
|
52
|
+
attr_accessor :code
|
42
53
|
|
43
|
-
#
|
54
|
+
# The country in which the company was founded.
|
55
|
+
# A string containing a ISO 3166 country code like
|
56
|
+
# 'GB', 'US' or 'DE'.
|
44
57
|
#
|
45
|
-
#
|
46
|
-
#
|
47
|
-
|
48
|
-
def dissolving_date=(date)
|
49
|
-
date = IncompleteDate.new date unless date.is_a? IncompleteDate
|
50
|
-
@dissolving_date = date
|
51
|
-
end
|
58
|
+
# See:: Utils#get_country_name
|
59
|
+
# See:: http://musicbrainz.org/doc/LabelCountry
|
60
|
+
attr_accessor :country
|
52
61
|
|
53
62
|
end
|
54
63
|
|