Consolidate duration formatting

This commit is contained in:
Claudio Ortolina
2025-09-27 11:48:00 +03:00
parent 35049e2844
commit 0cba0cb2a1
4 changed files with 44 additions and 51 deletions
+3 -40
View File
@@ -3,6 +3,7 @@ defmodule MusicLibraryWeb.Components.Release do
use Gettext, backend: MusicLibraryWeb.Gettext use Gettext, backend: MusicLibraryWeb.Gettext
alias MusicLibrary.ScrobbleActivity alias MusicLibrary.ScrobbleActivity
alias MusicLibraryWeb.Duration
def open(id), do: Fluxon.open_dialog(id) def open(id), do: Fluxon.open_dialog(id)
@@ -107,7 +108,7 @@ defmodule MusicLibraryWeb.Components.Release do
{track.title} {track.title}
</span> </span>
<span class="table-cell text-xs md:text-sm text-right pl-2"> <span class="table-cell text-xs md:text-sm text-right pl-2">
{track.length && format_duration(track.length)} {track.length && Duration.format_duration(track.length)}
</span> </span>
</div> </div>
<div <div
@@ -197,7 +198,7 @@ defmodule MusicLibraryWeb.Components.Release do
defp medium_duration(medium) do defp medium_duration(medium) do
medium medium
|> MusicBrainz.Release.medium_duration() |> MusicBrainz.Release.medium_duration()
|> format_duration() |> Duration.format_duration()
end end
defp medium_title(medium) do defp medium_title(medium) do
@@ -207,42 +208,4 @@ defmodule MusicLibraryWeb.Components.Release do
medium.title medium.title
end end
end end
defp format_duration(milliseconds) do
milliseconds
|> System.convert_time_unit(:millisecond, :second)
|> format_seconds()
end
defp format_seconds(seconds) when seconds <= 59 do
"0:#{zero_pad(seconds)}"
end
defp format_seconds(seconds) do
minutes = div(seconds, 60)
remaining_seconds = rem(seconds, 60)
format_minutes(minutes, remaining_seconds)
end
defp format_minutes(minutes, seconds) when minutes <= 59 do
"#{minutes}:#{zero_pad(seconds)}"
end
defp format_minutes(minutes, seconds) do
hours = div(minutes, 60)
remaining_minutes = rem(minutes, 60)
format_hours(hours, remaining_minutes, seconds)
end
defp format_hours(hours, minutes, seconds) do
"#{hours}:#{zero_pad(minutes)}:#{zero_pad(seconds)}"
end
defp zero_pad(integer) do
integer
|> to_string()
|> String.pad_leading(2, "0")
end
end end
+39
View File
@@ -0,0 +1,39 @@
defmodule MusicLibraryWeb.Duration do
def format_duration(milliseconds) do
milliseconds
|> System.convert_time_unit(:millisecond, :second)
|> format_seconds()
end
defp format_seconds(seconds) when seconds <= 59 do
"0:#{zero_pad(seconds)}"
end
defp format_seconds(seconds) do
minutes = div(seconds, 60)
remaining_seconds = rem(seconds, 60)
format_minutes(minutes, remaining_seconds)
end
defp format_minutes(minutes, seconds) when minutes <= 59 do
"#{minutes}:#{zero_pad(seconds)}"
end
defp format_minutes(minutes, seconds) do
hours = div(minutes, 60)
remaining_minutes = rem(minutes, 60)
format_hours(hours, remaining_minutes, seconds)
end
defp format_hours(hours, minutes, seconds) do
"#{hours}:#{zero_pad(minutes)}:#{zero_pad(seconds)}"
end
defp zero_pad(integer) do
integer
|> to_string()
|> String.pad_leading(2, "0")
end
end
@@ -2,6 +2,7 @@ defmodule MusicLibraryWeb.ScrobbleLive.Show do
use MusicLibraryWeb, :live_view use MusicLibraryWeb, :live_view
alias MusicLibrary.ScrobbleActivity alias MusicLibrary.ScrobbleActivity
alias MusicLibraryWeb.Duration
@impl true @impl true
def mount(_params, _session, socket) do def mount(_params, _session, socket) do
@@ -78,14 +79,4 @@ defmodule MusicLibraryWeb.ScrobbleLive.Show do
)} )}
end end
end end
defp format_duration(nil), do: "Unknown"
defp format_duration(milliseconds) when is_integer(milliseconds) do
seconds = div(milliseconds, 1000)
minutes = div(seconds, 60)
remaining_seconds = rem(seconds, 60)
"#{minutes}:#{String.pad_leading(Integer.to_string(remaining_seconds), 2, "0")}"
end
end end
@@ -143,7 +143,7 @@
:if={track.length} :if={track.length}
class="text-xs text-gray-500 dark:text-gray-400 font-mono" class="text-xs text-gray-500 dark:text-gray-400 font-mono"
> >
{format_duration(track.length)} {Duration.format_duration(track.length)}
</span> </span>
</div> </div>
</div> </div>