aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--desktop/island/Logic.js9
-rw-r--r--desktop/island/test_logic.js9
2 files changed, 17 insertions, 1 deletions
diff --git a/desktop/island/Logic.js b/desktop/island/Logic.js
index e79625c..24458cd 100644
--- a/desktop/island/Logic.js
+++ b/desktop/island/Logic.js
@@ -62,3 +62,12 @@ function parseOpenWindow(data) {
const p = String(data || "").split(",");
return { address: p[0] || "", workspace: p[1] || "", appClass: p[2] || "" };
}
+
+// OBS's outputDuration (ms) as mm:ss, or h:mm:ss past an hour.
+function obsElapsed(ms) {
+ const s = Math.floor((ms > 0 ? ms : 0) / 1000);
+ const two = n => String(n).padStart(2, "0");
+ const h = Math.floor(s / 3600);
+ const mmss = `${two(Math.floor(s / 60) % 60)}:${two(s % 60)}`;
+ return h ? `${h}:${mmss}` : mmss;
+}
diff --git a/desktop/island/test_logic.js b/desktop/island/test_logic.js
index 5932991..ee237cc 100644
--- a/desktop/island/test_logic.js
+++ b/desktop/island/test_logic.js
@@ -8,7 +8,7 @@ const assert = require("assert");
const src = fs.readFileSync(__dirname + "/Logic.js", "utf8")
.replace(/^\.pragma library$/m, "");
const L = new Function(src +
- "\nreturn { volumeIcon, vmRole, flagFor, privacyRoles, parseOpenWindow };")();
+ "\nreturn { volumeIcon, vmRole, flagFor, privacyRoles, parseOpenWindow, obsElapsed };")();
// Volume: muted or zero is muted, then thirds.
assert.strictEqual(L.volumeIcon(0.5, true), "audio-volume-muted");
@@ -52,4 +52,11 @@ assert.deepStrictEqual(L.parseOpenWindow("55d1a0,3,kitty,a, b, c"),
assert.deepStrictEqual(L.parseOpenWindow(""),
{ address: "", workspace: "", appClass: "" });
+// OBS elapsed: mm:ss under an hour, h:mm:ss past it.
+assert.strictEqual(L.obsElapsed(0), "00:00");
+assert.strictEqual(L.obsElapsed(61000), "01:01");
+assert.strictEqual(L.obsElapsed(3599999), "59:59");
+assert.strictEqual(L.obsElapsed(3661000), "1:01:01");
+assert.strictEqual(L.obsElapsed(undefined), "00:00");
+
console.log("ok");