From 889ba61e4cc9450087057d3b330dc28439ba8289 Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Fri, 21 Feb 2025 16:02:18 +0000 Subject: [PATCH] Extract LastFm module --- lib/last_fm.ex | 43 +++++++++++++++++++ lib/music_library/artists.ex | 42 ------------------ .../live/artist_live/show.ex | 2 +- test/last_fm_test.exs | 23 ++++++++++ test/music_library/artists_test.exs | 26 ----------- 5 files changed, 67 insertions(+), 69 deletions(-) create mode 100644 lib/last_fm.ex create mode 100644 test/last_fm_test.exs diff --git a/lib/last_fm.ex b/lib/last_fm.ex new file mode 100644 index 00000000..e963ca85 --- /dev/null +++ b/lib/last_fm.ex @@ -0,0 +1,43 @@ +defmodule LastFm do + def get_artist_info(musicbrainz_id, name) do + last_fm_config = last_fm_config() + + case last_fm_config.api.get_artist_info( + {:musicbrainz_id, musicbrainz_id}, + last_fm_config + ) do + {:ok, info} -> + {:ok, info} + + {:error, :invalid_parameters} -> + # Sometimes the artist info cannot be identified with the MusicBrainz ID, + # because Last.fm doesn't have that information. In that case, we try again with the artist name. + last_fm_config.api.get_artist_info({:name, name}, last_fm_config) + + error -> + error + end + end + + def get_similar_artists(musicbrainz_id, name) do + last_fm_config = last_fm_config() + + case last_fm_config.api.get_similar_artists( + {:musicbrainz_id, musicbrainz_id}, + last_fm_config + ) do + {:ok, info} -> + {:ok, info} + + {:error, :invalid_parameters} -> + # Sometimes the artist info cannot be identified with the MusicBrainz ID, + # because Last.fm doesn't have that information. In that case, we try again with the artist name. + last_fm_config.api.get_similar_artists({:name, name}, last_fm_config) + + error -> + error + end + end + + defp last_fm_config, do: LastFm.Config.resolve(:music_library) +end diff --git a/lib/music_library/artists.ex b/lib/music_library/artists.ex index b030d1bc..ab6486b6 100644 --- a/lib/music_library/artists.ex +++ b/lib/music_library/artists.ex @@ -19,46 +19,4 @@ defmodule MusicLibrary.Artists do q |> Repo.all() |> MapSet.new() end - - def get_artist_info(artist) do - last_fm_config = last_fm_config() - - case last_fm_config.api.get_artist_info( - {:musicbrainz_id, artist.musicbrainz_id}, - last_fm_config - ) do - {:ok, info} -> - {:ok, info} - - {:error, :invalid_parameters} -> - # Sometimes the artist info cannot be identified with the MusicBrainz ID, - # because Last.fm doesn't have that information. In that case, we try again with the artist name. - last_fm_config.api.get_artist_info({:name, artist.name}, last_fm_config) - - error -> - error - end - end - - def get_similar_artists(artist) do - last_fm_config = last_fm_config() - - case last_fm_config.api.get_similar_artists( - {:musicbrainz_id, artist.musicbrainz_id}, - last_fm_config - ) do - {:ok, info} -> - {:ok, info} - - {:error, :invalid_parameters} -> - # Sometimes the artist info cannot be identified with the MusicBrainz ID, - # because Last.fm doesn't have that information. In that case, we try again with the artist name. - last_fm_config.api.get_similar_artists({:name, artist.name}, last_fm_config) - - error -> - error - end - end - - defp last_fm_config, do: LastFm.Config.resolve(:music_library) end diff --git a/lib/music_library_web/live/artist_live/show.ex b/lib/music_library_web/live/artist_live/show.ex index 96214d3b..8d888919 100644 --- a/lib/music_library_web/live/artist_live/show.ex +++ b/lib/music_library_web/live/artist_live/show.ex @@ -27,7 +27,7 @@ defmodule MusicLibraryWeb.ArtistLive.Show do |> assign(:collection_records_count, Enum.count(grouped_artist_records.collection)) |> assign(:wishlist_records_count, Enum.count(grouped_artist_records.wishlist)) |> assign_async(:artist_info, fn -> - with {:ok, artist_info} <- Artists.get_artist_info(artist) do + with {:ok, artist_info} <- LastFm.get_artist_info(artist.musicbrainz_id, artist.name) do {:ok, %{artist_info: artist_info}} end end) diff --git a/test/last_fm_test.exs b/test/last_fm_test.exs new file mode 100644 index 00000000..d7d1bb0e --- /dev/null +++ b/test/last_fm_test.exs @@ -0,0 +1,23 @@ +defmodule LastFmTest do + use ExUnit.Case, async: true + + alias LastFm.APIMock + alias LastFm.Fixtures.Artist + import Mox + + setup :verify_on_exit! + + describe "get_artist_info/1" do + test "it returns the artist info" do + name = "Steven Wilson" + musicbrainz_id = Ecto.UUID.generate() + expected_info = Artist.get_info() + + expect(APIMock, :get_artist_info, fn {:musicbrainz_id, ^musicbrainz_id}, _config -> + {:ok, expected_info} + end) + + assert {:ok, expected_info} == LastFm.get_artist_info(musicbrainz_id, name) + end + end +end diff --git a/test/music_library/artists_test.exs b/test/music_library/artists_test.exs index 21a01c8a..3db9ef6c 100644 --- a/test/music_library/artists_test.exs +++ b/test/music_library/artists_test.exs @@ -1,13 +1,8 @@ defmodule MusicLibrary.ArtistsTest do use MusicLibrary.DataCase - alias LastFm.APIMock alias MusicLibrary.Artists import MusicLibrary.Fixtures.Records - import LastFm.Fixtures.Artist - import Mox - - setup :verify_on_exit! describe "get_artist/1" do test "it returns records with essential data" do @@ -34,25 +29,4 @@ defmodule MusicLibrary.ArtistsTest do assert expected == Artists.get_all_artist_ids() end end - - describe "get_artist_info/1" do - test "it returns the artist info" do - collection_record = - record_with_artist("Steven Wilson", %{ - title: "The Raven that refused to sing", - purchased_at: DateTime.utc_now() - }) - - [artist] = collection_record.artists - artist_musicbrainz_id = artist.musicbrainz_id - - expected_info = get_info() - - expect(APIMock, :get_artist_info, fn {:musicbrainz_id, ^artist_musicbrainz_id}, _config -> - {:ok, expected_info} - end) - - assert {:ok, expected_info} == Artists.get_artist_info(artist) - end - end end