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
{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)} />
diff --git a/lib/music_library_web/live/collection_live/show.html.heex b/lib/music_library_web/live/collection_live/show.html.heex
index ca4b684c..5cee9fee 100644
--- a/lib/music_library_web/live/collection_live/show.html.heex
+++ b/lib/music_library_web/live/collection_live/show.html.heex
@@ -213,7 +213,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"
>
@@ -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