From 7a1061a783a7d5025ebf4febf55349ae39ad915a Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Sun, 12 Oct 2025 22:45:12 +0200 Subject: [PATCH] Update embeddings when populating genres --- lib/music_library/records/similarity.ex | 2 +- .../worker/generate_record_embedding.ex | 13 +++---------- lib/music_library/worker/populate_genres.ex | 10 +++++++--- .../live/collection_live/show.ex | 18 ++++++++++++++---- .../live/wishlist_live/show.ex | 18 ++++++++++++++---- 5 files changed, 39 insertions(+), 22 deletions(-) diff --git a/lib/music_library/records/similarity.ex b/lib/music_library/records/similarity.ex index 5e2a4241..9fee9b55 100644 --- a/lib/music_library/records/similarity.ex +++ b/lib/music_library/records/similarity.ex @@ -121,7 +121,7 @@ defmodule MusicLibrary.Records.Similarity do params |> GenerateRecordEmbedding.new(meta: meta) - |> Oban.insert!() + |> Oban.insert() end def generate_all_embeddings_async do diff --git a/lib/music_library/worker/generate_record_embedding.ex b/lib/music_library/worker/generate_record_embedding.ex index f98cae3b..d8250a81 100644 --- a/lib/music_library/worker/generate_record_embedding.ex +++ b/lib/music_library/worker/generate_record_embedding.ex @@ -1,8 +1,6 @@ defmodule MusicLibrary.Worker.GenerateRecordEmbedding do use Oban.Worker, queue: :heavy_writes, max_attempts: 3 - require Logger - alias MusicLibrary.Records alias MusicLibrary.Records.Similarity @@ -12,12 +10,7 @@ defmodule MusicLibrary.Worker.GenerateRecordEmbedding do with {:ok, embedding} <- generate_embedding(record), {:ok, _} <- store_embedding(record, embedding) do - Logger.info("Generated embedding for record #{record_id}") - :ok - else - {:error, reason} = error -> - Logger.error("Failed to generate embedding for record #{record_id}: #{inspect(reason)}") - error + Records.notify_update(record) end end @@ -28,8 +21,8 @@ defmodule MusicLibrary.Worker.GenerateRecordEmbedding do {:ok, embedding} -> {:ok, {embedding, text}} - {:error, reason} -> - {:error, reason} + error -> + error end end diff --git a/lib/music_library/worker/populate_genres.ex b/lib/music_library/worker/populate_genres.ex index 27ba9928..f6aaf396 100644 --- a/lib/music_library/worker/populate_genres.ex +++ b/lib/music_library/worker/populate_genres.ex @@ -1,12 +1,16 @@ defmodule MusicLibrary.Worker.PopulateGenres do use Oban.Worker, queue: :heavy_writes, max_attempts: 10 + alias MusicLibrary.Records + @impl Oban.Worker def perform(%Oban.Job{args: %{"id" => record_id}}) do - record = MusicLibrary.Records.get_record!(record_id) + record = Records.get_record!(record_id) - with {:ok, updated_record} <- MusicLibrary.Records.populate_genres(record) do - MusicLibrary.Records.notify_update(updated_record) + with {:ok, updated_record} <- Records.populate_genres(record), + {:ok, _worker} <- + Records.Similarity.generate_embedding_async(updated_record) do + Records.notify_update(updated_record) end end end diff --git a/lib/music_library_web/live/collection_live/show.ex b/lib/music_library_web/live/collection_live/show.ex index 84feac62..c607cae3 100644 --- a/lib/music_library_web/live/collection_live/show.ex +++ b/lib/music_library_web/live/collection_live/show.ex @@ -35,7 +35,6 @@ defmodule MusicLibraryWeb.CollectionLive.Show do def handle_params(%{"id" => id}, _, socket) do record = Records.get_record!(id) last_listened_track = Records.get_last_listened_track(record) - similar_records = Similarity.find_similar(id, limit: 6, scope: :collection) socket = if record.selected_release_id do @@ -49,7 +48,7 @@ defmodule MusicLibraryWeb.CollectionLive.Show do |> assign(:page_title, page_title(socket.assigns.live_action, record)) |> assign(:record, record) |> assign(:last_listened_track, last_listened_track) - |> assign(:similar_records, similar_records)} + |> assign_similar_records()} end @impl true @@ -141,7 +140,10 @@ defmodule MusicLibraryWeb.CollectionLive.Show do @impl true def handle_info({MusicLibraryWeb.Components.RecordForm, {:saved, record}}, socket) do - {:noreply, assign(socket, :record, record)} + {:noreply, + socket + |> assign(:record, record) + |> assign_similar_records()} end @impl true @@ -149,7 +151,8 @@ defmodule MusicLibraryWeb.CollectionLive.Show do {:noreply, socket |> put_toast(:info, gettext("Record updated in the background")) - |> assign(:record, record)} + |> assign(:record, record) + |> assign_similar_records()} end def page_title(:show, record) do @@ -184,4 +187,11 @@ defmodule MusicLibraryWeb.CollectionLive.Show do defp title_segment(:show), do: gettext("Show") defp title_segment(:edit), do: gettext("Edit") + + defp assign_similar_records(socket) do + similar_records = + Similarity.find_similar(socket.assigns.record.id, limit: 6, scope: :collection) + + assign(socket, :similar_records, similar_records) + end end diff --git a/lib/music_library_web/live/wishlist_live/show.ex b/lib/music_library_web/live/wishlist_live/show.ex index 201d67f0..4e57509f 100644 --- a/lib/music_library_web/live/wishlist_live/show.ex +++ b/lib/music_library_web/live/wishlist_live/show.ex @@ -34,14 +34,13 @@ defmodule MusicLibraryWeb.WishlistLive.Show do def handle_params(%{"id" => id}, _, socket) do record = Records.get_record!(id) online_store_templates = OnlineStoreTemplates.list_enabled_templates() - similar_records = Similarity.find_similar(id, limit: 6, scope: :wishlist) {:noreply, socket |> assign(:page_title, page_title(socket.assigns.live_action, record)) |> assign(:record, record) |> assign(:online_store_templates, online_store_templates) - |> assign(:similar_records, similar_records)} + |> assign_similar_records()} end @impl true @@ -149,7 +148,10 @@ defmodule MusicLibraryWeb.WishlistLive.Show do @impl true def handle_info({MusicLibraryWeb.Components.RecordForm, {:saved, record}}, socket) do - {:noreply, assign(socket, :record, record)} + {:noreply, + socket + |> assign(:record, record) + |> assign_similar_records()} end @impl true @@ -157,7 +159,8 @@ defmodule MusicLibraryWeb.WishlistLive.Show do {:noreply, socket |> put_toast(:info, gettext("Record updated in the background")) - |> assign(:record, record)} + |> assign(:record, record) + |> assign_similar_records()} end def page_title(action, record) do @@ -177,4 +180,11 @@ defmodule MusicLibraryWeb.WishlistLive.Show do defp title_segment(:show), do: gettext("Show") defp title_segment(:edit), do: gettext("Edit") + + defp assign_similar_records(socket) do + similar_records = + Similarity.find_similar(socket.assigns.record.id, limit: 6, scope: :wishlist) + + assign(socket, :similar_records, similar_records) + end end