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")})
@@ -0,0 +1,9 @@
defmodule MusicLibrary.Repo.Migrations.AddDominantColorsToRecords do
use Ecto.Migration
def change do
alter table(:records) do
add :dominant_colors, {:array, :string}, default: []
end
end
end
+8
View File
@@ -44,6 +44,14 @@ defmodule MusicLibrary.RecordsTest do
assert record.cover_hash ==
"599407DDF69907D4A60FE13CCAA824D25CF08DC124FD6AA3E8E7ECD98C885FFE"
assert record.dominant_colors == [
"#000000",
"#C0C0C0",
"#C08080",
"#404000",
"#804040"
]
end
test "it queues a task to retrieve artist info data" do
@@ -69,7 +69,8 @@ defmodule MusicLibrary.Fixtures.Records do
selected_release_id: "d3f9b9e2-73f5-4b47-a2a7-2c2199aad608",
release_date: Enum.random(1969..2024) |> Integer.to_string(),
purchased_at: current_time,
artists: [artist_attrs(artist_name)]
artists: [artist_attrs(artist_name)],
dominant_colors: ["#000000", "#C0C0C0", "#C08080", "#404000", "#804040"]
})
|> MusicLibrary.Records.create_record()