Extract MusicbrainzData module
This commit is contained in:
@@ -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
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user