musicbrainz 0.7.3 → 0.7.4

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/README.md CHANGED
@@ -80,6 +80,9 @@ MusicBrainz::ReleaseGroup
80
80
  ```ruby
81
81
  # Class Methods
82
82
  MusicBrainz::ReleaseGroup.find(id)
83
+ MusicBrainz::ReleaseGroup.find_by_artist_and_title(artist_name, title, type: 'Album')
84
+ MusicBrainz::ReleaseGroup.search(artist_name, title)
85
+ MusicBrainz::ReleaseGroup.search(artist_name, title, type: 'Album')
83
86
 
84
87
  # Instance Methods
85
88
  @release_group.releases
@@ -105,11 +108,15 @@ MusicBrainz::Release.find(id)
105
108
  # Fields
106
109
  {
107
110
  :id => String,
111
+ :type => String,
108
112
  :title => String,
109
113
  :status => String,
110
114
  :format => String,
111
115
  :date => Date,
112
- :country => String
116
+ :country => String,
117
+ :asin => String,
118
+ :barcode => String,
119
+ :quality => String
113
120
  }
114
121
  ```
115
122
 
@@ -24,6 +24,7 @@ require "musicbrainz/bindings/artist"
24
24
  require "musicbrainz/bindings/artist_search"
25
25
  require "musicbrainz/bindings/artist_release_groups"
26
26
  require "musicbrainz/bindings/release_group"
27
+ require "musicbrainz/bindings/release_group_search"
27
28
  require "musicbrainz/bindings/release_group_releases"
28
29
  require "musicbrainz/bindings/release"
29
30
  require "musicbrainz/bindings/release_tracks"
@@ -6,10 +6,14 @@ module MusicBrainz
6
6
 
7
7
  hash = {
8
8
  id: (xml.attribute('id').value rescue nil),
9
+ type: (xml.xpath('./release-group').attribute('type').value rescue nil),
9
10
  title: (xml.xpath('./title').text rescue nil),
10
11
  status: (xml.xpath('./status').text rescue nil),
11
12
  country: (xml.xpath('./country').text rescue nil),
12
- date: (xml.xpath('./date').text rescue nil)
13
+ date: (xml.xpath('./date').text rescue nil),
14
+ asin: (xml.xpath('./asin').text rescue nil),
15
+ barcode: (xml.xpath('./barcode').text rescue nil),
16
+ quality: (xml.xpath('./quality').text rescue nil)
13
17
  }
14
18
 
15
19
  formats = (xml.xpath('./medium-list/medium/format') rescue []).map(&:text)
