From edd133928797c0bcc4285d795106fd2b3d35a5c5 Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Thu, 14 Nov 2024 19:11:19 +0000 Subject: [PATCH] Extract MusicBrainz.ReleaseGroup --- lib/music_brainz/api_impl.ex | 23 +++-------------------- lib/music_brainz/release_group.ex | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+), 20 deletions(-) create mode 100644 lib/music_brainz/release_group.ex diff --git a/lib/music_brainz/api_impl.ex b/lib/music_brainz/api_impl.ex index 70237f63..71e0eb42 100644 --- a/lib/music_brainz/api_impl.ex +++ b/lib/music_brainz/api_impl.ex @@ -10,6 +10,8 @@ defmodule MusicBrainz.APIImpl do require Logger + alias MusicBrainz.ReleaseGroup + @doc """ Uses the [lookup](https://musicbrainz.org/doc/MusicBrainz_API#Lookups) endpoint with the release group id and include the artist credits. @@ -399,19 +401,7 @@ defmodule MusicBrainz.APIImpl do "https://musicbrainz.org/ws/2/release-group?#{URI.encode_query(qs)}" with {:ok, result} <- json_get(url) do - {:ok, - Enum.map(result["release-groups"], fn rg -> - %{ - id: rg["id"], - type: parse_subtype(rg["primary-type"]), - title: rg["title"], - artists: - rg["artist-credit"] - |> Enum.map(fn ac -> ac["artist"]["name"] end) - |> Enum.join(", "), - release: rg["first-release-date"] - } - end)} + {:ok, Enum.map(result["release-groups"], &ReleaseGroup.from_api_response/1)} end end @@ -490,11 +480,4 @@ defmodule MusicBrainz.APIImpl do error end end - - defp parse_subtype("Album"), do: :album - defp parse_subtype("EP"), do: :ep - defp parse_subtype("Live"), do: :live - defp parse_subtype("Compilation"), do: :compilation - defp parse_subtype("Single"), do: :single - defp parse_subtype(_), do: :other end diff --git a/lib/music_brainz/release_group.ex b/lib/music_brainz/release_group.ex new file mode 100644 index 00000000..ce227544 --- /dev/null +++ b/lib/music_brainz/release_group.ex @@ -0,0 +1,23 @@ +defmodule MusicBrainz.ReleaseGroup do + defstruct [:id, :type, :title, :artists, :release] + + def from_api_response(rg) do + %__MODULE__{ + id: rg["id"], + type: parse_subtype(rg["primary-type"]), + title: rg["title"], + artists: + rg["artist-credit"] + |> Enum.map(fn ac -> ac["artist"]["name"] end) + |> Enum.join(", "), + release: rg["first-release-date"] + } + end + + defp parse_subtype("Album"), do: :album + defp parse_subtype("EP"), do: :ep + defp parse_subtype("Live"), do: :live + defp parse_subtype("Compilation"), do: :compilation + defp parse_subtype("Single"), do: :single + defp parse_subtype(_), do: :other +end