Simplify custom scrobble page

This commit is contained in:
Claudio Ortolina
2025-09-27 11:37:41 +03:00
parent a585caec7e
commit 35049e2844
4 changed files with 164 additions and 421 deletions
@@ -4,82 +4,29 @@ defmodule MusicLibraryWeb.ScrobbleLive.Show do
alias MusicLibrary.ScrobbleActivity alias MusicLibrary.ScrobbleActivity
@impl true @impl true
def mount(%{"release_id" => release_id}, _session, socket) do def mount(_params, _session, socket) do
{:ok, {:ok,
assign(socket, assign(socket,
current_section: :scrobble, current_section: :scrobble,
release_id: release_id,
release: nil, release: nil,
loading: true,
can_scrobble: ScrobbleActivity.can_scrobble?(), can_scrobble: ScrobbleActivity.can_scrobble?(),
scrobble_form: %{
"type" => "finished_at",
"finished_at_date" => Date.utc_today() |> Date.to_string(),
"finished_at_time" => Time.utc_now() |> Time.truncate(:second) |> Time.to_string(),
"started_at_date" => Date.utc_today() |> Date.to_string(),
"started_at_time" => Time.utc_now() |> Time.truncate(:second) |> Time.to_string()
},
page_title: "Scrobble Release" page_title: "Scrobble Release"
)} )}
end end
@impl true @impl true
def handle_params(params, _url, socket) do def handle_params(params, _url, socket) do
{:noreply, apply_action(socket, socket.assigns.live_action, params)} apply_action(socket, socket.assigns.live_action, params)
end end
defp apply_action(socket, :show, _params) do defp apply_action(socket, :show, %{"release_id" => release_id}) do
send(self(), :fetch_release) case MusicBrainz.get_release(release_id) do
socket
end
@impl true
def handle_event("update_scrobble_form", %{"scrobble" => scrobble_params}, socket) do
{:noreply, assign(socket, scrobble_form: scrobble_params)}
end
def handle_event("scrobble_release", _params, socket) do
case perform_scrobble(socket.assigns.release, :all, socket.assigns.scrobble_form) do
{:ok, _result} ->
{:noreply,
socket
|> put_flash(:info, "Release scrobbled successfully!")
|> push_navigate(to: ~p"/scrobble")}
{:error, reason} ->
{:noreply, put_flash(socket, :error, "Failed to scrobble release: #{inspect(reason)}")}
end
end
def handle_event("scrobble_medium", %{"medium_number" => medium_number_str}, socket) do
{medium_number, ""} = Integer.parse(medium_number_str)
case perform_scrobble(
socket.assigns.release,
{:medium, medium_number},
socket.assigns.scrobble_form
) do
{:ok, _result} ->
{:noreply,
socket
|> put_flash(:info, "Medium scrobbled successfully!")
|> push_navigate(to: ~p"/scrobble")}
{:error, reason} ->
{:noreply, put_flash(socket, :error, "Failed to scrobble medium: #{inspect(reason)}")}
end
end
@impl true
def handle_info(:fetch_release, socket) do
case MusicBrainz.get_release(socket.assigns.release_id) do
{:ok, release} -> {:ok, release} ->
release = MusicBrainz.Release.from_api_response(release) release = MusicBrainz.Release.from_api_response(release)
{:noreply, {:noreply,
assign(socket, assign(socket,
release: release, release: release,
loading: false,
page_title: "Scrobble: #{release.title}" page_title: "Scrobble: #{release.title}"
)} )}
@@ -91,48 +38,47 @@ defmodule MusicLibraryWeb.ScrobbleLive.Show do
end end
end end
defp perform_scrobble(release, scope, scrobble_form) do @impl true
datetime_opts = build_datetime_opts(scrobble_form) 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"))}
case scope do {:error, reason} ->
:all -> {:noreply,
ScrobbleActivity.scrobble_release(release, datetime_opts) socket
|> put_toast(
{:medium, medium_number} -> :error,
ScrobbleActivity.scrobble_medium(medium_number, release, datetime_opts) gettext("Error scrobbling release") <> "," <> inspect(reason)
)}
end end
end end
defp build_datetime_opts(%{ def handle_event("scrobble_medium", %{"medium_number" => number}, socket) do
"type" => "finished_at", number = String.to_integer(number)
"finished_at_date" => date,
"finished_at_time" => time case ScrobbleActivity.scrobble_medium(number, socket.assigns.release,
}) do finished_at: DateTime.utc_now()
with {:ok, date} <- Date.from_iso8601(date), ) do
{:ok, time} <- Time.from_iso8601(time), {:ok, _} ->
datetime <- DateTime.new!(date, time, "Etc/UTC") do {:noreply,
[finished_at: datetime] socket
else |> put_toast(:info, gettext("Disc scrobbled successfully"))}
_ -> [finished_at: DateTime.utc_now()]
{:error, reason} ->
{:noreply,
socket
|> put_toast(
:error,
gettext("Error scrobbling disc") <> "," <> inspect(reason)
)}
end end
end end
defp build_datetime_opts(%{
"type" => "started_at",
"started_at_date" => date,
"started_at_time" => time
}) do
with {:ok, date} <- Date.from_iso8601(date),
{:ok, time} <- Time.from_iso8601(time),
datetime <- DateTime.new!(date, time, "Etc/UTC") do
[started_at: datetime]
else
_ -> [started_at: DateTime.utc_now()]
end
end
defp build_datetime_opts(_), do: [finished_at: DateTime.utc_now()]
defp format_duration(nil), do: "Unknown" defp format_duration(nil), do: "Unknown"
defp format_duration(milliseconds) when is_integer(milliseconds) do defp format_duration(milliseconds) when is_integer(milliseconds) do
@@ -1,30 +1,8 @@
<Layouts.app flash={@flash} current_section={:scrobble} socket={@socket}> <Layouts.app flash={@flash} current_section={:scrobble} socket={@socket}>
<div> <div>
<div :if={@loading} class="text-center py-8"> <div class="space-y-6">
<.icon name="hero-arrow-path" class="h-8 w-8 animate-spin mx-auto text-gray-400" />
<p class="text-gray-600 dark:text-gray-400 mt-2">{gettext("Loading release details...")}</p>
</div>
<div :if={not @loading} class="space-y-6">
<div class="flex items-center gap-4"> <div class="flex items-center gap-4">
<.link navigate={~p"/scrobble"} class="flex-shrink-0"> <div class="min-w-0 flex-1"></div>
<.button variant="ghost" size="sm">
<.icon name="hero-arrow-left" class="h-4 w-4 mr-2" /> {gettext("Back to Search")}
</.button>
</.link>
<div class="min-w-0 flex-1">
<h1 class="text-base lg:text-2xl text-zinc-900 dark:text-zinc-200 font-semibold">
{@release.title}
</h1>
<p class="text-sm text-gray-600 dark:text-gray-400 mt-1">
<span :if={@release.artists != []}>
by {@release.artists |> Enum.map(& &1.name) |> Enum.join(", ")}
</span>
<span :if={@release.date}>
{@release.date}
</span>
</p>
</div>
</div> </div>
<div <div
@@ -43,184 +21,131 @@
</div> </div>
</div> </div>
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6"> <div class="bg-white dark:bg-zinc-800 shadow rounded-lg">
<div class="lg:col-span-2"> <div class="p-6">
<div class="bg-white dark:bg-zinc-800 shadow rounded-lg"> <h1 class="text-base lg:text-2xl text-zinc-900 dark:text-zinc-200 font-semibold">
<div class="p-6"> {@release.title}
<h3 class="text-lg font-semibold mb-4">{gettext("Release Information")}</h3> </h1>
<div class="flex gap-6"> <p class="text-sm text-gray-600 dark:text-gray-400 mt-1">
<div class="flex-shrink-0"> <span :if={@release.artists != []}>
<img by {@release.artists |> Enum.map(& &1.name) |> Enum.join(", ")}
src={MusicBrainz.Release.thumb_url(@release)} </span>
alt={"Cover art for #{@release.title}"} <span :if={@release.date}>
class="w-32 h-32 object-cover rounded-lg shadow-sm" {@release.date}
loading="lazy" </span>
/> </p>
</div> <div class="flex gap-6 mt-4">
<div class="flex-1"> <div class="flex-shrink-0">
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4 text-sm"> <img
<div :if={@release.date}> src={MusicBrainz.Release.thumb_url(@release)}
<span class="font-medium text-gray-600 dark:text-gray-400"> alt={"Cover art for #{@release.title}"}
{gettext("Release Date:")} class="w-32 h-32 object-cover rounded-lg shadow-sm"
</span> loading="lazy"
<br />{@release.date} />
</div>
<div :if={@release.country}>
<span class="font-medium text-gray-600 dark:text-gray-400">
{gettext("Country:")}
</span>
<br />{@release.country}
</div>
<div :if={@release.barcode}>
<span class="font-medium text-gray-600 dark:text-gray-400">
{gettext("Barcode:")}
</span>
<br />{@release.barcode}
</div>
<div :if={@release.catalog_number}>
<span class="font-medium text-gray-600 dark:text-gray-400">
{gettext("Catalog Number:")}
</span>
<br />{@release.catalog_number}
</div>
</div>
</div>
</div>
</div> </div>
</div> <div class="flex-1">
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4 text-sm">
<div :if={@release.media != []} class="bg-white dark:bg-zinc-800 shadow rounded-lg mt-6"> <div :if={@release.date}>
<div class="p-6"> <span class="font-medium text-gray-600 dark:text-gray-400">
<h3 class="text-lg font-semibold mb-4">{gettext("Tracks")}</h3> {gettext("Release Date:")}
<div class="space-y-6"> </span>
<div :for={medium <- @release.media} class="space-y-3"> <br />{@release.date}
<div class="flex justify-between items-center"> </div>
<h4 :if={length(@release.media) > 1} class="font-medium"> <div :if={@release.country}>
Medium {medium.number} <span class="font-medium text-gray-600 dark:text-gray-400">
<span :if={medium.title}> {gettext("Country:")}
- {medium.title} </span>
</span> <br />{@release.country}
<span :if={medium.format}> </div>
({medium.format}) <div :if={@release.barcode}>
</span> <span class="font-medium text-gray-600 dark:text-gray-400">
</h4> {gettext("Barcode:")}
<h4 :if={length(@release.media) == 1} class="font-medium"> </span>
{gettext("Tracks")} <br />{@release.barcode}
<span :if={medium.format}> </div>
({medium.format}) <div :if={@release.catalog_number}>
</span> <span class="font-medium text-gray-600 dark:text-gray-400">
</h4> {gettext("Catalog Number:")}
<.button </span>
:if={@can_scrobble} <br />{@release.catalog_number}
size="sm"
variant="outline"
phx-click="scrobble_medium"
phx-value-medium_number={medium.number}
>
<.icon name="hero-play" class="h-3 w-3 mr-1" /> {gettext("Scrobble Medium")}
</.button>
</div>
<div class="space-y-1">
<div
:for={track <- medium.tracks}
class="flex justify-between items-center py-2 px-3 bg-gray-50 dark:bg-gray-800 rounded"
>
<div class="flex items-center gap-3">
<span class="text-xs text-gray-500 dark:text-gray-400 w-6 text-right">
{track.position}
</span>
<div class="min-w-0 flex-1">
<p class="font-medium text-sm text-gray-900 dark:text-gray-100 truncate">
{track.title}
</p>
<p
:if={track.artists != [] and track.artists != @release.artists}
class="text-xs text-gray-600 dark:text-gray-400 truncate"
>
{track.artists |> Enum.map(& &1.name) |> Enum.join(", ")}
</p>
</div>
</div>
<span
:if={track.length}
class="text-xs text-gray-500 dark:text-gray-400 font-mono"
>
{format_duration(track.length)}
</span>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
<div :if={@can_scrobble} class="lg:col-span-1"> <div :if={@release.media != []} class="bg-white dark:bg-zinc-800 shadow rounded-lg mt-6">
<div class="bg-white dark:bg-zinc-800 shadow rounded-lg sticky top-6"> <div class="p-6">
<div class="p-6"> <div class="flex justify-between items-center">
<h3 class="text-lg font-semibold mb-4">{gettext("Scrobble Options")}</h3> <h3 class="text-lg font-semibold mb-4">{gettext("Tracks")}</h3>
<.form <.button
for={%{}} :if={@can_scrobble}
as={:scrobble} phx-click="scrobble_release"
phx-change="update_scrobble_form" size="sm"
class="space-y-4" >
> {gettext("Scrobble release")}
<.select </.button>
name="type" </div>
label={gettext("Scrobble timing")}
value={@scrobble_form["type"]}
options={[
{gettext("Just finished listening"), "finished_at"},
{gettext("Started listening at"), "started_at"}
]}
/>
<div :if={@scrobble_form["type"] == "finished_at"} class="space-y-2"> <div class="space-y-6">
<.input <div :for={medium <- @release.media} class="space-y-3">
type="date" <div class="flex justify-between items-center">
name="finished_at_date" <h4 :if={length(@release.media) > 1} class="font-medium">
label={gettext("Finished Date")} Medium {medium.number}
value={@scrobble_form["finished_at_date"]} <span :if={medium.title}>
/> - {medium.title}
<.input </span>
type="time" <span :if={medium.format}>
name="finished_at_time" ({medium.format})
label={gettext("Finished Time")} </span>
value={@scrobble_form["finished_at_time"]} </h4>
/> <h4 :if={length(@release.media) == 1} class="font-medium">
</div> {gettext("Tracks")}
<div :if={@scrobble_form["type"] != "finished_at"} class="space-y-2"> <span :if={medium.format}>
<.input ({medium.format})
type="date" </span>
name="started_at_date" </h4>
label={gettext("Started Date")}
value={@scrobble_form["started_at_date"]}
/>
<.input
type="time"
name="started_at_time"
label={gettext("Started Time")}
value={@scrobble_form["started_at_time"]}
/>
</div>
</.form>
<div class="space-y-3 mt-6">
<.button <.button
phx-click="scrobble_release" :if={@can_scrobble}
class="w-full" size="sm"
size="lg" variant="outline"
phx-click="scrobble_medium"
phx-value-medium_number={medium.number}
> >
<.icon name="hero-play" class="h-4 w-4 mr-2" /> {gettext( {gettext("Scrobble disc")}
"Scrobble Entire Release"
)}
</.button> </.button>
</div>
<p class="text-xs text-gray-500 dark:text-gray-400 text-center"> <div class="space-y-1">
{gettext("This will scrobble all tracks from all media in sequence")} <div
</p> :for={track <- medium.tracks}
class="flex justify-between items-center py-2 px-3 bg-gray-50 dark:bg-gray-800 rounded"
>
<div class="flex items-center gap-3">
<span class="text-xs text-gray-500 dark:text-gray-400 w-6 text-right">
{track.position}
</span>
<div class="min-w-0 flex-1">
<p class="font-medium text-sm text-gray-900 dark:text-gray-100 truncate">
{track.title}
</p>
<p
:if={track.artists != [] and track.artists != @release.artists}
class="text-xs text-gray-600 dark:text-gray-400 truncate"
>
{track.artists |> Enum.map(& &1.name) |> Enum.join(", ")}
</p>
</div>
</div>
<span
:if={track.length}
class="text-xs text-gray-500 dark:text-gray-400 font-mono"
>
{format_duration(track.length)}
</span>
</div>
</div> </div>
</div> </div>
</div> </div>
+6 -70
View File
@@ -739,11 +739,13 @@ msgid "Successfully connected your Last.fm account"
msgstr "" msgstr ""
#: lib/music_library_web/components/release.ex #: lib/music_library_web/components/release.ex
#: lib/music_library_web/live/scrobble_live/show.ex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Error scrobbling release" msgid "Error scrobbling release"
msgstr "" msgstr ""
#: lib/music_library_web/components/release.ex #: lib/music_library_web/components/release.ex
#: lib/music_library_web/live/scrobble_live/show.ex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Release scrobbled successfully" msgid "Release scrobbled successfully"
msgstr "" msgstr ""
@@ -760,21 +762,25 @@ msgid "Scrobbling..."
msgstr "" msgstr ""
#: lib/music_library_web/components/release.ex #: lib/music_library_web/components/release.ex
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Scrobble release" msgid "Scrobble release"
msgstr "" msgstr ""
#: lib/music_library_web/components/release.ex #: lib/music_library_web/components/release.ex
#: lib/music_library_web/live/scrobble_live/show.ex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Disc scrobbled successfully" msgid "Disc scrobbled successfully"
msgstr "" msgstr ""
#: lib/music_library_web/components/release.ex #: lib/music_library_web/components/release.ex
#: lib/music_library_web/live/scrobble_live/show.ex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Error scrobbling disc" msgid "Error scrobbling disc"
msgstr "" msgstr ""
#: lib/music_library_web/components/release.ex #: lib/music_library_web/components/release.ex
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Scrobble disc" msgid "Scrobble disc"
msgstr "" msgstr ""
@@ -1435,11 +1441,6 @@ msgstr[1] ""
msgid "Releases for \"%{title}\"" msgid "Releases for \"%{title}\""
msgstr "" msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format
msgid "Back to Search"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex #: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Barcode:" msgid "Barcode:"
@@ -1455,76 +1456,11 @@ msgstr ""
msgid "Country:" msgid "Country:"
msgstr "" msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format
msgid "Finished Date"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format
msgid "Finished Time"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format
msgid "Just finished listening"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format
msgid "Loading release details..."
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex #: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Release Date:" msgid "Release Date:"
msgstr "" msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format
msgid "Release Information"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format
msgid "Scrobble Entire Release"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format
msgid "Scrobble Medium"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format
msgid "Scrobble Options"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format
msgid "Scrobble timing"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format
msgid "Started Date"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format
msgid "Started Time"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format
msgid "Started listening at"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format
msgid "This will scrobble all tracks from all media in sequence"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex #: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "You need to connect your Last.fm account to scrobble. Please set up your Last.fm session key in the settings." msgid "You need to connect your Last.fm account to scrobble. Please set up your Last.fm session key in the settings."
+6 -70
View File
@@ -739,11 +739,13 @@ msgid "Successfully connected your Last.fm account"
msgstr "" msgstr ""
#: lib/music_library_web/components/release.ex #: lib/music_library_web/components/release.ex
#: lib/music_library_web/live/scrobble_live/show.ex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Error scrobbling release" msgid "Error scrobbling release"
msgstr "" msgstr ""
#: lib/music_library_web/components/release.ex #: lib/music_library_web/components/release.ex
#: lib/music_library_web/live/scrobble_live/show.ex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Release scrobbled successfully" msgid "Release scrobbled successfully"
msgstr "" msgstr ""
@@ -760,21 +762,25 @@ msgid "Scrobbling..."
msgstr "" msgstr ""
#: lib/music_library_web/components/release.ex #: lib/music_library_web/components/release.ex
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Scrobble release" msgid "Scrobble release"
msgstr "" msgstr ""
#: lib/music_library_web/components/release.ex #: lib/music_library_web/components/release.ex
#: lib/music_library_web/live/scrobble_live/show.ex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Disc scrobbled successfully" msgid "Disc scrobbled successfully"
msgstr "" msgstr ""
#: lib/music_library_web/components/release.ex #: lib/music_library_web/components/release.ex
#: lib/music_library_web/live/scrobble_live/show.ex
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Error scrobbling disc" msgid "Error scrobbling disc"
msgstr "" msgstr ""
#: lib/music_library_web/components/release.ex #: lib/music_library_web/components/release.ex
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Scrobble disc" msgid "Scrobble disc"
msgstr "" msgstr ""
@@ -1435,11 +1441,6 @@ msgstr[1] ""
msgid "Releases for \"%{title}\"" msgid "Releases for \"%{title}\""
msgstr "" msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format
msgid "Back to Search"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex #: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Barcode:" msgid "Barcode:"
@@ -1455,76 +1456,11 @@ msgstr ""
msgid "Country:" msgid "Country:"
msgstr "" msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format
msgid "Finished Date"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format
msgid "Finished Time"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format
msgid "Just finished listening"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format, fuzzy
msgid "Loading release details..."
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex #: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "Release Date:" msgid "Release Date:"
msgstr "" msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format
msgid "Release Information"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format, fuzzy
msgid "Scrobble Entire Release"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format, fuzzy
msgid "Scrobble Medium"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format, fuzzy
msgid "Scrobble Options"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format, fuzzy
msgid "Scrobble timing"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format
msgid "Started Date"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format
msgid "Started Time"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format
msgid "Started listening at"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format
msgid "This will scrobble all tracks from all media in sequence"
msgstr ""
#: lib/music_library_web/live/scrobble_live/show.html.heex #: lib/music_library_web/live/scrobble_live/show.html.heex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "You need to connect your Last.fm account to scrobble. Please set up your Last.fm session key in the settings." msgid "You need to connect your Last.fm account to scrobble. Please set up your Last.fm session key in the settings."