Skip to content

Commit dbb8c52

Browse files
committed
fix: Added seeking state to player UI
1 parent c79cfba commit dbb8c52

File tree

3 files changed

+60
-8
lines changed

3 files changed

+60
-8
lines changed

packages/app/src/components/PlayerControls.tsx

Lines changed: 51 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import { Button } from "@nextui-org/react";
2+
import { Events } from "@superstreamer/player";
23
import cn from "clsx";
3-
import { useRef } from "react";
4+
import { useEffect, useRef, useState } from "react";
45
import { Selection } from "./Selection";
5-
import { usePlayerSelector } from "../context/PlayerContext";
6+
import { usePlayer, usePlayerSelector } from "../context/PlayerContext";
67
import { useSeekbar } from "../hooks/useSeekbar";
78
import type { ReactNode, RefObject } from "react";
89

@@ -35,22 +36,45 @@ function PlayButton() {
3536
}
3637

3738
function Seekbar() {
39+
const { player } = usePlayer();
3840
const seekableStart = usePlayerSelector((player) => player.seekableStart);
3941
const time = usePlayerSelector((player) => player.time);
4042
const duration = usePlayerSelector((player) => player.duration);
4143
const seekTo = usePlayerSelector((player) => player.seekTo);
4244

45+
const [lastSeekTime, setLastSeekTime] = useState<number | null>(null);
46+
4347
const seekbar = useSeekbar({
4448
min: seekableStart,
4549
max: duration,
46-
onSeeked: seekTo,
50+
onSeeked: (time) => {
51+
if (seekTo(time)) {
52+
setLastSeekTime(time);
53+
}
54+
},
4755
});
4856

49-
let percentage = Number.isNaN(duration)
50-
? 0
51-
: (time - seekableStart) / (duration - seekableStart);
52-
if (percentage < 0) {
53-
percentage = 0;
57+
useEffect(() => {
58+
if (!player) {
59+
return;
60+
}
61+
62+
const onSeekingChange = () => {
63+
if (!player.seeking) {
64+
setLastSeekTime(null);
65+
}
66+
};
67+
68+
player.on(Events.SEEKING_CHANGE, onSeekingChange);
69+
return () => {
70+
player.off(Events.SEEKING_CHANGE, onSeekingChange);
71+
};
72+
}, [player]);
73+
74+
const fakeTime = lastSeekTime ?? time;
75+
let percentage = getPercentage(fakeTime, duration, seekableStart);
76+
if (seekbar.seeking) {
77+
percentage = seekbar.x;
5478
}
5579

5680
return (
@@ -209,3 +233,22 @@ function hms(seconds: number) {
209233
"00:00:00"
210234
);
211235
}
236+
237+
function getPercentage(time: number, duration: number, seekableStart: number) {
238+
if (Number.isNaN(duration)) {
239+
return 0;
240+
}
241+
242+
let timeRel = time - seekableStart;
243+
const durationRel = duration - seekableStart;
244+
245+
if (timeRel < 0) {
246+
timeRel = 0;
247+
} else if (timeRel > durationRel) {
248+
timeRel = durationRel;
249+
}
250+
251+
const percentage = timeRel / durationRel;
252+
253+
return percentage;
254+
}

packages/player/src/hls-player.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,17 @@ export class HlsPlayer {
100100
seekTo(time: number) {
101101
assert(this.hls_);
102102

103+
if (this.state_?.interstitial) {
104+
return false;
105+
}
106+
103107
if (this.hls_.interstitialsManager) {
104108
this.hls_.interstitialsManager.primary.seekTo(time);
105109
} else {
106110
this.media_.currentTime = time;
107111
}
112+
113+
return true;
108114
}
109115

110116
setQuality(height: number | null) {

packages/player/src/state.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ export class State implements StateProperties {
9494

9595
setInterstitial(interstitial: Interstitial | null) {
9696
this.interstitial = interstitial;
97+
this.setSeeking(false);
9798
this.params_.onEvent(Events.INTERSTITIAL_CHANGE);
9899
}
99100

@@ -163,11 +164,13 @@ export class State implements StateProperties {
163164
return;
164165
}
165166
this.seeking = seeking;
167+
this.requestTimingSync();
166168
this.params_.onEvent(Events.SEEKING_CHANGE);
167169
}
168170

169171
setCuePoints(cuePoints: number[]) {
170172
this.cuePoints = cuePoints;
173+
this.requestTimingSync();
171174
this.params_.onEvent(Events.CUEPOINTS_CHANGE);
172175
}
173176

0 commit comments

Comments
 (0)