Skip to content

Commit 1709f70

Browse files
committed
Viewer: Disable video looping when seeking manually #1307 #4982
Signed-off-by: Michael Mayer <michael@photoprism.app>
1 parent 4475a8d commit 1709f70

3 files changed

Lines changed: 29 additions & 9 deletions

File tree

frontend/src/common/util.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ export default class $util {
202202
}
203203

204204
static formatNs(d) {
205-
if (!d || typeof d !== "number") {
205+
if (!d || Number.isNaN(d)) {
206206
return "";
207207
}
208208

frontend/src/component/lightbox.vue

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1878,7 +1878,7 @@ export default {
18781878
},
18791879
// Jumps to the specified time index when a video is loaded and seekable.
18801880
seekVideo(seekTo) {
1881-
if (typeof seekTo !== "number") {
1881+
if (Number.isNaN(seekTo)) {
18821882
return false;
18831883
}
18841884
@@ -1891,19 +1891,39 @@ export default {
18911891
return;
18921892
}
18931893
1894-
if (seekTo > video.duration) {
1895-
video.currentTime = video.duration;
1896-
} else if (seekTo <= 0) {
1897-
video.currentTime = 0;
1894+
// If possible, use the fastSeek() method to quickly jump to the new time index:
1895+
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/fastSeek
1896+
if (typeof video.fastSeek === "function") {
1897+
if (seekTo >= video.duration - 0.01) {
1898+
video.loop = false;
1899+
video.fastSeek(video.duration);
1900+
this.pauseVideo(video);
1901+
} else if (seekTo <= 0) {
1902+
video.loop = false;
1903+
video.fastSeek(0);
1904+
this.pauseVideo(video);
1905+
} else {
1906+
video.fastSeek(seekTo);
1907+
}
18981908
} else {
1899-
video.currentTime = seekTo;
1909+
if (seekTo >= video.duration - 0.01) {
1910+
video.loop = false;
1911+
video.currentTime = video.duration;
1912+
this.pauseVideo(video);
1913+
} else if (seekTo <= 0) {
1914+
video.loop = false;
1915+
video.currentTime = 0;
1916+
this.pauseVideo(video);
1917+
} else {
1918+
video.currentTime = seekTo;
1919+
}
19001920
}
19011921
19021922
return true;
19031923
},
19041924
// Skips the specified number of seconds when a video is loaded and seekable.
19051925
seekVideoSeconds(seconds) {
1906-
if (!seconds || typeof seconds !== "number") {
1926+
if (!seconds || Number.isNaN(seconds)) {
19071927
return false;
19081928
} else if (!this.video.playing) {
19091929
return false;

frontend/src/component/loading-bar.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ export default {
243243
increase(amount) {
244244
let o = this.progress;
245245
246-
if (o < 100 && typeof amount !== "number") {
246+
if (o < 100 && Number.isNaN(amount)) {
247247
if (o >= 0 && o < 25) {
248248
amount = Math.random() * 3 + 3;
249249
} else if (o >= 25 && o < 50) {

0 commit comments

Comments
 (0)