Skip to content

Commit fba30c9

Browse files
committed
fix(player): vimeo not firing ended event
closes #1103
1 parent f4954d9 commit fba30c9

2 files changed

Lines changed: 17 additions & 4 deletions

File tree

packages/vidstack/src/providers/vimeo/provider.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,8 +291,13 @@ export class VimeoProvider
291291
this._remote('getCurrentTime');
292292
}
293293

294+
// Embed will sometimes dispatch 0 at end of playback.
295+
private _skipTimeUpdates = false;
296+
294297
protected _onTimeUpdate(time: number, trigger: Event) {
295-
const { realCurrentTime, paused, bufferedEnd } = this._ctx.$state;
298+
if (this._skipTimeUpdates && time === 0) return;
299+
300+
const { realCurrentTime, realDuration, paused, bufferedEnd } = this._ctx.$state;
296301

297302
if (realCurrentTime() === time) return;
298303

@@ -312,6 +317,14 @@ export class VimeoProvider
312317
this._notify('waiting', undefined, trigger);
313318
}
314319
}
320+
321+
if (realDuration() - time < 0.01) {
322+
this._notify('end', undefined, trigger);
323+
this._skipTimeUpdates = true;
324+
setTimeout(() => {
325+
this._skipTimeUpdates = false;
326+
}, 500);
327+
}
315328
}
316329

317330
protected _getPlayedRange(time: number) {

packages/vidstack/src/providers/youtube/provider.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -339,13 +339,13 @@ export class YouTubeProvider
339339
protected override _onMessage({ info }: YouTubeMessage, event: MessageEvent) {
340340
if (!info) return;
341341

342-
const { title, realDuration, playbackRate } = this._ctx.$state;
342+
const { title, intrinsicDuration, playbackRate } = this._ctx.$state;
343343

344344
if (isObject(info.videoData) && info.videoData.title !== title()) {
345345
this._notify('title-change', info.videoData.title, event);
346346
}
347347

348-
if (isNumber(info.duration) && info.duration !== realDuration()) {
348+
if (isNumber(info.duration) && info.duration !== intrinsicDuration()) {
349349
if (isNumber(info.videoLoadedFraction)) {
350350
const buffered = info.progressState?.loaded ?? info.videoLoadedFraction * info.duration,
351351
seekable = new TimeRange(0, info.duration);
@@ -369,7 +369,7 @@ export class YouTubeProvider
369369
} = info.progressState;
370370
this._onTimeUpdate(current, event);
371371
this._onProgress(loaded, new TimeRange(seekableStart, seekableEnd), event);
372-
if (_duration !== duration()) {
372+
if (_duration !== intrinsicDuration()) {
373373
this._notify('duration-change', _duration, event);
374374
}
375375
}

0 commit comments

Comments
 (0)