Display dominant colors from the db
This commit is contained in:
@@ -21,6 +21,17 @@ defmodule MusicLibrary.Records.DominantColors do
|
|||||||
end
|
end
|
||||||
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
|
defp prepare_image_for_analysis(image) do
|
||||||
with {:ok, resized} <- Operation.thumbnail_image(image, 150) do
|
with {:ok, resized} <- Operation.thumbnail_image(image, 150) do
|
||||||
ensure_rgb_channels(resized)
|
ensure_rgb_channels(resized)
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ defmodule MusicLibrary.Records.Record do
|
|||||||
|
|
||||||
alias MusicBrainz.{Release, ReleaseGroup}
|
alias MusicBrainz.{Release, ReleaseGroup}
|
||||||
alias MusicLibrary.Artists.Artist
|
alias MusicLibrary.Artists.Artist
|
||||||
alias MusicLibrary.Records.Cover
|
alias MusicLibrary.Records.{Cover, DominantColors}
|
||||||
|
|
||||||
@formats [:cd, :backup, :vinyl, :blu_ray, :dvd, :multi]
|
@formats [:cd, :backup, :vinyl, :blu_ray, :dvd, :multi]
|
||||||
@types [:album, :ep, :live, :compilation, :single, :other]
|
@types [:album, :ep, :live, :compilation, :single, :other]
|
||||||
@@ -27,6 +27,7 @@ defmodule MusicLibrary.Records.Record do
|
|||||||
field :selected_release_id, :string
|
field :selected_release_id, :string
|
||||||
field :release_ids, {:array, :string}, default: []
|
field :release_ids, {:array, :string}, default: []
|
||||||
field :included_release_group_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
|
embeds_many :artists, Artist, on_replace: :delete
|
||||||
|
|
||||||
@@ -112,16 +113,28 @@ defmodule MusicLibrary.Records.Record do
|
|||||||
:included_release_group_ids,
|
:included_release_group_ids,
|
||||||
:cover_url,
|
:cover_url,
|
||||||
:cover_data,
|
:cover_data,
|
||||||
|
:dominant_colors,
|
||||||
:purchased_at
|
:purchased_at
|
||||||
])
|
])
|
||||||
|> cast_embed(:artists)
|
|> cast_embed(:artists)
|
||||||
|> validate_required([:type, :title, :musicbrainz_id, :genres])
|
|> validate_required([:type, :title, :musicbrainz_id, :genres])
|
||||||
|> unique_constraint(:musicbrainz_id, name: "records_musicbrainz_id_format_index")
|
|> unique_constraint(:musicbrainz_id, name: "records_musicbrainz_id_format_index")
|
||||||
|> generate_cover_hash()
|
|> generate_cover_hash()
|
||||||
|
|> maybe_generate_dominant_colors()
|
||||||
|> update_release_ids()
|
|> update_release_ids()
|
||||||
|> update_included_release_group_ids()
|
|> update_included_release_group_ids()
|
||||||
end
|
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
|
def add_genres(record, genres) do
|
||||||
change(record, genres: genres)
|
change(record, genres: genres)
|
||||||
end
|
end
|
||||||
@@ -130,6 +143,7 @@ defmodule MusicLibrary.Records.Record do
|
|||||||
record
|
record
|
||||||
|> change(cover_data: cover_data)
|
|> change(cover_data: cover_data)
|
||||||
|> generate_cover_hash()
|
|> generate_cover_hash()
|
||||||
|
|> generate_dominant_colors()
|
||||||
end
|
end
|
||||||
|
|
||||||
def add_musicbrainz_data(record, musicbrainz_data) do
|
def add_musicbrainz_data(record, musicbrainz_data) do
|
||||||
@@ -155,6 +169,24 @@ defmodule MusicLibrary.Records.Record do
|
|||||||
end
|
end
|
||||||
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
|
defp update_release_ids(changeset) do
|
||||||
case get_change(changeset, :musicbrainz_data) do
|
case get_change(changeset, :musicbrainz_data) do
|
||||||
nil ->
|
nil ->
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
{@record.title}
|
{@record.title}
|
||||||
</h2>
|
</h2>
|
||||||
<p class="mt-2 flex items-center text-sm leading-5 text-zinc-500 dark:text-zinc-400">
|
<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">
|
<span class="ml-1">
|
||||||
{Records.Record.format_release_date(@record.release_date)} · {format_label(
|
{Records.Record.format_release_date(@record.release_date)} · {format_label(
|
||||||
@record.format
|
@record.format
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
{@record.title}
|
{@record.title}
|
||||||
</h2>
|
</h2>
|
||||||
<p class="flex items-center mt-2 text-sm leading-5 text-zinc-500 dark:text-zinc-400">
|
<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)}
|
{Records.Record.format_release_date(@record.release_date)}
|
||||||
<span :if={@current_date && !Records.Record.released?(@record, @current_date)}>
|
<span :if={@current_date && !Records.Record.released?(@record, @current_date)}>
|
||||||
({gettext("Unreleased")})
|
({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 ==
|
assert record.cover_hash ==
|
||||||
"599407DDF69907D4A60FE13CCAA824D25CF08DC124FD6AA3E8E7ECD98C885FFE"
|
"599407DDF69907D4A60FE13CCAA824D25CF08DC124FD6AA3E8E7ECD98C885FFE"
|
||||||
|
|
||||||
|
assert record.dominant_colors == [
|
||||||
|
"#000000",
|
||||||
|
"#C0C0C0",
|
||||||
|
"#C08080",
|
||||||
|
"#404000",
|
||||||
|
"#804040"
|
||||||
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it queues a task to retrieve artist info data" do
|
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",
|
selected_release_id: "d3f9b9e2-73f5-4b47-a2a7-2c2199aad608",
|
||||||
release_date: Enum.random(1969..2024) |> Integer.to_string(),
|
release_date: Enum.random(1969..2024) |> Integer.to_string(),
|
||||||
purchased_at: current_time,
|
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()
|
|> MusicLibrary.Records.create_record()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user