From 32afe32d454d203c1c94daa702a255708789c629 Mon Sep 17 00:00:00 2001 From: Richard Degenne Date: Tue, 14 Jan 2025 21:38:51 +0100 Subject: [PATCH] Add medium tracks --- lib/musicbrainz/bindings/medium.rb | 3 +++ lib/musicbrainz/models/medium.rb | 5 +++++ lib/musicbrainz/models/release.rb | 2 +- spec/bindings/medium_spec.rb | 19 +++++++++++++++++++ spec/models/release_spec.rb | 11 ++++++++--- 5 files changed, 36 insertions(+), 4 deletions(-) diff --git a/lib/musicbrainz/bindings/medium.rb b/lib/musicbrainz/bindings/medium.rb index 4edbc53..42da89a 100644 --- a/lib/musicbrainz/bindings/medium.rb +++ b/lib/musicbrainz/bindings/medium.rb @@ -5,6 +5,9 @@ def parse(xml) { position: (xml.xpath('./position').text rescue nil), format: (xml.xpath('./format').text rescue nil), + tracks: xml.xpath('./track-list/track').map do |track_xml| + MusicBrainz::Bindings::Track.parse(track_xml) + end } end diff --git a/lib/musicbrainz/models/medium.rb b/lib/musicbrainz/models/medium.rb index 4818134..ad4d584 100644 --- a/lib/musicbrainz/models/medium.rb +++ b/lib/musicbrainz/models/medium.rb @@ -2,5 +2,10 @@ module MusicBrainz class Medium < BaseModel field :position, Integer field :format, String + field :tracks, Array + + def tracks=(tracks_data) + @tracks = tracks_data.map { |track_data| Track.new(track_data) } + end end end diff --git a/lib/musicbrainz/models/release.rb b/lib/musicbrainz/models/release.rb index 86fd5af..914951e 100644 --- a/lib/musicbrainz/models/release.rb +++ b/lib/musicbrainz/models/release.rb @@ -12,7 +12,7 @@ class Release < BaseModel field :quality, String def mediums - @mediums ||= client.load(:release, { id: id, inc: [:media], limit: 100 }, { + @mediums ||= client.load(:release, { id: id, inc: [:recordings, :media], limit: 100 }, { binding: :release_mediums, create_models: :medium, sort: :position diff --git a/spec/bindings/medium_spec.rb b/spec/bindings/medium_spec.rb index 490e776..4cbc65c 100644 --- a/spec/bindings/medium_spec.rb +++ b/spec/bindings/medium_spec.rb @@ -8,11 +8,30 @@ 1 CD + + + 1 + 1 + 233013 + + Empire + 233013 + 2006-08-25 + + + XML it 'contains medium attributes' do expect(parse).to include(position: '1', format: 'CD') end + + it 'contains track attributes' do + expect(parse[:tracks].first).to include( + id: '0501cf38-48b7-3026-80d2-717d574b3d6a', position: '1', length: '233013', + recording_id: 'b3015bab-1540-4d4e-9f30-14872a1525f7', title: 'Empire' + ) + end end end diff --git a/spec/models/release_spec.rb b/spec/models/release_spec.rb index 41c983e..99cdc04 100644 --- a/spec/models/release_spec.rb +++ b/spec/models/release_spec.rb @@ -5,9 +5,6 @@ mock url: 'http://musicbrainz.org/ws/2/release/2225dd4c-ae9a-403b-8ea0-9e05014c778f?inc=media+release-groups', fixture: 'release/find_2225dd4c-ae9a-403b-8ea0-9e05014c778f.xml' - mock url: 'http://musicbrainz.org/ws/2/release/2225dd4c-ae9a-403b-8ea0-9e05014c778f?inc=media&limit=100', - fixture: 'release/find_2225dd4c-ae9a-403b-8ea0-9e05014c778f.xml' - mock url: 'http://musicbrainz.org/ws/2/release/2225dd4c-ae9a-403b-8ea0-9e05014c778f?inc=recordings+media&limit=100', fixture: 'release/find_2225dd4c-ae9a-403b-8ea0-9e05014c778f_tracks.xml' @@ -58,6 +55,14 @@ expect(mediums.first.position).to eq 1 expect(mediums.first.format).to eq "CD" end + + it "gets correct mediums tracks" do + expect(mediums.first.tracks.length).to eq 11 + expect(mediums.first.tracks.first.position).to eq 1 + expect(mediums.first.tracks.first.recording_id).to eq "b3015bab-1540-4d4e-9f30-14872a1525f7" + expect(mediums.first.tracks.first.title).to eq "Empire" + expect(mediums.first.tracks.first.length).to eq 233013 + end end describe '#tracks' do