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)}