Files
music_library/lib/music_library_web/live/collection_live/show.ex
T
2025-05-05 16:18:47 +01:00

191 lines
4.5 KiB
Elixir

defmodule MusicLibraryWeb.CollectionLive.Show do
use MusicLibraryWeb, :live_view
import MusicLibraryWeb.RecordComponents,
only: [
toggle_actions_menu: 1,
close_actions_menu: 1,
format_label: 1,
type_label: 1,
selected_release_label: 1,
format_duration: 1
]
alias MusicLibrary.Records
alias Phoenix.LiveView.JS
@impl true
def mount(%{"id" => record_id}, _session, socket) do
socket =
if static_changed?(socket) do
put_flash(socket, :warning, gettext("The application has been updated, please reload."))
else
socket
end
if connected?(socket) do
Records.subscribe(record_id)
end
{:ok, assign(socket, :release_with_tracks, nil)}
end
@impl true
def handle_params(%{"id" => id}, _, socket) do
record = Records.get_record!(id)
socket =
if record.selected_release_id do
socket
else
socket
end
{:noreply,
socket
|> assign(:nav_section, :records)
|> assign(:page_title, page_title(socket.assigns.live_action, record))
|> assign(:record, record)}
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_flash(:info, gettext("MusicBrainz data refreshed successfully"))
|> assign(:record, updated_record)}
{:error, reason} ->
{:noreply,
socket
|> put_flash(
: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_flash(:info, gettext("Genres populated successfully"))
|> assign(:record, updated_record)}
{:error, reason} ->
{:noreply,
socket
|> put_flash(
: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_flash(:info, gettext("Cover refreshed successfully"))}
{:error, reason} ->
{:noreply,
socket
|> put_flash(
:error,
gettext("Error refreshing cover") <> "," <> inspect(reason)
)}
end
end
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
@impl true
def handle_info({MusicLibraryWeb.FormComponent, {:saved, record}}, socket) do
{:noreply, assign(socket, :record, record)}
end
@impl true
def handle_info({:update, record}, socket) do
{:noreply,
socket
|> put_flash(: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")
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