plyr.js 50 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336
  1. !
  2. function(e, t) {
  3. "use strict";
  4. "object" == typeof module && "object" == typeof module.exports ? module.exports = t(e, document) : "function" == typeof define && define.amd ? define([], function() {
  5. return t(e, document)
  6. }) : e.plyr = t(e, document)
  7. }("undefined" != typeof window ? window : this, function(e, t) {
  8. "use strict";
  9. function n() {
  10. var e, n, r, a = navigator.userAgent,
  11. s = navigator.appName,
  12. o = "" + parseFloat(navigator.appVersion),
  13. i = parseInt(navigator.appVersion, 10),
  14. l = !1,
  15. u = !1,
  16. c = !1,
  17. d = !1;
  18. return navigator.appVersion.indexOf("Windows NT") !== -1 && navigator.appVersion.indexOf("rv:11") !== -1 ? (l = !0, s = "IE", o = "11") : (n = a.indexOf("MSIE")) !== -1 ? (l = !0, s = "IE", o = a.substring(n + 5)) : (n = a.indexOf("Chrome")) !== -1 ? (c = !0, s = "Chrome", o = a.substring(n + 7)) : (n = a.indexOf("Safari")) !== -1 ? (d = !0, s = "Safari", o = a.substring(n + 7), (n = a.indexOf("Version")) !== -1 && (o = a.substring(n + 8))) : (n = a.indexOf("Firefox")) !== -1 ? (u = !0, s = "Firefox", o = a.substring(n + 8)) : (e = a.lastIndexOf(" ") + 1) < (n = a.lastIndexOf("/")) && (s = a.substring(e, n), o = a.substring(n + 1), s.toLowerCase() === s.toUpperCase() && (s = navigator.appName)), (r = o.indexOf(";")) !== -1 && (o = o.substring(0, r)), (r = o.indexOf(" ")) !== -1 && (o = o.substring(0, r)), i = parseInt("" + o, 10), isNaN(i) && (o = "" + parseFloat(navigator.appVersion), i = parseInt(navigator.appVersion, 10)), {
  19. name: s,
  20. version: i,
  21. isIE: l,
  22. isFirefox: u,
  23. isChrome: c,
  24. isSafari: d,
  25. isIos: /(iPad|iPhone|iPod)/g.test(navigator.platform),
  26. isIphone: /(iPhone|iPod)/g.test(navigator.userAgent),
  27. isTouch: "ontouchstart" in t.documentElement
  28. }
  29. }
  30. function r(e, t) {
  31. var n = e.media;
  32. if ("video" === e.type) switch (t) {
  33. case "video/webm":
  34. return !(!n.canPlayType || !n.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/no/, ""));
  35. case "video/mp4":
  36. return !(!n.canPlayType || !n.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/, ""));
  37. case "video/ogg":
  38. return !(!n.canPlayType || !n.canPlayType('video/ogg; codecs="theora"').replace(/no/, ""))
  39. } else if ("audio" === e.type) switch (t) {
  40. case "audio/mpeg":
  41. return !(!n.canPlayType || !n.canPlayType("audio/mpeg;").replace(/no/, ""));
  42. case "audio/ogg":
  43. return !(!n.canPlayType || !n.canPlayType('audio/ogg; codecs="vorbis"').replace(/no/, ""));
  44. case "audio/wav":
  45. return !(!n.canPlayType || !n.canPlayType('audio/wav; codecs="1"').replace(/no/, ""))
  46. }
  47. return !1
  48. }
  49. function a(e) {
  50. if (!t.querySelectorAll('script[src="' + e + '"]').length) {
  51. var n = t.createElement("script");
  52. n.src = e;
  53. var r = t.getElementsByTagName("script")[0];
  54. r.parentNode.insertBefore(n, r)
  55. }
  56. }
  57. function s(e, t) {
  58. return Array.prototype.indexOf && e.indexOf(t) !== -1
  59. }
  60. function o(e, t, n) {
  61. return e.replace(new RegExp(t.replace(/([.*+?\^=!:${}()|\[\]\/\\])/g, "\\$1"), "g"), n)
  62. }
  63. function i(e, t) {
  64. e.length || (e = [e]);
  65. for (var n = e.length - 1; n >= 0; n--) {
  66. var r = n > 0 ? t.cloneNode(!0) : t,
  67. a = e[n],
  68. s = a.parentNode,
  69. o = a.nextSibling;
  70. return r.appendChild(a), o ? s.insertBefore(r, o) : s.appendChild(r), r
  71. }
  72. }
  73. function l(e) {
  74. e && e.parentNode.removeChild(e)
  75. }
  76. function u(e, t) {
  77. e.insertBefore(t, e.firstChild)
  78. }
  79. function c(e, t) {
  80. for (var n in t) e.setAttribute(n, O.boolean(t[n]) && t[n] ? "" : t[n])
  81. }
  82. function d(e, n, r) {
  83. var a = t.createElement(e);
  84. c(a, r), u(n, a)
  85. }
  86. function p(e) {
  87. return e.replace(".", "")
  88. }
  89. function m(e, t, n) {
  90. if (e) if (e.classList) e.classList[n ? "add" : "remove"](t);
  91. else {
  92. var r = (" " + e.className + " ").replace(/\s+/g, " ").replace(" " + t + " ", "");
  93. e.className = r + (n ? " " + t : "")
  94. }
  95. }
  96. function f(e, t) {
  97. return !!e && (e.classList ? e.classList.contains(t) : new RegExp("(\\s|^)" + t + "(\\s|$)").test(e.className))
  98. }
  99. function y(e, n) {
  100. var r = Element.prototype,
  101. a = r.matches || r.webkitMatchesSelector || r.mozMatchesSelector || r.msMatchesSelector ||
  102. function(e) {
  103. return [].indexOf.call(t.querySelectorAll(e), this) !== -1
  104. };
  105. return a.call(e, n)
  106. }
  107. function b(e, t, n, r, a) {
  108. g(e, t, function(t) {
  109. n && n.apply(e, [t]), r.apply(e, [t])
  110. }, a)
  111. }
  112. function v(e, t, n, r, a) {
  113. var s = t.split(" ");
  114. if (O.boolean(a) || (a = !1), e instanceof NodeList) for (var o = 0; o < e.length; o++) e[o] instanceof Node && v(e[o], arguments[1], arguments[2], arguments[3]);
  115. else for (var i = 0; i < s.length; i++) e[r ? "addEventListener" : "removeEventListener"](s[i], n, a)
  116. }
  117. function g(e, t, n, r) {
  118. e && v(e, t, n, !0, r)
  119. }
  120. function h(e, t, n, r) {
  121. if (e && t) {
  122. O.boolean(n) || (n = !1);
  123. var a = new CustomEvent(t, {
  124. bubbles: n,
  125. detail: r
  126. });
  127. e.dispatchEvent(a)
  128. }
  129. }
  130. function k(e, t) {
  131. if (e) return t = O.boolean(t) ? t : !e.getAttribute("aria-pressed"), e.setAttribute("aria-pressed", t), t
  132. }
  133. function w(e, t) {
  134. return 0 === e || 0 === t || isNaN(e) || isNaN(t) ? 0 : (e / t * 100).toFixed(2)
  135. }
  136. function x() {
  137. var e = arguments;
  138. if (e.length) {
  139. if (1 === e.length) return e[0];
  140. for (var t = Array.prototype.shift.call(e), n = e.length, r = 0; r < n; r++) {
  141. var a = e[r];
  142. for (var s in a) a[s] && a[s].constructor && a[s].constructor === Object ? (t[s] = t[s] || {}, x(t[s], a[s])) : t[s] = a[s]
  143. }
  144. return t
  145. }
  146. }
  147. function T(e) {
  148. var t = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/;
  149. return e.match(t) ? RegExp.$2 : e
  150. }
  151. function S(e) {
  152. var t = /^.*(vimeo.com\/|video\/)(\d+).*/;
  153. return e.match(t) ? RegExp.$2 : e
  154. }
  155. function _() {
  156. var e = {
  157. supportsFullScreen: !1,
  158. isFullScreen: function() {
  159. return !1
  160. },
  161. requestFullScreen: function() {},
  162. cancelFullScreen: function() {},
  163. fullScreenEventName: "",
  164. element: null,
  165. prefix: ""
  166. },
  167. n = "webkit o moz ms khtml".split(" ");
  168. if (O.undefined(t.cancelFullScreen)) for (var r = 0, a = n.length; r < a; r++) {
  169. if (e.prefix = n[r], !O.undefined(t[e.prefix + "CancelFullScreen"])) {
  170. e.supportsFullScreen = !0;
  171. break
  172. }
  173. if (!O.undefined(t.msExitFullscreen) && t.msFullscreenEnabled) {
  174. e.prefix = "ms", e.supportsFullScreen = !0;
  175. break
  176. }
  177. } else e.supportsFullScreen = !0;
  178. return e.supportsFullScreen && (e.fullScreenEventName = "ms" === e.prefix ? "MSFullscreenChange" : e.prefix + "fullscreenchange", e.isFullScreen = function(e) {
  179. switch (O.undefined(e) && (e = t.body), this.prefix) {
  180. case "":
  181. return t.fullscreenElement === e;
  182. case "moz":
  183. return t.mozFullScreenElement === e;
  184. default:
  185. return t[this.prefix + "FullscreenElement"] === e
  186. }
  187. }, e.requestFullScreen = function(e) {
  188. return O.undefined(e) && (e = t.body), "" === this.prefix ? e.requestFullScreen() : e[this.prefix + ("ms" === this.prefix ? "RequestFullscreen" : "RequestFullScreen")]()
  189. }, e.cancelFullScreen = function() {
  190. return "" === this.prefix ? t.cancelFullScreen() : t[this.prefix + ("ms" === this.prefix ? "ExitFullscreen" : "CancelFullScreen")]()
  191. }, e.element = function() {
  192. return "" === this.prefix ? t.fullscreenElement : t[this.prefix + "FullscreenElement"]
  193. }), e
  194. }
  195. function E(v, E) {
  196. function A(e, t, n, r) {
  197. h(e, t, n, x({}, r, {
  198. plyr: Be
  199. }))
  200. }
  201. function j(t, n) {
  202. E.debug && e.console && (n = Array.prototype.slice.call(n), O.string(E.logPrefix) && E.logPrefix.length && n.unshift(E.logPrefix), console[t].apply(console, n))
  203. }
  204. function V() {
  205. return {
  206. url: E.iconUrl,
  207. absolute: 0 === E.iconUrl.indexOf("http") || Ue.browser.isIE
  208. }
  209. }
  210. function R() {
  211. var e = [],
  212. t = V(),
  213. n = (t.absolute ? "" : t.url) + "#" + E.iconPrefix;
  214. return s(E.controls, "play-large") && e.push('<button type="button" data-plyr="play" class="plyr__play-large">', '<svg><use xlink:href="' + n + '-play" /></svg>', '<span class="plyr__sr-only">' + E.i18n.play + "</span>", "</button>"), e.push('<div class="plyr__controls">'),
  215. s(E.controls, "restart") && e.push('<button type="button" data-plyr="restart">', '<svg><use xlink:href="' + n + '-restart" /></svg>', '<span class="plyr__sr-only">' + E.i18n.restart + "</span>", "</button>"),
  216. s(E.controls, "rewind") && e.push('<button type="button" data-plyr="rewind">', '<svg><use xlink:href="' + n + '-rewind" /></svg>', '<span class="plyr__sr-only">' + E.i18n.rewind + "</span>", "</button>"),
  217. s(E.controls, "fast-forward") && e.push('<button type="button" data-plyr="fast-forward">', '<svg><use xlink:href="' + n + '-fast-forward" /></svg>', '<span class="plyr__sr-only">' + E.i18n.forward + "</span>", "</button>"),
  218. s(E.controls, "progress") && (e.push('<span class="plyr__progress">', '<label for="seek{id}" class="plyr__sr-only">Seek</label>', '<progress class="plyr__progress--played" max="100" value="0" role="presentation"></progress>', '<progress class="plyr__progress--buffer" max="100" value="0">', "<span>0</span>% " + E.i18n.buffered, "</progress>"), e.push("</span>")),
  219. s(E.controls, "duration") && e.push('<span class="plyr__time">', '<span class="plyr__sr-only">' + E.i18n.duration + "</span>", '<span class="plyr__time--duration">00:00</span>', "</span>"),
  220. s(E.controls, "captions") && e.push('<button type="button" data-plyr="captions">', '<svg class="icon--captions-on"><use xlink:href="' + n + '-captions-on" /></svg>', '<svg><use xlink:href="' + n + '-captions-off" /></svg>', '<span class="plyr__sr-only">' + E.i18n.toggleCaptions + "</span>", "</button>"),
  221. e.push("</div>"), e.join("")
  222. }
  223. function q() {
  224. if (Ue.supported.full && ("audio" !== Ue.type || E.fullscreen.allowAudio) && E.fullscreen.enabled) {
  225. var e = N.supportsFullScreen;
  226. e || E.fullscreen.fallback && !X() ? (Je((e ? "Native" : "Fallback") + " fullscreen enabled"), m(Ue.container, E.classes.fullscreen.enabled, !0)) : Je("Fullscreen not supported and fallback disabled"), Ue.buttons && Ue.buttons.fullscreen && k(Ue.buttons.fullscreen, !1), $()
  227. }
  228. }
  229. function D() {
  230. if ("video" === Ue.type) {
  231. U(E.selectors.captions) || Ue.videoContainer.insertAdjacentHTML("afterbegin", '<div class="' + p(E.selectors.captions) + '"></div>'), Ue.usingTextTracks = !1, Ue.media.textTracks && (Ue.usingTextTracks = !0);
  232. for (var e, t = "", n = Ue.media.childNodes, r = 0; r < n.length; r++)"track" === n[r].nodeName.toLowerCase() && (e = n[r].kind, "captions" !== e && "subtitles" !== e || (t = n[r].getAttribute("src")));
  233. if (Ue.captionExists = !0, "" === t ? (Ue.captionExists = !1, Je("No caption track found")) : Je("Caption track found; URI: " + t), Ue.captionExists) {
  234. for (var a = Ue.media.textTracks, s = 0; s < a.length; s++) a[s].mode = "hidden";
  235. if (Y(Ue), (Ue.browser.isIE && Ue.browser.version >= 10 || Ue.browser.isFirefox && Ue.browser.version >= 31) && (Je("Detected browser with known TextTrack issues - using manual fallback"), Ue.usingTextTracks = !1), Ue.usingTextTracks) {
  236. Je("TextTracks supported");
  237. for (var o = 0; o < a.length; o++) {
  238. var i = a[o];
  239. "captions" !== i.kind && "subtitles" !== i.kind || g(i, "cuechange", function() {
  240. this.activeCues[0] && "text" in this.activeCues[0] ? H(this.activeCues[0].getCueAsHTML()) : H()
  241. })
  242. }
  243. } else if (Je("TextTracks not supported so rendering captions manually"), Ue.currentCaption = "", Ue.captions = [], "" !== t) {
  244. var l = new XMLHttpRequest;
  245. l.onreadystatechange = function() {
  246. if (4 === l.readyState) if (200 === l.status) {
  247. var e, t = [],
  248. n = l.responseText,
  249. r = "\r\n";
  250. n.indexOf(r + r) === -1 && (r = n.indexOf("\r\r") !== -1 ? "\r" : "\n"), t = n.split(r + r);
  251. for (var a = 0; a < t.length; a++) {
  252. e = t[a], Ue.captions[a] = [];
  253. var s = e.split(r),
  254. o = 0;
  255. s[o].indexOf(":") === -1 && (o = 1), Ue.captions[a] = [s[o], s[o + 1]]
  256. }
  257. Ue.captions.shift(), Je("Successfully loaded the caption file via AJAX")
  258. } else ze(E.logPrefix + "There was a problem loading the caption file via AJAX")
  259. }, l.open("get", t, !0), l.send()
  260. }
  261. } else m(Ue.container, E.classes.captions.enabled)
  262. }
  263. }
  264. function H(e) {
  265. var n = U(E.selectors.captions),
  266. r = t.createElement("span");
  267. n.innerHTML = "", O.undefined(e) && (e = ""), O.string(e) ? r.innerHTML = e.trim() : r.appendChild(e), n.appendChild(r);
  268. n.offsetHeight
  269. }
  270. function W(e) {
  271. function t(e, t) {
  272. var n = [];
  273. n = e.split(" --> ");
  274. for (var r = 0; r < n.length; r++) n[r] = n[r].replace(/(\d+:\d+:\d+\.\d+).*/, "$1");
  275. return a(n[t])
  276. }
  277. function n(e) {
  278. return t(e, 0)
  279. }
  280. function r(e) {
  281. return t(e, 1)
  282. }
  283. function a(e) {
  284. if (null === e || void 0 === e) return 0;
  285. var t, n = [],
  286. r = [];
  287. return n = e.split(","), r = n[0].split(":"), t = Math.floor(60 * r[0] * 60) + Math.floor(60 * r[1]) + Math.floor(r[2])
  288. }
  289. if (!Ue.usingTextTracks && "video" === Ue.type && Ue.supported.full && (Ue.subcount = 0, e = O.number(e) ? e : Ue.media.currentTime, Ue.captions[Ue.subcount])) {
  290. for (; r(Ue.captions[Ue.subcount][0]) < e.toFixed(1);) if (Ue.subcount++, Ue.subcount > Ue.captions.length - 1) {
  291. Ue.subcount = Ue.captions.length - 1;
  292. break
  293. }
  294. Ue.media.currentTime.toFixed(1) >= n(Ue.captions[Ue.subcount][0]) && Ue.media.currentTime.toFixed(1) <= r(Ue.captions[Ue.subcount][0]) ? (Ue.currentCaption = Ue.captions[Ue.subcount][1], H(Ue.currentCaption)) : H()
  295. }
  296. }
  297. function Y() {
  298. if (Ue.buttons.captions) {
  299. m(Ue.container, E.classes.captions.enabled, !0);
  300. var e = Ue.storage.captionsEnabled;
  301. O.boolean(e) || (e = E.captions.defaultActive), e && (m(Ue.container, E.classes.captions.active, !0), k(Ue.buttons.captions, !0))
  302. }
  303. }
  304. function B(e) {
  305. return Ue.container.querySelectorAll(e)
  306. }
  307. function U(e) {
  308. return B(e)[0]
  309. }
  310. function X() {
  311. try {
  312. return e.self !== e.top
  313. } catch (e) {
  314. return !0
  315. }
  316. }
  317. function $() {
  318. function e(e) {
  319. 9 === e.which && Ue.isFullscreen && (e.target !== r || e.shiftKey ? e.target === n && e.shiftKey && (e.preventDefault(), r.focus()) : (e.preventDefault(), n.focus()))
  320. }
  321. var t = B("input:not([disabled]), button:not([disabled])"),
  322. n = t[0],
  323. r = t[t.length - 1];
  324. g(Ue.container, "keydown", e)
  325. }
  326. function J(e, t) {
  327. if (O.string(t)) d(e, Ue.media, {
  328. src: t
  329. });
  330. else if (t.constructor === Array) for (var n = t.length - 1; n >= 0; n--) d(e, Ue.media, t[n])
  331. }
  332. function z() {
  333. if (E.loadSprite) {
  334. var e = V();
  335. e.absolute ? (Je("AJAX loading absolute SVG sprite" + (Ue.browser.isIE ? " (due to IE)" : "")), C(e.url, "sprite-plyr")) : Je("Sprite will be used as external resource directly")
  336. }
  337. var n = E.html;
  338. Je("Injecting custom controls"), n || (n = R()), n = o(n, "{seektime}", E.seekTime), n = o(n, "{id}", Math.floor(1e4 * Math.random()));
  339. var r;
  340. if (O.string(E.selectors.controls.container) && (r = t.querySelector(E.selectors.controls.container)), O.htmlElement(r) || (r = Ue.container), r.insertAdjacentHTML("beforeend", n), E.tooltips.controls) for (var a = B([E.selectors.controls.wrapper, " ", E.selectors.labels, " .", E.classes.hidden].join("")), s = a.length - 1; s >= 0; s--) {
  341. var i = a[s];
  342. m(i, E.classes.hidden, !1), m(i, E.classes.tooltip, !0)
  343. }
  344. }
  345. function G() {
  346. try {
  347. return Ue.controls = U(E.selectors.controls.wrapper), Ue.buttons = {}, Ue.buttons.seek = U(E.selectors.buttons.seek), Ue.buttons.play = B(E.selectors.buttons.play), Ue.buttons.pause = U(E.selectors.buttons.pause), Ue.buttons.restart = U(E.selectors.buttons.restart), Ue.buttons.rewind = U(E.selectors.buttons.rewind), Ue.buttons.forward = U(E.selectors.buttons.forward), Ue.buttons.fullscreen = U(E.selectors.buttons.fullscreen), Ue.buttons.mute = U(E.selectors.buttons.mute), Ue.buttons.captions = U(E.selectors.buttons.captions), Ue.progress = {}, Ue.progress.container = U(E.selectors.progress.container), Ue.progress.buffer = {}, Ue.progress.buffer.bar = U(E.selectors.progress.buffer), Ue.progress.buffer.text = Ue.progress.buffer.bar && Ue.progress.buffer.bar.getElementsByTagName("span")[0], Ue.progress.played = U(E.selectors.progress.played), Ue.progress.tooltip = Ue.progress.container && Ue.progress.container.querySelector("." + E.classes.tooltip), Ue.volume = {}, Ue.volume.input = U(E.selectors.volume.input), Ue.volume.display = U(E.selectors.volume.display), Ue.duration = U(E.selectors.duration), Ue.currentTime = U(E.selectors.currentTime), Ue.seekTime = B(E.selectors.seekTime), !0
  348. } catch (e) {
  349. return ze("It looks like there is a problem with your controls HTML"), Q(!0), !1
  350. }
  351. }
  352. function K() {
  353. m(Ue.container, E.selectors.container.replace(".", ""), Ue.supported.full)
  354. }
  355. function Q(e) {
  356. e && s(E.types.html5, Ue.type) ? Ue.media.setAttribute("controls", "") : Ue.media.removeAttribute("controls")
  357. }
  358. function Z(e) {
  359. var t = E.i18n.play;
  360. if (O.string(E.title) && E.title.length && (t += ", " + E.title, Ue.container.setAttribute("aria-label", E.title)), Ue.supported.full && Ue.buttons.play) for (var n = Ue.buttons.play.length - 1; n >= 0; n--) Ue.buttons.play[n].setAttribute("aria-label", t);
  361. O.htmlElement(e) && e.setAttribute("title", E.i18n.frameTitle.replace("{title}", E.title))
  362. }
  363. function ee() {
  364. var t = null;
  365. Ue.storage = {}, L.supported && E.storage.enabled && (e.localStorage.removeItem("plyr-volume"), t = e.localStorage.getItem(E.storage.key), t && (/^\d+(\.\d+)?$/.test(t) ? te({
  366. volume: parseFloat(t)
  367. }) : Ue.storage = JSON.parse(t)))
  368. }
  369. function te(t) {
  370. L.supported && E.storage.enabled && (x(Ue.storage, t), e.localStorage.setItem(E.storage.key, JSON.stringify(Ue.storage)))
  371. }
  372. function ne() {
  373. if (!Ue.media) return void ze("No media element found!");
  374. if (Ue.supported.full && (m(Ue.container, E.classes.type.replace("{0}", Ue.type), !0), s(E.types.embed, Ue.type) && m(Ue.container, E.classes.type.replace("{0}", "video"), !0), m(Ue.container, E.classes.stopped, E.autoplay), m(Ue.ontainer, E.classes.isIos, Ue.browser.isIos), m(Ue.container, E.classes.isTouch, Ue.browser.isTouch), "video" === Ue.type)) {
  375. var e = t.createElement("div");
  376. e.setAttribute("class", E.classes.videoWrapper), i(Ue.media, e), Ue.videoContainer = e
  377. }
  378. s(E.types.embed, Ue.type) && re()
  379. }
  380. function re() {
  381. var n, r = t.createElement("div"),
  382. s = Ue.type + "-" + Math.floor(1e4 * Math.random());
  383. switch (Ue.type) {
  384. case "youtube":
  385. n = T(Ue.embedId);
  386. break;
  387. case "vimeo":
  388. n = S(Ue.embedId);
  389. break;
  390. default:
  391. n = Ue.embedId
  392. }
  393. for (var o = B('[id^="' + Ue.type + '-"]'), i = o.length - 1; i >= 0; i--) l(o[i]);
  394. if (m(Ue.media, E.classes.videoWrapper, !0), m(Ue.media, E.classes.embedWrapper, !0), "youtube" === Ue.type) Ue.media.appendChild(r), r.setAttribute("id", s), O.object(e.YT) ? se(n, r) : (a(E.urls.youtube.api), e.onYouTubeReadyCallbacks = e.onYouTubeReadyCallbacks || [], e.onYouTubeReadyCallbacks.push(function() {
  395. se(n, r)
  396. }), e.onYouTubeIframeAPIReady = function() {
  397. e.onYouTubeReadyCallbacks.forEach(function(e) {
  398. e()
  399. })
  400. });
  401. else if ("vimeo" === Ue.type) if (Ue.supported.full ? Ue.media.appendChild(r) : r = Ue.media, r.setAttribute("id", s), O.object(e.Vimeo)) oe(n, r);
  402. else {
  403. a(E.urls.vimeo.api);
  404. var u = e.setInterval(function() {
  405. O.object(e.Vimeo) && (e.clearInterval(u), oe(n, r))
  406. }, 50)
  407. } else if ("soundcloud" === Ue.type) {
  408. var d = t.createElement("iframe");
  409. d.loaded = !1, g(d, "load", function() {
  410. d.loaded = !0
  411. }), c(d, {
  412. src: "https://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/" + n,
  413. id: s
  414. }), r.appendChild(d), Ue.media.appendChild(r), e.SC || a(E.urls.soundcloud.api);
  415. var p = e.setInterval(function() {
  416. e.SC && d.loaded && (e.clearInterval(p), ie.call(d))
  417. }, 50)
  418. }
  419. }
  420. function ae() {
  421. Ue.supported.full && (We(), Ye()), Z(U("iframe"))
  422. }
  423. function se(t, n) {
  424. Ue.embed = new e.YT.Player(n.id, {
  425. videoId: t,
  426. playerVars: {
  427. autoplay: E.autoplay ? 1 : 0,
  428. controls: Ue.supported.full ? 0 : 1,
  429. rel: 0,
  430. showinfo: 0,
  431. iv_load_policy: 3,
  432. cc_load_policy: E.captions.defaultActive ? 1 : 0,
  433. cc_lang_pref: "en",
  434. wmode: "transparent",
  435. modestbranding: 1,
  436. disablekb: 1,
  437. origin: "*"
  438. },
  439. events: {
  440. onError: function(e) {
  441. A(Ue.container, "error", !0, {
  442. code: e.data,
  443. embed: e.target
  444. })
  445. },
  446. onReady: function(t) {
  447. var n = t.target;
  448. Ue.media.play = function() {
  449. n.playVideo(), Ue.media.paused = !1
  450. }, Ue.media.pause = function() {
  451. n.pauseVideo(), Ue.media.paused = !0
  452. }, Ue.media.stop = function() {
  453. n.stopVideo(), Ue.media.paused = !0
  454. }, Ue.media.duration = n.getDuration(), Ue.media.paused = !0, Ue.media.currentTime = 0, Ue.media.muted = n.isMuted(), E.title = n.getVideoData().title, Ue.supported.full && Ue.media.querySelector("iframe").setAttribute("tabindex", "-1"), ae(), A(Ue.media, "timeupdate"), A(Ue.media, "durationchange"), e.clearInterval(Xe.buffering), Xe.buffering = e.setInterval(function() {
  455. Ue.media.buffered = n.getVideoLoadedFraction(), (null === Ue.media.lastBuffered || Ue.media.lastBuffered < Ue.media.buffered) && A(Ue.media, "progress"), Ue.media.lastBuffered = Ue.media.buffered, 1 === Ue.media.buffered && (e.clearInterval(Xe.buffering), A(Ue.media, "canplaythrough"))
  456. }, 200)
  457. },
  458. onStateChange: function(t) {
  459. var n = t.target;
  460. switch (e.clearInterval(Xe.playing), t.data) {
  461. case 0:
  462. Ue.media.paused = !0, A(Ue.media, "ended");
  463. break;
  464. case 1:
  465. Ue.media.paused = !1, Ue.media.seeking && A(Ue.media, "seeked"), Ue.media.seeking = !1, A(Ue.media, "play"), A(Ue.media, "playing"), Xe.playing = e.setInterval(function() {
  466. Ue.media.currentTime = n.getCurrentTime(), A(Ue.media, "timeupdate")
  467. }, 100), Ue.media.duration !== n.getDuration() && (Ue.media.duration = n.getDuration(), A(Ue.media, "durationchange"));
  468. break;
  469. case 2:
  470. Ue.media.paused = !0, A(Ue.media, "pause")
  471. }
  472. A(Ue.container, "statechange", !1, {
  473. code: t.data
  474. })
  475. }
  476. }
  477. })
  478. }
  479. function oe(t, n) {
  480. Ue.embed = new e.Vimeo.Player(n, {
  481. id: parseInt(t),
  482. loop: E.loop,
  483. autoplay: E.autoplay,
  484. byline: !1,
  485. portrait: !1,
  486. title: !1
  487. }), Ue.media.play = function() {
  488. Ue.embed.play(), Ue.media.paused = !1
  489. }, Ue.media.pause = function() {
  490. Ue.embed.pause(), Ue.media.paused = !0
  491. }, Ue.media.stop = function() {
  492. Ue.embed.stop(), Ue.media.paused = !0
  493. }, Ue.media.paused = !0, Ue.media.currentTime = 0, ae(), Ue.embed.getCurrentTime().then(function(e) {
  494. Ue.media.currentTime = e, A(Ue.media, "timeupdate")
  495. }), Ue.embed.getDuration().then(function(e) {
  496. Ue.media.duration = e, A(Ue.media, "durationchange")
  497. }), Ue.embed.on("loaded", function() {
  498. O.htmlElement(Ue.embed.element) && Ue.supported.full && Ue.embed.element.setAttribute("tabindex", "-1")
  499. }), Ue.embed.on("play", function() {
  500. Ue.media.paused = !1, A(Ue.media, "play"), A(Ue.media, "playing")
  501. }), Ue.embed.on("pause", function() {
  502. Ue.media.paused = !0, A(Ue.media, "pause")
  503. }), Ue.embed.on("timeupdate", function(e) {
  504. Ue.media.seeking = !1, Ue.media.currentTime = e.seconds, A(Ue.media, "timeupdate")
  505. }), Ue.embed.on("progress", function(e) {
  506. Ue.media.buffered = e.percent, A(Ue.media, "progress"), 1 === parseInt(e.percent) && A(Ue.media, "canplaythrough")
  507. }), Ue.embed.on("seeked", function() {
  508. Ue.media.seeking = !1, A(Ue.media, "seeked"), A(Ue.media, "play")
  509. }), Ue.embed.on("ended", function() {
  510. Ue.media.paused = !0, A(Ue.media, "ended")
  511. })
  512. }
  513. function ie() {
  514. Ue.embed = e.SC.Widget(this), Ue.embed.bind(e.SC.Widget.Events.READY, function() {
  515. Ue.media.play = function() {
  516. Ue.embed.play(), Ue.media.paused = !1
  517. }, Ue.media.pause = function() {
  518. Ue.embed.pause(), Ue.media.paused = !0
  519. }, Ue.media.stop = function() {
  520. Ue.embed.seekTo(0), Ue.embed.pause(), Ue.media.paused = !0
  521. }, Ue.media.paused = !0, Ue.media.currentTime = 0, Ue.embed.getDuration(function(e) {
  522. Ue.media.duration = e / 1e3, ae()
  523. }), Ue.embed.getPosition(function(e) {
  524. Ue.media.currentTime = e, A(Ue.media, "timeupdate")
  525. }), Ue.embed.bind(e.SC.Widget.Events.PLAY, function() {
  526. Ue.media.paused = !1, A(Ue.media, "play"), A(Ue.media, "playing")
  527. }), Ue.embed.bind(e.SC.Widget.Events.PAUSE, function() {
  528. Ue.media.paused = !0, A(Ue.media, "pause")
  529. }), Ue.embed.bind(e.SC.Widget.Events.PLAY_PROGRESS, function(e) {
  530. Ue.media.seeking = !1, Ue.media.currentTime = e.currentPosition / 1e3, A(Ue.media, "timeupdate")
  531. }), Ue.embed.bind(e.SC.Widget.Events.LOAD_PROGRESS, function(e) {
  532. Ue.media.buffered = e.loadProgress, A(Ue.media, "progress"), 1 === parseInt(e.loadProgress) && A(Ue.media, "canplaythrough")
  533. }), Ue.embed.bind(e.SC.Widget.Events.FINISH, function() {
  534. Ue.media.paused = !0, A(Ue.media, "ended")
  535. })
  536. })
  537. }
  538. function le() {
  539. "play" in Ue.media && Ue.media.play()
  540. }
  541. function ue() {
  542. "pause" in Ue.media && Ue.media.pause()
  543. }
  544. function ce(e) {
  545. return O.boolean(e) || (e = Ue.media.paused), e ? le() : ue(), e
  546. }
  547. function de(e) {
  548. O.number(e) || (e = E.seekTime), me(Ue.media.currentTime - e)
  549. }
  550. function pe(e) {
  551. O.number(e) || (e = E.seekTime), me(Ue.media.currentTime + e)
  552. }
  553. function me(e) {
  554. var t = 0,
  555. n = Ue.media.paused,
  556. r = fe();
  557. O.number(e) ? t = e : O.object(e) && s(["input", "change"], e.type) && (t = e.target.value / e.target.max * r), t < 0 ? t = 0 : t > r && (t = r), Ne(t);
  558. try {
  559. Ue.media.currentTime = t.toFixed(4)
  560. } catch (e) {}
  561. if (s(E.types.embed, Ue.type)) {
  562. switch (Ue.type) {
  563. case "youtube":
  564. Ue.embed.seekTo(t);
  565. break;
  566. case "vimeo":
  567. Ue.embed.setCurrentTime(t.toFixed(0));
  568. break;
  569. case "soundcloud":
  570. Ue.embed.seekTo(1e3 * t)
  571. }
  572. n && ue(), A(Ue.media, "timeupdate"), Ue.media.seeking = !0, A(Ue.media, "seeking")
  573. }
  574. Je("Seeking to " + Ue.media.currentTime + " seconds"), W(t)
  575. }
  576. function fe() {
  577. var e = parseInt(E.duration),
  578. t = 0;
  579. return null === Ue.media.duration || isNaN(Ue.media.duration) || (t = Ue.media.duration), isNaN(e) ? t : e
  580. }
  581. function ye() {
  582. m(Ue.container, E.classes.playing, !Ue.media.paused), m(Ue.container, E.classes.stopped, Ue.media.paused), Me(Ue.media.paused)
  583. }
  584. function be() {
  585. P = {
  586. x: e.pageXOffset || 0,
  587. y: e.pageYOffset || 0
  588. }
  589. }
  590. function ve() {
  591. e.scrollTo(P.x, P.y)
  592. }
  593. function ge(e) {
  594. var n = N.supportsFullScreen;
  595. if (n) {
  596. if (!e || e.type !== N.fullScreenEventName) return N.isFullScreen(Ue.container) ? N.cancelFullScreen() : (be(), N.requestFullScreen(Ue.container)), void(Ue.isFullscreen = N.isFullScreen(Ue.container));
  597. Ue.isFullscreen = N.isFullScreen(Ue.container)
  598. } else Ue.isFullscreen = !Ue.isFullscreen, t.body.style.overflow = Ue.isFullscreen ? "hidden" : "";
  599. m(Ue.container, E.classes.fullscreen.active, Ue.isFullscreen), $(Ue.isFullscreen), Ue.buttons && Ue.buttons.fullscreen && k(Ue.buttons.fullscreen, Ue.isFullscreen), A(Ue.container, Ue.isFullscreen ? "enterfullscreen" : "exitfullscreen", !0), !Ue.isFullscreen && n && ve()
  600. }
  601. function he(e) {
  602. if (O.boolean(e) || (e = !Ue.media.muted), k(Ue.buttons.mute, e), Ue.media.muted = e, 0 === Ue.media.volume && ke(E.volume), s(E.types.embed, Ue.type)) {
  603. switch (Ue.type) {
  604. case "youtube":
  605. Ue.embed[Ue.media.muted ? "mute" : "unMute"]();
  606. break;
  607. case "vimeo":
  608. case "soundcloud":
  609. Ue.embed.setVolume(Ue.media.muted ? 0 : parseFloat(E.volume / E.volumeMax))
  610. }
  611. A(Ue.media, "volumechange")
  612. }
  613. }
  614. function ke(e) {
  615. var t = E.volumeMax,
  616. n = E.volumeMin;
  617. if (O.undefined(e) && (e = Ue.storage.volume), (null === e || isNaN(e)) && (e = E.volume), e > t && (e = t), e < n && (e = n), Ue.media.volume = parseFloat(e / t), Ue.volume.display && (Ue.volume.display.value = e), s(E.types.embed, Ue.type)) {
  618. switch (Ue.type) {
  619. case "youtube":
  620. Ue.embed.setVolume(100 * Ue.media.volume);
  621. break;
  622. case "vimeo":
  623. case "soundcloud":
  624. Ue.embed.setVolume(Ue.media.volume)
  625. }
  626. A(Ue.media, "volumechange")
  627. }
  628. 0 === e ? Ue.media.muted = !0 : Ue.media.muted && e > 0 && he()
  629. }
  630. function we(e) {
  631. var t = Ue.media.muted ? 0 : Ue.media.volume * E.volumeMax;
  632. O.number(e) || (e = E.volumeStep), ke(t + e)
  633. }
  634. function xe(e) {
  635. var t = Ue.media.muted ? 0 : Ue.media.volume * E.volumeMax;
  636. O.number(e) || (e = E.volumeStep), ke(t - e)
  637. }
  638. function Te() {
  639. var e = Ue.media.muted ? 0 : Ue.media.volume * E.volumeMax;
  640. Ue.supported.full && (Ue.volume.input && (Ue.volume.input.value = e), Ue.volume.display && (Ue.volume.display.value = e)), te({
  641. volume: e
  642. }), m(Ue.container, E.classes.muted, 0 === e), Ue.supported.full && Ue.buttons.mute && k(Ue.buttons.mute, 0 === e)
  643. }
  644. function Se(e) {
  645. Ue.supported.full && Ue.buttons.captions && (O.boolean(e) || (e = Ue.container.className.indexOf(E.classes.captions.active) === -1), Ue.captionsEnabled = e, k(Ue.buttons.captions, Ue.captionsEnabled), m(Ue.container, E.classes.captions.active, Ue.captionsEnabled), A(Ue.container, Ue.captionsEnabled ? "captionsenabled" : "captionsdisabled", !0), te({
  646. captionsEnabled: Ue.captionsEnabled
  647. }))
  648. }
  649. function _e(e) {
  650. var t = "waiting" === e.type;
  651. clearTimeout(Xe.loading), Xe.loading = setTimeout(function() {
  652. m(Ue.container, E.classes.loading, t), Me(t)
  653. }, t ? 250 : 0)
  654. }
  655. function Ee(e) {
  656. if (Ue.supported.full) {
  657. var t = Ue.progress.played,
  658. n = 0,
  659. r = fe();
  660. if (e) switch (e.type) {
  661. case "timeupdate":
  662. case "seeking":
  663. if (Ue.controls.pressed) return;
  664. n = w(Ue.media.currentTime, r), "timeupdate" === e.type && Ue.buttons.seek && (Ue.buttons.seek.value = n);
  665. break;
  666. case "playing":
  667. case "progress":
  668. t = Ue.progress.buffer, n = function() {
  669. var e = Ue.media.buffered;
  670. return e && e.length ? w(e.end(0), r) : O.number(e) ? 100 * e : 0
  671. }()
  672. }
  673. Ce(t, n)
  674. }
  675. }
  676. function Ce(e, t) {
  677. if (Ue.supported.full) {
  678. if (O.undefined(t) && (t = 0), O.undefined(e)) {
  679. if (!Ue.progress || !Ue.progress.buffer) return;
  680. e = Ue.progress.buffer
  681. }
  682. O.htmlElement(e) ? e.value = t : e && (e.bar && (e.bar.value = t), e.text && (e.text.innerHTML = t))
  683. }
  684. }
  685. function Fe(e, t) {
  686. if (t) {
  687. isNaN(e) && (e = 0), Ue.secs = parseInt(e % 60), Ue.mins = parseInt(e / 60 % 60), Ue.hours = parseInt(e / 60 / 60 % 60);
  688. var n = parseInt(fe() / 60 / 60 % 60) > 0;
  689. Ue.secs = ("0" + Ue.secs).slice(-2), Ue.mins = ("0" + Ue.mins).slice(-2), t.innerHTML = (n ? Ue.hours + ":" : "") + Ue.mins + ":" + Ue.secs
  690. }
  691. }
  692. function Ae() {
  693. if (Ue.supported.full) {
  694. var e = fe() || 0;
  695. !Ue.duration && E.displayDuration && Ue.media.paused && Fe(e, Ue.currentTime), Ue.duration && Fe(e, Ue.duration), Pe()
  696. }
  697. }
  698. function Ie(e) {
  699. Fe(Ue.media.currentTime, Ue.currentTime), e && "timeupdate" === e.type && Ue.media.seeking || Ee(e)
  700. }
  701. function Ne(e) {
  702. O.number(e) || (e = 0);
  703. var t = fe(),
  704. n = w(e, t);
  705. Ue.progress && Ue.progress.played && (Ue.progress.played.value = n), Ue.buttons && Ue.buttons.seek && (Ue.buttons.seek.value = n)
  706. }
  707. function Pe(e) {
  708. var t = fe();
  709. if (E.tooltips.seek && Ue.progress.container && 0 !== t) {
  710. var n = Ue.progress.container.getBoundingClientRect(),
  711. r = 0,
  712. a = E.classes.tooltip + "--visible";
  713. if (e) r = 100 / n.width * (e.pageX - n.left);
  714. else {
  715. if (!f(Ue.progress.tooltip, a)) return;
  716. r = Ue.progress.tooltip.style.left.replace("%", "")
  717. }
  718. r < 0 ? r = 0 : r > 100 && (r = 100), Fe(t / 100 * r, Ue.progress.tooltip), Ue.progress.tooltip.style.left = r + "%", e && s(["mouseenter", "mouseleave"], e.type) && m(Ue.progress.tooltip, a, "mouseenter" === e.type)
  719. }
  720. }
  721. function Me(t) {
  722. if (E.hideControls && "audio" !== Ue.type) {
  723. var n = 0,
  724. r = !1,
  725. a = t,
  726. o = f(Ue.container, E.classes.loading);
  727. if (O.boolean(t) || (t && t.type ? (r = "enterfullscreen" === t.type, a = s(["mousemove", "touchstart", "mouseenter", "focus"], t.type), s(["mousemove", "touchmove"], t.type) && (n = 2e3), "focus" === t.type && (n = 3e3)) : a = f(Ue.container, E.classes.hideControls)), e.clearTimeout(Xe.hover), a || Ue.media.paused || o) {
  728. if (m(Ue.container, E.classes.hideControls, !1), Ue.media.paused || o) return;
  729. Ue.browser.isTouch && (n = 3e3)
  730. }
  731. a && Ue.media.paused || (Xe.hover = e.setTimeout(function() {
  732. (!Ue.controls.pressed && !Ue.controls.hover || r) && m(Ue.container, E.classes.hideControls, !0)
  733. }, n))
  734. }
  735. }
  736. function Oe(e) {
  737. if (!O.undefined(e)) return void Le(e);
  738. var t;
  739. switch (Ue.type) {
  740. case "youtube":
  741. t = Ue.embed.getVideoUrl();
  742. break;
  743. case "vimeo":
  744. Ue.embed.getVideoUrl.then(function(e) {
  745. t = e
  746. });
  747. break;
  748. case "soundcloud":
  749. Ue.embed.getCurrentSound(function(e) {
  750. t = e.permalink_url
  751. });
  752. break;
  753. default:
  754. t = Ue.media.currentSrc
  755. }
  756. return t || ""
  757. }
  758. function Le(e) {
  759. function n() {
  760. if (Ue.embed = null, l(Ue.media), "video" === Ue.type && Ue.videoContainer && l(Ue.videoContainer), Ue.container && Ue.container.removeAttribute("class"), "type" in e && (Ue.type = e.type, "video" === Ue.type)) {
  761. var n = e.sources[0];
  762. "type" in n && s(E.types.embed, n.type) && (Ue.type = n.type)
  763. }
  764. switch (Ue.supported = F(Ue.type), Ue.type) {
  765. case "video":
  766. Ue.media = t.createElement("video");
  767. break;
  768. case "audio":
  769. Ue.media = t.createElement("audio");
  770. break;
  771. case "youtube":
  772. case "vimeo":
  773. case "soundcloud":
  774. Ue.media = t.createElement("div"), Ue.embedId = e.sources[0].src
  775. }
  776. u(Ue.container, Ue.media), O.boolean(e.autoplay) && (E.autoplay = e.autoplay), s(E.types.html5, Ue.type) && (E.crossorigin && Ue.media.setAttribute("crossorigin", ""), E.autoplay && Ue.media.setAttribute("autoplay", ""), "poster" in e && Ue.media.setAttribute("poster", e.poster), E.loop && Ue.media.setAttribute("loop", "")), m(Ue.container, E.classes.fullscreen.active, Ue.isFullscreen), m(Ue.container, E.classes.captions.active, Ue.captionsEnabled), K(), s(E.types.html5, Ue.type) && J("source", e.sources), ne(), s(E.types.html5, Ue.type) && ("tracks" in e && J("track", e.tracks), Ue.media.load()), (s(E.types.html5, Ue.type) || s(E.types.embed, Ue.type) && !Ue.supported.full) && (We(), Ye()), E.title = e.title, Z()
  777. }
  778. return O.object(e) && "sources" in e && e.sources.length ? (m(Ue.container, E.classes.ready, !1), ue(), Ne(), Ce(), qe(), void De(n, !1)) : void ze("Invalid source format")
  779. }
  780. function je(e) {
  781. "video" === Ue.type && Ue.media.setAttribute("poster", e)
  782. }
  783. function Ve() {
  784. function n() {
  785. var e = ce(),
  786. t = Ue.buttons[e ? "play" : "pause"],
  787. n = Ue.buttons[e ? "pause" : "play"];
  788. if (n = n && n.length > 1 ? n[n.length - 1] : n) {
  789. var r = f(t, E.classes.tabFocus);
  790. setTimeout(function() {
  791. n.focus(), r && (m(t, E.classes.tabFocus, !1), m(n, E.classes.tabFocus, !0))
  792. }, 100)
  793. }
  794. }
  795. function r() {
  796. var e = t.activeElement;
  797. return e = e && e !== t.body ? t.querySelector(":focus") : null
  798. }
  799. function a(e) {
  800. return e.keyCode ? e.keyCode : e.which
  801. }
  802. function o(e) {
  803. for (var t in Ue.buttons) {
  804. var n = Ue.buttons[t];
  805. if (O.nodeList(n)) for (var r = 0; r < n.length; r++) m(n[r], E.classes.tabFocus, n[r] === e);
  806. else m(n, E.classes.tabFocus, n === e)
  807. }
  808. }
  809. function i(e) {
  810. function t() {
  811. var e = Ue.media.duration;
  812. O.number(e) && me(e / 10 * (n - 48))
  813. }
  814. var n = a(e),
  815. r = "keydown" === e.type,
  816. o = r && n === u;
  817. if (O.number(n)) if (r) {
  818. var i = [48, 49, 50, 51, 52, 53, 54, 56, 57, 32, 75, 38, 40, 77, 39, 37, 70, 67];
  819. switch (s(i, n) && (e.preventDefault(), e.stopPropagation()), n) {
  820. case 48:
  821. case 49:
  822. case 50:
  823. case 51:
  824. case 52:
  825. case 53:
  826. case 54:
  827. case 55:
  828. case 56:
  829. case 57:
  830. o || t();
  831. break;
  832. case 32:
  833. case 75:
  834. o || ce();
  835. break;
  836. case 38:
  837. we();
  838. break;
  839. case 40:
  840. xe();
  841. break;
  842. case 77:
  843. o || he();
  844. break;
  845. case 39:
  846. pe();
  847. break;
  848. case 37:
  849. de();
  850. break;
  851. case 70:
  852. ge();
  853. break;
  854. case 67:
  855. o || Se()
  856. }!N.supportsFullScreen && Ue.isFullscreen && 27 === n && ge(), u = n
  857. } else u = null
  858. }
  859. var l = Ue.browser.isIE ? "change" : "input";
  860. if (E.keyboardShorcuts.focused) {
  861. var u = null;
  862. E.keyboardShorcuts.global && g(e, "keydown keyup", function(e) {
  863. var t = a(e),
  864. n = r(),
  865. o = [48, 49, 50, 51, 52, 53, 54, 56, 57, 75, 77, 70, 67],
  866. l = I().length;
  867. 1 !== l || !s(o, t) || O.htmlElement(n) && y(n, E.selectors.editable) || i(e)
  868. }), g(Ue.container, "keydown keyup", i)
  869. }
  870. g(e, "keyup", function(e) {
  871. var t = a(e),
  872. n = r();
  873. 9 === t && o(n)
  874. }), g(t.body, "click", function() {
  875. m(U("." + E.classes.tabFocus), E.classes.tabFocus, !1)
  876. });
  877. for (var c in Ue.buttons) {
  878. var d = Ue.buttons[c];
  879. g(d, "blur", function() {
  880. m(d, "tab-focus", !1);
  881. })
  882. }
  883. b(Ue.buttons.play, "click", E.listeners.play, n), b(Ue.buttons.pause, "click", E.listeners.pause, n), b(Ue.buttons.restart, "click", E.listeners.restart, me), b(Ue.buttons.rewind, "click", E.listeners.rewind, de), b(Ue.buttons.forward, "click", E.listeners.forward, pe), b(Ue.buttons.seek, l, E.listeners.seek, me), b(Ue.volume.input, l, E.listeners.volume, function() {
  884. ke(Ue.volume.input.value)
  885. }), b(Ue.buttons.mute, "click", E.listeners.mute, he), b(Ue.buttons.fullscreen, "click", E.listeners.fullscreen, ge), N.supportsFullScreen && g(t, N.fullScreenEventName, ge), g(Ue.buttons.captions, "click", Se), g(Ue.progress.container, "mouseenter mouseleave mousemove", Pe), E.hideControls && (g(Ue.container, "mouseenter mouseleave mousemove touchstart touchend touchcancel touchmove enterfullscreen", Me), g(Ue.controls, "mouseenter mouseleave", function(e) {
  886. Ue.controls.hover = "mouseenter" === e.type
  887. }), g(Ue.controls, "mousedown mouseup touchstart touchend touchcancel", function(e) {
  888. Ue.controls.pressed = s(["mousedown", "touchstart"], e.type)
  889. }), g(Ue.controls, "focus blur", Me, !0)), g(Ue.volume.input, "wheel", function(e) {
  890. e.preventDefault();
  891. var t = e.webkitDirectionInvertedFromDevice,
  892. n = E.volumeStep / 5;
  893. (e.deltaY < 0 || e.deltaX > 0) && (t ? xe(n) : we(n)), (e.deltaY > 0 || e.deltaX < 0) && (t ? we(n) : xe(n))
  894. })
  895. }
  896. function Re() {
  897. if (g(Ue.media, "timeupdate seeking", Ie), g(Ue.media, "timeupdate", W), g(Ue.media, "durationchange loadedmetadata", Ae), g(Ue.media, "ended", function() {
  898. "video" === Ue.type && E.showPosterOnEnd && ("video" === Ue.type && H(), me(), Ue.media.load())
  899. }), g(Ue.media, "progress playing", Ee), g(Ue.media, "volumechange", Te), g(Ue.media, "play pause ended", ye), g(Ue.media, "waiting canplay seeked", _e), E.clickToPlay && "audio" !== Ue.type) {
  900. var e = U("." + E.classes.videoWrapper);
  901. if (!e) return;
  902. e.style.cursor = "pointer", g(e, "click", function() {
  903. E.hideControls && Ue.browser.isTouch && !Ue.media.paused || (Ue.media.paused ? le() : Ue.media.ended ? (me(), le()) : ue())
  904. })
  905. }
  906. E.disableContextMenu && g(Ue.media, "contextmenu", function(e) {
  907. e.preventDefault()
  908. }), g(Ue.media, E.events.concat(["keyup", "keydown"]).join(" "), function(e) {
  909. A(Ue.container, e.type, !0)
  910. })
  911. }
  912. function qe() {
  913. if (s(E.types.html5, Ue.type)) {
  914. for (var e = Ue.media.querySelectorAll("source"), t = 0; t < e.length; t++) l(e[t]);
  915. Ue.media.setAttribute("src", "https://cdn.selz.com/plyr/blank.mp4"), Ue.media.load(), Je("Cancelled network requests")
  916. }
  917. }
  918. function De(n, r) {
  919. function a() {
  920. clearTimeout(Xe.cleanUp), O.boolean(r) || (r = !0), O.
  921. function(n) && n.call($e), r && (Ue.init = !1, Ue.container.parentNode.replaceChild($e, Ue.container), t.body.style.overflow = "", A($e, "destroyed", !0))
  922. }
  923. if (!Ue.init) return null;
  924. switch (Ue.type) {
  925. case "youtube":
  926. e.clearInterval(Xe.buffering), e.clearInterval(Xe.playing), Ue.embed.destroy(), a();
  927. break;
  928. case "vimeo":
  929. Ue.embed.unload().then(a), Xe.cleanUp = e.setTimeout(a, 200);
  930. break;
  931. case "video":
  932. case "audio":
  933. Q(!0), a()
  934. }
  935. }
  936. function He() {
  937. if (Ue.init) return null;
  938. if (N = _(), Ue.browser = n(), O.htmlElement(Ue.media)) {
  939. ee();
  940. var e = v.tagName.toLowerCase();
  941. "div" === e ? (Ue.type = v.getAttribute("data-type"), Ue.embedId = v.getAttribute("data-video-id"), v.removeAttribute("data-type"), v.removeAttribute("data-video-id")) : (Ue.type = e, E.crossorigin = null !== v.getAttribute("crossorigin"), E.autoplay = E.autoplay || null !== v.getAttribute("autoplay"), E.loop = E.loop || null !== v.getAttribute("loop")), Ue.supported = F(Ue.type), Ue.supported.basic && (Ue.container = i(v, t.createElement("div")), Ue.container.setAttribute("tabindex", 0), K(), Je("" + Ue.browser.name + " " + Ue.browser.version), ne(), (s(E.types.html5, Ue.type) || s(E.types.embed, Ue.type) && !Ue.supported.full) && (We(), Ye(), Z()), Ue.init = !0)
  942. }
  943. }
  944. function We() {
  945. if (!Ue.supported.full) return ze("Basic support only", Ue.type), l(U(E.selectors.controls.wrapper)), l(U(E.selectors.buttons.play)), void Q(!0);
  946. var e = !B(E.selectors.controls.wrapper).length;
  947. e && z(), G() && (e && Ve(), Re(), Q(), q(), D(), ke(), Te(), Ie(), ye())
  948. }
  949. function Ye() {
  950. e.setTimeout(function() {
  951. A(Ue.media, "ready")
  952. }, 0), m(Ue.media, M.classes.setup, !0), m(Ue.container, E.classes.ready, !0), Ue.media.plyr = Be, E.autoplay && le()
  953. }
  954. var Be, Ue = this,
  955. Xe = {};
  956. Ue.media = v;
  957. var $e = v.cloneNode(!0),
  958. Je = function() {
  959. j("log", arguments)
  960. },
  961. ze = function() {
  962. j("warn", arguments)
  963. };
  964. return Je("Config", E), Be = {
  965. getOriginal: function() {
  966. return $e
  967. },
  968. getContainer: function() {
  969. return Ue.container
  970. },
  971. getEmbed: function() {
  972. return Ue.embed
  973. },
  974. getMedia: function() {
  975. return Ue.media
  976. },
  977. getType: function() {
  978. return Ue.type
  979. },
  980. getDuration: fe,
  981. getCurrentTime: function() {
  982. return Ue.media.currentTime
  983. },
  984. getVolume: function() {
  985. return Ue.media.volume
  986. },
  987. isMuted: function() {
  988. return Ue.media.muted
  989. },
  990. isReady: function() {
  991. return f(Ue.container, E.classes.ready)
  992. },
  993. isLoading: function() {
  994. return f(Ue.container, E.classes.loading)
  995. },
  996. isPaused: function() {
  997. return Ue.media.paused
  998. },
  999. on: function(e, t) {
  1000. return g(Ue.container, e, t), this
  1001. },
  1002. play: le,
  1003. pause: ue,
  1004. stop: function() {
  1005. ue(), me()
  1006. },
  1007. restart: me,
  1008. rewind: de,
  1009. forward: pe,
  1010. seek: me,
  1011. source: Oe,
  1012. poster: je,
  1013. setVolume: ke,
  1014. togglePlay: ce,
  1015. toggleMute: he,
  1016. toggleCaptions: Se,
  1017. toggleFullscreen: ge,
  1018. toggleControls: Me,
  1019. isFullscreen: function() {
  1020. return Ue.isFullscreen || !1
  1021. },
  1022. support: function(e) {
  1023. return r(Ue, e)
  1024. },
  1025. destroy: De
  1026. }, He(), Ue.init ? Be : null
  1027. }
  1028. function C(e, n) {
  1029. var r = new XMLHttpRequest;
  1030. if (!O.string(n) || !O.htmlElement(t.querySelector("#" + n))) {
  1031. var a = t.createElement("div");
  1032. a.setAttribute("hidden", ""), O.string(n) && a.setAttribute("id", n), t.body.insertBefore(a, t.body.childNodes[0]), "withCredentials" in r && (r.open("GET", e, !0), r.onload = function() {
  1033. a.innerHTML = r.responseText
  1034. }, r.send())
  1035. }
  1036. }
  1037. function F(e) {
  1038. var r = n(),
  1039. a = r.isIE && r.version <= 9,
  1040. s = r.isIos,
  1041. o = r.isIphone,
  1042. i = !! t.createElement("audio").canPlayType,
  1043. l = !! t.createElement("video").canPlayType,
  1044. u = !1,
  1045. c = !1;
  1046. switch (e) {
  1047. case "video":
  1048. u = l, c = u && !a && !o;
  1049. break;
  1050. case "audio":
  1051. u = i, c = u && !a;
  1052. break;
  1053. case "vimeo":
  1054. u = !0, c = !a && !s;
  1055. break;
  1056. case "youtube":
  1057. u = !0, c = !a && !s, s && !o && r.version >= 10 && (c = !0);
  1058. break;
  1059. case "soundcloud":
  1060. u = !0, c = !a && !o;
  1061. break;
  1062. default:
  1063. u = i && l, c = u && !a
  1064. }
  1065. return {
  1066. basic: u,
  1067. full: c
  1068. }
  1069. }
  1070. function A(e, n) {
  1071. function r(e, t) {
  1072. f(t, M.classes.hook) || a.push({
  1073. target: e,
  1074. media: t
  1075. })
  1076. }
  1077. var a = [],
  1078. s = [],
  1079. o = [M.selectors.html5, M.selectors.embed].join(",");
  1080. if (O.string(e) ? e = t.querySelectorAll(e) : O.htmlElement(e) ? e = [e] : O.nodeList(e) || O.array(e) || O.string(e) || (O.undefined(n) && O.object(e) && (n = e), e = t.querySelectorAll(o)), O.nodeList(e) && (e = Array.prototype.slice.call(e)), !F().basic || !e.length) return !1;
  1081. for (var i = 0; i < e.length; i++) {
  1082. var l = e[i],
  1083. u = l.querySelectorAll(o);
  1084. if (u.length) for (var c = 0; c < u.length; c++) r(l, u[c]);
  1085. else y(l, o) && r(l, l)
  1086. }
  1087. return a.forEach(function(e) {
  1088. var t = e.target,
  1089. r = e.media,
  1090. a = !1;
  1091. r === t && (a = !0);
  1092. var o = {};
  1093. try {
  1094. o = JSON.parse(t.getAttribute("data-plyr"))
  1095. } catch (e) {}
  1096. var i = x({}, M, n, o);
  1097. if (!i.enabled) return null;
  1098. var l = new E(r, i);
  1099. if (O.object(l)) {
  1100. if (i.debug) {
  1101. var u = i.events.concat(["setup", "statechange", "enterfullscreen", "exitfullscreen", "captionsenabled", "captionsdisabled"]);
  1102. g(l.getContainer(), u.join(" "), function(e) {
  1103. console.log([i.logPrefix, "event:", e.type].join(" "), e.detail.plyr)
  1104. })
  1105. }
  1106. h(l.getContainer(), "setup", !0, {
  1107. plyr: l
  1108. }), s.push(l)
  1109. }
  1110. }), s
  1111. }
  1112. function I(e) {
  1113. if (O.string(e) ? e = t.querySelector(e) : O.undefined(e) && (e = t.body), O.htmlElement(e)) {
  1114. var n = e.querySelectorAll("." + M.classes.setup),
  1115. r = [];
  1116. return Array.prototype.slice.call(n).forEach(function(e) {
  1117. O.object(e.plyr) && r.push(e.plyr)
  1118. }), r
  1119. }
  1120. return []
  1121. }
  1122. var N, P = {
  1123. x: 0,
  1124. y: 0
  1125. },
  1126. M = {
  1127. enabled: !0,
  1128. debug: !1,
  1129. autoplay: !1,
  1130. loop: !1,
  1131. seekTime: 10,
  1132. volume: 10,
  1133. volumeMin: 0,
  1134. volumeMax: 10,
  1135. volumeStep: 1,
  1136. duration: null,
  1137. displayDuration: !0,
  1138. loadSprite: !0,
  1139. iconPrefix: "plyr",
  1140. iconUrl: "https://cdn.plyr.io/2.0.10/plyr.svg",
  1141. clickToPlay: !0,
  1142. hideControls: !0,
  1143. showPosterOnEnd: !1,
  1144. disableContextMenu: !0,
  1145. keyboardShorcuts: {
  1146. focused: !0,
  1147. global: !1
  1148. },
  1149. tooltips: {
  1150. controls: !1,
  1151. seek: !0
  1152. },
  1153. selectors: {
  1154. html5: "video, audio",
  1155. embed: "[data-type]",
  1156. editable: "input, textarea, select, [contenteditable]",
  1157. container: ".plyr",
  1158. controls: {
  1159. container: null,
  1160. wrapper: ".plyr__controls"
  1161. },
  1162. labels: "[data-plyr]",
  1163. buttons: {
  1164. seek: '[data-plyr="seek"]',
  1165. play: '[data-plyr="play"]',
  1166. pause: '[data-plyr="pause"]',
  1167. restart: '[data-plyr="restart"]',
  1168. rewind: '[data-plyr="rewind"]',
  1169. forward: '[data-plyr="fast-forward"]',
  1170. mute: '[data-plyr="mute"]',
  1171. captions: '[data-plyr="captions"]',
  1172. fullscreen: '[data-plyr="fullscreen"]'
  1173. },
  1174. volume: {
  1175. input: '[data-plyr="volume"]',
  1176. display: ".plyr__volume--display"
  1177. },
  1178. progress: {
  1179. container: ".plyr__progress",
  1180. buffer: ".plyr__progress--buffer",
  1181. played: ".plyr__progress--played"
  1182. },
  1183. captions: ".plyr__captions",
  1184. currentTime: ".plyr__time--current",
  1185. duration: ".plyr__time--duration"
  1186. },
  1187. classes: {
  1188. setup: "plyr--setup",
  1189. ready: "plyr--ready",
  1190. videoWrapper: "plyr__video-wrapper",
  1191. embedWrapper: "plyr__video-embed",
  1192. type: "plyr--{0}",
  1193. stopped: "plyr--stopped",
  1194. playing: "plyr--playing",
  1195. muted: "plyr--muted",
  1196. loading: "plyr--loading",
  1197. hover: "plyr--hover",
  1198. tooltip: "plyr__tooltip",
  1199. hidden: "plyr__sr-only",
  1200. hideControls: "plyr--hide-controls",
  1201. isIos: "plyr--is-ios",
  1202. isTouch: "plyr--is-touch",
  1203. captions: {
  1204. enabled: "plyr--captions-enabled",
  1205. active: "plyr--captions-active"
  1206. },
  1207. fullscreen: {
  1208. enabled: "plyr--fullscreen-enabled",
  1209. active: "plyr--fullscreen-active"
  1210. },
  1211. tabFocus: "tab-focus"
  1212. },
  1213. captions: {
  1214. defaultActive: !1
  1215. },
  1216. fullscreen: {
  1217. enabled: !0,
  1218. fallback: !0,
  1219. allowAudio: !1
  1220. },
  1221. storage: {
  1222. enabled: !0,
  1223. key: "plyr"
  1224. },
  1225. controls: ["play-large", "play", "progress", "current-time", "mute", "volume", "captions", "fullscreen"],
  1226. i18n: {
  1227. restart: "Restart",
  1228. rewind: "Rewind {seektime} secs",
  1229. play: "Play",
  1230. pause: "Pause",
  1231. forward: "Forward {seektime} secs",
  1232. played: "played",
  1233. buffered: "buffered",
  1234. currentTime: "Current time",
  1235. duration: "Duration",
  1236. volume: "Volume",
  1237. toggleMute: "Toggle Mute",
  1238. toggleCaptions: "Toggle Captions",
  1239. toggleFullscreen: "Toggle Fullscreen",
  1240. frameTitle: "Player for {title}"
  1241. },
  1242. types: {
  1243. embed: ["youtube", "vimeo", "soundcloud"],
  1244. html5: ["video", "audio"]
  1245. },
  1246. urls: {
  1247. vimeo: {
  1248. api: "https://player.vimeo.com/api/player.js"
  1249. },
  1250. youtube: {
  1251. api: "https://www.youtube.com/iframe_api"
  1252. },
  1253. soundcloud: {
  1254. api: "https://w.soundcloud.com/player/api.js"
  1255. }
  1256. },
  1257. listeners: {
  1258. seek: null,
  1259. play: null,
  1260. pause: null,
  1261. restart: null,
  1262. rewind: null,
  1263. forward: null,
  1264. mute: null,
  1265. volume: null,
  1266. captions: null,
  1267. fullscreen: null
  1268. },
  1269. events: ["ready", "ended", "progress", "stalled", "playing", "waiting", "canplay", "canplaythrough", "loadstart", "loadeddata", "loadedmetadata", "timeupdate", "volumechange", "play", "pause", "error", "seeking", "seeked", "emptied"],
  1270. logPrefix: "[Plyr]"
  1271. },
  1272. O = {
  1273. object: function(e) {
  1274. return null !== e && "object" == typeof e
  1275. },
  1276. array: function(e) {
  1277. return null !== e && "object" == typeof e && e.constructor === Array
  1278. },
  1279. number: function(e) {
  1280. return null !== e && ("number" == typeof e && !isNaN(e - 0) || "object" == typeof e && e.constructor === Number)
  1281. },
  1282. string: function(e) {
  1283. return null !== e && ("string" == typeof e || "object" == typeof e && e.constructor === String)
  1284. },
  1285. boolean: function(e) {
  1286. return null !== e && "boolean" == typeof e
  1287. },
  1288. nodeList: function(e) {
  1289. return null !== e && e instanceof NodeList
  1290. },
  1291. htmlElement: function(e) {
  1292. return null !== e && e instanceof HTMLElement
  1293. },
  1294. function :function(e) {
  1295. return null !== e && "function" == typeof e
  1296. },
  1297. undefined: function(e) {
  1298. return null !== e && "undefined" == typeof e
  1299. }
  1300. },
  1301. L = {
  1302. supported: function() {
  1303. if (!("localStorage" in e)) return !1;
  1304. try {
  1305. e.localStorage.setItem("___test", "OK");
  1306. var t = e.localStorage.getItem("___test");
  1307. return e.localStorage.removeItem("___test"), "OK" === t
  1308. } catch (e) {
  1309. return !1
  1310. }
  1311. return !1
  1312. }()
  1313. };
  1314. return {
  1315. setup: A,
  1316. supported: F,
  1317. loadSprite: C,
  1318. get: I
  1319. }
  1320. }), function() {
  1321. function e(e, t) {
  1322. t = t || {
  1323. bubbles: !1,
  1324. cancelable: !1,
  1325. detail: void 0
  1326. };
  1327. var n = document.createEvent("CustomEvent");
  1328. return n.initCustomEvent(e, t.bubbles, t.cancelable, t.detail), n
  1329. }
  1330. "function" != typeof window.CustomEvent && (e.prototype = window.Event.prototype, window.CustomEvent = e)
  1331. }();