From ade6aebb87b5f80a5743aa5b356a88797ccb8ca7 Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Fri, 7 Nov 2025 12:16:10 +0000 Subject: [PATCH] Add Worker to prune dangling assets --- lib/music_library/worker/prune_assets.ex | 36 ++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 lib/music_library/worker/prune_assets.ex diff --git a/lib/music_library/worker/prune_assets.ex b/lib/music_library/worker/prune_assets.ex new file mode 100644 index 00000000..0fbf91ca --- /dev/null +++ b/lib/music_library/worker/prune_assets.ex @@ -0,0 +1,36 @@ +defmodule MusicLibrary.Worker.PruneAssets do + use Oban.Worker, queue: :default, max_attempts: 3 + + import Ecto.Query + + require Logger + + alias MusicLibrary.{ + Artists.ArtistInfo, + Assets.Asset, + Records.Record, + Repo + } + + @impl Oban.Worker + def perform(_) do + # Find all assets that are not referenced by any records or artist info + # Note that SQLite doesn't support left joins on delete, so we do it in two steps. + asset_hashes = + from a in Asset, + left_join: r in Record, + on: r.cover_hash == a.hash, + left_join: ai in ArtistInfo, + on: ai.image_data_hash == a.hash, + where: is_nil(r.id) and is_nil(ai.id), + select: a.hash + + q = + from a in Asset, + where: a.hash in subquery(asset_hashes) + + {count, nil} = Repo.delete_all(q) + + Logger.info("Pruned #{count} unreferenced assets.") + end +end