Materialize included release group ids
This commit is contained in:
@@ -18,7 +18,7 @@ defmodule MusicLibrary.Records do
|
|||||||
:release,
|
:release,
|
||||||
:genres,
|
:genres,
|
||||||
:musicbrainz_id,
|
:musicbrainz_id,
|
||||||
:musicbrainz_data,
|
:included_release_group_ids,
|
||||||
:cover_hash
|
:cover_hash
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -24,12 +24,22 @@ defmodule MusicLibrary.Records.Batch do
|
|||||||
run_on_all_records(&update_release_ids/1)
|
run_on_all_records(&update_release_ids/1)
|
||||||
end
|
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
|
def update_release_ids(record) do
|
||||||
record
|
record
|
||||||
|> Record.update_release_ids()
|
|> Record.update_release_ids()
|
||||||
|> Repo.update()
|
|> Repo.update()
|
||||||
end
|
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
|
defp run_on_all_records(fun) do
|
||||||
q = from(r in Record)
|
q = from(r in Record)
|
||||||
stream = Repo.stream(q)
|
stream = Repo.stream(q)
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ defmodule MusicLibrary.Records.Record do
|
|||||||
field :release, :string
|
field :release, :string
|
||||||
field :purchased_at, :utc_datetime
|
field :purchased_at, :utc_datetime
|
||||||
field :release_ids, {:array, :string}, default: []
|
field :release_ids, {:array, :string}, default: []
|
||||||
|
field :included_release_group_ids, {:array, :string}, default: []
|
||||||
|
|
||||||
embeds_many :artists, Artist do
|
embeds_many :artists, Artist do
|
||||||
field :name, :string
|
field :name, :string
|
||||||
@@ -43,6 +44,7 @@ defmodule MusicLibrary.Records.Record do
|
|||||||
:release,
|
:release,
|
||||||
:genres,
|
:genres,
|
||||||
:release_ids,
|
:release_ids,
|
||||||
|
:included_release_group_ids,
|
||||||
:cover_url,
|
:cover_url,
|
||||||
:cover_data,
|
:cover_data,
|
||||||
:purchased_at
|
:purchased_at
|
||||||
@@ -67,13 +69,7 @@ defmodule MusicLibrary.Records.Record do
|
|||||||
end
|
end
|
||||||
|
|
||||||
def child_release_groups_count(record) do
|
def child_release_groups_count(record) do
|
||||||
record.musicbrainz_data
|
Enum.count(record.included_release_group_ids)
|
||||||
|> Map.get("relations", [])
|
|
||||||
|> Enum.count(fn relation ->
|
|
||||||
relation["target-type"] == "release_group" and
|
|
||||||
relation["type"] == "included in" and
|
|
||||||
relation["direction"] == "backward"
|
|
||||||
end)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@doc false
|
@doc false
|
||||||
@@ -99,6 +95,7 @@ defmodule MusicLibrary.Records.Record do
|
|||||||
record
|
record
|
||||||
|> change(musicbrainz_data: musicbrainz_data)
|
|> change(musicbrainz_data: musicbrainz_data)
|
||||||
|> update_release_ids()
|
|> update_release_ids()
|
||||||
|
|> update_included_release_group_ids()
|
||||||
end
|
end
|
||||||
|
|
||||||
def update_release_ids(record = %__MODULE__{musicbrainz_data: musicbrainz_data}) do
|
def update_release_ids(record = %__MODULE__{musicbrainz_data: musicbrainz_data}) do
|
||||||
@@ -119,6 +116,36 @@ defmodule MusicLibrary.Records.Record do
|
|||||||
end
|
end
|
||||||
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
|
def generate_cover_hash(record = %__MODULE__{cover_data: cover_data}) do
|
||||||
hash = :crypto.hash(:sha256, cover_data) |> Base.encode16()
|
hash = :crypto.hash(:sha256, cover_data) |> Base.encode16()
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
Reference in New Issue
Block a user