Fix #876: YouTube and Vimeo autoplays on seek
This commit is contained in:
parent
333435a9c2
commit
f8c89e3e95
@ -149,25 +149,26 @@ const vimeo = {
|
|||||||
return currentTime;
|
return currentTime;
|
||||||
},
|
},
|
||||||
set(time) {
|
set(time) {
|
||||||
// Get current paused state
|
// Vimeo will automatically play on seek if the video hasn't been played before
|
||||||
// Vimeo will automatically play on seek
|
|
||||||
const { paused } = player.media;
|
|
||||||
|
|
||||||
// Set seeking flag
|
// Get current paused state and volume etc
|
||||||
player.media.seeking = true;
|
const { embed, media, paused, volume } = player;
|
||||||
|
|
||||||
// Trigger seeking
|
// Set seeking state and trigger event
|
||||||
utils.dispatchEvent.call(player, player.media, 'seeking');
|
media.seeking = true;
|
||||||
|
utils.dispatchEvent.call(player, media, 'seeking');
|
||||||
|
|
||||||
// Seek after events
|
// If paused, mute until seek is complete
|
||||||
player.embed.setCurrentTime(time).catch(() => {
|
Promise.resolve(paused && embed.setVolume(0))
|
||||||
// Do nothing
|
// Seek
|
||||||
});
|
.then(() => embed.setCurrentTime(time))
|
||||||
|
// Restore paused
|
||||||
// Restore pause state
|
.then(() => paused && embed.pause())
|
||||||
if (paused) {
|
// Restore volume
|
||||||
player.pause();
|
.then(() => paused && embed.setVolume(volume))
|
||||||
}
|
.catch(() => {
|
||||||
|
// Do nothing
|
||||||
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -357,7 +358,6 @@ const vimeo = {
|
|||||||
player.embed.on('seeked', () => {
|
player.embed.on('seeked', () => {
|
||||||
player.media.seeking = false;
|
player.media.seeking = false;
|
||||||
utils.dispatchEvent.call(player, player.media, 'seeked');
|
utils.dispatchEvent.call(player, player.media, 'seeked');
|
||||||
utils.dispatchEvent.call(player, player.media, 'play');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
player.embed.on('ended', () => {
|
player.embed.on('ended', () => {
|
||||||
|
@ -295,22 +295,17 @@ const youtube = {
|
|||||||
return Number(instance.getCurrentTime());
|
return Number(instance.getCurrentTime());
|
||||||
},
|
},
|
||||||
set(time) {
|
set(time) {
|
||||||
// Vimeo will automatically play on seek
|
// If paused, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).
|
||||||
const { paused } = player.media;
|
if (player.paused) {
|
||||||
|
player.embed.mute();
|
||||||
|
}
|
||||||
|
|
||||||
// Set seeking flag
|
// Set seeking state and trigger event
|
||||||
player.media.seeking = true;
|
player.media.seeking = true;
|
||||||
|
|
||||||
// Trigger seeking
|
|
||||||
utils.dispatchEvent.call(player, player.media, 'seeking');
|
utils.dispatchEvent.call(player, player.media, 'seeking');
|
||||||
|
|
||||||
// Seek after events sent
|
// Seek after events sent
|
||||||
instance.seekTo(time);
|
instance.seekTo(time);
|
||||||
|
|
||||||
// Restore pause state
|
|
||||||
if (paused) {
|
|
||||||
player.pause();
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -448,7 +443,6 @@ const youtube = {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 0:
|
case 0:
|
||||||
// Assure state and event
|
|
||||||
assurePlaybackState.call(player, false);
|
assurePlaybackState.call(player, false);
|
||||||
|
|
||||||
// YouTube doesn't support loop for a single video, so mimick it.
|
// YouTube doesn't support loop for a single video, so mimick it.
|
||||||
@ -465,34 +459,42 @@ const youtube = {
|
|||||||
case 1:
|
case 1:
|
||||||
// If we were seeking, fire seeked event
|
// If we were seeking, fire seeked event
|
||||||
if (player.media.seeking) {
|
if (player.media.seeking) {
|
||||||
utils.dispatchEvent.call(player, player.media, 'seeked');
|
|
||||||
player.media.seeking = false;
|
player.media.seeking = false;
|
||||||
|
utils.dispatchEvent.call(player, player.media, 'seeked');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assure state and event (must be done after seeked event)
|
// Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)
|
||||||
assurePlaybackState.call(player, true);
|
if (player.media.paused) {
|
||||||
|
player.media.pause();
|
||||||
|
} else {
|
||||||
|
assurePlaybackState.call(player, true);
|
||||||
|
|
||||||
utils.dispatchEvent.call(player, player.media, 'playing');
|
utils.dispatchEvent.call(player, player.media, 'playing');
|
||||||
|
|
||||||
// Poll to get playback progress
|
// Poll to get playback progress
|
||||||
player.timers.playing = setInterval(() => {
|
player.timers.playing = setInterval(() => {
|
||||||
utils.dispatchEvent.call(player, player.media, 'timeupdate');
|
utils.dispatchEvent.call(player, player.media, 'timeupdate');
|
||||||
}, 50);
|
}, 50);
|
||||||
|
|
||||||
// Check duration again due to YouTube bug
|
// Check duration again due to YouTube bug
|
||||||
// https://github.com/sampotts/plyr/issues/374
|
// https://github.com/sampotts/plyr/issues/374
|
||||||
// https://code.google.com/p/gdata-issues/issues/detail?id=8690
|
// https://code.google.com/p/gdata-issues/issues/detail?id=8690
|
||||||
if (player.media.duration !== instance.getDuration()) {
|
if (player.media.duration !== instance.getDuration()) {
|
||||||
player.media.duration = instance.getDuration();
|
player.media.duration = instance.getDuration();
|
||||||
utils.dispatchEvent.call(player, player.media, 'durationchange');
|
utils.dispatchEvent.call(player, player.media, 'durationchange');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get quality
|
||||||
|
controls.setQualityMenu.call(player, mapQualityUnits(instance.getAvailableQualityLevels()));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get quality
|
|
||||||
controls.setQualityMenu.call(player, mapQualityUnits(instance.getAvailableQualityLevels()));
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
|
// Restore audio (YouTube starts playing on seek if the video hasn't been played yet)
|
||||||
|
if (!player.muted) {
|
||||||
|
player.embed.unMute();
|
||||||
|
}
|
||||||
assurePlaybackState.call(player, false);
|
assurePlaybackState.call(player, false);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user