1
0
Fork 0

Artist, Release Group, Release models

This commit is contained in:
magnolia-fan 2011-07-18 06:00:26 +04:00
parent dd4b2387c0
commit 5112cfbd8a
9 changed files with 215 additions and 7 deletions

View File

@ -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
View 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

View File

@ -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'

View 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

View 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

View 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

View File

@ -0,0 +1,3 @@
class MusicBrainzTrack
end

View File

@ -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"

View File

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