Files
music_library/lib/music_brainz/release_search_result.ex
T
2025-05-25 08:45:38 +01:00

64 lines
1.7 KiB
Elixir

defmodule MusicBrainz.ReleaseSearchResult do
@enforce_keys [:id, :title, :release_group, :artists, :date, :barcode, :media]
defstruct [:id, :title, :release_group, :artists, :date, :barcode, :media]
alias MusicBrainz.ReleaseGroup
def from_api_response(r) do
%__MODULE__{
id: r["id"],
title: r["title"],
release_group: r["release-group"] && parse_release_group(r["release-group"]),
artists: Enum.map_join(r["artist-credit"] || [], ", ", fn ac -> ac["artist"]["name"] end),
date: r["date"],
barcode: r["barcode"],
media: parse_media(r["media"])
}
end
def format(release_search_result) do
sorted_frequencies =
release_search_result.media
|> Enum.frequencies_by(& &1.format)
|> Enum.sort_by(fn {_, count} -> count end)
case sorted_frequencies do
[{format, _}] -> parse_format(format)
_ -> :multi
end
end
defp parse_release_group(rg) do
%{
id: rg["id"],
type: ReleaseGroup.parse_type(rg["primary-type"]),
title: rg["title"]
}
end
def parse_media(media) do
Enum.map(media, fn m ->
%{
format: m["format"],
track_count: m["track-count"],
disc_count: m["disc-count"]
}
end)
end
defp parse_format(nil), do: :unknown
defp parse_format("CD"), do: :cd
defp parse_format("DVD-Audio"), do: :dvd
defp parse_format("DVD-Video"), do: :dvd
defp parse_format("Blu-ray"), do: :blu_ray
defp parse_format("Digital Media"), do: :digital_download
defp parse_format(format) do
cond do
String.contains?(format, "Vinyl") -> :vinyl
String.contains?(format, "CD") -> :cd
true -> :unknown
end
end
end