diff --git a/lib/music_library/artists/artist.ex b/lib/music_library/artists/artist.ex index 84ac451b..52eee011 100644 --- a/lib/music_library/artists/artist.ex +++ b/lib/music_library/artists/artist.ex @@ -8,7 +8,7 @@ defmodule MusicLibrary.Artists.Artist do field :name, :string field :sort_name, :string field :disambiguation, :string - field :joinphrase, :string, default: " and " + field :joinphrase, :string, default: "" end def changeset(artist, attrs) do diff --git a/lib/music_library/records/record.ex b/lib/music_library/records/record.ex index 1ad20a38..a261a15e 100644 --- a/lib/music_library/records/record.ex +++ b/lib/music_library/records/record.ex @@ -28,7 +28,7 @@ defmodule MusicLibrary.Records.Record do field :release_ids, {:array, :string}, default: [] field :included_release_group_ids, {:array, :string}, default: [] - embeds_many :artists, Artist + embeds_many :artists, Artist, on_replace: :delete timestamps(type: :utc_datetime) end @@ -134,7 +134,9 @@ defmodule MusicLibrary.Records.Record do def add_musicbrainz_data(record, musicbrainz_data) do record - |> change(musicbrainz_data: musicbrainz_data) + |> change() + |> force_change(:musicbrainz_data, musicbrainz_data) + |> update_artists() |> update_release_ids() |> update_included_release_group_ids() end @@ -163,6 +165,16 @@ defmodule MusicLibrary.Records.Record do end end + defp update_artists(changeset) do + case get_change(changeset, :musicbrainz_data) do + nil -> + changeset + + musicbrainz_data -> + put_change(changeset, :artists, parse_artists(musicbrainz_data)) + end + end + defp update_included_release_group_ids(changeset) do case get_change(changeset, :musicbrainz_data) do nil -> @@ -180,18 +192,7 @@ defmodule MusicLibrary.Records.Record do def attrs_from_release_group(release_group) do musicbrainz_id = release_group["id"] - artists_attrs = - release_group - |> get_in(["artist-credit", Access.all(), "artist"]) - |> Enum.map(fn artist -> - %{ - name: artist["name"], - musicbrainz_id: artist["id"], - sort_name: artist["sort-name"], - disambiguation: artist["disambiguation"], - joinphrase: artist["joinphrase"] - } - end) + artists_attrs = parse_artists(release_group) %{ "musicbrainz_id" => musicbrainz_id, @@ -206,6 +207,20 @@ defmodule MusicLibrary.Records.Record do } end + defp parse_artists(musicbrainz_data) do + musicbrainz_data + |> get_in(["artist-credit", Access.all()]) + |> Enum.map(fn artist_credit -> + %{ + name: artist_credit["artist"]["name"], + musicbrainz_id: artist_credit["artist"]["id"], + sort_name: artist_credit["artist"]["sort-name"], + disambiguation: artist_credit["artist"]["disambiguation"], + joinphrase: artist_credit["joinphrase"] + } + end) + end + defp parse_subtype("Album"), do: :album defp parse_subtype("EP"), do: :ep defp parse_subtype("Live"), do: :live diff --git a/lib/music_library_web/components/record_components.ex b/lib/music_library_web/components/record_components.ex index 2a5aebdf..92668612 100644 --- a/lib/music_library_web/components/record_components.ex +++ b/lib/music_library_web/components/record_components.ex @@ -46,13 +46,17 @@ defmodule MusicLibraryWeb.RecordComponents do