From a3c4989571cc65c78704bd9973b9a5639baaac29 Mon Sep 17 00:00:00 2001 From: Thomas Frans <48214567+ThomasFrans@users.noreply.github.com> Date: Fri, 17 Feb 2023 09:22:12 +0100 Subject: [PATCH] Switch from MM:SS to HH:MM:SS duration representation if needed * Contidionally switch from MM:SS to HH:MM:SS duration representation if needed. * Correct tiny style issue. * --amend --- src/model/episode.rs | 5 ++--- src/model/playable.rs | 6 ++---- src/model/track.rs | 5 ++--- src/ui/statusbar.rs | 7 ++----- src/utils.rs | 19 +++++++++++++++++++ 5 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/model/episode.rs b/src/model/episode.rs index 7f589b4..e68417d 100644 --- a/src/model/episode.rs +++ b/src/model/episode.rs @@ -2,6 +2,7 @@ use crate::library::Library; use crate::model::playable::Playable; use crate::queue::Queue; use crate::traits::{ListItem, ViewExt}; +use crate::utils::ms_to_hms; use chrono::{DateTime, Utc}; use rspotify::model::show::{FullEpisode, SimplifiedEpisode}; use rspotify::model::Id; @@ -23,9 +24,7 @@ pub struct Episode { impl Episode { pub fn duration_str(&self) -> String { - let minutes = self.duration / 60_000; - let seconds = (self.duration / 1000) % 60; - format!("{minutes:02}:{seconds:02}") + ms_to_hms(self.duration) } } diff --git a/src/model/playable.rs b/src/model/playable.rs index 2611b88..eb57196 100644 --- a/src/model/playable.rs +++ b/src/model/playable.rs @@ -8,6 +8,7 @@ use crate::model::episode::Episode; use crate::model::track::Track; use crate::queue::Queue; use crate::traits::{ListItem, ViewExt}; +use crate::utils::ms_to_hms; use std::fmt; use std::sync::Arc; @@ -118,10 +119,7 @@ impl Playable { } pub fn duration_str(&self) -> String { - let duration = self.duration(); - let minutes = duration / 60_000; - let seconds = (duration / 1000) % 60; - format!("{minutes:02}:{seconds:02}") + ms_to_hms(self.duration()) } pub fn as_listitem(&self) -> Box { diff --git a/src/model/track.rs b/src/model/track.rs index bc497b6..8f06da1 100644 --- a/src/model/track.rs +++ b/src/model/track.rs @@ -2,6 +2,7 @@ use std::fmt; use std::sync::{Arc, RwLock}; use crate::config; +use crate::utils::ms_to_hms; use chrono::{DateTime, Utc}; use rspotify::model::album::FullAlbum; use rspotify::model::track::{FullTrack, SavedTrack, SimplifiedTrack}; @@ -72,9 +73,7 @@ impl Track { } pub fn duration_str(&self) -> String { - let minutes = self.duration / 60_000; - let seconds = (self.duration / 1000) % 60; - format!("{minutes:02}:{seconds:02}") + ms_to_hms(self.duration) } } diff --git a/src/ui/statusbar.rs b/src/ui/statusbar.rs index 7d48c86..3763874 100644 --- a/src/ui/statusbar.rs +++ b/src/ui/statusbar.rs @@ -12,6 +12,7 @@ use crate::library::Library; use crate::model::playable::Playable; use crate::queue::{Queue, RepeatSetting}; use crate::spotify::{PlayerEvent, Spotify}; +use crate::utils::ms_to_hms; pub struct StatusBar { queue: Arc, @@ -165,11 +166,7 @@ impl View for StatusBar { let elapsed = self.spotify.get_current_progress(); let elapsed_ms = elapsed.as_millis() as u32; - let formatted_elapsed = format!( - "{:02}:{:02}", - elapsed.as_secs() / 60, - elapsed.as_secs() % 60 - ); + let formatted_elapsed = ms_to_hms(elapsed.as_millis().try_into().unwrap_or(0)); let playback_duration_status = match self.queue.get_current() { Some(ref t) => format!("{} / {}", formatted_elapsed, t.duration_str()), diff --git a/src/utils.rs b/src/utils.rs index a8140e3..e4ae725 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -24,6 +24,25 @@ pub fn format_duration(d: &std::time::Duration) -> String { s.trim_end().to_string() } +/// Returns a human readable String of milliseconds in the HH:MM:SS format. +pub fn ms_to_hms(duration: u32) -> String { + let mut formated_time = String::new(); + + let total_seconds = duration / 1000; + let seconds = total_seconds % 60; + let minutes = (total_seconds / 60) % 60; + let hours = total_seconds / 3600; + + if hours > 0 { + formated_time.push_str(&format!("{hours}:{minutes:02}:")); + } else { + formated_time.push_str(&format!("{minutes}:")); + } + formated_time.push_str(&format!("{seconds:02}")); + + formated_time +} + pub fn cache_path_for_url(url: String) -> std::path::PathBuf { let mut path = crate::config::cache_path("covers"); path.push(url.split('/').last().unwrap());