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")})
|
||||
|
||||
Reference in New Issue
Block a user