diff --git a/lib/music_library/artists.ex b/lib/music_library/artists.ex index 3baa714f..e4ef55c5 100644 --- a/lib/music_library/artists.ex +++ b/lib/music_library/artists.ex @@ -51,24 +51,20 @@ defmodule MusicLibrary.Artists do if discogs_id = MusicBrainz.Artist.get_discogs_id(musicbrainz_artist) do case Discogs.get_artist(discogs_id) do {:ok, discogs_artist} -> - %ArtistInfo{} - |> ArtistInfo.changeset(%{ + create_artist_info(%{ id: musicbrainz_artist.id, musicbrainz_data: musicbrainz_artist.musicbrainz_data, discogs_data: discogs_artist }) - |> Repo.insert(on_conflict: {:replace, [:musicbrainz_data, :discogs_data]}) error -> error end else - %ArtistInfo{} - |> ArtistInfo.changeset(%{ + create_artist_info(%{ id: musicbrainz_artist.id, musicbrainz_data: musicbrainz_artist.musicbrainz_data }) - |> Repo.insert(on_conflict: {:replace, [:musicbrainz_data, :discogs_data]}) end error -> @@ -76,6 +72,12 @@ defmodule MusicLibrary.Artists do end end + def create_artist_info(attrs) do + %ArtistInfo{} + |> ArtistInfo.changeset(attrs) + |> Repo.insert(on_conflict: {:replace, [:musicbrainz_data, :discogs_data]}) + end + def get_artist_info!(artist_id) do Repo.get!(ArtistInfo, artist_id) end diff --git a/lib/music_library/records/artist_info.ex b/lib/music_library/records/artist_info.ex index b5ada484..fa7b1cf1 100644 --- a/lib/music_library/records/artist_info.ex +++ b/lib/music_library/records/artist_info.ex @@ -28,6 +28,12 @@ defmodule MusicLibrary.Records.ArtistInfo do |> generate_image_hash() end + def country(artist_info) do + %{"area" => area} = artist_info.musicbrainz_data + [country_code | _rest] = area["iso-3166-1-codes"] + %{name: area["name"], code: country_code} + end + def generate_image_hash(%__MODULE__{image_data: image_data} = artist_info) do change(artist_info, image_data_hash: Cover.hash(image_data)) end diff --git a/lib/music_library_web/live/artist_live/show.ex b/lib/music_library_web/live/artist_live/show.ex index 4dfaf48b..eed9b0b9 100644 --- a/lib/music_library_web/live/artist_live/show.ex +++ b/lib/music_library_web/live/artist_live/show.ex @@ -2,8 +2,18 @@ defmodule MusicLibraryWeb.ArtistLive.Show do use MusicLibraryWeb, :live_view alias MusicLibrary.{Artists, Records} + alias MusicLibrary.Records.ArtistInfo import MusicLibraryWeb.RecordComponents, only: [record_grid: 1] + attr :country, :map, required: true + + def country_flag(assigns) do + ~H""" + {Flagmojis.by_iso(@country.code).emoji} + {@country.name} + """ + end + @impl true def mount(_params, _session, socket) do {:ok, socket} @@ -45,6 +55,7 @@ defmodule MusicLibraryWeb.ArtistLive.Show do defp apply_action(socket, :show, %{"musicbrainz_id" => musicbrainz_id}) do artist = Artists.get_artist!(musicbrainz_id) + artist_info = Artists.get_artist_info!(musicbrainz_id) %{collection: collection_records, wishlist: wishlist_records} = musicbrainz_id @@ -54,6 +65,7 @@ defmodule MusicLibraryWeb.ArtistLive.Show do socket |> assign(:nav_section, :artists) |> assign(:artist, artist) + |> assign(:country, ArtistInfo.country(artist_info)) |> stream(:collection_records, collection_records, reset: true) |> stream(:wishlist_records, wishlist_records, reset: true) |> assign(:collection_records_count, Enum.count(collection_records)) diff --git a/lib/music_library_web/live/artist_live/show.html.heex b/lib/music_library_web/live/artist_live/show.html.heex index 9cf1077c..16facd41 100644 --- a/lib/music_library_web/live/artist_live/show.html.heex +++ b/lib/music_library_web/live/artist_live/show.html.heex @@ -2,6 +2,7 @@

{@artist.name} + <.country_flag country={@country} />

diff --git a/mix.exs b/mix.exs index 4a20a6a4..cfde288d 100644 --- a/mix.exs +++ b/mix.exs @@ -63,6 +63,7 @@ defmodule MusicLibrary.MixProject do compile: false, depth: 1}, {:fluxon, "~> 1.1.0", repo: :fluxon}, + {:flagmojis, "~> 1.0"}, # Dev tooling {:phoenix_live_reload, "~> 1.2", only: :dev}, diff --git a/mix.lock b/mix.lock index 246bc16f..aaf3e237 100644 --- a/mix.lock +++ b/mix.lock @@ -20,6 +20,7 @@ "fast_html": {:hex, :fast_html, "2.4.1", "73142526cee294b0ec8cf122483f32c861e4a9d988c60cd04f63ce7fd9e5a620", [:make, :mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 1.1", [hex: :nimble_pool, repo: "hexpm", optional: false]}], "hexpm", "767a63ecc941d3fc0e0e9609ded1a5e798398e5b1bf4d2f47bcb5992a86b32cf"}, "file_system": {:hex, :file_system, "1.1.0", "08d232062284546c6c34426997dd7ef6ec9f8bbd090eb91780283c9016840e8f", [:mix], [], "hexpm", "bfcf81244f416871f2a2e15c1b515287faa5db9c6bcf290222206d120b3d43f6"}, "finch": {:hex, :finch, "0.19.0", "c644641491ea854fc5c1bbaef36bfc764e3f08e7185e1f084e35e0672241b76d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.6.2 or ~> 1.7", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 1.1", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "fc5324ce209125d1e2fa0fcd2634601c52a787aff1cd33ee833664a5af4ea2b6"}, + "flagmojis": {:hex, :flagmojis, "1.0.0", "d2b411d9d2c150180103a4d605ee394cabc23c2b6ddf7a0011a9a55a23575281", [:mix], [], "hexpm", "9d9916575cf9dcbe6f0199b410994bec9d19d47971f70089eb7f210f823cd293"}, "floki": {:hex, :floki, "0.37.1", "d7aaee758c8a5b4a7495799a4260754fec5530d95b9c383c03b27359dea117cf", [:mix], [], "hexpm", "673d040cb594d31318d514590246b6dd587ed341d3b67e17c1c0eb8ce7ca6f04"}, "fluxon": {:hex, :fluxon, "1.1.1", "79195863f5d62362cb296c6fe8c5ec739f0766f90a4e5d2fda7665d492f575b5", [:mix], [{:phoenix_live_view, ">= 1.0.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}], "fluxon", "b49d4a8688a32650f90c363fc8f5cedae36d1d4be023b380068bde1a3043b9ce"}, "gettext": {:hex, :gettext, "0.26.2", "5978aa7b21fada6deabf1f6341ddba50bc69c999e812211903b169799208f2a8", [:mix], [{:expo, "~> 0.5.1 or ~> 1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "aa978504bcf76511efdc22d580ba08e2279caab1066b76bb9aa81c4a1e0a32a5"}, diff --git a/test/music_library_web/live/artist_live/show_test.exs b/test/music_library_web/live/artist_live/show_test.exs index b12f7e86..6433c8e2 100644 --- a/test/music_library_web/live/artist_live/show_test.exs +++ b/test/music_library_web/live/artist_live/show_test.exs @@ -13,7 +13,13 @@ defmodule MusicLibraryWeb.ArtistLive.ShowTest do [artist] = collection_record.artists - %{collection_record: collection_record, artist_musicbrainz_id: artist.musicbrainz_id} + artist_info = artist_info(artist.musicbrainz_id) + + %{ + collection_record: collection_record, + artist_musicbrainz_id: artist.musicbrainz_id, + artist_info: artist_info + } end describe "Show artist" do @@ -64,6 +70,27 @@ defmodule MusicLibraryWeb.ArtistLive.ShowTest do |> assert_has("div", text: "Error loading biography") end + test "it shows the artist country", %{ + conn: conn, + artist_musicbrainz_id: artist_musicbrainz_id + } do + Req.Test.stub(LastFm.API, fn conn -> + case Map.get(conn.params, "method") do + "artist.getInfo" -> + Req.Test.json(conn, Fixtures.Artist.get_info()) + + "artist.getSimilar" -> + Req.Test.json(conn, Fixtures.Artist.get_similar_artists()) + end + end) + + conn + |> visit(~p"/artists/#{artist_musicbrainz_id}") + |> unwrap(&render_async/1) + |> assert_has("span", text: "United Kingdom") + |> assert_has("span", text: "🇬🇧") + end + test "it shows records from the collection and the wishlist", %{ conn: conn, collection_record: collection_record, diff --git a/test/support/fixtures/discogs/artist.ex b/test/support/fixtures/discogs/artist.ex index 2e65d80b..2fe451ca 100644 --- a/test/support/fixtures/discogs/artist.ex +++ b/test/support/fixtures/discogs/artist.ex @@ -6,4 +6,11 @@ defmodule Discogs.Fixtures.Artist do |> File.read!() |> JSON.decode!() end + + def image_data do + Path.join([@fixtures_folder, "steven wilson.jpeg"]) + |> File.read!() + end + + def image_width, do: 225 end diff --git a/test/support/fixtures/discogs/steven wilson.jpeg b/test/support/fixtures/discogs/steven wilson.jpeg new file mode 100644 index 00000000..13404145 Binary files /dev/null and b/test/support/fixtures/discogs/steven wilson.jpeg differ diff --git a/test/support/fixtures/music_library/records.ex b/test/support/fixtures/music_library/records.ex index 31384026..01215daf 100644 --- a/test/support/fixtures/music_library/records.ex +++ b/test/support/fixtures/music_library/records.ex @@ -75,6 +75,21 @@ defmodule MusicLibrary.Fixtures.Records do record end + def artist_info(musicbrainz_id, attrs \\ %{}) do + {:ok, artist_info} = + attrs + |> Enum.into(%{ + id: musicbrainz_id, + musicbrainz_data: MusicBrainz.Fixtures.Artist.get_artist(), + discogs_data: Discogs.Fixtures.Artist.get_artist(), + image_data: Discogs.Fixtures.Artist.image_data(), + image_width: Discogs.Fixtures.Artist.image_width() + }) + |> MusicLibrary.Artists.create_artist_info() + + artist_info + end + def record_with_artist(artist_name, record_attrs \\ %{}) do record_attrs |> Map.put(:artists, [artist_attrs(artist_name)])