defmodule MusicBrainz.Artist do @enforce_keys [:id, :name, :sort_name] defstruct [:id, :name, :sort_name, :country, :relations, :musicbrainz_data] 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"] || []), musicbrainz_data: r } end # MASSIVE ASSUMPTION: if there's more than one Discogs link, # take the one with the lowest ID, as it's likely to be the main one. def get_discogs_id(r) do candidates = r.relations |> Enum.filter(fn relation -> relation.type == "discogs" end) |> Enum.map(fn relation -> parse_discogs_id(relation.url["resource"]) end) |> Enum.sort() case candidates do [] -> nil [id | _rest] -> id end end def url(id) do "https://musicbrainz.org/artist/#{id}" end defp parse_relations(relations) do Enum.map(relations, fn relation -> %{ type: relation["type"], url: relation["url"] } end) end defp parse_discogs_id("https://www.discogs.com/artist/" <> id), do: String.to_integer(id) defp parse_discogs_id(_other), do: nil end