From 051c6195b5cc3ae65da3e98dcf99fdbb3cf99b8e Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Sun, 18 May 2025 20:57:17 +0100 Subject: [PATCH] Harden release label display --- lib/music_brainz/release.ex | 8 +++++--- lib/music_brainz/release_search_result.ex | 12 +++++++----- lib/music_library/records/record.ex | 7 ++++--- lib/music_library_web/components/form_component.ex | 2 +- .../components/record_components.ex | 12 +++++------- priv/gettext/default.pot | 5 ----- priv/gettext/en/LC_MESSAGES/default.po | 5 ----- 7 files changed, 22 insertions(+), 29 deletions(-) diff --git a/lib/music_brainz/release.ex b/lib/music_brainz/release.ex index 48f4c1c9..42b2cc83 100644 --- a/lib/music_brainz/release.ex +++ b/lib/music_brainz/release.ex @@ -1,6 +1,6 @@ defmodule MusicBrainz.Release do - @enforce_keys [:id, :title, :artists, :date, :barcode, :media] - defstruct [:id, :title, :artists, :date, :barcode, :media] + @enforce_keys [:id, :title, :disambiguation, :artists, :date, :barcode, :country, :media] + defstruct [:id, :title, :disambiguation, :artists, :date, :barcode, :country, :media] defmodule Artist do @enforce_keys [:id, :name, :sort_name] @@ -37,9 +37,11 @@ defmodule MusicBrainz.Release do %__MODULE__{ id: r["id"], title: r["title"], + disambiguation: r["disambiguation"], artists: parse_artists(r["artist-credit"] || []), date: r["date"], barcode: r["barcode"], + country: r["country"], media: parse_media(r["media"] || []) } end @@ -51,7 +53,7 @@ defmodule MusicBrainz.Release do format: m["format"], number: m["position"], track_count: m["track-count"], - tracks: parse_tracks(m["tracks"]) + tracks: parse_tracks(m["tracks"] || []) } end) end diff --git a/lib/music_brainz/release_search_result.ex b/lib/music_brainz/release_search_result.ex index 99bf51c5..759ed0a7 100644 --- a/lib/music_brainz/release_search_result.ex +++ b/lib/music_brainz/release_search_result.ex @@ -46,16 +46,18 @@ defmodule MusicBrainz.ReleaseSearchResult do 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(maybe_vinyl) do - if String.contains?(maybe_vinyl, "Vinyl") do - :vinyl - else - :unknown + defp parse_format(format) do + cond do + String.contains?(format, "Vinyl") -> :vinyl + String.contains?(format, "CD") -> :cd + true -> :unknown end end end diff --git a/lib/music_library/records/record.ex b/lib/music_library/records/record.ex index 2a1bd3ec..73fb4702 100644 --- a/lib/music_library/records/record.ex +++ b/lib/music_library/records/record.ex @@ -2,7 +2,7 @@ defmodule MusicLibrary.Records.Record do use Ecto.Schema import Ecto.Changeset - alias MusicBrainz.ReleaseGroup + alias MusicBrainz.{Release, ReleaseGroup} alias MusicLibrary.Records.{Artist, Cover} @formats [:cd, :backup, :vinyl, :blu_ray, :dvd, :multi] @@ -74,13 +74,14 @@ defmodule MusicLibrary.Records.Record do def releases(record) do record.musicbrainz_data |> ReleaseGroup.releases() - |> Enum.sort_by(fn r -> {r["date"], r["country"]} end, :desc) + |> Enum.map(&Release.from_api_response/1) + |> Enum.sort_by(fn r -> {r.date, r.country} end, :desc) end def selected_release(record) do record |> releases() - |> Enum.find(fn release -> release["id"] == record.selected_release_id end) + |> Enum.find(fn release -> release.id == record.selected_release_id end) end def changeset(record, attrs) do diff --git a/lib/music_library_web/components/form_component.ex b/lib/music_library_web/components/form_component.ex index a00231fb..22e578ae 100644 --- a/lib/music_library_web/components/form_component.ex +++ b/lib/music_library_web/components/form_component.ex @@ -192,7 +192,7 @@ defmodule MusicLibraryWeb.FormComponent do |> Enum.map(fn release -> { release_label(release), - release["id"] + release.id } end) end diff --git a/lib/music_library_web/components/record_components.ex b/lib/music_library_web/components/record_components.ex index e525fc78..d37dfb9d 100644 --- a/lib/music_library_web/components/record_components.ex +++ b/lib/music_library_web/components/record_components.ex @@ -1,6 +1,7 @@ defmodule MusicLibraryWeb.RecordComponents do use MusicLibraryWeb, :html + alias MusicBrainz.ReleaseSearchResult alias MusicLibrary.Records alias Phoenix.LiveView.JS @@ -303,10 +304,10 @@ defmodule MusicLibraryWeb.RecordComponents do def release_label(release) do [ - release["date"], - release["country"] |> country_label(), - release["packaging"] |> packaging_label(), - release["disambiguation"] + release.date, + release.country |> country_label(), + ReleaseSearchResult.format(release), + release.disambiguation ] |> Enum.reject(fn fragment -> fragment in [nil, ""] end) |> Enum.join(" ") @@ -324,9 +325,6 @@ defmodule MusicLibraryWeb.RecordComponents do end end - defp packaging_label("None"), do: gettext("Digital download") - defp packaging_label(other), do: other - def format_duration(milliseconds) do milliseconds |> System.convert_time_unit(:millisecond, :second) diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index ed2a9518..e05f88cd 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -743,11 +743,6 @@ msgstr "" msgid "Selected Release" msgstr "" -#: lib/music_library_web/components/record_components.ex -#, elixir-autogen, elixir-format -msgid "Digital download" -msgstr "" - #: lib/music_library_web/components/release_component.ex #, elixir-autogen, elixir-format msgid "Error loading tracks" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index b7e7c110..70adcb1b 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -743,11 +743,6 @@ msgstr "" msgid "Selected Release" msgstr "" -#: lib/music_library_web/components/record_components.ex -#, elixir-autogen, elixir-format -msgid "Digital download" -msgstr "" - #: lib/music_library_web/components/release_component.ex #, elixir-autogen, elixir-format, fuzzy msgid "Error loading tracks"