diff --git a/Gemfile b/Gemfile index f79b668..2286b96 100644 --- a/Gemfile +++ b/Gemfile @@ -10,4 +10,8 @@ group :development do gem "bundler", "~> 1.0.0" gem "jeweler", "~> 1.6.4" gem "rcov", ">= 0" + gem "rdoc", ">= 0" + gem "awesome_print" end + +gem "nokogiri", ">= 0" diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..56c6946 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,26 @@ +GEM + remote: http://rubygems.org/ + specs: + awesome_print (0.4.0) + git (1.2.5) + jeweler (1.6.4) + bundler (~> 1.0) + git (>= 1.2.5) + rake + nokogiri (1.5.0) + rake (0.9.2) + rcov (0.9.9) + rdoc (3.8) + shoulda (2.11.3) + +PLATFORMS + ruby + +DEPENDENCIES + awesome_print + bundler (~> 1.0.0) + jeweler (~> 1.6.4) + nokogiri + rcov + rdoc + shoulda diff --git a/Rakefile b/Rakefile index 8dfb63b..8c27226 100644 --- a/Rakefile +++ b/Rakefile @@ -17,10 +17,10 @@ Jeweler::Tasks.new do |gem| gem.name = "musicbrainz" gem.homepage = "http://github.com/magnolia-fan/musicbrainz" gem.license = "MIT" - gem.summary = %Q{TODO: one-line summary of your gem} - gem.description = %Q{TODO: longer description of your gem} + gem.summary = %Q{MusicBrainz Web Service wrapper} + gem.description = %Q{MusicBrainz Web Service wrapper} gem.email = "magnolia_fan@me.com" - gem.authors = ["magnolia-fan"] + gem.authors = ["Gregory Eremin"] # dependencies defined in Gemfile end Jeweler::RubygemsDotOrgTasks.new @@ -42,8 +42,8 @@ end task :default => :test -require 'rake/rdoctask' -Rake::RDocTask.new do |rdoc| +require 'rdoc/task' +RDoc::Task.new do |rdoc| version = File.exist?('VERSION') ? File.read('VERSION') : "" rdoc.rdoc_dir = 'rdoc' diff --git a/lib/models/music_brainz_artist.rb b/lib/models/music_brainz_artist.rb new file mode 100644 index 0000000..58bd86f --- /dev/null +++ b/lib/models/music_brainz_artist.rb @@ -0,0 +1,30 @@ +class MusicBrainzArtist + attr_accessor :id, :type, :name, :country, :date_begin, :date_end + @release_groups + + def release_groups + if @release_groups.nil? and not self.id.nil? + @release_groups = [] + Nokogiri::XML(open('http://musicbrainz.org/ws/2/release-group/?artist=' + self.id)).css('release-group').each do |rg| + @release_groups << MusicBrainzReleaseGroup.parse_xml(rg) + end + end + @release_groups + end + + def self.find mbid + @artist = self.parse_xml(Nokogiri::XML(open('http://musicbrainz.org/ws/2/artist/' + mbid))) + end + + def self.parse_xml xml + @artist = MusicBrainzArtist.new + @artist.id = xml.css('artist').attr('id').value + @artist.type = xml.css('artist').attr('type').value + @artist.name = xml.css('artist > name').text + @artist.country = xml.css('artist > country').text || nil + @artist.date_begin = xml.css('artist > life-span > begin').text || nil + @artist.date_end = xml.css('artist > life-span > end').text || nil + @artist + end + +end diff --git a/lib/models/music_brainz_release.rb b/lib/models/music_brainz_release.rb new file mode 100644 index 0000000..69a4244 --- /dev/null +++ b/lib/models/music_brainz_release.rb @@ -0,0 +1,38 @@ +class MusicBrainzRelease + attr_accessor :id, :title, :status, :date, :country + @tracks + + def tracks + if @tracks.nil? and not self.id.nil? + @tracks = [] + Nokogiri::XML(open('http://musicbrainz.org/ws/2/release/' + self.id + '?inc=recordings')).css('release').each do |r| + @tracks << MusicBrainzRelease.parse_xml(r) + end + end + @tracks + end + + def self.find mbid + xml = Nokogiri::XML(open('http://musicbrainz.org/ws/2/release/' + mbid)).css('release').first + self.parse_xml(xml) unless xml.nil? + end + + def self.parse_xml xml + @release = MusicBrainzRelease.new + @release.id = xml.attr('id') + @release.title = xml.css('title').text + @release.status = xml.css('status').text + date = xml.css('date').text + unless date.nil? or date.empty? + if date.length == 4 + date += '-01-01' + elsif date.length == 7 + date += '-01' + end + date = Time.parse(date) + end + @release.date = date + @release.country = xml.css('country').text + @release + end +end diff --git a/lib/models/music_brainz_release_group.rb b/lib/models/music_brainz_release_group.rb new file mode 100644 index 0000000..a130e4a --- /dev/null +++ b/lib/models/music_brainz_release_group.rb @@ -0,0 +1,37 @@ +class MusicBrainzReleaseGroup + attr_accessor :id, :type, :title, :first_release_date + @releases + + def releases + if @releases.nil? and not self.id.nil? + @releases = [] + Nokogiri::XML(open('http://musicbrainz.org/ws/2/release/?release-group=' + self.id)).css('release').each do |r| + @releases << MusicBrainzRelease.parse_xml(r) + end + end + @releases + end + + def self.find mbid + xml = Nokogiri::XML(open('http://musicbrainz.org/ws/2/release-group/' + mbid)).css('release-group').first + self.parse_xml(xml) unless xml.nil? + end + + def self.parse_xml xml + @release_group = MusicBrainzReleaseGroup.new + @release_group.id = xml.attr('id') + @release_group.type = xml.attr('type') + @release_group.title = xml.css('title').text + date = xml.css('first-release-date').text + unless date.nil? or date.empty? + if date.length == 4 + date += '-01-01' + elsif date.length == 7 + date += '-01' + end + date = Time.parse(date) + end + @release_group.first_release_date = date + @release_group + end +end \ No newline at end of file diff --git a/lib/models/music_brainz_track.rb b/lib/models/music_brainz_track.rb new file mode 100644 index 0000000..da95d8e --- /dev/null +++ b/lib/models/music_brainz_track.rb @@ -0,0 +1,3 @@ +class MusicBrainzTrack + +end diff --git a/lib/musicbrainz.rb b/lib/musicbrainz.rb index e69de29..1c71f30 100644 --- a/lib/musicbrainz.rb +++ b/lib/musicbrainz.rb @@ -0,0 +1,8 @@ +require "open-uri" +require "nokogiri" +require "awesome_print" + +require "models/music_brainz_artist" +require "models/music_brainz_release_group" +require "models/music_brainz_release" +require "models/music_brainz_track" diff --git a/test/test_musicbrainz.rb b/test/test_musicbrainz.rb index a7fb13c..b637a8d 100644 --- a/test/test_musicbrainz.rb +++ b/test/test_musicbrainz.rb @@ -1,7 +1,69 @@ require 'helper' class TestMusicbrainz < Test::Unit::TestCase - should "probably rename this file and start testing for real" do - flunk "hey buddy, you should probably rename this file and start testing for real" + context "artist" do + should "load artist xml" do + assert_nothing_raised(Exception) do + MusicBrainzArtist.find('69b39eab-6577-46a4-a9f5-817839092033') + end + end + + setup do + @artist = MusicBrainzArtist.find('69b39eab-6577-46a4-a9f5-817839092033') + end + + should "return valid instance" do + assert_instance_of(MusicBrainzArtist, @artist) + end + + should "contain correct data" do + assert_equal("69b39eab-6577-46a4-a9f5-817839092033", @artist.id) + assert_equal("Group", @artist.type) + assert_equal("Kasabian", @artist.name) + assert_equal("GB", @artist.country) + assert_equal("1999", @artist.date_begin) + end + + should "load release groups" do + release_groups = @artist.release_groups + assert_operator(16, :<=, release_groups.length) + assert_equal('0244b82e-0796-36fc-a629-2507d5441124', release_groups[0].id) + assert_equal('Single', release_groups[0].type) + assert_equal('Shoot the Runner', release_groups[0].title) + assert_equal(Time.parse('2006-01-01'), release_groups[0].first_release_date) + end + end + + context "release group" do + should "load release group xml" do + assert_nothing_raised(Exception) do + MusicBrainzReleaseGroup.find('6f33e0f0-cde2-38f9-9aee-2c60af8d1a61') + end + end + + setup do + @release_group = MusicBrainzReleaseGroup.find('6f33e0f0-cde2-38f9-9aee-2c60af8d1a61') + end + + should "return valid instance" do + assert_instance_of(MusicBrainzReleaseGroup, @release_group) + end + + should "contain correct data" do + assert_equal("6f33e0f0-cde2-38f9-9aee-2c60af8d1a61", @release_group.id) + assert_equal("Album", @release_group.type) + assert_equal("Empire", @release_group.title) + assert_equal(Time.parse('2006-08-28'), @release_group.first_release_date) + end + + should "load releases" do + releases = @release_group.releases + assert_operator(5, :<=, releases.length) + assert_equal('2225dd4c-ae9a-403b-8ea0-9e05014c778f', releases[0].id) + assert_equal('Official', releases[0].status) + assert_equal('Empire', releases[0].title) + assert_equal(Time.parse('2006-08-28'), releases[0].date) + assert_equal('GB', releases[0].country) + end end end