[mb-commits] branch, mbs-5765, created. MBS-5765: Correctly render a duration in seconds as hours, minutes, seconds

MusicBrainz Git Server <[email protected]> Tue, 22 Jan 2013 14:37:39 +0000
Newsgroups gmane.comp.audio.musicbrainz.cvs
Message-ID <E1Txeyp-00046r-Tk@wiley>
The branch, mbs-5765 has been created
        at  63289a136150f379cd8b21e2a964e1cf910ff6a2 (commit)

- Log -----------------------------------------------------------------
commit 63289a136150f379cd8b21e2a964e1cf910ff6a2
Author: Oliver Charles <[email protected]>
Date:   Tue Jan 22 14:37:14 2013 +0000

    MBS-5765: Correctly render a duration in seconds as hours, minutes, seconds
    
    Time::Duration->normalize normalizes a large duration into years, months, and
    days - rather than just the needed hours, minutes, seconds. Rather than manually
    re-fudging the calculation to account for that overflow, I've just implemented
    partioning of seconds in hours, minutes and seconds manually.

diff --git a/lib/MusicBrainz/Server/Track.pm b/lib/MusicBrainz/Server/Track.pm
index eae2202..789793e 100644
--- a/lib/MusicBrainz/Server/Track.pm
+++ b/lib/MusicBrainz/Server/Track.pm
@@ -1,7 +1,7 @@
 package MusicBrainz::Server::Track;
 use strict;
 use Carp 'confess';
-use aliased 'DateTime::Format::Duration';
+use POSIX qw( floor );
 use Scalar::Util qw( looks_like_number );
 
 use Sub::Exporter -setup => {
@@ -23,12 +23,18 @@ sub FormatTrackLength
     return $ms unless looks_like_number($ms);
     return "$ms ms" if $ms < 1000;
 
-    my $seconds = $ms / 1000.0 + 0.5;
+    my $one_second = 1000.0;
+    my $one_minute = $one_second * 60;
+    my $one_hour = $one_minute * 60;
 
-    my %data = Duration->new->normalise (seconds => $seconds);
-    return $data{hours} > 0 ?
-        sprintf ("%d:%02d:%02d", $data{hours}, $data{minutes}, $data{seconds}) :
-        sprintf ("%d:%02d", $data{minutes}, $data{seconds});
+    my ($hours, $minutes, $seconds);
+    ($hours, $ms) = (floor($ms / $one_hour), $ms % $one_hour);
+    ($minutes, $ms) = (floor($ms / $one_minute), $ms % $one_minute);
+    $seconds = floor($ms / $one_second);
+
+    return $hours > 0 ?
+        sprintf ("%d:%02d:%02d", $hours, $minutes, $seconds) :
+        sprintf ("%d:%02d", $minutes, $seconds);
 }
 
 sub FormatXSDTrackLength

-----------------------------------------------------------------------


hooks/post-receive
-- 
mb_server