Skip to content

Commit

Permalink
Add mediums (#39)
Browse files Browse the repository at this point in the history
* Add Medium model and binding

* Add medium tracks

* Updated GitHub Actions workflow
  • Loading branch information
Richard-Degenne authored Jan 19, 2025
1 parent 45ca1f7 commit a77b788
Show file tree
Hide file tree
Showing 11 changed files with 120 additions and 2 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
ruby-version: ['3.3']
ruby-version: ['3.3', '3.4']
steps:
- uses: actions/checkout@v4
- name: Set up Ruby ${{ matrix.ruby-version }}
uses: ruby/setup-ruby@v1.173.0
uses: ruby/setup-ruby@v1.207.0
with:
ruby-version: ${{ matrix.ruby-version }}
- name: Install dependencies
Expand Down
3 changes: 3 additions & 0 deletions lib/musicbrainz.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

require "musicbrainz/models/base_model"
require "musicbrainz/models/artist"
require "musicbrainz/models/medium"
require "musicbrainz/models/release_group"
require "musicbrainz/models/release"
require "musicbrainz/models/track"
Expand All @@ -26,11 +27,13 @@
require "musicbrainz/bindings/artist_search"
require "musicbrainz/bindings/artist_release_groups"
require "musicbrainz/bindings/discid_releases"
require "musicbrainz/bindings/medium"
require "musicbrainz/bindings/relations"
require "musicbrainz/bindings/release_group"
require "musicbrainz/bindings/release_group_search"
require "musicbrainz/bindings/release_group_releases"
require "musicbrainz/bindings/release"
require "musicbrainz/bindings/release_mediums"
require "musicbrainz/bindings/release_tracks"
require "musicbrainz/bindings/track"
require "musicbrainz/bindings/recording"
Expand Down
17 changes: 17 additions & 0 deletions lib/musicbrainz/bindings/medium.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
module MusicBrainz
module Bindings
module Medium
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

extend self
end
end
end
13 changes: 13 additions & 0 deletions lib/musicbrainz/bindings/release_mediums.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
module MusicBrainz
module Bindings
module ReleaseMediums
def parse(xml)
xml.xpath('./release/medium-list/medium').map do |xml|
MusicBrainz::Bindings::Medium.parse(xml)
end
end

extend self
end
end
end
11 changes: 11 additions & 0 deletions lib/musicbrainz/models/medium.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
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
8 changes: 8 additions & 0 deletions lib/musicbrainz/models/release.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,14 @@ class Release < BaseModel
field :barcode, String
field :quality, String

def mediums
@mediums ||= client.load(:release, { id: id, inc: [:recordings, :media], limit: 100 }, {
binding: :release_mediums,
create_models: :medium,
sort: :position
}) unless @id.nil?
end

def tracks
@tracks ||= client.load(:release, { id: id, inc: [:recordings, :media], limit: 100 }, {
binding: :release_tracks,
Expand Down
37 changes: 37 additions & 0 deletions spec/bindings/medium_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
require "spec_helper"

describe MusicBrainz::Bindings::Medium do
describe '.parse' do
subject(:parse) { described_class.parse(xml) }

let(:xml) { Nokogiri::XML(<<~XML).at_xpath('medium') }
<medium>
<position>1</position>
<format id="9712d52a-4509-3d4b-a1a2-67c88c643e31">CD</format>
<track-list>
<track id="0501cf38-48b7-3026-80d2-717d574b3d6a">
<position>1</position>
<number>1</number>
<length>233013</length>
<recording id="b3015bab-1540-4d4e-9f30-14872a1525f7">
<title>Empire</title>
<length>233013</length>
<first-release-date>2006-08-25</first-release-date>
</recording>
</track>
</track-list>
</medium>
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
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
<medium-list count="1">
<medium>
<position>1</position>
<format id="9712d52a-4509-3d4b-a1a2-67c88c643e31">CD</format>
<track-list count="11"/>
</medium>
</medium-list>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
<medium-list count="1">
<medium>
<position>1</position>
<format id="9712d52a-4509-3d4b-a1a2-67c88c643e31">CD</format>
<track-list count="11" offset="0">
<track id="0501cf38-48b7-3026-80d2-717d574b3d6a">
<position>1</position>
Expand Down
3 changes: 3 additions & 0 deletions spec/models/medium_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
require "spec_helper"

describe MusicBrainz::Medium
24 changes: 24 additions & 0 deletions spec/models/release_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,30 @@
end
end

describe '#mediums' do
subject(:mediums) {
release.mediums
}

let(:release) {
MusicBrainz::Release.find("2225dd4c-ae9a-403b-8ea0-9e05014c778f")
}

it "gets correct release mediums" do
expect(mediums.length).to eq 1
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
let(:release) {
MusicBrainz::Release.find("2225dd4c-ae9a-403b-8ea0-9e05014c778f")
Expand Down

0 comments on commit a77b788

Please sign in to comment.