From f57424d6105d80990f5a452e40d93b7b49a55ff8 Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Thu, 18 Sep 2025 21:24:28 +0300 Subject: [PATCH] Store and edit artist images as assets --- lib/music_library/artists.ex | 7 +++--- lib/music_library/artists/artist_info.ex | 22 +------------------ .../live/artist_live/form_component.ex | 21 +++++++----------- 3 files changed, 13 insertions(+), 37 deletions(-) diff --git a/lib/music_library/artists.ex b/lib/music_library/artists.ex index 24495926..1708b8c1 100644 --- a/lib/music_library/artists.ex +++ b/lib/music_library/artists.ex @@ -2,6 +2,7 @@ defmodule MusicLibrary.Artists do import Ecto.Query, warn: false alias MusicLibrary.Artists.ArtistInfo + alias MusicLibrary.Assets alias MusicLibrary.Records.{ArtistRecord, Record} alias MusicLibrary.Repo alias MusicLibrary.{BackgroundRepo, Worker} @@ -114,11 +115,11 @@ defmodule MusicLibrary.Artists do artist_info = get_artist_info!(artist_id) with {:ok, image} <- ArtistInfo.extract_image(artist_info), - {:ok, image_data} <- Discogs.get_artist_image(image.url) do + {:ok, image_data} <- Discogs.get_artist_image(image.url), + {:ok, asset} <- Assets.store_image(%{content: image_data, format: "image/jpeg"}) do artist_info |> ArtistInfo.changeset(%{ - image_data: image_data, - image_data_width: image.width + image_data_hash: asset.hash }) |> Repo.update() end diff --git a/lib/music_library/artists/artist_info.ex b/lib/music_library/artists/artist_info.ex index 66900df5..7ab1fbc5 100644 --- a/lib/music_library/artists/artist_info.ex +++ b/lib/music_library/artists/artist_info.ex @@ -3,15 +3,11 @@ defmodule MusicLibrary.Artists.ArtistInfo do import Ecto.Changeset - alias MusicLibrary.Assets.Asset - @primary_key {:id, :binary_id, autogenerate: true} schema "artist_infos" do field :musicbrainz_data, :map, default: %{} field :discogs_data, :map, default: %{} - field :image_data, :binary field :image_data_hash, :string - field :image_data_width, :integer timestamps(type: :utc_datetime) end @@ -22,11 +18,9 @@ defmodule MusicLibrary.Artists.ArtistInfo do :id, :musicbrainz_data, :discogs_data, - :image_data, - :image_data_width + :image_data_hash ]) |> validate_required([:musicbrainz_data]) - |> generate_image_hash() end def country(artist_info) do @@ -48,20 +42,6 @@ defmodule MusicLibrary.Artists.ArtistInfo do String.slice(country_code, 0..1) end - def generate_image_hash(%__MODULE__{image_data: image_data} = artist_info) do - change(artist_info, image_data_hash: Asset.hash(image_data)) - end - - def generate_image_hash(changeset) do - case get_change(changeset, :image_data) do - nil -> - changeset - - image_data -> - put_change(changeset, :image_data_hash, Asset.hash(image_data)) - end - end - def extract_image(artist_info) when is_nil(artist_info.discogs_data) do {:error, :no_discogs_data} end diff --git a/lib/music_library_web/live/artist_live/form_component.ex b/lib/music_library_web/live/artist_live/form_component.ex index b6cbc999..1021ce4e 100644 --- a/lib/music_library_web/live/artist_live/form_component.ex +++ b/lib/music_library_web/live/artist_live/form_component.ex @@ -2,8 +2,8 @@ defmodule MusicLibraryWeb.ArtistLive.FormComponent do use MusicLibraryWeb, :live_component alias MusicLibrary.Artists + alias MusicLibrary.Assets alias MusicLibrary.Assets.Transform - alias Vix.Vips.Image @impl true def mount(socket) do @@ -112,8 +112,9 @@ defmodule MusicLibraryWeb.ArtistLive.FormComponent do artist_info_params = params["artist_info"] || %{} uploaded_images = - consume_uploaded_entries(socket, :image_data, fn %{path: path}, _entry -> - {:ok, File.read!(path)} + consume_uploaded_entries(socket, :image_data, fn %{path: path}, entry -> + params = %{content: File.read!(path), format: entry.client_type} + {:ok, params} end) save_artist_info(socket, artist_info_params, uploaded_images) @@ -129,15 +130,9 @@ defmodule MusicLibraryWeb.ArtistLive.FormComponent do [] -> artist_info_params - [image_data] -> - {:ok, image} = Image.new_from_buffer(image_data) - - image_width = Image.width(image) - - Map.merge(artist_info_params, %{ - "image_data" => image_data, - "image_data_width" => image_width - }) + [image_params] -> + {:ok, asset} = Assets.store_image(image_params) + Map.put(artist_info_params, "image_data_hash", asset.hash) end case Artists.update_artist_info(socket.assigns.artist_info, params) do @@ -158,7 +153,7 @@ defmodule MusicLibraryWeb.ArtistLive.FormComponent do defp artist_image_path(artist_info) do payload = - %Transform{hash: artist_info.image_hash, width: 96} + %Transform{hash: artist_info.image_data_hash} |> Transform.encode!() ~p"/assets/#{payload}"