From 61e9a48b65bea06018af9a02233927241fb6c29f Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Fri, 25 Apr 2025 20:41:25 +0100 Subject: [PATCH] Get artist from MusicBrainz --- lib/music_brainz.ex | 4 ++++ lib/music_brainz/api.ex | 22 +++++++++++++++++++++- lib/music_brainz/artist.ex | 23 +++++++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 lib/music_brainz/artist.ex diff --git a/lib/music_brainz.ex b/lib/music_brainz.ex index 586d6478..ee6c8eec 100644 --- a/lib/music_brainz.ex +++ b/lib/music_brainz.ex @@ -32,5 +32,9 @@ defmodule MusicBrainz do API.get_cover_art(id_or_url, music_brainz_config()) end + def get_artist(musicbrainz_id) do + API.get_artist(musicbrainz_id, music_brainz_config()) + end + defp music_brainz_config, do: MusicBrainz.Config.resolve(:music_library) end diff --git a/lib/music_brainz/api.ex b/lib/music_brainz/api.ex index 0a8985b8..5c730d82 100644 --- a/lib/music_brainz/api.ex +++ b/lib/music_brainz/api.ex @@ -8,7 +8,7 @@ defmodule MusicBrainz.API do require Logger - alias MusicBrainz.{ReleaseGroupSearchResult, ReleaseSearchResult} + alias MusicBrainz.{Artist, ReleaseGroupSearchResult, ReleaseSearchResult} @doc """ Uses the [lookup](https://musicbrainz.org/doc/MusicBrainz_API#Lookups) endpoint with the release group id and include the @@ -451,6 +451,20 @@ defmodule MusicBrainz.API do |> get_request() end + def get_artist(musicbrainz_id, config) do + config + |> new_request() + |> Req.merge( + url: "/artist/#{musicbrainz_id}", + params: [ + fmt: "json", + inc: "url-rels" + ] + ) + |> Req.Request.append_response_steps(parse_artist: &parse_artist/1) + |> get_request() + end + @doc """ Uses the [cover art](https://musicbrainz.org/doc/Cover_Art_Archive/API) endpoint with the release group id to get the cover image. """ @@ -525,4 +539,10 @@ defmodule MusicBrainz.API do {request, Map.put(response, :body, releases)} end + + defp parse_artist({request, response}) do + artist = Artist.from_api_response(response.body) + + {request, Map.put(response, :body, artist)} + end end diff --git a/lib/music_brainz/artist.ex b/lib/music_brainz/artist.ex new file mode 100644 index 00000000..67c1b744 --- /dev/null +++ b/lib/music_brainz/artist.ex @@ -0,0 +1,23 @@ +defmodule MusicBrainz.Artist do + @enforce_keys [:id, :name, :sort_name] + defstruct [:id, :name, :sort_name, :country, :relations] + + def from_api_response(r) do + %__MODULE__{ + id: r["id"], + name: r["name"], + sort_name: r["sort-name"], + country: r["country"], + relations: parse_relations(r["relations"]) + } + end + + defp parse_relations(relations) do + Enum.map(relations, fn relation -> + %{ + type: relation["type"], + url: relation["url"] + } + end) + end +end