summaryrefslogtreecommitdiff
path: root/web/js/player.js
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-06 08:04:06 +0300
committerPaul Buetow <paul@buetow.org>2026-05-06 08:04:06 +0300
commit885dd0912dd0e4f9df86b6676a6c467bdb367660 (patch)
treecd77d4baf36c5817c7c3b29ace6e7ab6f5c04073 /web/js/player.js
parent532747899cb6db7e5208a454779c37092c8c6451 (diff)
Fix music video duration display in progress bar
Diffstat (limited to 'web/js/player.js')
-rw-r--r--web/js/player.js41
1 files changed, 26 insertions, 15 deletions
diff --git a/web/js/player.js b/web/js/player.js
index fea4a19..e179856 100644
--- a/web/js/player.js
+++ b/web/js/player.js
@@ -23,6 +23,20 @@ let slideshowTimer = null;
let slideshowPausedUntil = 0;
let cropMode = false;
+function currentMediaElement() {
+ const e = els();
+ if (currentMedia?.type === 'audio') return e.audio;
+ if (currentMedia?.type === 'video') return e.video;
+ return null;
+}
+
+function effectiveDuration() {
+ const m = currentMediaElement();
+ if (!m) return 0;
+ if (isFinite(m.duration) && m.duration > 0) return m.duration;
+ return currentMedia?.duration || 0;
+}
+
const els = () => ({
video: document.getElementById('media-video'),
audio: document.getElementById('media-audio'),
@@ -36,7 +50,7 @@ const els = () => ({
btnSlideshow: document.getElementById('btn-slideshow'),
btnMute: document.getElementById('btn-mute'),
btnFs: document.getElementById('btn-fullscreen'),
- btnMinimize: document.getElementById('btn-minimize'),
+ btnMinimize: document.getElementById('btn-minimize-player'),
btnRestore: document.getElementById('btn-restore-player'),
restoreTitle: document.getElementById('player-restore-title'),
bigPlay: document.getElementById('big-play'),
@@ -110,15 +124,17 @@ export function initPlayer(options = {}) {
[e.video, e.audio].forEach((m) => {
m.addEventListener('timeupdate', () => {
- if (!m.duration || isNaN(m.duration)) return;
- const pct = (m.currentTime / m.duration) * 100;
+ const dur = effectiveDuration();
+ if (!dur) return;
+ const pct = (m.currentTime / dur) * 100;
e.fill.style.width = pct.toFixed(2) + '%';
e.thumb.style.left = pct.toFixed(2) + '%';
e.timeElapsed.textContent = fmt(m.currentTime);
updateBufferedRanges(m);
});
m.addEventListener('loadedmetadata', () => {
- e.timeTotal.textContent = fmt(isFinite(m.duration) ? m.duration : 0);
+ const dur = effectiveDuration();
+ e.timeTotal.textContent = fmt(dur);
updateBufferedRanges(m);
});
['progress', 'durationchange', 'loadeddata', 'canplay', 'seeked'].forEach((event) => {
@@ -166,8 +182,9 @@ export function initPlayer(options = {}) {
let seeking = false;
const seekToFraction = (frac) => {
const m = currentMediaElement();
- if (!m || !m.duration) return;
- m.currentTime = Math.max(0, Math.min(1, frac)) * m.duration;
+ const dur = effectiveDuration();
+ if (!m || !dur) return;
+ m.currentTime = Math.max(0, Math.min(1, frac)) * dur;
};
const handlePointer = (ev) => {
const r = e.track.getBoundingClientRect();
@@ -188,9 +205,10 @@ export function initPlayer(options = {}) {
e.track?.addEventListener('touchend', () => { seeking = false; });
e.track?.addEventListener('keydown', (ev) => {
const m = currentMediaElement();
- if (!m || !m.duration) return;
+ const dur = effectiveDuration();
+ if (!m || !dur) return;
if (ev.key === 'ArrowLeft') { ev.preventDefault(); m.currentTime = Math.max(0, m.currentTime - 5); }
- if (ev.key === 'ArrowRight') { ev.preventDefault(); m.currentTime = Math.min(m.duration, m.currentTime + 5); }
+ if (ev.key === 'ArrowRight') { ev.preventDefault(); m.currentTime = Math.min(dur, m.currentTime + 5); }
});
}
@@ -454,13 +472,6 @@ function loadMedia(media, resumeFrom = 0) {
updateFloatingSize();
}
-function currentMediaElement() {
- const e = els();
- if (currentMedia?.type === 'audio') return e.audio;
- if (currentMedia?.type === 'video') return e.video;
- return null;
-}
-
function seekWhenMetadataReady(m, seconds) {
const target = Number(seconds || 0);
if (!m || !isFinite(target) || target <= 0) return;