From 753615c57f6a29466457becd8758625868ce26cd Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Sun, 15 Jun 2025 12:12:04 +0300 Subject: [PATCH] Improve top albums Makes it timezone aware, so that it can round up to the beginning of day --- lib/music_library/scrobble_activity.ex | 27 +++++++++++++------ .../live/stats_live/index.ex | 10 ++++++- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/lib/music_library/scrobble_activity.ex b/lib/music_library/scrobble_activity.ex index f318990d..2d3bc348 100644 --- a/lib/music_library/scrobble_activity.ex +++ b/lib/music_library/scrobble_activity.ex @@ -207,10 +207,16 @@ defmodule MusicLibrary.ScrobbleActivity do Gets the top albums by scrobble count for the given number of days. Returns a list of maps with album information and play counts. """ - def get_top_albums_by_days(days, limit \\ 10, current_time \\ DateTime.utc_now()) do + def get_top_albums_by_days(days, opts) do + limit = Keyword.get(opts, :limit, 10) + current_time = Keyword.get_lazy(opts, :current_time, &DateTime.utc_now/0) + timezone = Keyword.get(opts, :timezone, &resolve_timezone!/0) + cutoff_timestamp = current_time |> DateTime.add(-days, :day) + |> NaiveDateTime.beginning_of_day() + |> DateTime.from_naive!(timezone) |> DateTime.to_unix() query = @@ -239,10 +245,10 @@ defmodule MusicLibrary.ScrobbleActivity do Returns a map with the results for each period, along with collected and wishlisted releases. """ - def get_top_albums_by_periods(limit \\ 10) do - last_30_days = get_top_albums_by_days(30, limit) - last_90_days = get_top_albums_by_days(90, limit) - last_365_days = get_top_albums_by_days(365, limit) + def get_top_albums_by_periods(opts) do + last_30_days = get_top_albums_by_days(30, opts) + last_90_days = get_top_albums_by_days(90, opts) + last_365_days = get_top_albums_by_days(365, opts) all_album_ids = (last_30_days ++ last_90_days ++ last_365_days) @@ -256,9 +262,14 @@ defmodule MusicLibrary.ScrobbleActivity do %{ collected_releases: collected_releases, wishlisted_releases: wishlisted_releases, - last_30_days: get_top_albums_by_days(30, limit), - last_90_days: get_top_albums_by_days(90, limit), - last_365_days: get_top_albums_by_days(365, limit) + last_30_days: last_30_days, + last_90_days: last_90_days, + last_365_days: last_365_days } end + + defp resolve_timezone! do + Application.get_env(:music_library, MusicLibraryWeb) + |> Keyword.fetch!(:timezone) + end end diff --git a/lib/music_library_web/live/stats_live/index.ex b/lib/music_library_web/live/stats_live/index.ex index 5707ad62..ae11c0a7 100644 --- a/lib/music_library_web/live/stats_live/index.ex +++ b/lib/music_library_web/live/stats_live/index.ex @@ -287,7 +287,15 @@ defmodule MusicLibraryWeb.StatsLive.Index do end defp assign_top_albums(socket) do - top_albums = ScrobbleActivity.get_top_albums_by_periods(10) + timezone = socket.assigns.timezone + current_time = DateTime.utc_now() + + top_albums = + ScrobbleActivity.get_top_albums_by_periods( + limit: 10, + current_time: current_time, + timezone: timezone + ) assign(socket, top_albums: top_albums) end