From 659894aaeef044aa5372a895ad21afc75014ead1 Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Sun, 17 Nov 2024 11:52:47 +0000 Subject: [PATCH] Materialize included release group ids --- lib/music_library/records.ex | 2 +- lib/music_library/records/batch.ex | 10 +++++ lib/music_library/records/record.ex | 41 +++++++++++++++---- ..._included_release_group_ids_to_records.exs | 11 +++++ 4 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 priv/repo/migrations/20241117114540_add_included_release_group_ids_to_records.exs diff --git a/lib/music_library/records.ex b/lib/music_library/records.ex index 39eea61e..8245f07f 100644 --- a/lib/music_library/records.ex +++ b/lib/music_library/records.ex @@ -18,7 +18,7 @@ defmodule MusicLibrary.Records do :release, :genres, :musicbrainz_id, - :musicbrainz_data, + :included_release_group_ids, :cover_hash ] end diff --git a/lib/music_library/records/batch.ex b/lib/music_library/records/batch.ex index 3fb864fe..9add50e2 100644 --- a/lib/music_library/records/batch.ex +++ b/lib/music_library/records/batch.ex @@ -24,12 +24,22 @@ defmodule MusicLibrary.Records.Batch do run_on_all_records(&update_release_ids/1) end + def update_included_release_group_ids do + run_on_all_records(&update_included_release_group_ids/1) + end + def update_release_ids(record) do record |> Record.update_release_ids() |> Repo.update() end + def update_included_release_group_ids(record) do + record + |> Record.update_included_release_group_ids() + |> Repo.update() + end + defp run_on_all_records(fun) do q = from(r in Record) stream = Repo.stream(q) diff --git a/lib/music_library/records/record.ex b/lib/music_library/records/record.ex index 503f4695..b88bb971 100644 --- a/lib/music_library/records/record.ex +++ b/lib/music_library/records/record.ex @@ -20,6 +20,7 @@ defmodule MusicLibrary.Records.Record do field :release, :string field :purchased_at, :utc_datetime field :release_ids, {:array, :string}, default: [] + field :included_release_group_ids, {:array, :string}, default: [] embeds_many :artists, Artist do field :name, :string @@ -43,6 +44,7 @@ defmodule MusicLibrary.Records.Record do :release, :genres, :release_ids, + :included_release_group_ids, :cover_url, :cover_data, :purchased_at @@ -67,13 +69,7 @@ defmodule MusicLibrary.Records.Record do end def child_release_groups_count(record) do - record.musicbrainz_data - |> Map.get("relations", []) - |> Enum.count(fn relation -> - relation["target-type"] == "release_group" and - relation["type"] == "included in" and - relation["direction"] == "backward" - end) + Enum.count(record.included_release_group_ids) end @doc false @@ -99,6 +95,7 @@ defmodule MusicLibrary.Records.Record do record |> change(musicbrainz_data: musicbrainz_data) |> update_release_ids() + |> update_included_release_group_ids() end def update_release_ids(record = %__MODULE__{musicbrainz_data: musicbrainz_data}) do @@ -119,6 +116,36 @@ defmodule MusicLibrary.Records.Record do end end + def update_included_release_group_ids(record = %__MODULE__{musicbrainz_data: musicbrainz_data}) do + included_release_group_ids = extract_included_release_group_ids(musicbrainz_data) + + record + |> change(included_release_group_ids: included_release_group_ids) + end + + def update_included_release_group_ids(changeset) do + case get_change(changeset, :musicbrainz_data) do + nil -> + changeset + + musicbrainz_data -> + included_release_group_ids = extract_included_release_group_ids(musicbrainz_data) + + put_change(changeset, :included_release_group_ids, included_release_group_ids) + 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 generate_cover_hash(record = %__MODULE__{cover_data: cover_data}) do hash = :crypto.hash(:sha256, cover_data) |> Base.encode16() diff --git a/priv/repo/migrations/20241117114540_add_included_release_group_ids_to_records.exs b/priv/repo/migrations/20241117114540_add_included_release_group_ids_to_records.exs new file mode 100644 index 00000000..3517fed6 --- /dev/null +++ b/priv/repo/migrations/20241117114540_add_included_release_group_ids_to_records.exs @@ -0,0 +1,11 @@ +defmodule MusicLibrary.Repo.Migrations.AddIncludedReleaseGroupIdsToRecords do + use Ecto.Migration + + def change do + alter table(:records) do + add :included_release_group_ids, {:array, :string}, default: [] + end + + create index(:records, [:included_release_group_ids]) + end +end