127 lines
3.5 KiB
Elixir
127 lines
3.5 KiB
Elixir
defmodule MusicLibraryWeb.ScrobbleLive.Show do
|
|
use MusicLibraryWeb, :live_view
|
|
|
|
import(MusicLibraryWeb.Components.Release, only: [medium: 1, scrobble_button_label: 1])
|
|
|
|
alias MusicLibrary.ScrobbleActivity
|
|
|
|
@impl true
|
|
def mount(_params, _session, socket) do
|
|
{:ok,
|
|
assign(socket,
|
|
current_section: :scrobble,
|
|
release: nil,
|
|
can_scrobble: ScrobbleActivity.can_scrobble?(),
|
|
page_title: "Scrobble Release",
|
|
selected_tracks: MapSet.new()
|
|
)}
|
|
end
|
|
|
|
@impl true
|
|
def handle_params(params, _url, socket) do
|
|
apply_action(socket, socket.assigns.live_action, params)
|
|
end
|
|
|
|
defp apply_action(socket, :show, %{"release_id" => release_id}) do
|
|
case MusicBrainz.get_release(release_id) do
|
|
{:ok, release} ->
|
|
release = MusicBrainz.Release.from_api_response(release)
|
|
|
|
{:noreply,
|
|
assign(socket,
|
|
release: release,
|
|
page_title: "Scrobble: #{release.title}"
|
|
)}
|
|
|
|
{:error, _reason} ->
|
|
{:noreply,
|
|
socket
|
|
|> put_flash(:error, "Failed to fetch release details")
|
|
|> push_navigate(to: ~p"/scrobble")}
|
|
end
|
|
end
|
|
|
|
@impl true
|
|
def handle_event("scrobble_release", _params, socket) do
|
|
case ScrobbleActivity.scrobble_release(socket.assigns.release,
|
|
finished_at: DateTime.utc_now()
|
|
) do
|
|
{:ok, _} ->
|
|
{:noreply,
|
|
socket
|
|
|> put_toast(:info, gettext("Release scrobbled successfully"))}
|
|
|
|
{:error, reason} ->
|
|
{:noreply,
|
|
socket
|
|
|> put_toast(
|
|
:error,
|
|
gettext("Error scrobbling release") <> "," <> inspect(reason)
|
|
)}
|
|
end
|
|
end
|
|
|
|
def handle_event("scrobble_medium", %{"medium_number" => number}, socket) do
|
|
number = String.to_integer(number)
|
|
|
|
case ScrobbleActivity.scrobble_medium(number, socket.assigns.release,
|
|
finished_at: DateTime.utc_now()
|
|
) do
|
|
{:ok, _} ->
|
|
{:noreply,
|
|
socket
|
|
|> put_toast(:info, gettext("Disc scrobbled successfully"))}
|
|
|
|
{:error, reason} ->
|
|
{:noreply,
|
|
socket
|
|
|> put_toast(
|
|
:error,
|
|
gettext("Error scrobbling disc") <> "," <> inspect(reason)
|
|
)}
|
|
end
|
|
end
|
|
|
|
def handle_event("scrobble_selected_tracks", _params, socket) do
|
|
release_with_tracks = socket.assigns.release
|
|
selected_track_ids = socket.assigns.selected_tracks
|
|
|
|
if MapSet.size(selected_track_ids) == 0 do
|
|
{:noreply, socket |> put_toast(:error, gettext("No tracks selected"))}
|
|
else
|
|
case ScrobbleActivity.scrobble_tracks(
|
|
selected_track_ids,
|
|
release_with_tracks,
|
|
finished_at: DateTime.utc_now()
|
|
) do
|
|
{:ok, _} ->
|
|
{:noreply,
|
|
socket
|
|
|> assign(:selected_tracks, MapSet.new())
|
|
|> put_toast(:info, gettext("Selected tracks scrobbled successfully"))}
|
|
|
|
{:error, reason} ->
|
|
{:noreply,
|
|
socket
|
|
|> put_toast(
|
|
:error,
|
|
gettext("Error scrobbling selected tracks") <> "," <> inspect(reason)
|
|
)}
|
|
end
|
|
end
|
|
end
|
|
|
|
def handle_event("toggle_track", %{"track-id" => track_id}, socket) do
|
|
selected_tracks = socket.assigns.selected_tracks
|
|
|
|
updated_tracks =
|
|
if MapSet.member?(selected_tracks, track_id) do
|
|
MapSet.delete(selected_tracks, track_id)
|
|
else
|
|
MapSet.put(selected_tracks, track_id)
|
|
end
|
|
|
|
{:noreply, assign(socket, :selected_tracks, updated_tracks)}
|
|
end
|
|
end
|