Extract MusicbrainzData module

This commit is contained in:
Claudio Ortolina
2025-02-10 09:49:34 +00:00
parent 791807c137
commit 224bcdba38
6 changed files with 52 additions and 39 deletions
@@ -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
+9 -25
View File
@@ -2,7 +2,7 @@ defmodule MusicLibrary.Records.Record do
use Ecto.Schema use Ecto.Schema
import Ecto.Changeset import Ecto.Changeset
alias MusicLibrary.Records.{Artist, Cover} alias MusicLibrary.Records.{Artist, Cover, MusicbrainzData}
@formats [:cd, :backup, :vinyl, :blu_ray, :dvd, :multi] @formats [:cd, :backup, :vinyl, :blu_ray, :dvd, :multi]
@types [:album, :ep, :live, :compilation, :single, :other] @types [:album, :ep, :live, :compilation, :single, :other]
@@ -32,18 +32,14 @@ defmodule MusicLibrary.Records.Record do
def formats, do: @formats def formats, do: @formats
def types, do: @types def types, do: @types
def child_release_groups(record) do def included_release_groups(record) do
record.musicbrainz_data MusicbrainzData.included_release_groups(
|> Map.get("relations", []) record.musicbrainz_data,
|> Enum.filter(fn relation -> record.included_release_group_ids
relation["release_group"]["id"] in record.included_release_group_ids )
end)
|> Enum.map(fn relation ->
MusicBrainz.ReleaseGroup.from_api_response(relation["release_group"])
end)
end end
def child_release_groups_count(record) do def included_release_groups_count(record) do
Enum.count(record.included_release_group_ids) Enum.count(record.included_release_group_ids)
end end
@@ -125,8 +121,7 @@ defmodule MusicLibrary.Records.Record do
changeset changeset
musicbrainz_data -> musicbrainz_data ->
release_ids = Enum.map(musicbrainz_data["releases"], fn r -> r["id"] end) put_change(changeset, :release_ids, MusicbrainzData.release_ids(musicbrainz_data))
put_change(changeset, :release_ids, release_ids)
end end
end end
@@ -139,22 +134,11 @@ defmodule MusicLibrary.Records.Record do
put_change( put_change(
changeset, changeset,
:included_release_group_ids, :included_release_group_ids,
extract_included_release_group_ids(musicbrainz_data) MusicbrainzData.included_release_group_ids(musicbrainz_data)
) )
end end
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 def attrs_from_release_group(release_group) do
musicbrainz_id = release_group["id"] musicbrainz_id = release_group["id"]
@@ -50,12 +50,12 @@ defmodule MusicLibraryWeb.RecordComponents do
</p> </p>
<p class="sm:hidden mt-1 text-xs leading-5 text-zinc-500 dark:text-zinc-400"> <p class="sm:hidden mt-1 text-xs leading-5 text-zinc-500 dark:text-zinc-400">
{format_label(record.format)} · {type_label(record.type)} {format_label(record.format)} · {type_label(record.type)}
<span :if={Records.Record.child_release_groups_count(record) > 0}> <span :if={Records.Record.included_release_groups_count(record) > 0}>
· ·
<span class="sr-only"> <span class="sr-only">
{gettext("Number of included records")} {gettext("Number of included records")}
</span> </span>
<.round_badge text={Records.Record.child_release_groups_count(record)} /> <.round_badge text={Records.Record.included_release_groups_count(record)} />
</span> </span>
<span :if={record.purchased_at}> <span :if={record.purchased_at}>
· ·
@@ -77,12 +77,12 @@ defmodule MusicLibraryWeb.RecordComponents do
<div class="hidden sm:flex sm:flex-col sm:items-end"> <div class="hidden sm:flex sm:flex-col sm:items-end">
<p class="text-xs leading-6 text-zinc-900 dark:text-zinc-300"> <p class="text-xs leading-6 text-zinc-900 dark:text-zinc-300">
{format_label(record.format)} · {type_label(record.type)} {format_label(record.format)} · {type_label(record.type)}
<span :if={Records.Record.child_release_groups_count(record) > 0}> <span :if={Records.Record.included_release_groups_count(record) > 0}>
· ·
<span class="sr-only"> <span class="sr-only">
{gettext("Number of included records")} {gettext("Number of included records")}
</span> </span>
<.round_badge text={Records.Record.child_release_groups_count(record)} /> <.round_badge text={Records.Record.included_release_groups_count(record)} />
</span> </span>
</p> </p>
<p :if={record.purchased_at} class="text-xs leading-6 text-zinc-900 dark:text-zinc-300"> <p :if={record.purchased_at} class="text-xs leading-6 text-zinc-900 dark:text-zinc-300">
@@ -213,7 +213,7 @@
</dd> </dd>
</div> </div>
<div <div
:if={Records.Record.child_release_groups_count(@record) > 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" class="py-2 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0"
> >
<dt class="text-xs md:text-sm font-medium leading-6 text-zinc-900 dark:text-zinc-400"> <dt class="text-xs md:text-sm font-medium leading-6 text-zinc-900 dark:text-zinc-400">
@@ -221,8 +221,8 @@
</dt> </dt>
<dd class="mt-1 text-xs md:text-sm leading-6 text-zinc-700 dark:text-zinc-300 sm:col-span-2 sm:mt-0"> <dd class="mt-1 text-xs md:text-sm leading-6 text-zinc-700 dark:text-zinc-300 sm:col-span-2 sm:mt-0">
<ul> <ul>
<li :for={child_release_group <- Records.Record.child_release_groups(@record)}> <li :for={included_release_group <- Records.Record.included_release_groups(@record)}>
{child_release_group.artists} - {child_release_group.title} {included_release_group.artists} - {included_release_group.title}
</li> </li>
</ul> </ul>
</dd> </dd>
@@ -225,7 +225,7 @@
</dd> </dd>
</div> </div>
<div <div
:if={Records.Record.child_release_groups_count(@record) > 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" class="py-2 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0"
> >
<dt class="text-xs md:text-sm font-medium leading-6 text-zinc-900 dark:text-zinc-400"> <dt class="text-xs md:text-sm font-medium leading-6 text-zinc-900 dark:text-zinc-400">
@@ -233,8 +233,8 @@
</dt> </dt>
<dd class="mt-1 text-xs md:text-sm leading-6 text-zinc-700 dark:text-zinc-300 sm:col-span-2 sm:mt-0"> <dd class="mt-1 text-xs md:text-sm leading-6 text-zinc-700 dark:text-zinc-300 sm:col-span-2 sm:mt-0">
<ul> <ul>
<li :for={child_release_group <- Records.Record.child_release_groups(@record)}> <li :for={included_release_group <- Records.Record.included_release_groups(@record)}>
{child_release_group.artists} - {child_release_group.title} {included_release_group.artists} - {included_release_group.title}
</li> </li>
</ul> </ul>
</dd> </dd>
+4 -4
View File
@@ -40,7 +40,7 @@ defmodule MusicLibrary.Records.RecordTest do
end end
end end
describe "child_release_groups/1" do describe "included_release_groups/1" do
test "returns the release groups of children releases" do test "returns the release groups of children releases" do
release_group = release_group(:lockdown_trilogy) release_group = release_group(:lockdown_trilogy)
@@ -49,7 +49,7 @@ defmodule MusicLibrary.Records.RecordTest do
|> Record.add_musicbrainz_data(release_group) |> Record.add_musicbrainz_data(release_group)
|> Ecto.Changeset.apply_changes() |> Ecto.Changeset.apply_changes()
assert Record.child_release_groups(record) == [ assert Record.included_release_groups(record) == [
%MusicBrainz.ReleaseGroup{ %MusicBrainz.ReleaseGroup{
id: "749c07b5-4900-404b-bea9-bb6b16fa991e", id: "749c07b5-4900-404b-bea9-bb6b16fa991e",
type: :other, type: :other,
@@ -82,7 +82,7 @@ defmodule MusicLibrary.Records.RecordTest do
end end
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 test "returns the release groups count of children releases" do
release_group = release_group(:lockdown_trilogy) release_group = release_group(:lockdown_trilogy)
@@ -91,7 +91,7 @@ defmodule MusicLibrary.Records.RecordTest do
|> Record.add_musicbrainz_data(release_group) |> Record.add_musicbrainz_data(release_group)
|> Ecto.Changeset.apply_changes() |> Ecto.Changeset.apply_changes()
assert Record.child_release_groups_count(record) == 4 assert Record.included_release_groups_count(record) == 4
end end
end end