Move regenerate_artist_embeddings into Similarity

This commit is contained in:
Claudio Ortolina
2026-04-11 21:27:35 +01:00
parent 789ce04b87
commit a608be7387
2 changed files with 86 additions and 0 deletions
+14
View File
@@ -341,6 +341,20 @@ defmodule MusicLibrary.Records.Similarity do
|> Oban.insert()
end
@doc """
Enqueues embedding regeneration for every record by the given artist.
Used when upstream artist metadata (MusicBrainz/Wikipedia/Discogs/Last.fm)
changes, so that each record's text representation — which embeds per-artist
context — is re-computed.
"""
@spec regenerate_artist_embeddings(String.t()) :: :ok
def regenerate_artist_embeddings(musicbrainz_id) do
musicbrainz_id
|> Records.get_artist_records()
|> Enum.each(&generate_embedding_async/1)
end
@spec generate_all_embeddings_async() :: non_neg_integer()
def generate_all_embeddings_async do
Record
@@ -297,6 +297,78 @@ defmodule MusicLibrary.Records.SimilarityTest do
end
end
describe "generate_embedding_async/1" do
test "enqueues a GenerateRecordEmbedding job for the record" do
record = record()
assert {:ok, %Oban.Job{}} = Similarity.generate_embedding_async(record)
assert_enqueued(
worker: MusicLibrary.Worker.GenerateRecordEmbedding,
args: %{record_id: record.id}
)
end
end
describe "regenerate_artist_embeddings/1" do
test "enqueues a GenerateRecordEmbedding job for each record by the artist" do
artist_mbid = Ecto.UUID.generate()
other_artist_mbid = Ecto.UUID.generate()
record_a =
record(%{
artists: [
%{
name: "Target Artist",
musicbrainz_id: artist_mbid,
sort_name: "Artist, Target",
joinphrase: ""
}
]
})
record_b =
record(%{
artists: [
%{
name: "Target Artist",
musicbrainz_id: artist_mbid,
sort_name: "Artist, Target",
joinphrase: ""
}
]
})
_unrelated =
record(%{
artists: [
%{
name: "Unrelated",
musicbrainz_id: other_artist_mbid,
sort_name: "Unrelated",
joinphrase: ""
}
]
})
assert :ok = Similarity.regenerate_artist_embeddings(artist_mbid)
assert_enqueued(
worker: MusicLibrary.Worker.GenerateRecordEmbedding,
args: %{record_id: record_a.id}
)
assert_enqueued(
worker: MusicLibrary.Worker.GenerateRecordEmbedding,
args: %{record_id: record_b.id}
)
end
test "returns :ok when the artist has no records" do
assert :ok = Similarity.regenerate_artist_embeddings(Ecto.UUID.generate())
end
end
describe "find_similar/2" do
setup do
# Create test records with embeddings