Display dominant colors from the db
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user