|
|
|
/*! npm.im/iphone-inline-video */
|
|
|
|
var makeVideoPlayableInline = (function () {
|
|
|
|
"use strict"; /*! npm.im/intervalometer */
|
|
|
|
function e(e, n, r, i) {
|
|
|
|
function t(r) {
|
|
|
|
(d = n(t, i)), e(r - (a || r)), (a = r);
|
|
|
|
}
|
|
|
|
var d, a;
|
|
|
|
return {
|
|
|
|
start: function () {
|
|
|
|
d || t(0);
|
|
|
|
},
|
|
|
|
stop: function () {
|
|
|
|
r(d), (d = null), (a = 0);
|
|
|
|
},
|
|
|
|
};
|
|
|
|
}
|
|
|
|
function n(n) {
|
|
|
|
return e(n, requestAnimationFrame, cancelAnimationFrame);
|
|
|
|
}
|
|
|
|
function r(e, n, r, i) {
|
|
|
|
function t(n) {
|
|
|
|
Boolean(e[r]) === Boolean(i) && n.stopImmediatePropagation(), delete e[r];
|
|
|
|
}
|
|
|
|
return e.addEventListener(n, t, !1), t;
|
|
|
|
}
|
|
|
|
function i(e, n, r, i) {
|
|
|
|
function t() {
|
|
|
|
return r[n];
|
|
|
|
}
|
|
|
|
function d(e) {
|
|
|
|
r[n] = e;
|
|
|
|
}
|
|
|
|
i && d(e[n]), Object.defineProperty(e, n, { get: t, set: d });
|
|
|
|
}
|
|
|
|
function t(e, n, r) {
|
|
|
|
r.addEventListener(n, function () {
|
|
|
|
return e.dispatchEvent(new Event(n));
|
|
|
|
});
|
|
|
|
}
|
|
|
|
function d(e, n) {
|
|
|
|
Promise.resolve().then(function () {
|
|
|
|
e.dispatchEvent(new Event(n));
|
|
|
|
});
|
|
|
|
}
|
|
|
|
function a(e) {
|
|
|
|
var n = new Audio();
|
|
|
|
return (
|
|
|
|
t(e, "play", n),
|
|
|
|
t(e, "playing", n),
|
|
|
|
t(e, "pause", n),
|
|
|
|
(n.crossOrigin = e.crossOrigin),
|
|
|
|
(n.src = e.src || e.currentSrc || "data:"),
|
|
|
|
n
|
|
|
|
);
|
|
|
|
}
|
|
|
|
function o(e, n, r) {
|
|
|
|
(m || 0) + 200 < Date.now() && ((e[g] = !0), (m = Date.now())),
|
|
|
|
r || (e.currentTime = n),
|
|
|
|
(A[++k % 3] = (100 * n) | 0);
|
|
|
|
}
|
|
|
|
function u(e) {
|
|
|
|
return e.driver.currentTime >= e.video.duration;
|
|
|
|
}
|
|
|
|
function s(e) {
|
|
|
|
var n = this;
|
|
|
|
n.video.readyState >= n.video.HAVE_FUTURE_DATA
|
|
|
|
? (n.hasAudio ||
|
|
|
|
((n.driver.currentTime = n.video.currentTime + (e * n.video.playbackRate) / 1e3),
|
|
|
|
n.video.loop && u(n) && (n.driver.currentTime = 0)),
|
|
|
|
o(n.video, n.driver.currentTime))
|
|
|
|
: n.video.networkState !== n.video.NETWORK_IDLE || n.video.buffered.length || n.video.load(),
|
|
|
|
n.video.ended && (delete n.video[g], n.video.pause(!0));
|
|
|
|
}
|
|
|
|
function c() {
|
|
|
|
var e = this,
|
|
|
|
n = e[b];
|
|
|
|
return e.webkitDisplayingFullscreen
|
|
|
|
? void e[E]()
|
|
|
|
: ("data:" !== n.driver.src && n.driver.src !== e.src && (o(e, 0, !0), (n.driver.src = e.src)),
|
|
|
|
void (
|
|
|
|
e.paused &&
|
|
|
|
((n.paused = !1),
|
|
|
|
e.buffered.length || e.load(),
|
|
|
|
n.driver.play(),
|
|
|
|
n.updater.start(),
|
|
|
|
n.hasAudio || (d(e, "play"), n.video.readyState >= n.video.HAVE_ENOUGH_DATA && d(e, "playing")))
|
|
|
|
));
|
|
|
|
}
|
|
|
|
function v(e) {
|
|
|
|
var n = this,
|
|
|
|
r = n[b];
|
|
|
|
r.driver.pause(),
|
|
|
|
r.updater.stop(),
|
|
|
|
n.webkitDisplayingFullscreen && n[T](),
|
|
|
|
(r.paused && !e) || ((r.paused = !0), r.hasAudio || d(n, "pause"), n.ended && ((n[g] = !0), d(n, "ended")));
|
|
|
|
}
|
|
|
|
function p(e, r) {
|
|
|
|
var i = (e[b] = {});
|
|
|
|
(i.paused = !0),
|
|
|
|
(i.hasAudio = r),
|
|
|
|
(i.video = e),
|
|
|
|
(i.updater = n(s.bind(i))),
|
|
|
|
r
|
|
|
|
? (i.driver = a(e))
|
|
|
|
: (e.addEventListener("canplay", function () {
|
|
|
|
e.paused || d(e, "playing");
|
|
|
|
}),
|
|
|
|
(i.driver = {
|
|
|
|
src: e.src || e.currentSrc || "data:",
|
|
|
|
muted: !0,
|
|
|
|
paused: !0,
|
|
|
|
pause: function () {
|
|
|
|
i.driver.paused = !0;
|
|
|
|
},
|
|
|
|
play: function () {
|
|
|
|
(i.driver.paused = !1), u(i) && o(e, 0);
|
|
|
|
},
|
|
|
|
get ended() {
|
|
|
|
return u(i);
|
|
|
|
},
|
|
|
|
})),
|
|
|
|
e.addEventListener(
|
|
|
|
"emptied",
|
|
|
|
function () {
|
|
|
|
var n = !i.driver.src || "data:" === i.driver.src;
|
|
|
|
i.driver.src &&
|
|
|
|
i.driver.src !== e.src &&
|
|
|
|
(o(e, 0, !0), (i.driver.src = e.src), n ? i.driver.play() : i.updater.stop());
|
|
|
|
},
|
|
|
|
!1
|
|
|
|
),
|
|
|
|
e.addEventListener("webkitbeginfullscreen", function () {
|
|
|
|
e.paused ? r && !i.driver.buffered.length && i.driver.load() : (e.pause(), e[E]());
|
|
|
|
}),
|
|
|
|
r &&
|
|
|
|
(e.addEventListener("webkitendfullscreen", function () {
|
|
|
|
i.driver.currentTime = e.currentTime;
|
|
|
|
}),
|
|
|
|
e.addEventListener("seeking", function () {
|
|
|
|
A.indexOf((100 * e.currentTime) | 0) < 0 && (i.driver.currentTime = e.currentTime);
|
|
|
|
}));
|
|
|
|
}
|
|
|
|
function l(e) {
|
|
|
|
var n = e[b];
|
|
|
|
(e[E] = e.play),
|
|
|
|
(e[T] = e.pause),
|
|
|
|
(e.play = c),
|
|
|
|
(e.pause = v),
|
|
|
|
i(e, "paused", n.driver),
|
|
|
|
i(e, "muted", n.driver, !0),
|
|
|
|
i(e, "playbackRate", n.driver, !0),
|
|
|
|
i(e, "ended", n.driver),
|
|
|
|
i(e, "loop", n.driver, !0),
|
|
|
|
r(e, "seeking"),
|
|
|
|
r(e, "seeked"),
|
|
|
|
r(e, "timeupdate", g, !1),
|
|
|
|
r(e, "ended", g, !1);
|
|
|
|
}
|
|
|
|
function f(e, n, r) {
|
|
|
|
void 0 === n && (n = !0),
|
|
|
|
void 0 === r && (r = !0),
|
|
|
|
(r && !h) ||
|
|
|
|
e[b] ||
|
|
|
|
(p(e, n),
|
|
|
|
l(e),
|
|
|
|
e.classList.add("IIV"),
|
|
|
|
!n && e.autoplay && e.play(),
|
|
|
|
/iPhone|iPod|iPad/.test(navigator.platform) ||
|
|
|
|
console.warn("iphone-inline-video is not guaranteed to work in emulated environments"));
|
|
|
|
}
|
|
|
|
var m,
|
|
|
|
y =
|
|
|
|
"undefined" == typeof Symbol
|
|
|
|
? function (e) {
|
|
|
|
return "@" + (e || "@") + Math.random();
|
|
|
|
}
|
|
|
|
: Symbol,
|
|
|
|
h =
|
|
|
|
"object-fit" in document.head.style &&
|
|
|
|
/iPhone|iPod/i.test(navigator.userAgent) &&
|
|
|
|
!matchMedia("(-webkit-video-playable-inline)").matches,
|
|
|
|
b = y(),
|
|
|
|
g = y(),
|
|
|
|
E = y("nativeplay"),
|
|
|
|
T = y("nativepause"),
|
|
|
|
A = [],
|
|
|
|
k = 0;
|
|
|
|
return (f.isWhitelisted = h), f;
|
|
|
|
})();
|