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

- <.link - :for={artist <- record.artists} - class="text-zinc-700 hover:text-zinc-500 dark:text-zinc-400 dark:hover:text-zinc-300" - navigate={~p"/artists/#{artist.musicbrainz_id}"} - > - {artist.name} - + + <.link + class="text-zinc-700 hover:text-zinc-500 dark:text-zinc-400 dark:hover:text-zinc-300" + navigate={~p"/artists/#{artist.musicbrainz_id}"} + > + {artist.name} + + + {artist.joinphrase} + +

{record.title} diff --git a/lib/music_library_web/live/collection_live/show.html.heex b/lib/music_library_web/live/collection_live/show.html.heex index aca9b9fd..902eb7e2 100644 --- a/lib/music_library_web/live/collection_live/show.html.heex +++ b/lib/music_library_web/live/collection_live/show.html.heex @@ -11,13 +11,17 @@

- <.link - :for={artist <- @record.artists} - class="text-zinc-700 hover:text-zinc-500 dark:text-zinc-400 dark:hover:text-zinc-300" - navigate={~p"/artists/#{artist.musicbrainz_id}"} - > - {artist.name} - + + <.link + class="text-zinc-700 hover:text-zinc-500 dark:text-zinc-400 dark:hover:text-zinc-300" + navigate={~p"/artists/#{artist.musicbrainz_id}"} + > + {artist.name} + + + {artist.joinphrase} + +

{@record.title} diff --git a/lib/music_library_web/live/wishlist_live/show.html.heex b/lib/music_library_web/live/wishlist_live/show.html.heex index c732ab61..d8b6d904 100644 --- a/lib/music_library_web/live/wishlist_live/show.html.heex +++ b/lib/music_library_web/live/wishlist_live/show.html.heex @@ -11,13 +11,17 @@

- <.link - :for={artist <- @record.artists} - class="text-zinc-700 hover:text-zinc-500 dark:text-zinc-400 dark:hover:text-zinc-300" - navigate={~p"/artists/#{artist.musicbrainz_id}"} - > - {artist.name} - + + <.link + class="text-zinc-700 hover:text-zinc-500 dark:text-zinc-400 dark:hover:text-zinc-300" + navigate={~p"/artists/#{artist.musicbrainz_id}"} + > + {artist.name} + + + {artist.joinphrase} + +

{@record.title} diff --git a/test/music_library/records_test.exs b/test/music_library/records_test.exs index a7481800..fe8aec20 100644 --- a/test/music_library/records_test.exs +++ b/test/music_library/records_test.exs @@ -72,7 +72,7 @@ defmodule MusicLibrary.RecordsTest do end describe "refresh_musicbrainz_data/1" do - test "updates release_ids and included_release_group_ids" do + test "updates release_ids, included_release_group_ids, and artists" do release_group_id = release_group_id(:marbles) record = @@ -101,6 +101,8 @@ defmodule MusicLibrary.RecordsTest do assert record.release_ids !== updated_record.release_ids assert record.included_release_group_ids !== updated_record.included_release_group_ids + assert record.artists !== updated_record.artists + assert updated_record.artists !== [] end end