186 lines
4.5 KiB
Elixir
186 lines
4.5 KiB
Elixir
defmodule MusicLibraryWeb.CollectionLive.Show do
|
|
use MusicLibraryWeb, :live_view
|
|
|
|
import MusicLibrary.ScrobbleActivity, only: [localize_scrobbled_at: 2]
|
|
|
|
import MusicLibraryWeb.RecordComponents,
|
|
only: [
|
|
format_label: 1,
|
|
type_label: 1,
|
|
release_summary: 1,
|
|
artist_links: 1,
|
|
record_colors: 1,
|
|
record_cover: 1
|
|
]
|
|
|
|
alias MusicLibrary.{Records, ScrobbleActivity}
|
|
alias Phoenix.LiveView.JS
|
|
|
|
@impl true
|
|
def mount(%{"id" => record_id}, _session, socket) do
|
|
if connected?(socket) do
|
|
Records.subscribe(record_id)
|
|
end
|
|
|
|
{:ok,
|
|
socket
|
|
|> assign(:current_section, :collection)
|
|
|> assign(:timezone, MusicLibrary.timezone())
|
|
|> assign(:can_scrobble?, ScrobbleActivity.can_scrobble?())
|
|
|> assign(:release_with_tracks, nil)}
|
|
end
|
|
|
|
@impl true
|
|
def handle_params(%{"id" => id}, _, socket) do
|
|
record = Records.get_record!(id)
|
|
last_listened_track = Records.get_last_listened_track(record)
|
|
|
|
socket =
|
|
if record.selected_release_id do
|
|
socket
|
|
else
|
|
socket
|
|
end
|
|
|
|
{:noreply,
|
|
socket
|
|
|> assign(:page_title, page_title(socket.assigns.live_action, record))
|
|
|> assign(:record, record)
|
|
|> assign(:last_listened_track, last_listened_track)}
|
|
end
|
|
|
|
@impl true
|
|
def handle_event("delete", %{"id" => id}, socket) do
|
|
record = Records.get_record!(id)
|
|
{:ok, _} = Records.delete_record(record)
|
|
|
|
{:noreply, push_navigate(socket, to: ~p"/collection")}
|
|
end
|
|
|
|
def handle_event("refresh_musicbrainz_data", %{"id" => id}, socket) do
|
|
record = Records.get_record!(id)
|
|
|
|
case Records.refresh_musicbrainz_data(record) do
|
|
{:ok, updated_record} ->
|
|
{:noreply,
|
|
socket
|
|
|> put_toast(:info, gettext("MusicBrainz data refreshed successfully"))
|
|
|> assign(:record, updated_record)}
|
|
|
|
{:error, reason} ->
|
|
{:noreply,
|
|
socket
|
|
|> put_toast(
|
|
:error,
|
|
gettext("Error refreshing MusicBrainz data") <> "," <> inspect(reason)
|
|
)}
|
|
end
|
|
end
|
|
|
|
def handle_event("populate_genres", %{"id" => id}, socket) do
|
|
record = Records.get_record!(id)
|
|
|
|
case Records.populate_genres(record) do
|
|
{:ok, updated_record} ->
|
|
{:noreply,
|
|
socket
|
|
|> put_toast(:info, gettext("Genres populated successfully"))
|
|
|> assign(:record, updated_record)}
|
|
|
|
{:error, reason} ->
|
|
{:noreply,
|
|
socket
|
|
|> put_toast(
|
|
:error,
|
|
gettext("Error populating genres") <> "," <> inspect(reason)
|
|
)}
|
|
end
|
|
end
|
|
|
|
def handle_event("refresh_cover", %{"id" => id}, socket) do
|
|
record = Records.get_record!(id)
|
|
|
|
case Records.refresh_cover(record) do
|
|
{:ok, record} ->
|
|
{:noreply,
|
|
socket
|
|
|> assign(:record, record)
|
|
|> put_toast(:info, gettext("Cover refreshed successfully"))}
|
|
|
|
{:error, reason} ->
|
|
{:noreply,
|
|
socket
|
|
|> put_toast(
|
|
:error,
|
|
gettext("Error refreshing cover") <> "," <> inspect(reason)
|
|
)}
|
|
end
|
|
end
|
|
|
|
def handle_event("extract_colors", %{"id" => id, "method" => method}, socket) do
|
|
record = Records.get_record!(id)
|
|
method = String.to_existing_atom(method)
|
|
|
|
case Records.extract_colors_async(record, method) do
|
|
{:ok, _worker} ->
|
|
{:noreply,
|
|
socket
|
|
|> put_toast(:info, gettext("In progress - record will update automatically"))}
|
|
|
|
{:error, reason} ->
|
|
{:noreply,
|
|
socket
|
|
|> put_toast(
|
|
:error,
|
|
gettext("Error") <> "," <> inspect(reason)
|
|
)}
|
|
end
|
|
end
|
|
|
|
@impl true
|
|
def handle_info({MusicLibraryWeb.RecordFormComponent, {:saved, record}}, socket) do
|
|
{:noreply, assign(socket, :record, record)}
|
|
end
|
|
|
|
@impl true
|
|
def handle_info({:update, record}, socket) do
|
|
{:noreply,
|
|
socket
|
|
|> put_toast(:info, gettext("Record updated in the background"))
|
|
|> assign(:record, record)}
|
|
end
|
|
|
|
def page_title(:show, record) do
|
|
Enum.join(
|
|
[
|
|
Records.Record.artist_names(record),
|
|
"-",
|
|
record.title,
|
|
"·",
|
|
gettext("Details"),
|
|
"·",
|
|
gettext("Collection")
|
|
],
|
|
" "
|
|
)
|
|
end
|
|
|
|
def page_title(action, record) do
|
|
Enum.join(
|
|
[
|
|
Records.Record.artist_names(record),
|
|
"-",
|
|
record.title,
|
|
"·",
|
|
title_segment(action),
|
|
"·",
|
|
gettext("Collection")
|
|
],
|
|
" "
|
|
)
|
|
end
|
|
|
|
defp title_segment(:show), do: gettext("Show")
|
|
defp title_segment(:edit), do: gettext("Edit")
|
|
end
|