diff --git a/lib/music_library_web/live/stats_live/index.ex b/lib/music_library_web/live/stats_live/index.ex
index 73f7824c..b1808820 100644
--- a/lib/music_library_web/live/stats_live/index.ex
+++ b/lib/music_library_web/live/stats_live/index.ex
@@ -19,10 +19,13 @@ defmodule MusicLibraryWeb.StatsLive.Index do
|> stream_configure(:recent_tracks,
dom_id: fn track -> "track-#{track.scrobbled_at_uts}" end
)
- |> stream(:recent_tracks, recent_tracks)
+ |> stream_configure(:recent_albums,
+ dom_id: fn album -> "album-#{album.scrobbled_at_uts}" end
+ )
|> assign_counts()
|> assign_scrobble_activity(recent_tracks)
|> assign(
+ scrobble_activity_mode: :tracks,
latest_record: latest_record,
page_title: gettext("Stats"),
nav_section: :stats
@@ -60,11 +63,20 @@ defmodule MusicLibraryWeb.StatsLive.Index do
end
end
- def handle_info(%{tracks: recent_tracks}, socket) do
+ def handle_event("set_scrobble_activity_mode", %{"mode" => mode}, socket)
+ when mode in ["tracks", "albums"] do
+ recent_tracks = LastFm.Feed.all_tracks()
+
{:noreply,
socket
|> assign_scrobble_activity(recent_tracks)
- |> stream(:recent_tracks, recent_tracks, reset: true)}
+ |> assign(scrobble_activity_mode: String.to_existing_atom(mode))}
+ end
+
+ def handle_info(%{tracks: recent_tracks}, socket) do
+ {:noreply,
+ socket
+ |> assign_scrobble_activity(recent_tracks)}
end
defp assign_counts(socket) do
@@ -95,7 +107,23 @@ defmodule MusicLibraryWeb.StatsLive.Index do
recent_artist_ids = recent_artist_ids(recent_tracks)
artist_ids = MapSet.intersection(all_artist_ids, recent_artist_ids)
- assign(socket,
+ recent_albums =
+ recent_tracks
+ |> Enum.uniq_by(fn t -> t.album end)
+ |> Enum.map(fn t ->
+ %{
+ scrobbled_at_uts: t.scrobbled_at_uts,
+ scrobbled_at_label: t.scrobbled_at_label,
+ metadata: t.album,
+ artist: t.artist,
+ cover_url: t.cover_url
+ }
+ end)
+
+ socket
+ |> stream(:recent_tracks, recent_tracks, reset: true)
+ |> stream(:recent_albums, recent_albums, reset: true)
+ |> assign(
collected_releases: collected_releases,
wishlisted_releases: wishlisted_releases,
artist_ids: artist_ids
diff --git a/lib/music_library_web/live/stats_live/index.html.heex b/lib/music_library_web/live/stats_live/index.html.heex
index 8e6424f5..b06575f8 100644
--- a/lib/music_library_web/live/stats_live/index.html.heex
+++ b/lib/music_library_web/live/stats_live/index.html.heex
@@ -83,10 +83,169 @@
<%!-- TODO: replace with OSS version --%>
+
+
+
+
+ -
+
+
+
+
+
+

+
+
+ {album.artist.name}
+
+ <.link
+ :if={album.artist.musicbrainz_id in @artist_ids}
+ class="font-semibold text-sm block text-zinc-700 hover:text-zinc-500 dark:text-zinc-400 dark:hover:text-zinc-300"
+ navigate={~p"/artists/#{album.artist.musicbrainz_id}"}
+ >
+ {album.artist.name}
+
+
+ {album.metadata.title}
+
+
+
+
+
+
+ <.badge
+ :if={album.metadata.musicbrainz_id == ""}
+ color={:gray}
+ text={gettext("No MB ID")}
+ />
+ <.link
+ :if={
+ record_id = tracked_record?(@collected_releases, album.metadata.musicbrainz_id)
+ }
+ navigate={~p"/collection/#{record_id}"}
+ >
+ <.badge color={:green} text={gettext("Collected")} />
+
+ <.link
+ :if={
+ record_id = tracked_record?(@wishlisted_releases, album.metadata.musicbrainz_id)
+ }
+ navigate={~p"/wishlist/#{record_id}"}
+ >
+ <.badge color={:yellow} text={gettext("Wishlisted")} />
+
+
+
+
+
+
+ <.focus_wrap
+ id={"actions-#{album.scrobbled_at_uts}"}
+ class={[
+ "hidden pointer-events-auto absolute right-0 z-10 mt-2 w-48 origin-top-right rounded-md bg-white dark:bg-zinc-800 py-2 shadow-lg ring-1 ring-zinc-900/5 focus:outline-hidden"
+ ]}
+ role="menu"
+ aria-orientation="vertical"
+ aria-labelledby="options-menu-0-button"
+ >
+ <.link
+ :for={format <- Records.Record.formats()}
+ class="block px-3 py-1 text-sm leading-6 text-zinc-900 dark:text-zinc-400 hover:bg-zinc-50 dark:hover:text-zinc-300 dark:hover:bg-zinc-700"
+ role="menuitem"
+ tabindex="0"
+ id={"actions-#{album.scrobbled_at_uts}-#{format}-import"}
+ phx-click={
+ JS.push("import",
+ value: %{id: album.metadata.musicbrainz_id, format: format},
+ page_loading: true
+ )
+ }
+ >
+ {format_label(format)}
+
+
+
+
+
+
+
+
-
diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot
index 89b690c0..f971a1a2 100644
--- a/priv/gettext/default.pot
+++ b/priv/gettext/default.pot
@@ -61,8 +61,8 @@ msgstr ""
#: lib/music_library_web/live/collection_live/index.ex:133
#: lib/music_library_web/live/collection_live/index.ex:140
-#: lib/music_library_web/live/stats_live/index.ex:53
-#: lib/music_library_web/live/stats_live/index.ex:59
+#: lib/music_library_web/live/stats_live/index.ex:56
+#: lib/music_library_web/live/stats_live/index.ex:62
#: lib/music_library_web/live/wishlist_live/index.ex:120
#: lib/music_library_web/live/wishlist_live/index.ex:127
#, elixir-autogen, elixir-format
@@ -176,7 +176,7 @@ msgid "Purchased on"
msgstr ""
#: lib/music_library_web/live/collection_live/index.ex:125
-#: lib/music_library_web/live/stats_live/index.ex:45
+#: lib/music_library_web/live/stats_live/index.ex:48
#: lib/music_library_web/live/wishlist_live/index.ex:112
#, elixir-autogen, elixir-format
msgid "Record imported successfully"
@@ -226,7 +226,7 @@ msgid "Something went wrong!"
msgstr ""
#: lib/music_library_web/components/layouts/app.html.heex:14
-#: lib/music_library_web/live/stats_live/index.ex:27
+#: lib/music_library_web/live/stats_live/index.ex:30
#, elixir-autogen, elixir-format
msgid "Stats"
msgstr ""
@@ -317,19 +317,22 @@ msgid "Scrobble activity"
msgstr ""
#: lib/music_library_web/components/add_record_component.ex:92
-#: lib/music_library_web/live/stats_live/index.html.heex:169
+#: lib/music_library_web/live/stats_live/index.html.heex:201
+#: lib/music_library_web/live/stats_live/index.html.heex:328
#, elixir-autogen, elixir-format
msgid "Choose which format to import"
msgstr ""
#: lib/music_library_web/components/barcode_scanner_component.ex:293
-#: lib/music_library_web/live/stats_live/index.html.heex:141
+#: lib/music_library_web/live/stats_live/index.html.heex:171
+#: lib/music_library_web/live/stats_live/index.html.heex:300
#, elixir-autogen, elixir-format
msgid "Collected"
msgstr ""
#: lib/music_library_web/components/barcode_scanner_component.ex:290
-#: lib/music_library_web/live/stats_live/index.html.heex:147
+#: lib/music_library_web/live/stats_live/index.html.heex:179
+#: lib/music_library_web/live/stats_live/index.html.heex:306
#, elixir-autogen, elixir-format
msgid "Wishlisted"
msgstr ""
@@ -373,7 +376,8 @@ msgstr ""
msgid "Error refreshing cover"
msgstr ""
-#: lib/music_library_web/live/stats_live/index.html.heex:135
+#: lib/music_library_web/live/stats_live/index.html.heex:163
+#: lib/music_library_web/live/stats_live/index.html.heex:294
#, elixir-autogen, elixir-format
msgid "No MB ID"
msgstr ""
@@ -691,3 +695,13 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "Search for a record"
msgstr ""
+
+#: lib/music_library_web/live/stats_live/index.html.heex:109
+#, elixir-autogen, elixir-format
+msgid "Albums"
+msgstr ""
+
+#: lib/music_library_web/live/stats_live/index.html.heex:97
+#, elixir-autogen, elixir-format
+msgid "Tracks"
+msgstr ""