Fix #876: YouTube and Vimeo autoplays on seek

This commit is contained in:
Albin Larsson 2018-05-18 04:42:58 +02:00
parent 333435a9c2
commit f8c89e3e95
2 changed files with 47 additions and 45 deletions

View File

@ -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', () => {

View File

@ -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;