From 0cba0cb2a14e4ad8d49368b93d5483edae489341 Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Sat, 27 Sep 2025 11:48:00 +0300 Subject: [PATCH] Consolidate duration formatting --- lib/music_library_web/components/release.ex | 43 ++----------------- lib/music_library_web/duration.ex | 39 +++++++++++++++++ .../live/scrobble_live/show.ex | 11 +---- .../live/scrobble_live/show.html.heex | 2 +- 4 files changed, 44 insertions(+), 51 deletions(-) create mode 100644 lib/music_library_web/duration.ex diff --git a/lib/music_library_web/components/release.ex b/lib/music_library_web/components/release.ex index f0e4e121..dbf24a67 100644 --- a/lib/music_library_web/components/release.ex +++ b/lib/music_library_web/components/release.ex @@ -3,6 +3,7 @@ defmodule MusicLibraryWeb.Components.Release do use Gettext, backend: MusicLibraryWeb.Gettext alias MusicLibrary.ScrobbleActivity + alias MusicLibraryWeb.Duration def open(id), do: Fluxon.open_dialog(id) @@ -107,7 +108,7 @@ defmodule MusicLibraryWeb.Components.Release do {track.title} - {track.length && format_duration(track.length)} + {track.length && Duration.format_duration(track.length)}
MusicBrainz.Release.medium_duration() - |> format_duration() + |> Duration.format_duration() end defp medium_title(medium) do @@ -207,42 +208,4 @@ defmodule MusicLibraryWeb.Components.Release do medium.title 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 diff --git a/lib/music_library_web/duration.ex b/lib/music_library_web/duration.ex new file mode 100644 index 00000000..301c29c1 --- /dev/null +++ b/lib/music_library_web/duration.ex @@ -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 diff --git a/lib/music_library_web/live/scrobble_live/show.ex b/lib/music_library_web/live/scrobble_live/show.ex index 5dab4bfe..b325c972 100644 --- a/lib/music_library_web/live/scrobble_live/show.ex +++ b/lib/music_library_web/live/scrobble_live/show.ex @@ -2,6 +2,7 @@ defmodule MusicLibraryWeb.ScrobbleLive.Show do use MusicLibraryWeb, :live_view alias MusicLibrary.ScrobbleActivity + alias MusicLibraryWeb.Duration @impl true def mount(_params, _session, socket) do @@ -78,14 +79,4 @@ defmodule MusicLibraryWeb.ScrobbleLive.Show do )} 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 diff --git a/lib/music_library_web/live/scrobble_live/show.html.heex b/lib/music_library_web/live/scrobble_live/show.html.heex index 7824458f..8251d09d 100644 --- a/lib/music_library_web/live/scrobble_live/show.html.heex +++ b/lib/music_library_web/live/scrobble_live/show.html.heex @@ -143,7 +143,7 @@ :if={track.length} class="text-xs text-gray-500 dark:text-gray-400 font-mono" > - {format_duration(track.length)} + {Duration.format_duration(track.length)}