Artist, Release Group, Release models
This commit is contained in:
parent
dd4b2387c0
commit
5112cfbd8a
4
Gemfile
4
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"
|
||||
|
26
Gemfile.lock
Normal file
26
Gemfile.lock
Normal file
@ -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
|
10
Rakefile
10
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'
|
||||
|
30
lib/models/music_brainz_artist.rb
Normal file
30
lib/models/music_brainz_artist.rb
Normal file
@ -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
|
38
lib/models/music_brainz_release.rb
Normal file
38
lib/models/music_brainz_release.rb
Normal file
@ -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
|
37
lib/models/music_brainz_release_group.rb
Normal file
37
lib/models/music_brainz_release_group.rb
Normal file
@ -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
|
3
lib/models/music_brainz_track.rb
Normal file
3
lib/models/music_brainz_track.rb
Normal file
@ -0,0 +1,3 @@
|
||||
class MusicBrainzTrack
|
||||
|
||||
end
|
@ -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"
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user