From 01bf184e93ff5c45103c43eb83ad21e658318588 Mon Sep 17 00:00:00 2001 From: magnolia-fan Date: Mon, 18 Jul 2011 06:38:21 +0400 Subject: [PATCH] Track model --- lib/models/music_brainz_release.rb | 4 +-- lib/models/music_brainz_track.rb | 14 ++++++++ test/test_musicbrainz.rb | 55 ++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 2 deletions(-) diff --git a/lib/models/music_brainz_release.rb b/lib/models/music_brainz_release.rb index 69a4244..23bbaf0 100644 --- a/lib/models/music_brainz_release.rb +++ b/lib/models/music_brainz_release.rb @@ -5,8 +5,8 @@ class MusicBrainzRelease 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) + Nokogiri::XML(open('http://musicbrainz.org/ws/2/release/' + self.id + '?inc=recordings')).css('medium-list > medium > track-list > track').each do |r| + @tracks << MusicBrainzTrack.parse_xml(r) end end @tracks diff --git a/lib/models/music_brainz_track.rb b/lib/models/music_brainz_track.rb index da95d8e..4c694b3 100644 --- a/lib/models/music_brainz_track.rb +++ b/lib/models/music_brainz_track.rb @@ -1,3 +1,17 @@ class MusicBrainzTrack + attr_accessor :position, :recording_id, :title, :length + def self.find mbid + xml = Nokogiri::XML(open('http://musicbrainz.org/ws/2/recording/' + mbid)) + self.parse_xml(xml) unless xml.nil? + end + + def self.parse_xml xml + @track = MusicBrainzTrack.new + @track.position = xml.css('position').text.to_i || nil + @track.recording_id = xml.css('recording').attr('id').value + @track.title = xml.css('recording > title').text + @track.length = xml.css('length').first.text.to_i || 0 + @track + end end diff --git a/test/test_musicbrainz.rb b/test/test_musicbrainz.rb index b637a8d..3783a8c 100644 --- a/test/test_musicbrainz.rb +++ b/test/test_musicbrainz.rb @@ -66,4 +66,59 @@ class TestMusicbrainz < Test::Unit::TestCase assert_equal('GB', releases[0].country) end end + + context "release" do + should "load release xml" do + assert_nothing_raised(Exception) do + MusicBrainzRelease.find('2225dd4c-ae9a-403b-8ea0-9e05014c778f') + end + end + + setup do + @release = MusicBrainzRelease.find('2225dd4c-ae9a-403b-8ea0-9e05014c778f') + end + + should "return valid instance" do + assert_instance_of(MusicBrainzRelease, @release) + end + + should "contain correct data" do + assert_equal("2225dd4c-ae9a-403b-8ea0-9e05014c778f", @release.id) + assert_equal("Empire", @release.title) + assert_equal("Official", @release.status) + assert_equal(Time.parse('2006-08-28'), @release.date) + assert_equal("GB", @release.country) + end + + should "load tracks" do + tracks = @release.tracks + assert_equal(11, tracks.length) + assert_equal(1, tracks[0].position) + assert_equal('b3015bab-1540-4d4e-9f30-14872a1525f7', tracks[0].recording_id) + assert_equal('Empire', tracks[0].title) + assert_equal(233013, tracks[0].length) + end + end + + context "track" do + should "load track xml" do + assert_nothing_raised(Exception) do + MusicBrainzTrack.find('b3015bab-1540-4d4e-9f30-14872a1525f7') + end + end + + setup do + @track = MusicBrainzTrack.find('b3015bab-1540-4d4e-9f30-14872a1525f7') + end + + should "return valid instance" do + assert_instance_of(MusicBrainzTrack, @track) + end + + should "contain correct data" do + assert_equal("b3015bab-1540-4d4e-9f30-14872a1525f7", @track.recording_id) + assert_equal("Empire", @track.title) + assert_equal(233013, @track.length) + end + end end