diff --git a/config/config.exs b/config/config.exs index 24b87b37..bcfb3a7d 100644 --- a/config/config.exs +++ b/config/config.exs @@ -34,6 +34,10 @@ config :music_library, LastFm, api_key: "change me", user_agent: user_agent +config :music_library, MusicBrainz, + api: MusicBrainz.APIImpl, + user_agent: user_agent + # Configure esbuild (the version is required) config :esbuild, version: "0.17.11", diff --git a/lib/music_brainz/config.ex b/lib/music_brainz/config.ex new file mode 100644 index 00000000..d14eb1e8 --- /dev/null +++ b/lib/music_brainz/config.ex @@ -0,0 +1,16 @@ +defmodule MusicBrainz.Config do + @type t :: %{ + api: module(), + user_agent: String.t() + } + + defstruct api: MusicBrainz.APIImpl, + user_agent: "change me" + + @spec resolve(atom) :: t + def resolve(otp_app) do + app_config = Application.get_env(otp_app, MusicBrainz) + + struct(__MODULE__, app_config) + end +end diff --git a/lib/music_library/records.ex b/lib/music_library/records.ex index 052f124c..939fcc1a 100644 --- a/lib/music_library/records.ex +++ b/lib/music_library/records.ex @@ -127,11 +127,11 @@ defmodule MusicLibrary.Records do def search_release_group(query, opts \\ []) do limit = Keyword.get(opts, :limit, 20) offset = Keyword.get(opts, :offset, 0) - musicbrainz().search_release_group(query, limit: limit, offset: offset) + music_brainz_config().api.search_release_group(query, limit: limit, offset: offset) end def import_from_musicbrainz_release(musicbrainz_id, opts \\ []) do - case musicbrainz().get_release(musicbrainz_id) do + case music_brainz_config().api.get_release(musicbrainz_id) do {:ok, release} -> release_group_id = release["release-group"]["id"] import_from_musicbrainz_release_group(release_group_id, opts) @@ -144,7 +144,7 @@ defmodule MusicLibrary.Records do def import_from_musicbrainz_release_group(musicbrainz_id, opts \\ []) do with format = Keyword.get(opts, :format, "cd"), purchased_at = Keyword.get(opts, :purchased_at), - {:ok, release_group} <- musicbrainz().get_release_group(musicbrainz_id), + {:ok, release_group} <- music_brainz_config().api.get_release_group(musicbrainz_id), {:ok, cover_data} <- get_cover_art_or_default(musicbrainz_id), record_attrs = build_record_attrs(release_group, %{ @@ -159,14 +159,14 @@ defmodule MusicLibrary.Records do end defp get_cover_art_or_default(musicbrainz_id) do - case musicbrainz().get_cover_art({:musicbrainz_id, musicbrainz_id}) do + case music_brainz_config().api.get_cover_art({:musicbrainz_id, musicbrainz_id}) do {:error, :cover_not_available} -> {:ok, Record.fallback_cover_data()} {:ok, cover_data} -> Cover.resize(cover_data) end end def refresh_cover(record) do - with {:ok, cover_data} <- musicbrainz().get_cover_art({:url, record.cover_url}) do + with {:ok, cover_data} <- music_brainz_config().api.get_cover_art({:url, record.cover_url}) do {:ok, thumb_data} = Cover.resize(cover_data) record @@ -184,7 +184,7 @@ defmodule MusicLibrary.Records do end def refresh_musicbrainz_data(record) do - with {:ok, data} <- musicbrainz().get_release_group(record.musicbrainz_id) do + with {:ok, data} <- music_brainz_config().api.get_release_group(record.musicbrainz_id) do record |> Record.add_musicbrainz_data(data) |> Repo.update() @@ -217,9 +217,7 @@ defmodule MusicLibrary.Records do Record.changeset(record, attrs) end - defp musicbrainz do - Application.get_env(:music_library, :musicbrainz, MusicBrainz.APIImpl) - end + defp music_brainz_config, do: MusicBrainz.Config.resolve(:music_library) defp last_fm_config, do: LastFm.Config.resolve(:music_library) end diff --git a/lib/music_library/records/batch.ex b/lib/music_library/records/batch.ex index ec327faa..30f25fe3 100644 --- a/lib/music_library/records/batch.ex +++ b/lib/music_library/records/batch.ex @@ -13,7 +13,7 @@ defmodule MusicLibrary.Records.Batch do end def import_musicbrainz_data(record) do - with {:ok, data} <- musicbrainz().get_release_group(record.musicbrainz_id) do + with {:ok, data} <- music_brainz_config().api.get_release_group(record.musicbrainz_id) do record |> Record.add_musicbrainz_data(data) |> Repo.update!() @@ -88,7 +88,5 @@ defmodule MusicLibrary.Records.Batch do ) end - defp musicbrainz do - Application.get_env(:music_library, :musicbrainz, MusicBrainz.APIImpl) - end + defp music_brainz_config, do: MusicBrainz.Config.resolve(:music_library) end diff --git a/test/test_helper.exs b/test/test_helper.exs index e3df04dd..ea4b0540 100644 --- a/test/test_helper.exs +++ b/test/test_helper.exs @@ -1,5 +1,8 @@ Mox.defmock(MusicBrainz.APIBehaviourMock, for: MusicBrainz.APIBehaviour) Application.put_env(:music_library, :musicbrainz, MusicBrainz.APIBehaviourMock) +music_brainz_config = Application.get_env(:music_library, MusicBrainz) +new_music_brainz_config = Keyword.put(music_brainz_config, :api, MusicBrainz.APIBehaviourMock) +Application.put_env(:music_library, MusicBrainz, new_music_brainz_config) Mox.defmock(LastFm.APIBehaviourMock, for: LastFm.APIBehaviour) last_fm_config = Application.get_env(:music_library, LastFm)