Show last listen at for each collected record
This commit is contained in:
@@ -211,6 +211,23 @@ defmodule MusicLibrary.Records do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def get_last_listened_track(record_id) do
|
||||||
|
q =
|
||||||
|
from r in fragment("records, json_each(records.release_ids)"),
|
||||||
|
where: fragment("records.id = ?", ^record_id),
|
||||||
|
select: r.value
|
||||||
|
|
||||||
|
release_ids = Repo.all(q)
|
||||||
|
|
||||||
|
q =
|
||||||
|
from t in LastFm.Track,
|
||||||
|
where: fragment("? ->> '$.musicbrainz_id'", t.album) in ^release_ids,
|
||||||
|
order_by: [desc: t.scrobbled_at_uts],
|
||||||
|
limit: 1
|
||||||
|
|
||||||
|
Repo.one(q)
|
||||||
|
end
|
||||||
|
|
||||||
def refresh_cover(record) do
|
def refresh_cover(record) do
|
||||||
with {:ok, cover_data} <- MusicBrainz.get_cover_art({:url, record.cover_url}) do
|
with {:ok, cover_data} <- MusicBrainz.get_cover_art({:url, record.cover_url}) do
|
||||||
{:ok, thumb_data} = Cover.resize(cover_data)
|
{:ok, thumb_data} = Cover.resize(cover_data)
|
||||||
|
|||||||
@@ -177,7 +177,7 @@ defmodule MusicLibrary.ScrobbleActivity do
|
|||||||
track.artist.musicbrainz_id
|
track.artist.musicbrainz_id
|
||||||
end
|
end
|
||||||
|
|
||||||
defp localize_scrobbled_at(uts, timezone) do
|
def localize_scrobbled_at(uts, timezone) do
|
||||||
ldt =
|
ldt =
|
||||||
uts
|
uts
|
||||||
|> DateTime.from_unix!()
|
|> DateTime.from_unix!()
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
defmodule MusicLibraryWeb.CollectionLive.Show do
|
defmodule MusicLibraryWeb.CollectionLive.Show do
|
||||||
use MusicLibraryWeb, :live_view
|
use MusicLibraryWeb, :live_view
|
||||||
|
|
||||||
|
import MusicLibrary.ScrobbleActivity, only: [localize_scrobbled_at: 2]
|
||||||
|
|
||||||
import MusicLibraryWeb.RecordComponents,
|
import MusicLibraryWeb.RecordComponents,
|
||||||
only: [
|
only: [
|
||||||
format_label: 1,
|
format_label: 1,
|
||||||
@@ -19,6 +21,7 @@ defmodule MusicLibraryWeb.CollectionLive.Show do
|
|||||||
|
|
||||||
{:ok,
|
{:ok,
|
||||||
socket
|
socket
|
||||||
|
|> assign(:timezone, resolve_timezone!())
|
||||||
|> assign(:can_scrobble?, ScrobbleActivity.can_scrobble?())
|
|> assign(:can_scrobble?, ScrobbleActivity.can_scrobble?())
|
||||||
|> assign(:release_with_tracks, nil)}
|
|> assign(:release_with_tracks, nil)}
|
||||||
end
|
end
|
||||||
@@ -26,6 +29,7 @@ defmodule MusicLibraryWeb.CollectionLive.Show do
|
|||||||
@impl true
|
@impl true
|
||||||
def handle_params(%{"id" => id}, _, socket) do
|
def handle_params(%{"id" => id}, _, socket) do
|
||||||
record = Records.get_record!(id)
|
record = Records.get_record!(id)
|
||||||
|
last_listened_track = Records.get_last_listened_track(id)
|
||||||
|
|
||||||
socket =
|
socket =
|
||||||
if record.selected_release_id do
|
if record.selected_release_id do
|
||||||
@@ -38,7 +42,8 @@ defmodule MusicLibraryWeb.CollectionLive.Show do
|
|||||||
socket
|
socket
|
||||||
|> assign(:current_section, :collection)
|
|> assign(:current_section, :collection)
|
||||||
|> assign(:page_title, page_title(socket.assigns.live_action, record))
|
|> assign(:page_title, page_title(socket.assigns.live_action, record))
|
||||||
|> assign(:record, record)}
|
|> assign(:record, record)
|
||||||
|
|> assign(:last_listened_track, last_listened_track)}
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
@@ -154,4 +159,9 @@ defmodule MusicLibraryWeb.CollectionLive.Show do
|
|||||||
|
|
||||||
defp title_segment(:show), do: gettext("Show")
|
defp title_segment(:show), do: gettext("Show")
|
||||||
defp title_segment(:edit), do: gettext("Edit")
|
defp title_segment(:edit), do: gettext("Edit")
|
||||||
|
|
||||||
|
defp resolve_timezone! do
|
||||||
|
Application.get_env(:music_library, MusicLibraryWeb)
|
||||||
|
|> Keyword.fetch!(:timezone)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -251,6 +251,15 @@
|
|||||||
{Records.Record.format_as_date(@record.updated_at)}
|
{Records.Record.format_as_date(@record.updated_at)}
|
||||||
</dd>
|
</dd>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="py-2 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0">
|
||||||
|
<dt class="text-xs md:text-sm font-medium leading-6 text-zinc-900 dark:text-zinc-400">
|
||||||
|
{gettext("Last listened at")}
|
||||||
|
</dt>
|
||||||
|
<dd class="mt-1 text-xs md:text-sm leading-6 text-zinc-700 dark:text-zinc-300 sm:col-span-2 sm:mt-0">
|
||||||
|
{@last_listened_track &&
|
||||||
|
localize_scrobbled_at(@last_listened_track.scrobbled_at_uts, @timezone)}
|
||||||
|
</dd>
|
||||||
|
</div>
|
||||||
</dl>
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -879,3 +879,8 @@ msgstr ""
|
|||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Insertion"
|
msgid "Insertion"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/music_library_web/live/collection_live/show.html.heex
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Last listened at"
|
||||||
|
msgstr ""
|
||||||
|
|||||||
@@ -879,3 +879,8 @@ msgstr ""
|
|||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Insertion"
|
msgid "Insertion"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/music_library_web/live/collection_live/show.html.heex
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Last listened at"
|
||||||
|
msgstr ""
|
||||||
|
|||||||
Reference in New Issue
Block a user