sexagesimal time formatting option
authorMischa POSLAWSKY <perl@shiar.org>
Mon, 14 Nov 2022 23:33:56 +0000 (00:33 +0100)
committerMischa POSLAWSKY <perl@shiar.org>
Mon, 21 Nov 2022 15:42:04 +0000 (16:42 +0100)
Convert duration values from previous examples; like ffprobe -sexagesimal.

barcat
t/t0002-usage_-h_|wc_-l.out
t/t1421-sexy_time.in [new file with mode: 0644]
t/t1421-sexy_time_--sexagesimal.out [new file with mode: 0644]

diff --git a/barcat b/barcat
index 37445908b20682e1d56c06fc962a989c750c78bf..1a1112c0ccdfa530e55b1792a7d25bf21f5381c1 100755 (executable)
--- a/barcat
+++ b/barcat
@@ -27,6 +27,7 @@ GetOptions(\%opt,
                } or die $@ =~ s/(?:\ at\ \N+)?\Z/ for option $_[0]/r;
        },
        'human-readable|H!',
+       'sexagesimal!',
        'interval|t:i',
        'trim|length|l=s' => sub {
                my ($optname, $optval) = @_;
@@ -129,7 +130,10 @@ $opt{input} = (@ARGV && $ARGV[0] =~ m/\A[-0-9]/) ? \@ARGV : undef
 
 $opt{'sum-format'} = sub { sprintf '%.8g', $_[0] };
 $opt{'calc-format'} = sub { sprintf '%*.*f', 0, 2, $_[0] };
-$opt{'value-format'} = $opt{units} && sub {
+$opt{'value-format'} = $opt{sexagesimal} ? sub {
+       my $s = $_[0] + .5;
+       sprintf('%d:%02d:%02d', $s/3600, $s/60%60, $s%60);
+} : $opt{units} && sub {
        my $unit = (
                log(abs $_[0] || 1) / log(10)
                - 3 * (abs($_[0]) < .9995)   # shift to smaller unit if below 1
@@ -380,6 +384,7 @@ Options:
       --header             Prepend a chart axis with minimum and maximum
                            values labeled
   -H, --human-readable     Format values using SI unit prefixes
+      --sexagesimal        Convert seconds to HH:MM:SS time format
   -t, --interval[=(N|-LINES)]
                            Output partial progress every given number of
                            seconds or input lines
@@ -467,6 +472,10 @@ turning long numbers like I<12356789> into I<12.4M>.
 Also changes an exponent I<1.602176634e-19> to I<160.2z>.
 Short integers are aligned but kept without decimal point.
 
+=item --sexagesimal
+
+Convert seconds to HH:MM:SS time format.
+
 =item -t, --interval[=(<seconds> | -<lines>)]
 
 Output partial progress every given number of seconds or input lines.
@@ -613,11 +622,11 @@ Compare media metadata, like image size or play time:
 
     exiftool -T -p '$megapixels ($imagesize) $filename' * | barcat
 
-    exiftool -T -p '$duration# $avgbitrate# $filename' * | barcat -H
+    exiftool -T -p '$duration# $avgbitrate# $filename' * | barcat --sexagesimal
 
     find -type f -print0 | xargs -0 -L1 \
     ffprobe -show_format -of json -v error |
-    jq -r '[.format|.duration,.bit_rate,.filename]|join(" ")' | barcat -H
+    jq -r '.format|.duration+" "+.bit_rate+" "+.filename' | barcat --sex
 
 Memory usage of user processes with long names truncated:
 
index a7873645902455c63d166fdcaa4b2fe565f6de7d..8f92bfdd49766b1907d4aec8d3b0f9ed6129d0e6 100644 (file)
@@ -1 +1 @@
-34
+35
diff --git a/t/t1421-sexy_time.in b/t/t1421-sexy_time.in
new file mode 100644 (file)
index 0000000..62c17bf
--- /dev/null
@@ -0,0 +1,12 @@
+0
+.5
+1.49
+60
+59.5
+3600
+3661
+35999.49
+35999.5
+40271.1
+86400
+
diff --git a/t/t1421-sexy_time_--sexagesimal.out b/t/t1421-sexy_time_--sexagesimal.out
new file mode 100644 (file)
index 0000000..8164e5b
--- /dev/null
@@ -0,0 +1,12 @@
+0:00:00 
+0:00:01 
+0:00:01 
+0:01:00 
+0:01:00 
+1:00:00 +
+1:01:01 +
+9:59:59 +----=----->-
+10:00:00 +----=----->-
+11:11:11 +----=----->--
+24:00:00 +----=----->-------------------
+