plyr.js 63 KB

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