51 lines
1.2 KiB
Elixir
51 lines
1.2 KiB
Elixir
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
|