defmodule MusicLibraryWeb.ReleaseComponent do use MusicLibraryWeb, :live_component use Gettext, backend: MusicLibraryWeb.Gettext import MusicLibraryWeb.RecordComponents, only: [ format_duration: 1 ] alias MusicLibrary.ScrobbleActivity @impl true def mount(socket) do {:ok, socket |> assign(:can_scrobble?, ScrobbleActivity.can_scrobble?()) |> assign(:release_with_tracks, nil)} end @impl true def render(assigns) do ~H"""

{gettext("Tracks")}

{gettext("Scrobble to Last.fm")} {gettext("Connect your Last.fm account")}
<.async_result :let={release_with_tracks} assign={@release_with_tracks}> <:loading> {gettext("Loading release with tracks")} <:failed :let={_failure}>
<.icon name="hero-exclamation-triangle" class="-mt-1 mr-1 h-5 w-5" aria-hidden="true" data-slot="icon" /> {gettext("Error loading tracks")}

1} class="text-sm font-semibold text-zinc-700 dark:text-zinc-300" > {medium_title(medium)}

  • {track.position} {track.title} {track.length && format_duration(track.length)}
    {Enum.map_join(track.artists, ", ", fn artist -> artist.name end)}

{medium_duration(medium)}

""" end @impl true def handle_event("load_release_with_tracks", _params, socket) do selected_release_id = socket.assigns.record.selected_release_id {:noreply, socket |> assign_async(:release_with_tracks, fn -> with {:ok, release} <- MusicBrainz.get_release(selected_release_id) do {:ok, %{release_with_tracks: MusicBrainz.Release.from_api_response(release)}} end end)} end def handle_event("scrobble_release", _params, socket) do release_with_tracks_async_result = socket.assigns.release_with_tracks if release_with_tracks = release_with_tracks_async_result && release_with_tracks_async_result.result do case ScrobbleActivity.scrobble(release_with_tracks, finished_at: DateTime.utc_now()) do {:ok, _} -> {:noreply, socket |> put_flash(:info, gettext("Release scrobbled successfully"))} {:error, reason} -> {:noreply, socket |> put_flash( :error, gettext("Error scrobbling release") <> "," <> inspect(reason) )} end end end defp medium_duration(medium) do medium |> MusicBrainz.Release.medium_duration() |> format_duration() end defp medium_title(medium) do if medium.title !== "" do medium.title else gettext("Disc %{no}", %{no: medium.number}) end end end