From 224bcdba3802a89530ab10931d5b214374d47919 Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Mon, 10 Feb 2025 09:49:34 +0000 Subject: [PATCH] Extract MusicbrainzData module --- lib/music_library/records/musicbrainz_data.ex | 29 ++++++++++++++++ lib/music_library/records/record.ex | 34 +++++-------------- .../components/record_components.ex | 8 ++--- .../live/collection_live/show.html.heex | 6 ++-- .../live/wishlist_live/show.html.heex | 6 ++-- test/music_library/records/record_test.exs | 8 ++--- 6 files changed, 52 insertions(+), 39 deletions(-) create mode 100644 lib/music_library/records/musicbrainz_data.ex diff --git a/lib/music_library/records/musicbrainz_data.ex b/lib/music_library/records/musicbrainz_data.ex new file mode 100644 index 00000000..f46a0c83 --- /dev/null +++ b/lib/music_library/records/musicbrainz_data.ex @@ -0,0 +1,29 @@ +defmodule MusicLibrary.Records.MusicbrainzData do + def included_release_groups(musicbrainz_data, included_release_group_ids) do + musicbrainz_data + |> Map.get("relations", []) + |> Enum.filter(fn relation -> + relation["release_group"]["id"] in included_release_group_ids + end) + |> Enum.map(fn relation -> + MusicBrainz.ReleaseGroup.from_api_response(relation["release_group"]) + end) + end + + def release_ids(musicbrainz_data) do + musicbrainz_data + |> Map.get("releases", []) + |> Enum.map(fn release -> release["id"] end) + end + + def included_release_group_ids(musicbrainz_data) do + musicbrainz_data + |> Map.get("relations", []) + |> Enum.filter(fn relation -> + relation["target-type"] == "release_group" and + relation["type"] == "included in" and + relation["direction"] == "backward" + end) + |> Enum.map(fn relation -> relation["release_group"]["id"] end) + end +end diff --git a/lib/music_library/records/record.ex b/lib/music_library/records/record.ex index 64b4dc49..e85da2c8 100644 --- a/lib/music_library/records/record.ex +++ b/lib/music_library/records/record.ex @@ -2,7 +2,7 @@ defmodule MusicLibrary.Records.Record do use Ecto.Schema import Ecto.Changeset - alias MusicLibrary.Records.{Artist, Cover} + alias MusicLibrary.Records.{Artist, Cover, MusicbrainzData} @formats [:cd, :backup, :vinyl, :blu_ray, :dvd, :multi] @types [:album, :ep, :live, :compilation, :single, :other] @@ -32,18 +32,14 @@ defmodule MusicLibrary.Records.Record do def formats, do: @formats def types, do: @types - def child_release_groups(record) do - record.musicbrainz_data - |> Map.get("relations", []) - |> Enum.filter(fn relation -> - relation["release_group"]["id"] in record.included_release_group_ids - end) - |> Enum.map(fn relation -> - MusicBrainz.ReleaseGroup.from_api_response(relation["release_group"]) - end) + def included_release_groups(record) do + MusicbrainzData.included_release_groups( + record.musicbrainz_data, + record.included_release_group_ids + ) end - def child_release_groups_count(record) do + def included_release_groups_count(record) do Enum.count(record.included_release_group_ids) end @@ -125,8 +121,7 @@ defmodule MusicLibrary.Records.Record do changeset musicbrainz_data -> - release_ids = Enum.map(musicbrainz_data["releases"], fn r -> r["id"] end) - put_change(changeset, :release_ids, release_ids) + put_change(changeset, :release_ids, MusicbrainzData.release_ids(musicbrainz_data)) end end @@ -139,22 +134,11 @@ defmodule MusicLibrary.Records.Record do put_change( changeset, :included_release_group_ids, - extract_included_release_group_ids(musicbrainz_data) + MusicbrainzData.included_release_group_ids(musicbrainz_data) ) end end - defp extract_included_release_group_ids(musicbrainz_data) do - musicbrainz_data - |> Map.get("relations", []) - |> Enum.filter(fn relation -> - relation["target-type"] == "release_group" and - relation["type"] == "included in" and - relation["direction"] == "backward" - end) - |> Enum.map(fn relation -> relation["release_group"]["id"] end) - end - def attrs_from_release_group(release_group) do musicbrainz_id = release_group["id"] diff --git a/lib/music_library_web/components/record_components.ex b/lib/music_library_web/components/record_components.ex index b1acd9a2..6b3d414e 100644 --- a/lib/music_library_web/components/record_components.ex +++ b/lib/music_library_web/components/record_components.ex @@ -50,12 +50,12 @@ defmodule MusicLibraryWeb.RecordComponents do

{format_label(record.format)} · {type_label(record.type)} - 0}> + 0}> · {gettext("Number of included records")} - <.round_badge text={Records.Record.child_release_groups_count(record)} /> + <.round_badge text={Records.Record.included_release_groups_count(record)} /> · @@ -77,12 +77,12 @@ defmodule MusicLibraryWeb.RecordComponents do

0} + :if={Records.Record.included_release_groups_count(@record) > 0} class="py-2 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0" >
@@ -221,8 +221,8 @@
    -
  • - {child_release_group.artists} - {child_release_group.title} +
  • + {included_release_group.artists} - {included_release_group.title}
diff --git a/lib/music_library_web/live/wishlist_live/show.html.heex b/lib/music_library_web/live/wishlist_live/show.html.heex index 6a8b0add..fbdfa76f 100644 --- a/lib/music_library_web/live/wishlist_live/show.html.heex +++ b/lib/music_library_web/live/wishlist_live/show.html.heex @@ -225,7 +225,7 @@
0} + :if={Records.Record.included_release_groups_count(@record) > 0} class="py-2 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0" >
@@ -233,8 +233,8 @@
    -
  • - {child_release_group.artists} - {child_release_group.title} +
  • + {included_release_group.artists} - {included_release_group.title}
diff --git a/test/music_library/records/record_test.exs b/test/music_library/records/record_test.exs index 28d4fb38..e9dce38b 100644 --- a/test/music_library/records/record_test.exs +++ b/test/music_library/records/record_test.exs @@ -40,7 +40,7 @@ defmodule MusicLibrary.Records.RecordTest do end end - describe "child_release_groups/1" do + describe "included_release_groups/1" do test "returns the release groups of children releases" do release_group = release_group(:lockdown_trilogy) @@ -49,7 +49,7 @@ defmodule MusicLibrary.Records.RecordTest do |> Record.add_musicbrainz_data(release_group) |> Ecto.Changeset.apply_changes() - assert Record.child_release_groups(record) == [ + assert Record.included_release_groups(record) == [ %MusicBrainz.ReleaseGroup{ id: "749c07b5-4900-404b-bea9-bb6b16fa991e", type: :other, @@ -82,7 +82,7 @@ defmodule MusicLibrary.Records.RecordTest do end end - describe "child_release_groups_count/1" do + describe "included_release_groups_count/1" do test "returns the release groups count of children releases" do release_group = release_group(:lockdown_trilogy) @@ -91,7 +91,7 @@ defmodule MusicLibrary.Records.RecordTest do |> Record.add_musicbrainz_data(release_group) |> Ecto.Changeset.apply_changes() - assert Record.child_release_groups_count(record) == 4 + assert Record.included_release_groups_count(record) == 4 end end