Skip to content

Commit e1beda4

Browse files
Enable time query param in embed URL (#858)
* Add checkUrlTimeParam method to embed setup * Check that 'matches' array is valid before reading from it * Refactor * Revert "Refactor" This reverts commit 0986559. Co-authored-by: Rowan Krishnan <[email protected]>
1 parent ccc4d67 commit e1beda4

File tree

7 files changed

+189
-4
lines changed

7 files changed

+189
-4
lines changed

dist/player.es.js

+61
Original file line numberDiff line numberDiff line change
@@ -1070,6 +1070,66 @@ function initAppendVideoMetadata() {
10701070

10711071
window.addEventListener('message', onMessage);
10721072
}
1073+
/**
1074+
* Seek to time indicated by vimeo_t query parameter if present in URL
1075+
*
1076+
* @param {HTMLElement} [parent=document] The parent element.
1077+
* @return {void}
1078+
*/
1079+
1080+
function checkUrlTimeParam() {
1081+
var parent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;
1082+
1083+
// Prevent execution if users include the player.js script multiple times.
1084+
if (window.VimeoCheckedUrlTimeParam) {
1085+
return;
1086+
}
1087+
1088+
window.VimeoCheckedUrlTimeParam = true;
1089+
1090+
var handleError = function handleError(error) {
1091+
if ('console' in window && console.error) {
1092+
console.error("There was an error getting video Id: ".concat(error));
1093+
}
1094+
};
1095+
1096+
var onMessage = function onMessage(event) {
1097+
if (!isVimeoUrl(event.origin)) {
1098+
return;
1099+
}
1100+
1101+
var data = parseMessageData(event.data);
1102+
1103+
if (!data || data.event !== 'ready') {
1104+
return;
1105+
}
1106+
1107+
var iframes = parent.querySelectorAll('iframe');
1108+
1109+
for (var i = 0; i < iframes.length; i++) {
1110+
var iframe = iframes[i];
1111+
var isValidMessageSource = iframe.contentWindow === event.source;
1112+
1113+
if (isVimeoEmbed(iframe.src) && isValidMessageSource) {
1114+
(function () {
1115+
var player = new Player(iframe);
1116+
player.getVideoId().then(function (videoId) {
1117+
var matches = new RegExp("[?&]vimeo_t_".concat(videoId, "=([^&#]*)")).exec(window.location.href);
1118+
1119+
if (matches && matches[1]) {
1120+
var sec = decodeURI(matches[1]);
1121+
player.setCurrentTime(sec);
1122+
}
1123+
1124+
return;
1125+
}).catch(handleError);
1126+
})();
1127+
}
1128+
}
1129+
};
1130+
1131+
window.addEventListener('message', onMessage);
1132+
}
10731133

10741134
/* MIT License
10751135
@@ -2570,6 +2630,7 @@ if (!isNode) {
25702630
initializeEmbeds();
25712631
resizeEmbeds();
25722632
initAppendVideoMetadata();
2633+
checkUrlTimeParam();
25732634
}
25742635

25752636
export default Player;

dist/player.js

+61
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/player.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/player.min.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/player.min.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/lib/embed.js

+54
Original file line numberDiff line numberDiff line change
@@ -254,3 +254,57 @@ export function initAppendVideoMetadata(parent = document) {
254254

255255
window.addEventListener('message', onMessage);
256256
}
257+
258+
/**
259+
* Seek to time indicated by vimeo_t query parameter if present in URL
260+
*
261+
* @param {HTMLElement} [parent=document] The parent element.
262+
* @return {void}
263+
*/
264+
export function checkUrlTimeParam(parent = document) {
265+
// Prevent execution if users include the player.js script multiple times.
266+
if (window.VimeoCheckedUrlTimeParam) {
267+
return;
268+
}
269+
window.VimeoCheckedUrlTimeParam = true;
270+
271+
const handleError = (error) => {
272+
if ('console' in window && console.error) {
273+
console.error(`There was an error getting video Id: ${error}`);
274+
}
275+
};
276+
277+
const onMessage = (event) => {
278+
if (!isVimeoUrl(event.origin)) {
279+
return;
280+
}
281+
282+
const data = parseMessageData(event.data);
283+
if (!data || data.event !== 'ready') {
284+
return;
285+
}
286+
287+
const iframes = parent.querySelectorAll('iframe');
288+
for (let i = 0; i < iframes.length; i++) {
289+
const iframe = iframes[i];
290+
const isValidMessageSource = iframe.contentWindow === event.source;
291+
292+
if (isVimeoEmbed(iframe.src) && isValidMessageSource) {
293+
const player = new Player(iframe);
294+
player
295+
.getVideoId()
296+
.then((videoId) => {
297+
const matches = new RegExp(`[?&]vimeo_t_${videoId}=([^&#]*)`).exec(window.location.href);
298+
if (matches && matches[1]) {
299+
const sec = decodeURI(matches[1]);
300+
player.setCurrentTime(sec);
301+
}
302+
return;
303+
})
304+
.catch(handleError);
305+
}
306+
}
307+
};
308+
309+
window.addEventListener('message', onMessage);
310+
}

src/player.js

+10-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,15 @@ import Promise from 'native-promise-only';
55

66
import { storeCallback, getCallbacks, removeCallback, swapCallbacks } from './lib/callbacks';
77
import { getMethodName, isDomElement, isVimeoUrl, getVimeoUrl, isNode } from './lib/functions';
8-
import { getOEmbedParameters, getOEmbedData, createEmbed, initializeEmbeds, resizeEmbeds, initAppendVideoMetadata } from './lib/embed';
8+
import {
9+
getOEmbedParameters,
10+
getOEmbedData,
11+
createEmbed,
12+
initializeEmbeds,
13+
resizeEmbeds,
14+
initAppendVideoMetadata,
15+
checkUrlTimeParam
16+
} from './lib/embed';
917
import { parseMessageData, postMessage, processData } from './lib/postmessage';
1018
import { initializeScreenfull } from './lib/screenfull.js';
1119

@@ -1213,6 +1221,7 @@ if (!isNode) {
12131221
initializeEmbeds();
12141222
resizeEmbeds();
12151223
initAppendVideoMetadata();
1224+
checkUrlTimeParam();
12161225
}
12171226

12181227
export default Player;

0 commit comments

Comments
 (0)