Display dominant colors from the db

This commit is contained in:
Claudio Ortolina
2025-06-07 20:07:23 +01:00
parent 8a2fda5f73
commit c5e47cbc8c
7 changed files with 65 additions and 4 deletions
@@ -21,6 +21,17 @@ defmodule MusicLibrary.Records.DominantColors do
end
end
@doc """
Same as `extract-dominant_colors/2`, but raises an error if extraction fails.
"""
@spec extract_dominant_colors!(binary(), pos_integer()) :: [String.t()] | no_return
def extract_dominant_colors!(image_data, num_colors \\ 5) do
case extract_dominant_colors(image_data, num_colors) do
{:ok, colors} -> colors
{:error, reason} -> raise "Failed to extract dominant colors: #{inspect(reason)}"
end
end
defp prepare_image_for_analysis(image) do
with {:ok, resized} <- Operation.thumbnail_image(image, 150) do
ensure_rgb_channels(resized)
+33 -1
View File
@@ -5,7 +5,7 @@ defmodule MusicLibrary.Records.Record do
alias MusicBrainz.{Release, ReleaseGroup}
alias MusicLibrary.Artists.Artist
alias MusicLibrary.Records.Cover
alias MusicLibrary.Records.{Cover, DominantColors}
@formats [:cd, :backup, :vinyl, :blu_ray, :dvd, :multi]
@types [:album, :ep, :live, :compilation, :single, :other]
@@ -27,6 +27,7 @@ defmodule MusicLibrary.Records.Record do
field :selected_release_id, :string
field :release_ids, {:array, :string}, default: []
field :included_release_group_ids, {:array, :string}, default: []
field :dominant_colors, {:array, :string}, default: []
embeds_many :artists, Artist, on_replace: :delete
@@ -112,16 +113,28 @@ defmodule MusicLibrary.Records.Record do
:included_release_group_ids,
:cover_url,
:cover_data,
:dominant_colors,
:purchased_at
])
|> cast_embed(:artists)
|> validate_required([:type, :title, :musicbrainz_id, :genres])
|> unique_constraint(:musicbrainz_id, name: "records_musicbrainz_id_format_index")
|> generate_cover_hash()
|> maybe_generate_dominant_colors()
|> update_release_ids()
|> update_included_release_group_ids()
end
defp maybe_generate_dominant_colors(changeset) do
case get_change(changeset, :dominant_colors) do
nil ->
generate_dominant_colors(changeset)
_dominant_colors ->
changeset
end
end
def add_genres(record, genres) do
change(record, genres: genres)
end
@@ -130,6 +143,7 @@ defmodule MusicLibrary.Records.Record do
record
|> change(cover_data: cover_data)
|> generate_cover_hash()
|> generate_dominant_colors()
end
def add_musicbrainz_data(record, musicbrainz_data) do
@@ -155,6 +169,24 @@ defmodule MusicLibrary.Records.Record do
end
end
def generate_dominant_colors(%__MODULE__{cover_data: cover_data} = record) do
change(record, dominant_colors: DominantColors.extract_dominant_colors!(cover_data))
end
def generate_dominant_colors(changeset) do
case get_change(changeset, :cover_data) do
nil ->
changeset
cover_data ->
put_change(
changeset,
:dominant_colors,
DominantColors.extract_dominant_colors!(cover_data)
)
end
end
defp update_release_ids(changeset) do
case get_change(changeset, :musicbrainz_data) do
nil ->
@@ -17,7 +17,7 @@
{@record.title}
</h2>
<p class="mt-2 flex items-center text-sm leading-5 text-zinc-500 dark:text-zinc-400">
<.record_colors colors={@dominant_colors} />
<.record_colors colors={@record.dominant_colors} />
<span class="ml-1">
{Records.Record.format_release_date(@record.release_date)} · {format_label(
@record.format
@@ -17,7 +17,7 @@
{@record.title}
</h2>
<p class="flex items-center mt-2 text-sm leading-5 text-zinc-500 dark:text-zinc-400">
<.record_colors colors={@dominant_colors} />
<.record_colors colors={@record.dominant_colors} />
{Records.Record.format_release_date(@record.release_date)}
<span :if={@current_date && !Records.Record.released?(@record, @current_date)}>
({gettext("Unreleased")})