diff --git a/lib/music_library/assets/cache.ex b/lib/music_library/assets/cache.ex
index 0bb815b5..aff33c7c 100644
--- a/lib/music_library/assets/cache.ex
+++ b/lib/music_library/assets/cache.ex
@@ -27,8 +27,10 @@ defmodule MusicLibrary.Assets.Cache do
)
end
+ @one_week_seconds 60 * 60 * 24 * 7
+
@spec prune(non_neg_integer()) :: non_neg_integer()
- def prune(older_than_seconds) do
+ def prune(older_than_seconds \\ @one_week_seconds) do
threshold =
DateTime.utc_now()
|> DateTime.add(older_than_seconds * -1, :second)
diff --git a/lib/music_library/worker/prune_asset_cache.ex b/lib/music_library/worker/prune_asset_cache.ex
index f7aa266a..e5a4e3a7 100644
--- a/lib/music_library/worker/prune_asset_cache.ex
+++ b/lib/music_library/worker/prune_asset_cache.ex
@@ -5,11 +5,9 @@ defmodule MusicLibrary.Worker.PruneAssetCache do
alias MusicLibrary.Assets.Cache
- @one_week_seconds 60 * 60 * 24 * 7
-
@impl Oban.Worker
def perform(_) do
- prune_count = Cache.prune(@one_week_seconds)
+ prune_count = Cache.prune()
Logger.info(fn ->
"Pruned #{prune_count} old cached assets. Cache size now #{Cache.total_content_size()} bytes."
diff --git a/lib/music_library_web/live/maintenance_live/index.ex b/lib/music_library_web/live/maintenance_live/index.ex
index a85480f1..c8f36e20 100644
--- a/lib/music_library_web/live/maintenance_live/index.ex
+++ b/lib/music_library_web/live/maintenance_live/index.ex
@@ -4,8 +4,11 @@ defmodule MusicLibraryWeb.MaintenanceLive.Index do
require Logger
alias MusicLibrary.Artists
+ alias MusicLibrary.Assets.Cache
alias MusicLibrary.Maintenance
alias MusicLibrary.Records
+ alias MusicLibrary.RecordsOnThisDayEmail
+ alias MusicLibrary.Worker.PruneAssets
alias MusicLibraryWeb.ErrorMessages
@poll_interval 2_000
@@ -153,6 +156,56 @@ defmodule MusicLibraryWeb.MaintenanceLive.Index do
+
+ {gettext("Assets")}
+
+
+ {gettext("Manage cached and stored assets.")}
+
+
+ -
+ <.button_group>
+ <.button
+ type="button"
+ phx-click="prune_asset_cache"
+ phx-disable-with={gettext("Pruning...")}
+ >
+ {gettext("Prune asset cache")}
+
+ <.button
+ type="button"
+ phx-click="prune_assets"
+ phx-disable-with={gettext("Pruning...")}
+ data-confirm={
+ gettext(
+ "Are you sure you want to prune unreferenced assets? This will permanently delete data."
+ )
+ }
+ >
+ {gettext("Prune unreferenced assets")}
+
+
+
+
+
+ {gettext("Emails")}
+
+
+ {gettext("Manually trigger email notifications.")}
+
+
+ -
+ <.button_group>
+ <.button
+ type="button"
+ phx-click="send_records_on_this_day_email"
+ phx-disable-with={gettext("Sending...")}
+ >
+ {gettext("Send records on this day")}
+
+
+
+
"""
@@ -257,6 +310,43 @@ defmodule MusicLibraryWeb.MaintenanceLive.Index do
|> put_toast(:info, gettext("Operation started in the background."))}
end
+ def handle_event("prune_asset_cache", _params, socket) do
+ prune_count = Cache.prune()
+
+ {:noreply,
+ put_toast(socket, :info, gettext("Pruned %{count} cached assets.", count: prune_count))}
+ end
+
+ def handle_event("prune_assets", _params, socket) do
+ %{} |> PruneAssets.new() |> Oban.insert()
+
+ {:noreply, put_toast(socket, :info, gettext("Asset pruning started in the background."))}
+ end
+
+ def handle_event("send_records_on_this_day_email", _params, socket) do
+ today = DateTime.now!(MusicLibrary.default_timezone()) |> DateTime.to_date()
+
+ socket =
+ case RecordsOnThisDayEmail.send(today) do
+ {:ok, :sent} ->
+ put_toast(socket, :info, gettext("Email sent successfully."))
+
+ {:ok, :no_records} ->
+ put_toast(socket, :info, gettext("No records on this day."))
+
+ {:error, reason} ->
+ Logger.error("Failed to send records on this day email: #{inspect(reason)}.")
+
+ put_toast(
+ socket,
+ :error,
+ gettext("Failed to send email") <> ": " <> ErrorMessages.friendly_message(reason)
+ )
+ end
+
+ {:noreply, socket}
+ end
+
def handle_event("db_vacuum", _params, socket) do
case Maintenance.vacuum() do
{:ok, _result} ->
diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot
index 6295398e..853e6fd3 100644
--- a/priv/gettext/default.pot
+++ b/priv/gettext/default.pot
@@ -2205,3 +2205,78 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "Error generating tracklist PDF"
msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Are you sure you want to prune unreferenced assets? This will permanently delete data."
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Asset pruning started in the background."
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Assets"
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Email sent successfully."
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Emails"
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Failed to send email"
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Manage cached and stored assets."
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Manually trigger email notifications."
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "No records on this day."
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Prune asset cache"
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Prune unreferenced assets"
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Pruned %{count} cached assets."
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Pruning..."
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Send records on this day"
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Sending..."
+msgstr ""
diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po
index 41c2bbd7..677b9039 100644
--- a/priv/gettext/en/LC_MESSAGES/default.po
+++ b/priv/gettext/en/LC_MESSAGES/default.po
@@ -2205,3 +2205,78 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "Error generating tracklist PDF"
msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Are you sure you want to prune unreferenced assets? This will permanently delete data."
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Asset pruning started in the background."
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Assets"
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Email sent successfully."
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Emails"
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "Failed to send email"
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Manage cached and stored assets."
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Manually trigger email notifications."
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format, fuzzy
+msgid "No records on this day."
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Prune asset cache"
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Prune unreferenced assets"
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Pruned %{count} cached assets."
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Pruning..."
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Send records on this day"
+msgstr ""
+
+#: lib/music_library_web/live/maintenance_live/index.ex
+#, elixir-autogen, elixir-format
+msgid "Sending..."
+msgstr ""