@@ -0,0 +1,20 @@
1
+ # encoding: UTF-8
2
+ module MusicBrainz
3
+ module Bindings
4
+ module ReleaseGroupSearch
5
+ def parse(xml)
6
+ xml.xpath('./release-group-list/release-group').map do |xml|
7
+ {
8
+ id: (xml.attribute('id').value rescue nil),
9
+ mbid: (xml.attribute('id').value rescue nil), # Old shit
10
+ title: (xml.xpath('./title').text.gsub(/[`’]/, "'") rescue nil),
11
+ type: (xml.attribute('type').value rescue nil),
12
+ score: (xml.attribute('score').value.to_i rescue nil)
13
+ } rescue nil
14
+ end.delete_if{ |item| item.nil? }
15
+ end
16
+
17
+ extend self
18
+ end
19
+ end
20
+ end
@@ -46,14 +46,18 @@ module MusicBrainz
46
46
  elsif type == String
47
47
  val.to_s
48
48
  elsif type == Date
49
- if val.nil? or val == ""
50
- val = "2030-12-31"
49
+ val = if val.nil? or val == ""
50
+ [2030, 12, 31]
51
51
  elsif val.split("-").length == 1
52
- val << "-12-31"
52
+ [val.split("-").first.to_i, 12, 31]
53
53
  elsif val.split("-").length == 2
54
- val << "-31"
54
+ val = val.split("-").map(&:to_i)
55
+ [val.first, val.last, -1]
56
+ else
57
+ val.split("-").map(&:to_i)
55
58
  end
56
- Date.new(*val.split(?-).map(&:to_i))
59
+
60
+ Date.new(*val)
57
61
  else
58
62
  val
59
63
  end
@@ -1,12 +1,16 @@
1
1
  module MusicBrainz
2
2
  class Release < BaseModel
3
3
  field :id, String
4
+ field :type, String
4
5
  field :title, String
5
6
  field :status, String
6
7
  field :format, String
7
8
  field :date, Date
8
9
  field :country, String
9
-
10
+ field :asin, String
11
+ field :barcode, String
12
+ field :quality, String
13
+
10
14
  def tracks
11
15
  @tracks ||= client.load(:release, { id: id, inc: [:recordings, :media], limit: 100 }, {
12
16
  binding: :release_tracks,
@@ -17,7 +21,7 @@ module MusicBrainz
17
21
 
18
22
  class << self
19
23
  def find(id)
20
- client.load(:release, { id: id, inc: [:media] }, {
24
+ client.load(:release, { id: id, inc: [:media, :release_groups] }, {
21
25
  binding: :release,
22
26
  create_model: :release
23
27
  })
@@ -9,7 +9,7 @@ module MusicBrainz
9
9
  alias_method :disambiguation, :desc
10
10
 
11
11
  def releases
12
- @releases ||= client.load(:release, { release_group: id, inc: [:media], limit: 100 }, {
12
+ @releases ||= client.load(:release, { release_group: id, inc: [:media, :release_groups], limit: 100 }, {
13
13
  binding: :release_group_releases,
14
14
  create_models: :release,
15
15
  sort: :date
@@ -23,6 +23,23 @@ module MusicBrainz
23
23
  create_model: :release_group
24
24
  })
25
25
  end
26
+
27
+ def search(artist_name, title, options = {})
28
+ artist_name = CGI.escape(artist_name).gsub(/\!/, '\!')
29
+ title = CGI.escape(title).gsub(/\!/, '\!')
30
+ query = ["artist:\"#{artist_name}\"", "releasegroup:\"#{title}\""]
31
+ query << "type: #{options[:type]}" if options[:type]
32
+
33
+ client.load(
34
+ :release_group, { query: query.join(' AND '), limit: 10 },
35
+ { binding: :release_group_search }
36
+ )
37
+ end
38
+
39
+ def find_by_artist_and_title(artist_name, title, options = {})
40
+ matches = search(artist_name, title, options)
41
+ matches.empty? ? nil : find(matches.first[:id])
42
+ end
26
43
  end
27
44
  end
28
45
  end
@@ -1,3 +1,3 @@
1
1
  module MusicBrainz
2
- VERSION = "0.7.3"
2
+ VERSION = "0.7.4"
3
3
  end
@@ -0,0 +1,17 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "spec_helper"
4
+
5
+ describe MusicBrainz::Bindings::ReleaseGroupSearch do
6
+ describe '.parse' do
7
+ it "gets correct release group data" do
8
+ response = '<release-group-list><release-group id="246bc928-2dc8-35ba-80ee-7a0079de1632" type="Single" ext:score="100"><title>Empire</title></release-group>'
9
+ described_class.parse(Nokogiri::XML.parse(response)).should == [
10
+ {
11
+ id: '246bc928-2dc8-35ba-80ee-7a0079de1632', mbid: '246bc928-2dc8-35ba-80ee-7a0079de1632',
12
+ title: 'Empire', type: 'Single', score: 100
13
+ }
14
+ ]
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,45 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "spec_helper"
4
+
5
+ describe MusicBrainz::BaseModel do
6
+ describe '#validate_type' do
7
+ describe 'Date' do
8
+ context 'nil value' do
9
+ it 'returns 2030-12-31' do
10
+ response = '<release-group><first-release-date></first-release-date></release-group>'
11
+ xml = Nokogiri::XML.parse(response)
12
+ release_group = MusicBrainz::ReleaseGroup.new MusicBrainz::Bindings::ReleaseGroup.parse(xml)
13
+ release_group.first_release_date.should == Date.new(2030, 12, 31)
14
+ end
15
+ end
16
+
17
+ context 'year only' do
18
+ it 'returns 1995-12-31' do
19
+ response = '<release-group><first-release-date>1995</first-release-date></release-group>'
20
+ xml = Nokogiri::XML.parse(response)
21
+ release_group = MusicBrainz::ReleaseGroup.new MusicBrainz::Bindings::ReleaseGroup.parse(xml)
22
+ release_group.first_release_date.should == Date.new(1995, 12, 31)
23
+ end
24
+ end
25
+
26
+ context 'year and month only' do
27
+ it 'returns 1995-04-30' do
28
+ response = '<release-group><first-release-date>1995-04</first-release-date></release-group>'
29
+ xml = Nokogiri::XML.parse(response)
30
+ release_group = MusicBrainz::ReleaseGroup.new MusicBrainz::Bindings::ReleaseGroup.parse(xml)
31
+ release_group.first_release_date.should == Date.new(1995, 4, 30)
32
+ end
33
+ end
34
+
35
+ context 'year, month and day' do
36
+ it 'returns 1995-04-30' do
37
+ response = '<release-group><first-release-date>1995-04-30</first-release-date></release-group>'
38
+ xml = Nokogiri::XML.parse(response)
39
+ release_group = MusicBrainz::ReleaseGroup.new MusicBrainz::Bindings::ReleaseGroup.parse(xml)
40
+ release_group.first_release_date.should == Date.new(1995, 4, 30)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -3,32 +3,64 @@
3
3
  require "spec_helper"
4
4
 
5
5
  describe MusicBrainz::ReleaseGroup do
6
- it "gets no exception while loading release group info" do
7
- lambda {
8
- MusicBrainz::ReleaseGroup.find("6f33e0f0-cde2-38f9-9aee-2c60af8d1a61")
9
- }.should_not raise_error(Exception)
6
+ describe '.find' do
7
+ it "gets no exception while loading release group info" do
8
+ lambda {
9
+ MusicBrainz::ReleaseGroup.find("6f33e0f0-cde2-38f9-9aee-2c60af8d1a61")
10
+ }.should_not raise_error(Exception)
11
+ end
12
+
13
+ it "gets correct instance" do
14
+ release_group = MusicBrainz::ReleaseGroup.find("6f33e0f0-cde2-38f9-9aee-2c60af8d1a61")
15
+ release_group.should be_an_instance_of(MusicBrainz::ReleaseGroup)
16
+ end
17
+
18
+ it "gets correct release group data" do
19
+ release_group = MusicBrainz::ReleaseGroup.find("6f33e0f0-cde2-38f9-9aee-2c60af8d1a61")
20
+ release_group.id.should == "6f33e0f0-cde2-38f9-9aee-2c60af8d1a61"
21
+ release_group.type.should == "Album"
22
+ release_group.title.should == "Empire"
23
+ release_group.first_release_date.should == Date.new(2006, 8, 28)
24
+ end
10
25
  end
11
-
12
- it "gets correct instance" do
13
- release_group = MusicBrainz::ReleaseGroup.find("6f33e0f0-cde2-38f9-9aee-2c60af8d1a61")
14
- release_group.should be_an_instance_of(MusicBrainz::ReleaseGroup)
26
+
27
+ describe '.search' do
28
+ context 'without type filter' do
29
+ it "searches release group by artist name and title" do
30
+ matches = MusicBrainz::ReleaseGroup.search('Kasabian', 'Empire')
31
+ matches.length.should be > 0
32
+ matches.first[:title].should == 'Empire'
33
+ matches.first[:type].should == 'Single'
34
+ end
35
+ end
36
+
37
+ context 'with type filter' do
38
+ it "searches release group by artist name and title" do
39
+ matches = MusicBrainz::ReleaseGroup.search('Kasabian', 'Empire', type: 'Album')
40
+ matches.length.should be > 0
41
+ matches.first[:title].should == 'Empire'
42
+ matches.first[:type].should == 'Album'
43
+ end
44
+ end
15
45
  end
16
-
17
- it "gets correct release group data" do
18
- release_group = MusicBrainz::ReleaseGroup.find("6f33e0f0-cde2-38f9-9aee-2c60af8d1a61")
19
- release_group.id.should == "6f33e0f0-cde2-38f9-9aee-2c60af8d1a61"
20
- release_group.type.should == "Album"
21
- release_group.title.should == "Empire"
22
- release_group.first_release_date.should == Date.new(2006, 8, 28)
46
+
47
+ describe '.find_by_artist_and_title' do
48
+ it "gets first release group by artist name and title" do
49
+ release_group = MusicBrainz::ReleaseGroup.find_by_artist_and_title('Kasabian', 'Empire')
50
+ release_group.id.should == '246bc928-2dc8-35ba-80ee-7a0079de1632'
51
+ end
23
52
  end
24
-
25
- it "gets correct release group's releases" do
26
- releases = MusicBrainz::ReleaseGroup.find("6f33e0f0-cde2-38f9-9aee-2c60af8d1a61").releases
27
- releases.length.should be >= 5
28
- releases.first.id.should == "2225dd4c-ae9a-403b-8ea0-9e05014c778f"
29
- releases.first.status.should == "Official"
30
- releases.first.title.should == "Empire"
31
- releases.first.date.should == Date.new(2006, 8, 28)
32
- releases.first.country.should == "GB"
53
+
54
+ describe '#releases' do
55
+ it "gets correct release group's releases" do
56
+ releases = MusicBrainz::ReleaseGroup.find("6f33e0f0-cde2-38f9-9aee-2c60af8d1a61").releases
57
+ releases.length.should be >= 5
58
+ releases.first.id.should == "2225dd4c-ae9a-403b-8ea0-9e05014c778f"
59
+ releases.first.status.should == "Official"
60
+ releases.first.title.should == "Empire"
61
+ releases.first.date.should == Date.new(2006, 8, 28)
62
+ releases.first.country.should == "GB"
63
+ releases.first.type.should == "Album"
64
+ end
33
65
  end
34
66
  end
@@ -15,12 +15,16 @@ describe MusicBrainz::Release do
15
15
  end
16
16
 
17
17
  it "gets correct release data" do
18
- release = MusicBrainz::Release.find("2225dd4c-ae9a-403b-8ea0-9e05014c778f")
19
- release.id.should == "2225dd4c-ae9a-403b-8ea0-9e05014c778f"
20
- release.title.should == "Empire"
18
+ release = MusicBrainz::Release.find("b94cb547-cf7a-4357-894c-53c3bf33b093")
19
+ release.id.should == "b94cb547-cf7a-4357-894c-53c3bf33b093"
20
+ release.title.should == "Humanoid"
21
21
  release.status.should == "Official"
22
- release.date.should == Date.new(2006, 8, 28)
23
- release.country.should == "GB"
22
+ release.date.should == Date.new(2009, 10, 6)
23
+ release.country.should == "US"
24
+ release.asin.should == 'B002NOYX6I'
25
+ release.barcode.should == '602527197692'
26
+ release.quality.should == 'normal'
27
+ release.type.should == 'Album'
24
28
  end
25
29
 
26
30
  it "gets correct release tracks" do
metadata CHANGED
@@ -2,14 +2,14 @@
2
2
  name: musicbrainz
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.7.3
5
+ version: 0.7.4
6
6
  platform: ruby
7
7
  authors:
8
8
  - Gregory Eremin
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-20 00:00:00.000000000 Z
12
+ date: 2013-01-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  version_requirements: !ruby/object:Gem::Requirement
@@ -97,6 +97,7 @@ files:
97
97
  - lib/musicbrainz/bindings/release.rb
98
98
  - lib/musicbrainz/bindings/release_group.rb
99
99
  - lib/musicbrainz/bindings/release_group_releases.rb
100
+ - lib/musicbrainz/bindings/release_group_search.rb
100
101
  - lib/musicbrainz/bindings/release_tracks.rb
101
102
  - lib/musicbrainz/bindings/track.rb
102
103
  - lib/musicbrainz/client.rb
@@ -113,12 +114,14 @@ files:
113
114
  - lib/musicbrainz/models/track.rb
114
115
  - lib/musicbrainz/version.rb
115
116
  - musicbrainz.gemspec
117
+ - spec/bindings/release_group_search_spec.rb
116
118
  - spec/bindings/release_spec.rb
117
119
  - spec/client_modules/cache_spec.rb
118
120
  - spec/deprecated/cache_config_spec.rb
119
121
  - spec/deprecated/proxy_config_spec.rb
120
122
  - spec/fixtures/kasabian.xml
121
123
  - spec/models/artist_spec.rb
124
+ - spec/models/base_model_spec.rb
122
125
  - spec/models/release_group_spec.rb
123
126
  - spec/models/release_spec.rb
124
127
  - spec/models/track_spec.rb
@@ -149,12 +152,14 @@ signing_key:
149
152
  specification_version: 3
150
153
  summary: MusicBrainz Web Service wrapper with ActiveRecord-style models
151
154
  test_files:
155
+ - spec/bindings/release_group_search_spec.rb
152
156
  - spec/bindings/release_spec.rb
153
157
  - spec/client_modules/cache_spec.rb
154
158
  - spec/deprecated/cache_config_spec.rb
155
159
  - spec/deprecated/proxy_config_spec.rb
156
160
  - spec/fixtures/kasabian.xml
157
161
  - spec/models/artist_spec.rb
162
+ - spec/models/base_model_spec.rb
158
163
  - spec/models/release_group_spec.rb
159
164
  - spec/models/release_spec.rb
160
165
  - spec/models/track_spec.rb