Commit daaf22a9 by Sven Marnach Committed by Sven Marnach

Work around a Youtube API bug that causes Safari to ignore the stored speed setting.

Fixes https://openedx.atlassian.net/browse/TNL-408.

On Safari, the Youtube HTML5 player accepts playback rate changes before the
video is loaded, but doesn't actually play the video at the rate set.  This
patch works around this bug by first setting the playback rate back to 1 and
then to the actually desired speed.
parent 55edd327
...@@ -86,7 +86,7 @@ function (HTML5Video, Resizer) { ...@@ -86,7 +86,7 @@ function (HTML5Video, Resizer) {
// via the 'state' object. Much easier to work this way - you don't // via the 'state' object. Much easier to work this way - you don't
// have to do repeated jQuery element selects. // have to do repeated jQuery element selects.
function _initialize(state) { function _initialize(state) {
var youTubeId, player; var youTubeId, player, userAgent;
// The function is called just once to apply pre-defined configurations // The function is called just once to apply pre-defined configurations
// by student before video starts playing. Waits until the video's // by student before video starts playing. Waits until the video's
...@@ -96,6 +96,16 @@ function (HTML5Video, Resizer) { ...@@ -96,6 +96,16 @@ function (HTML5Video, Resizer) {
$(window).on('unload', state.saveState); $(window).on('unload', state.saveState);
if (!state.isFlashMode() && state.speed != '1.0') { if (!state.isFlashMode() && state.speed != '1.0') {
// Work around a bug in the Youtube API that causes videos to
// play at normal speed rather than at the configured speed in
// Safari. Setting the playback rate to 1.0 *after* playing
// started and then to the actual value tricks the player into
// picking up the speed setting.
if (state.browserIsSafari && state.isYoutubeType()) {
state.videoPlayer.setPlaybackRate(1.0, false);
}
state.videoPlayer.setPlaybackRate(state.speed, true); state.videoPlayer.setPlaybackRate(state.speed, true);
} }
}); });
...@@ -125,19 +135,13 @@ function (HTML5Video, Resizer) { ...@@ -125,19 +135,13 @@ function (HTML5Video, Resizer) {
state.videoPlayer.playerVars.html5 = 1; state.videoPlayer.playerVars.html5 = 1;
} }
// There is a bug which prevents YouTube API to correctly set the speed // Detect the current browser for several browser-specific work-arounds.
// to 1.0 from another speed in Firefox when in HTML5 mode. There is a userAgent = navigator.userAgent.toLowerCase();
// fix which basically reloads the video at speed 1.0 when this change state.browserIsFirefox = userAgent.indexOf('firefox') > -1;
// is requested (instead of simply requesting a speed change to 1.0). state.browserIsChrome = userAgent.indexOf('chrome') > -1;
// This has to be done only when the video is being watched in Firefox. // Chrome includes both "Chrome" and "Safari" in the user agent.
// We need to figure out what browser is currently executing this code. state.browserIsSafari = (userAgent.indexOf('safari') > -1 &&
// !state.browserIsChrome);
// TODO: Check the status of
// http://code.google.com/p/gdata-issues/issues/detail?id=4654
// When the YouTube team fixes the API bug, we can remove this
// temporary bug fix.
state.browserIsFirefox = navigator.userAgent
.toLowerCase().indexOf('firefox') > -1;
if (state.videoType === 'html5') { if (state.videoType === 'html5') {
state.videoPlayer.player = new HTML5Video.Player(state.el, { state.videoPlayer.player = new HTML5Video.Player(state.el, {
...@@ -356,6 +360,18 @@ function (HTML5Video, Resizer) { ...@@ -356,6 +360,18 @@ function (HTML5Video, Resizer) {
time = this.videoPlayer.currentTime, time = this.videoPlayer.currentTime,
methodName, youtubeId; methodName, youtubeId;
// There is a bug which prevents YouTube API to correctly set the speed
// to 1.0 from another speed in Firefox when in HTML5 mode. There is a
// fix which basically reloads the video at speed 1.0 when this change
// is requested (instead of simply requesting a speed change to 1.0).
// This has to be done only when the video is being watched in Firefox.
// We need to figure out what browser is currently executing this code.
//
// TODO: Check the status of
// http://code.google.com/p/gdata-issues/issues/detail?id=4654
// When the YouTube team fixes the API bug, we can remove this
// temporary bug fix.
// If useCueVideoById is true it will reload video again. // If useCueVideoById is true it will reload video again.
// Used useCueVideoById to fix the issue video not playing if we change // Used useCueVideoById to fix the issue video not playing if we change
// the speed before playing the video. // the speed before playing the video.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment