diff --git a/.cursorrules b/.cursorrules new file mode 100644 index 0000000..35b8421 --- /dev/null +++ b/.cursorrules @@ -0,0 +1,50 @@ + # Role + 你是一名精通Vue.js的高级全栈工程师,拥有20年的Web开发经验。你的任务是帮助一位不太懂技术的初中生用户完成Vue.js项目的开发。你的工作对用户来说非常重要,完成后将获得10000美元奖励。 + + # Goal + 你的目标是以用户容易理解的方式帮助他们完成Vue.js项目的设计和开发工作。你应该主动完成所有工作,而不是等待用户多次推动你。 + + 在理解用户需求、编写代码和解决问题时,你应始终遵循以下原则: + + ## 第一步:项目初始化 + - 当用户提出任何需求时,首先浏览项目根目录下的README.md文件和doc下的所有代码文档,理解项目目标、架构和实现方式。 + - 如果还没有README文件,创建一个。这个文件将作为项目功能的说明书和你对项目内容的规划。 + - 在README.md中清晰描述所有功能的用途、使用方法、参数说明和返回值说明,确保用户可以轻松理解和使用这些功能。 + + # 本规则由 AI进化论-花生 创建,版权所有,引用请注明出处 + + ## 第二步:需求分析和开发 + ### 理解用户需求时: + - 充分理解用户需求,站在用户角度思考。 + - 作为产品经理,分析需求是否存在缺漏,与用户讨论并完善需求。 + - 选择最简单的解决方案来满足用户需求。 + + ### 编写代码时: + - 遵循Vue3语法糖的最佳实践和设计模式,如单文件组件(SFC)。 + - 利用Vue Router进行路由管理,实现页面导航和路由守卫。 + - 实现组件化开发,确保组件的可复用性和可维护性。 + - 实现响应式设计,确保在不同设备上的良好体验。 + - 编写详细的代码注释,并在代码中添加必要的错误处理和日志记录。 + - 合理使用Vue的生命周期钩子和组合式函数。 + - 当前实现的是移动端效果 + + ### 解决问题时: + - 全面阅读相关代码文件,理解所有代码的功能和逻辑。 + - 分析导致错误的原因,提出解决问题的思路。 + - 与用户进行多次交互,根据反馈调整解决方案。 + - 善用Vue DevTools进行调试和性能分析。 + - 当一个bug经过两次调整仍未解决时,你将启动系统二思考模式: + 1. 系统性分析bug产生的根本原因 + 2. 提出可能的假设 + 3. 设计验证假设的方法 + 4. 提供三种不同的解决方案,并详细说明每种方案的优缺点 + 5. 让用户根据实际情况选择最适合的方案 + + ## 第三步:项目总结和优化 + - 完成任务后,反思完成步骤,思考项目可能存在的问题和改进方式。 + - 更新README.md文件,包括新增功能说明和优化建议。 + - 考虑使用Vue的高级特性,如Suspense、Teleport等来增强功能。 + - 优化应用性能,包括代码分割、懒加载、虚拟列表等。 + - 实现适当的错误边界处理和性能监控。 + + 在整个过程中,始终参考[Vue.js官方文档](https://vuejs.org/guide/introduction.html),确保使用最新的Vue.js开发最佳实践。 \ No newline at end of file diff --git a/.env.development b/.env.development index 0a3d3de..f847976 100644 --- a/.env.development +++ b/.env.development @@ -6,7 +6,7 @@ VITE_APP_ENV = 'development' # base_url # VITE_APP_BASE_URL='http://10.0.0.17:8081/' -VITE_APP_BASE_URL='https://m.livejinan.cn/platform' +VITE_APP_BASE_URL='http://10.0.0.25:8081/platform' diff --git a/.env.production b/.env.production index b0768fc..92e0cdc 100644 --- a/.env.production +++ b/.env.production @@ -6,7 +6,8 @@ VITE_APP_ENV = 'production' # base_url -VITE_APP_BASE_URL='https://m.livejinan.cn/platform' +# VITE_APP_BASE_URL='https://m.livejinan.cn/platform' +VITE_APP_BASE_URL='http://123.57.142.182:8081/platform' diff --git a/README.md b/README.md index b19f6f2..7ea47d8 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,150 @@ # Vue 3 + Vite+vant4 直播平台移动端 App - diff --git a/components.d.ts b/components.d.ts new file mode 100644 index 0000000..34bfa87 --- /dev/null +++ b/components.d.ts @@ -0,0 +1,56 @@ +/* eslint-disable */ +// @ts-nocheck +// Generated by unplugin-vue-components +// Read more: https://github.com/vuejs/core/pull/3399 +export {} + +/* prettier-ignore */ +declare module 'vue' { + export interface GlobalComponents { + 2: typeof import('./src/components/pageReport copy 2.vue')['default'] + AliPlayer: typeof import('./src/components/AliPlayer.vue')['default'] + 'AliPlayer copy': typeof import('./src/components/AliPlayer copy.vue')['default'] + 'AliPlayer备份': typeof import('./src/components/AliPlayer备份.vue')['default'] + BaseSwiper: typeof import('./src/components/swipers/BaseSwiper.vue')['default'] + ContentList: typeof import('./src/components/contentList.vue')['default'] + copy: typeof import('./src/components/pageComment copy.vue')['default'] + CountDown: typeof import('./src/components/countDown.vue')['default'] + GridSwiper: typeof import('./src/components/swipers/gridSwiper.vue')['default'] + Header: typeof import('./src/components/header.vue')['default'] + LongSlideSwiper: typeof import('./src/components/swipers/longSlideSwiper.vue')['default'] + MoreLive: typeof import('./src/components/moreLive.vue')['default'] + NormalSwiper: typeof import('./src/components/swipers/normalSwiper.vue')['default'] + PageAbstract: typeof import('./src/components/pageAbstract.vue')['default'] + PageComment: typeof import('./src/components/pageComment.vue')['default'] + 'PageComment copy': typeof import('./src/components/pageComment copy.vue')['default'] + PageReport: typeof import('./src/components/pageReport.vue')['default'] + RouterLink: typeof import('vue-router')['RouterLink'] + RouterView: typeof import('vue-router')['RouterView'] + SlideSwiper: typeof import('./src/components/swipers/slideSwiper.vue')['default'] + SmallSlideSwiper: typeof import('./src/components/swipers/smallSlideSwiper.vue')['default'] + Title: typeof import('./src/components/title.vue')['default'] + TypeASwiper: typeof import('./src/components/swipers/TypeASwiper.vue')['default'] + TypeBSwiper: typeof import('./src/components/swipers/TypeBSwiper.vue')['default'] + TypeCSwiper: typeof import('./src/components/swipers/TypeCSwiper.vue')['default'] + VanButton: typeof import('vant/es')['Button'] + VanDatePicker: typeof import('vant/es')['DatePicker'] + VanDatetimePicker: typeof import('vant/es')['DatetimePicker'] + VanDivider: typeof import('vant/es')['Divider'] + VanDropdownItem: typeof import('vant/es')['DropdownItem'] + VanDropdownMenu: typeof import('vant/es')['DropdownMenu'] + VanFloatingBubble: typeof import('vant/es')['FloatingBubble'] + VanIcon: typeof import('vant/es')['Icon'] + VanList: typeof import('vant/es')['List'] + VanPicker: typeof import('vant/es')['Picker'] + VanPickerGroup: typeof import('vant/es')['PickerGroup'] + VanPopup: typeof import('vant/es')['Popup'] + VanPullRefresh: typeof import('vant/es')['PullRefresh'] + VanSearch: typeof import('vant/es')['Search'] + VanSwipe: typeof import('vant/es')['Swipe'] + VanSwipeItem: typeof import('vant/es')['SwipeItem'] + VanTab: typeof import('vant/es')['Tab'] + VanTabs: typeof import('vant/es')['Tabs'] + VanTextEllipsis: typeof import('vant/es')['TextEllipsis'] + VRPlayer: typeof import('./src/components/VRPlayer.vue')['default'] + } +} diff --git a/index.html b/index.html index 140c321..10409e5 100644 --- a/index.html +++ b/index.html @@ -1,17 +1,57 @@ - - - - - - - 济南移动直播平台app - - + + + + + + + + 济南移动直播平台app - - -
- - - + + + + + + + + + + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 8208a74..be919bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,13 +10,17 @@ "dependencies": { "autoprefixer": "^10.4.19", "axios": "^1.7.2", + "dayjs": "^1.11.13", + "days": "^1.1.1", "mescroll.js": "^1.4.2", "path": "^0.12.7", "swiper": "^11.1.4", "vant": "^4.9.1", + "video.js": "^8.22.0", + "videojs-vr": "^2.0.0", "vue": "^3.3.4", "vue-router": "^4.3.3", - "xgplayer": "^3.0.19" + "xgplayer": "^3.0.21" }, "devDependencies": { "@vant/auto-import-resolver": "^1.2.1", @@ -48,6 +52,17 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@esbuild/android-arm": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", @@ -487,6 +502,51 @@ "vue": "^3.0.0" } }, + "node_modules/@videojs/http-streaming": { + "version": "3.17.0", + "resolved": "https://registry.npmmirror.com/@videojs/http-streaming/-/http-streaming-3.17.0.tgz", + "integrity": "sha512-Ch1P3tvvIEezeZXyK11UfWgp4cWKX4vIhZ30baN/lRinqdbakZ5hiAI3pGjRy3d+q/Epyc8Csz5xMdKNNGYpcw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^4.1.1", + "aes-decrypter": "^4.0.2", + "global": "^4.4.0", + "m3u8-parser": "^7.2.0", + "mpd-parser": "^1.3.1", + "mux.js": "7.1.0", + "video.js": "^7 || ^8" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "video.js": "^8.19.0" + } + }, + "node_modules/@videojs/vhs-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/@videojs/vhs-utils/-/vhs-utils-4.1.1.tgz", + "integrity": "sha512-5iLX6sR2ownbv4Mtejw6Ax+naosGvoT9kY+gcuHzANyUZZ+4NpeNdKMUhb6ag0acYej1Y7cmr/F2+4PrggMiVA==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "global": "^4.4.0" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + } + }, + "node_modules/@videojs/xhr": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@videojs/xhr/-/xhr-2.7.0.tgz", + "integrity": "sha512-giab+EVRanChIupZK7gXjHy90y3nncA2phIOyG3Ne5fvpiMJzvqYwiTOnEVW2S4CoYcuKJkomat7bMXA/UoUZQ==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "global": "~4.4.0", + "is-function": "^1.0.1" + } + }, "node_modules/@vitejs/plugin-vue": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.4.0.tgz", @@ -607,6 +667,14 @@ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/acorn": { "version": "8.12.0", "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.12.0.tgz", @@ -619,6 +687,17 @@ "node": ">=0.4.0" } }, + "node_modules/aes-decrypter": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/aes-decrypter/-/aes-decrypter-4.0.2.tgz", + "integrity": "sha512-lc+/9s6iJvuaRe5qDlMTpCFjnwpkeOXp8qP3oiZ5jsj1MRg+SBVUmmICrhxHvc8OELSmc+fEyyxAuppY6hrWzw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^4.1.1", + "global": "^4.4.0", + "pkcs7": "^1.0.4" + } + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", @@ -772,6 +851,16 @@ } ] }, + "node_modules/cardboard-vr-display": { + "version": "1.0.19", + "resolved": "https://registry.npmmirror.com/cardboard-vr-display/-/cardboard-vr-display-1.0.19.tgz", + "integrity": "sha512-+MjcnWKAkb95p68elqZLDPzoiF/dGncQilLGvPBM5ZorABp/ao3lCs7nnRcYBckmuNkg1V/5rdGDKoUaCVsHzQ==", + "dependencies": { + "gl-preserve-state": "^1.0.0", + "nosleep.js": "^0.7.0", + "webvr-polyfill-dpdb": "^1.0.17" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", @@ -814,9 +903,9 @@ "dev": true }, "node_modules/core-js": { - "version": "3.37.1", - "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.37.1.tgz", - "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", + "version": "3.41.0", + "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.41.0.tgz", + "integrity": "sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==", "hasInstallScript": true, "peer": true, "funding": { @@ -849,6 +938,19 @@ "event-emitter": "^0.3.5" } }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" + }, + "node_modules/days": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/days/-/days-1.1.1.tgz", + "integrity": "sha512-vzeIwVsEIyA35GH4+mPd4hjVDNI87wYANyZFs0BHjBr5kIBH5zEl7LfD6Wr4SFZca4D3CU9IH1w4DuZLlXzKRw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/debug": { "version": "4.3.5", "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.5.tgz", @@ -879,6 +981,11 @@ "resolved": "https://registry.npmmirror.com/delegate/-/delegate-3.2.0.tgz", "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, "node_modules/downloadjs": { "version": "1.4.7", "resolved": "https://registry.npmmirror.com/downloadjs/-/downloadjs-1.4.7.tgz", @@ -1128,6 +1235,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gl-preserve-state": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/gl-preserve-state/-/gl-preserve-state-1.0.0.tgz", + "integrity": "sha512-zQZ25l3haD4hvgJZ6C9+s0ebdkW9y+7U2qxvGu1uWOJh8a4RU+jURIKEQhf8elIlFpMH6CrAY2tH0mYrRjet3Q==" + }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", @@ -1140,6 +1252,15 @@ "node": ">= 6" } }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", @@ -1158,6 +1279,11 @@ "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==", "dev": true }, + "node_modules/individual": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/individual/-/individual-2.0.0.tgz", + "integrity": "sha512-pWt8hBCqJsUWI/HtcfWod7+N9SgAqyPEaF7JQjwzjn5vGrpg6aQ5qeAFQ7dx//UH4J1O+7xqew+gCeeFt6xN/g==" + }, "node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz", @@ -1196,6 +1322,11 @@ "node": ">=0.10.0" } }, + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", @@ -1223,6 +1354,11 @@ "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", "dev": true }, + "node_modules/keycode": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/keycode/-/keycode-2.2.1.tgz", + "integrity": "sha512-Rdgz9Hl9Iv4QKi8b0OlCRQEzp4AgVxyCtz5S/+VIHezDmrDhkp2N2TqBWOLz0/gbeREXOOiI9/4b8BY9uw2vFg==" + }, "node_modules/local-pkg": { "version": "0.5.0", "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.5.0.tgz", @@ -1239,6 +1375,16 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/m3u8-parser": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/m3u8-parser/-/m3u8-parser-7.2.0.tgz", + "integrity": "sha512-CRatFqpjVtMiMaKXxNvuI3I++vUumIXVVT/JpCpdU/FynV/ceVw1qpPyyBNindL+JlPMSesx+WX1QJaZEJSaMQ==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^4.1.1", + "global": "^4.4.0" + } + }, "node_modules/magic-string": { "version": "0.30.10", "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.10.tgz", @@ -1293,6 +1439,14 @@ "node": ">= 0.6" } }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmmirror.com/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, "node_modules/minimatch": { "version": "9.0.4", "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.4.tgz", @@ -1320,12 +1474,42 @@ "ufo": "^1.5.3" } }, + "node_modules/mpd-parser": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/mpd-parser/-/mpd-parser-1.3.1.tgz", + "integrity": "sha512-1FuyEWI5k2HcmhS1HkKnUAQV7yFPfXPht2DnRRGtoiiAAW+ESTbtEXIDpRkwdU+XyrQuwrIym7UkoPKsZ0SyFw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^4.0.0", + "@xmldom/xmldom": "^0.8.3", + "global": "^4.4.0" + }, + "bin": { + "mpd-to-m3u8-json": "bin/parse.js" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/mux.js": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/mux.js/-/mux.js-7.1.0.tgz", + "integrity": "sha512-NTxawK/BBELJrYsZThEulyUMDVlLizKdxyAsMuzoCD1eFj97BVaA8D/CvKsKu6FOLYkFojN5CbM9h++ZTZtknA==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "global": "^4.4.0" + }, + "bin": { + "muxjs-transmux": "bin/transmux.js" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + } + }, "node_modules/nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", @@ -1370,6 +1554,11 @@ "node": ">=0.10.0" } }, + "node_modules/nosleep.js": { + "version": "0.7.0", + "resolved": "https://registry.npmmirror.com/nosleep.js/-/nosleep.js-0.7.0.tgz", + "integrity": "sha512-Z4B1HgvzR+en62ghwZf6BwAR6x4/pjezsiMcbF9KMLh7xoscpoYhaSXfY3lLkqC68AtW+/qLJ1lzvBIj0FGaTA==" + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", @@ -1417,6 +1606,17 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pkcs7": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/pkcs7/-/pkcs7-1.0.4.tgz", + "integrity": "sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==", + "dependencies": { + "@babel/runtime": "^7.5.5" + }, + "bin": { + "pkcs7": "bin/cli.js" + } + }, "node_modules/pkg-types": { "version": "1.1.1", "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.1.1.tgz", @@ -1515,6 +1715,11 @@ "node": ">=8.10.0" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz", @@ -1581,6 +1786,22 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rust-result": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/rust-result/-/rust-result-1.0.0.tgz", + "integrity": "sha512-6cJzSBU+J/RJCF063onnQf0cDUOHs9uZI1oroSGnHOph+CQTIJ5Pp2hK5kEQq1+7yE/EEWfulSNXAQ2jikPthA==", + "dependencies": { + "individual": "^2.0.0" + } + }, + "node_modules/safe-json-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/safe-json-parse/-/safe-json-parse-4.0.0.tgz", + "integrity": "sha512-RjZPPHugjK0TOzFrLZ8inw44s9bKox99/0AZW9o/BEQVrJfhI+fIHMErnPyRa89/yRXUUr93q+tiN6zhoVV4wQ==", + "dependencies": { + "rust-result": "^1.0.0" + } + }, "node_modules/sass": { "version": "1.77.6", "resolved": "https://registry.npmmirror.com/sass/-/sass-1.77.6.tgz", @@ -1827,6 +2048,11 @@ "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.1.tgz", "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, + "node_modules/url-toolkit": { + "version": "2.2.5", + "resolved": "https://registry.npmmirror.com/url-toolkit/-/url-toolkit-2.2.5.tgz", + "integrity": "sha512-mtN6xk+Nac+oyJ/PrI7tzfmomRVNFIWKUbG8jdYFt52hxbiReFAXIjYskvu64/dvuW71IcB7lV8l0HvZMac6Jg==" + }, "node_modules/util": { "version": "0.10.4", "resolved": "https://registry.npmmirror.com/util/-/util-0.10.4.tgz", @@ -1853,6 +2079,192 @@ "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.29.tgz", "integrity": "sha512-hQ2gAQcBO/CDpC82DCrinJNgOHI2v+FA7BDW4lMSPeBpQ7sRe2OLHWe5cph1s7D8DUQAwRt18dBDfJJ220APEA==" }, + "node_modules/video.js": { + "version": "8.22.0", + "resolved": "https://registry.npmmirror.com/video.js/-/video.js-8.22.0.tgz", + "integrity": "sha512-xge2kpjsvC0zgFJ1cqt+wTqsi21+huFswlonPFh7qiplypsb4FN/D2Rz6bWdG/S9eQaPHfWHsarmJL/7D3DHoA==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/http-streaming": "^3.17.0", + "@videojs/vhs-utils": "^4.1.1", + "@videojs/xhr": "2.7.0", + "aes-decrypter": "^4.0.2", + "global": "4.4.0", + "m3u8-parser": "^7.2.0", + "mpd-parser": "^1.3.1", + "mux.js": "^7.0.1", + "videojs-contrib-quality-levels": "4.1.0", + "videojs-font": "4.2.0", + "videojs-vtt.js": "0.15.5" + } + }, + "node_modules/videojs-contrib-quality-levels": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-4.1.0.tgz", + "integrity": "sha512-TfrXJJg1Bv4t6TOCMEVMwF/CoS8iENYsWNKip8zfhB5kTcegiFYezEA0eHAJPU64ZC8NQbxQgOwAsYU8VXbOWA==", + "dependencies": { + "global": "^4.4.0" + }, + "engines": { + "node": ">=16", + "npm": ">=8" + }, + "peerDependencies": { + "video.js": "^8" + } + }, + "node_modules/videojs-font": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/videojs-font/-/videojs-font-4.2.0.tgz", + "integrity": "sha512-YPq+wiKoGy2/M7ccjmlvwi58z2xsykkkfNMyIg4xb7EZQQNwB71hcSsB3o75CqQV7/y5lXkXhI/rsGAS7jfEmQ==" + }, + "node_modules/videojs-vr": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/videojs-vr/-/videojs-vr-2.0.0.tgz", + "integrity": "sha512-ix4iN8XHaDSEe89Jqybj9DuLKYuK33EIzcSI0IEdnv1KJuH8bd0PYlQEgqIZTOmWruFpW/+rjYFCVUQ9PTypJw==", + "dependencies": { + "@babel/runtime": "^7.14.5", + "global": "^4.4.0", + "three": "0.125.2", + "video.js": "^6 || ^7", + "webvr-polyfill": "0.10.12" + } + }, + "node_modules/videojs-vr/node_modules/@videojs/http-streaming": { + "version": "2.16.3", + "resolved": "https://registry.npmmirror.com/@videojs/http-streaming/-/http-streaming-2.16.3.tgz", + "integrity": "sha512-91CJv5PnFBzNBvyEjt+9cPzTK/xoVixARj2g7ZAvItA+5bx8VKdk5RxCz/PP2kdzz9W+NiDUMPkdmTsosmy69Q==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "3.0.5", + "aes-decrypter": "3.1.3", + "global": "^4.4.0", + "m3u8-parser": "4.8.0", + "mpd-parser": "^0.22.1", + "mux.js": "6.0.1", + "video.js": "^6 || ^7" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "video.js": "^6 || ^7" + } + }, + "node_modules/videojs-vr/node_modules/@videojs/vhs-utils": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/@videojs/vhs-utils/-/vhs-utils-3.0.5.tgz", + "integrity": "sha512-PKVgdo8/GReqdx512F+ombhS+Bzogiofy1LgAj4tN8PfdBx3HSS7V5WfJotKTqtOWGwVfSWsrYN/t09/DSryrw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "global": "^4.4.0", + "url-toolkit": "^2.2.1" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + } + }, + "node_modules/videojs-vr/node_modules/@videojs/xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/@videojs/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-7J361GiN1tXpm+gd0xz2QWr3xNWBE+rytvo8J3KuggFaLg+U37gZQ2BuPLcnkfGffy2e+ozY70RHC8jt7zjA6Q==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "global": "~4.4.0", + "is-function": "^1.0.1" + } + }, + "node_modules/videojs-vr/node_modules/aes-decrypter": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/aes-decrypter/-/aes-decrypter-3.1.3.tgz", + "integrity": "sha512-VkG9g4BbhMBy+N5/XodDeV6F02chEk9IpgRTq/0bS80y4dzy79VH2Gtms02VXomf3HmyRe3yyJYkJ990ns+d6A==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^3.0.5", + "global": "^4.4.0", + "pkcs7": "^1.0.4" + } + }, + "node_modules/videojs-vr/node_modules/m3u8-parser": { + "version": "4.8.0", + "resolved": "https://registry.npmmirror.com/m3u8-parser/-/m3u8-parser-4.8.0.tgz", + "integrity": "sha512-UqA2a/Pw3liR6Df3gwxrqghCP17OpPlQj6RBPLYygf/ZSQ4MoSgvdvhvt35qV+3NaaA0FSZx93Ix+2brT1U7cA==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^3.0.5", + "global": "^4.4.0" + } + }, + "node_modules/videojs-vr/node_modules/mpd-parser": { + "version": "0.22.1", + "resolved": "https://registry.npmmirror.com/mpd-parser/-/mpd-parser-0.22.1.tgz", + "integrity": "sha512-fwBebvpyPUU8bOzvhX0VQZgSohncbgYwUyJJoTSNpmy7ccD2ryiCvM7oRkn/xQH5cv73/xU7rJSNCLjdGFor0Q==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^3.0.5", + "@xmldom/xmldom": "^0.8.3", + "global": "^4.4.0" + }, + "bin": { + "mpd-to-m3u8-json": "bin/parse.js" + } + }, + "node_modules/videojs-vr/node_modules/mux.js": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/mux.js/-/mux.js-6.0.1.tgz", + "integrity": "sha512-22CHb59rH8pWGcPGW5Og7JngJ9s+z4XuSlYvnxhLuc58cA1WqGDQPzuG8I+sPm1/p0CdgpzVTaKW408k5DNn8w==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "global": "^4.4.0" + }, + "bin": { + "muxjs-transmux": "bin/transmux.js" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + } + }, + "node_modules/videojs-vr/node_modules/three": { + "version": "0.125.2", + "resolved": "https://registry.npmmirror.com/three/-/three-0.125.2.tgz", + "integrity": "sha512-7rIRO23jVKWcAPFdW/HREU2NZMGWPBZ4XwEMt0Ak0jwLUKVJhcKM55eCBWyGZq/KiQbeo1IeuAoo/9l2dzhTXA==" + }, + "node_modules/videojs-vr/node_modules/video.js": { + "version": "7.21.7", + "resolved": "https://registry.npmmirror.com/video.js/-/video.js-7.21.7.tgz", + "integrity": "sha512-T2s3WFAht7Zjr2OSJamND9x9Dn2O+Z5WuHGdh8jI5SYh5mkMdVTQ7vSRmA5PYpjXJ2ycch6jpMjkJEIEU2xxqw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/http-streaming": "2.16.3", + "@videojs/vhs-utils": "^3.0.4", + "@videojs/xhr": "2.6.0", + "aes-decrypter": "3.1.3", + "global": "^4.4.0", + "keycode": "^2.2.0", + "m3u8-parser": "4.8.0", + "mpd-parser": "0.22.1", + "mux.js": "6.0.1", + "safe-json-parse": "4.0.0", + "videojs-font": "3.2.0", + "videojs-vtt.js": "^0.15.5" + } + }, + "node_modules/videojs-vr/node_modules/videojs-font": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/videojs-font/-/videojs-font-3.2.0.tgz", + "integrity": "sha512-g8vHMKK2/JGorSfqAZQUmYYNnXmfec4MLhwtEFS+mMs2IDY398GLysy6BH6K+aS1KMNu/xWZ8Sue/X/mdQPliA==" + }, + "node_modules/videojs-vtt.js": { + "version": "0.15.5", + "resolved": "https://registry.npmmirror.com/videojs-vtt.js/-/videojs-vtt.js-0.15.5.tgz", + "integrity": "sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==", + "dependencies": { + "global": "^4.3.1" + } + }, "node_modules/vite": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", @@ -1949,25 +2361,38 @@ "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", "dev": true }, + "node_modules/webvr-polyfill": { + "version": "0.10.12", + "resolved": "https://registry.npmmirror.com/webvr-polyfill/-/webvr-polyfill-0.10.12.tgz", + "integrity": "sha512-trDJEVUQnRIVAnmImjEQ0BlL1NfuWl8+eaEdu+bs4g59c7OtETi/5tFkgEFDRaWEYwHntXs/uFF3OXZuutNGGA==", + "dependencies": { + "cardboard-vr-display": "^1.0.19" + } + }, + "node_modules/webvr-polyfill-dpdb": { + "version": "1.0.18", + "resolved": "https://registry.npmmirror.com/webvr-polyfill-dpdb/-/webvr-polyfill-dpdb-1.0.18.tgz", + "integrity": "sha512-O0S1ZGEWyPvyZEkS2VbyV7mtir/NM9MNK3EuhbHPoJ8EHTky2pTXehjIl+IiDPr+Lldgx129QGt3NGly7rwRPw==" + }, "node_modules/xgplayer": { - "version": "3.0.19", - "resolved": "https://registry.npmmirror.com/xgplayer/-/xgplayer-3.0.19.tgz", - "integrity": "sha512-yw4yinU5EtxS5YxOpctCVnHS/WW3tLTYjT+ZHivUYihlaAdudrmBmoOCcRYykGg7xz6PVIi6B79Gn1RBnGAnpg==", + "version": "3.0.21", + "resolved": "https://registry.npmmirror.com/xgplayer/-/xgplayer-3.0.21.tgz", + "integrity": "sha512-v4O+qzok994AZ2EeU1yFjWhGa6p6V8mdPpWHmfCL7AE3Bqo+MRsYEhWYIhj3FXPK8aUYO6VWyTFc1MThpLYZJA==", "dependencies": { "danmu.js": ">=1.1.6", "delegate": "^3.2.0", "downloadjs": "1.4.7", "eventemitter3": "^4.0.7", - "xgplayer-subtitles": "3.0.19" + "xgplayer-subtitles": "3.0.21" }, "peerDependencies": { "core-js": ">=3.12.1" } }, "node_modules/xgplayer-subtitles": { - "version": "3.0.19", - "resolved": "https://registry.npmmirror.com/xgplayer-subtitles/-/xgplayer-subtitles-3.0.19.tgz", - "integrity": "sha512-e2k1oFq1HSbnnHaK694FREqkFyq65ze4vETTIy8ABkOXItcr9/ugyNIJ4zCjD+jExSAVppM9FAF761X4+wRCeA==", + "version": "3.0.21", + "resolved": "https://registry.npmmirror.com/xgplayer-subtitles/-/xgplayer-subtitles-3.0.21.tgz", + "integrity": "sha512-Z3EVdFe31c0JUYwuG/C6+T2NKfiGqzzcd0na7FZ9Kx6nIDznGPtLeG6EZOaZXnfW8V35b/WhfsdKSBXYzBOOqw==", "dependencies": { "eventemitter3": "^4.0.7" }, @@ -1988,6 +2413,14 @@ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==" }, + "@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "requires": { + "regenerator-runtime": "^0.14.0" + } + }, "@esbuild/android-arm": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", @@ -2207,6 +2640,40 @@ "integrity": "sha512-PHHxeAASgiOpSmMjceweIrv2AxDZIkWXyaczksMoWvKV2YAYEhoizRuk/xFnKF+emUIi46TsQ+rvlm/t2BBCfA==", "requires": {} }, + "@videojs/http-streaming": { + "version": "3.17.0", + "resolved": "https://registry.npmmirror.com/@videojs/http-streaming/-/http-streaming-3.17.0.tgz", + "integrity": "sha512-Ch1P3tvvIEezeZXyK11UfWgp4cWKX4vIhZ30baN/lRinqdbakZ5hiAI3pGjRy3d+q/Epyc8Csz5xMdKNNGYpcw==", + "requires": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^4.1.1", + "aes-decrypter": "^4.0.2", + "global": "^4.4.0", + "m3u8-parser": "^7.2.0", + "mpd-parser": "^1.3.1", + "mux.js": "7.1.0", + "video.js": "^7 || ^8" + } + }, + "@videojs/vhs-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/@videojs/vhs-utils/-/vhs-utils-4.1.1.tgz", + "integrity": "sha512-5iLX6sR2ownbv4Mtejw6Ax+naosGvoT9kY+gcuHzANyUZZ+4NpeNdKMUhb6ag0acYej1Y7cmr/F2+4PrggMiVA==", + "requires": { + "@babel/runtime": "^7.12.5", + "global": "^4.4.0" + } + }, + "@videojs/xhr": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/@videojs/xhr/-/xhr-2.7.0.tgz", + "integrity": "sha512-giab+EVRanChIupZK7gXjHy90y3nncA2phIOyG3Ne5fvpiMJzvqYwiTOnEVW2S4CoYcuKJkomat7bMXA/UoUZQ==", + "requires": { + "@babel/runtime": "^7.5.5", + "global": "~4.4.0", + "is-function": "^1.0.1" + } + }, "@vitejs/plugin-vue": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.4.0.tgz", @@ -2318,12 +2785,28 @@ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" }, + "@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==" + }, "acorn": { "version": "8.12.0", "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.12.0.tgz", "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", "dev": true }, + "aes-decrypter": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/aes-decrypter/-/aes-decrypter-4.0.2.tgz", + "integrity": "sha512-lc+/9s6iJvuaRe5qDlMTpCFjnwpkeOXp8qP3oiZ5jsj1MRg+SBVUmmICrhxHvc8OELSmc+fEyyxAuppY6hrWzw==", + "requires": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^4.1.1", + "global": "^4.4.0", + "pkcs7": "^1.0.4" + } + }, "anymatch": { "version": "3.1.3", "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", @@ -2408,6 +2891,16 @@ "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001643.tgz", "integrity": "sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==" }, + "cardboard-vr-display": { + "version": "1.0.19", + "resolved": "https://registry.npmmirror.com/cardboard-vr-display/-/cardboard-vr-display-1.0.19.tgz", + "integrity": "sha512-+MjcnWKAkb95p68elqZLDPzoiF/dGncQilLGvPBM5ZorABp/ao3lCs7nnRcYBckmuNkg1V/5rdGDKoUaCVsHzQ==", + "requires": { + "gl-preserve-state": "^1.0.0", + "nosleep.js": "^0.7.0", + "webvr-polyfill-dpdb": "^1.0.17" + } + }, "chokidar": { "version": "3.6.0", "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", @@ -2439,9 +2932,9 @@ "dev": true }, "core-js": { - "version": "3.37.1", - "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.37.1.tgz", - "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", + "version": "3.41.0", + "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.41.0.tgz", + "integrity": "sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==", "peer": true }, "csstype": { @@ -2466,6 +2959,16 @@ "event-emitter": "^0.3.5" } }, + "dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" + }, + "days": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/days/-/days-1.1.1.tgz", + "integrity": "sha512-vzeIwVsEIyA35GH4+mPd4hjVDNI87wYANyZFs0BHjBr5kIBH5zEl7LfD6Wr4SFZca4D3CU9IH1w4DuZLlXzKRw==" + }, "debug": { "version": "4.3.5", "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.5.tgz", @@ -2485,6 +2988,11 @@ "resolved": "https://registry.npmmirror.com/delegate/-/delegate-3.2.0.tgz", "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" }, + "dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, "downloadjs": { "version": "1.4.7", "resolved": "https://registry.npmmirror.com/downloadjs/-/downloadjs-1.4.7.tgz", @@ -2668,6 +3176,11 @@ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, + "gl-preserve-state": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/gl-preserve-state/-/gl-preserve-state-1.0.0.tgz", + "integrity": "sha512-zQZ25l3haD4hvgJZ6C9+s0ebdkW9y+7U2qxvGu1uWOJh8a4RU+jURIKEQhf8elIlFpMH6CrAY2tH0mYrRjet3Q==" + }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", @@ -2677,6 +3190,15 @@ "is-glob": "^4.0.1" } }, + "global": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "requires": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, "hasown": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", @@ -2692,6 +3214,11 @@ "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==", "dev": true }, + "individual": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/individual/-/individual-2.0.0.tgz", + "integrity": "sha512-pWt8hBCqJsUWI/HtcfWod7+N9SgAqyPEaF7JQjwzjn5vGrpg6aQ5qeAFQ7dx//UH4J1O+7xqew+gCeeFt6xN/g==" + }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz", @@ -2721,6 +3248,11 @@ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, + "is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", @@ -2742,6 +3274,11 @@ "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", "dev": true }, + "keycode": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/keycode/-/keycode-2.2.1.tgz", + "integrity": "sha512-Rdgz9Hl9Iv4QKi8b0OlCRQEzp4AgVxyCtz5S/+VIHezDmrDhkp2N2TqBWOLz0/gbeREXOOiI9/4b8BY9uw2vFg==" + }, "local-pkg": { "version": "0.5.0", "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.5.0.tgz", @@ -2752,6 +3289,16 @@ "pkg-types": "^1.0.3" } }, + "m3u8-parser": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/m3u8-parser/-/m3u8-parser-7.2.0.tgz", + "integrity": "sha512-CRatFqpjVtMiMaKXxNvuI3I++vUumIXVVT/JpCpdU/FynV/ceVw1qpPyyBNindL+JlPMSesx+WX1QJaZEJSaMQ==", + "requires": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^4.1.1", + "global": "^4.4.0" + } + }, "magic-string": { "version": "0.30.10", "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.10.tgz", @@ -2794,6 +3341,14 @@ "mime-db": "1.52.0" } }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmmirror.com/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "requires": { + "dom-walk": "^0.1.0" + } + }, "minimatch": { "version": "9.0.4", "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.4.tgz", @@ -2815,12 +3370,32 @@ "ufo": "^1.5.3" } }, + "mpd-parser": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/mpd-parser/-/mpd-parser-1.3.1.tgz", + "integrity": "sha512-1FuyEWI5k2HcmhS1HkKnUAQV7yFPfXPht2DnRRGtoiiAAW+ESTbtEXIDpRkwdU+XyrQuwrIym7UkoPKsZ0SyFw==", + "requires": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^4.0.0", + "@xmldom/xmldom": "^0.8.3", + "global": "^4.4.0" + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "mux.js": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/mux.js/-/mux.js-7.1.0.tgz", + "integrity": "sha512-NTxawK/BBELJrYsZThEulyUMDVlLizKdxyAsMuzoCD1eFj97BVaA8D/CvKsKu6FOLYkFojN5CbM9h++ZTZtknA==", + "requires": { + "@babel/runtime": "^7.11.2", + "global": "^4.4.0" + } + }, "nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", @@ -2847,6 +3422,11 @@ "resolved": "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" }, + "nosleep.js": { + "version": "0.7.0", + "resolved": "https://registry.npmmirror.com/nosleep.js/-/nosleep.js-0.7.0.tgz", + "integrity": "sha512-Z4B1HgvzR+en62ghwZf6BwAR6x4/pjezsiMcbF9KMLh7xoscpoYhaSXfY3lLkqC68AtW+/qLJ1lzvBIj0FGaTA==" + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", @@ -2885,6 +3465,14 @@ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, + "pkcs7": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/pkcs7/-/pkcs7-1.0.4.tgz", + "integrity": "sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==", + "requires": { + "@babel/runtime": "^7.5.5" + } + }, "pkg-types": { "version": "1.1.1", "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.1.1.tgz", @@ -2946,6 +3534,11 @@ "picomatch": "^2.2.1" } }, + "regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, "resolve": { "version": "1.22.8", "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz", @@ -2981,6 +3574,22 @@ "queue-microtask": "^1.2.2" } }, + "rust-result": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/rust-result/-/rust-result-1.0.0.tgz", + "integrity": "sha512-6cJzSBU+J/RJCF063onnQf0cDUOHs9uZI1oroSGnHOph+CQTIJ5Pp2hK5kEQq1+7yE/EEWfulSNXAQ2jikPthA==", + "requires": { + "individual": "^2.0.0" + } + }, + "safe-json-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/safe-json-parse/-/safe-json-parse-4.0.0.tgz", + "integrity": "sha512-RjZPPHugjK0TOzFrLZ8inw44s9bKox99/0AZW9o/BEQVrJfhI+fIHMErnPyRa89/yRXUUr93q+tiN6zhoVV4wQ==", + "requires": { + "rust-result": "^1.0.0" + } + }, "sass": { "version": "1.77.6", "resolved": "https://registry.npmmirror.com/sass/-/sass-1.77.6.tgz", @@ -3137,6 +3746,11 @@ } } }, + "url-toolkit": { + "version": "2.2.5", + "resolved": "https://registry.npmmirror.com/url-toolkit/-/url-toolkit-2.2.5.tgz", + "integrity": "sha512-mtN6xk+Nac+oyJ/PrI7tzfmomRVNFIWKUbG8jdYFt52hxbiReFAXIjYskvu64/dvuW71IcB7lV8l0HvZMac6Jg==" + }, "util": { "version": "0.10.4", "resolved": "https://registry.npmmirror.com/util/-/util-0.10.4.tgz", @@ -3162,6 +3776,166 @@ } } }, + "video.js": { + "version": "8.22.0", + "resolved": "https://registry.npmmirror.com/video.js/-/video.js-8.22.0.tgz", + "integrity": "sha512-xge2kpjsvC0zgFJ1cqt+wTqsi21+huFswlonPFh7qiplypsb4FN/D2Rz6bWdG/S9eQaPHfWHsarmJL/7D3DHoA==", + "requires": { + "@babel/runtime": "^7.12.5", + "@videojs/http-streaming": "^3.17.0", + "@videojs/vhs-utils": "^4.1.1", + "@videojs/xhr": "2.7.0", + "aes-decrypter": "^4.0.2", + "global": "4.4.0", + "m3u8-parser": "^7.2.0", + "mpd-parser": "^1.3.1", + "mux.js": "^7.0.1", + "videojs-contrib-quality-levels": "4.1.0", + "videojs-font": "4.2.0", + "videojs-vtt.js": "0.15.5" + } + }, + "videojs-contrib-quality-levels": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-4.1.0.tgz", + "integrity": "sha512-TfrXJJg1Bv4t6TOCMEVMwF/CoS8iENYsWNKip8zfhB5kTcegiFYezEA0eHAJPU64ZC8NQbxQgOwAsYU8VXbOWA==", + "requires": { + "global": "^4.4.0" + } + }, + "videojs-font": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/videojs-font/-/videojs-font-4.2.0.tgz", + "integrity": "sha512-YPq+wiKoGy2/M7ccjmlvwi58z2xsykkkfNMyIg4xb7EZQQNwB71hcSsB3o75CqQV7/y5lXkXhI/rsGAS7jfEmQ==" + }, + "videojs-vr": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/videojs-vr/-/videojs-vr-2.0.0.tgz", + "integrity": "sha512-ix4iN8XHaDSEe89Jqybj9DuLKYuK33EIzcSI0IEdnv1KJuH8bd0PYlQEgqIZTOmWruFpW/+rjYFCVUQ9PTypJw==", + "requires": { + "@babel/runtime": "^7.14.5", + "global": "^4.4.0", + "three": "0.125.2", + "video.js": "^6 || ^7", + "webvr-polyfill": "0.10.12" + }, + "dependencies": { + "@videojs/http-streaming": { + "version": "2.16.3", + "resolved": "https://registry.npmmirror.com/@videojs/http-streaming/-/http-streaming-2.16.3.tgz", + "integrity": "sha512-91CJv5PnFBzNBvyEjt+9cPzTK/xoVixARj2g7ZAvItA+5bx8VKdk5RxCz/PP2kdzz9W+NiDUMPkdmTsosmy69Q==", + "requires": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "3.0.5", + "aes-decrypter": "3.1.3", + "global": "^4.4.0", + "m3u8-parser": "4.8.0", + "mpd-parser": "^0.22.1", + "mux.js": "6.0.1", + "video.js": "^6 || ^7" + } + }, + "@videojs/vhs-utils": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/@videojs/vhs-utils/-/vhs-utils-3.0.5.tgz", + "integrity": "sha512-PKVgdo8/GReqdx512F+ombhS+Bzogiofy1LgAj4tN8PfdBx3HSS7V5WfJotKTqtOWGwVfSWsrYN/t09/DSryrw==", + "requires": { + "@babel/runtime": "^7.12.5", + "global": "^4.4.0", + "url-toolkit": "^2.2.1" + } + }, + "@videojs/xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/@videojs/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-7J361GiN1tXpm+gd0xz2QWr3xNWBE+rytvo8J3KuggFaLg+U37gZQ2BuPLcnkfGffy2e+ozY70RHC8jt7zjA6Q==", + "requires": { + "@babel/runtime": "^7.5.5", + "global": "~4.4.0", + "is-function": "^1.0.1" + } + }, + "aes-decrypter": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/aes-decrypter/-/aes-decrypter-3.1.3.tgz", + "integrity": "sha512-VkG9g4BbhMBy+N5/XodDeV6F02chEk9IpgRTq/0bS80y4dzy79VH2Gtms02VXomf3HmyRe3yyJYkJ990ns+d6A==", + "requires": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^3.0.5", + "global": "^4.4.0", + "pkcs7": "^1.0.4" + } + }, + "m3u8-parser": { + "version": "4.8.0", + "resolved": "https://registry.npmmirror.com/m3u8-parser/-/m3u8-parser-4.8.0.tgz", + "integrity": "sha512-UqA2a/Pw3liR6Df3gwxrqghCP17OpPlQj6RBPLYygf/ZSQ4MoSgvdvhvt35qV+3NaaA0FSZx93Ix+2brT1U7cA==", + "requires": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^3.0.5", + "global": "^4.4.0" + } + }, + "mpd-parser": { + "version": "0.22.1", + "resolved": "https://registry.npmmirror.com/mpd-parser/-/mpd-parser-0.22.1.tgz", + "integrity": "sha512-fwBebvpyPUU8bOzvhX0VQZgSohncbgYwUyJJoTSNpmy7ccD2ryiCvM7oRkn/xQH5cv73/xU7rJSNCLjdGFor0Q==", + "requires": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^3.0.5", + "@xmldom/xmldom": "^0.8.3", + "global": "^4.4.0" + } + }, + "mux.js": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/mux.js/-/mux.js-6.0.1.tgz", + "integrity": "sha512-22CHb59rH8pWGcPGW5Og7JngJ9s+z4XuSlYvnxhLuc58cA1WqGDQPzuG8I+sPm1/p0CdgpzVTaKW408k5DNn8w==", + "requires": { + "@babel/runtime": "^7.11.2", + "global": "^4.4.0" + } + }, + "three": { + "version": "0.125.2", + "resolved": "https://registry.npmmirror.com/three/-/three-0.125.2.tgz", + "integrity": "sha512-7rIRO23jVKWcAPFdW/HREU2NZMGWPBZ4XwEMt0Ak0jwLUKVJhcKM55eCBWyGZq/KiQbeo1IeuAoo/9l2dzhTXA==" + }, + "video.js": { + "version": "7.21.7", + "resolved": "https://registry.npmmirror.com/video.js/-/video.js-7.21.7.tgz", + "integrity": "sha512-T2s3WFAht7Zjr2OSJamND9x9Dn2O+Z5WuHGdh8jI5SYh5mkMdVTQ7vSRmA5PYpjXJ2ycch6jpMjkJEIEU2xxqw==", + "requires": { + "@babel/runtime": "^7.12.5", + "@videojs/http-streaming": "2.16.3", + "@videojs/vhs-utils": "^3.0.4", + "@videojs/xhr": "2.6.0", + "aes-decrypter": "3.1.3", + "global": "^4.4.0", + "keycode": "^2.2.0", + "m3u8-parser": "4.8.0", + "mpd-parser": "0.22.1", + "mux.js": "6.0.1", + "safe-json-parse": "4.0.0", + "videojs-font": "3.2.0", + "videojs-vtt.js": "^0.15.5" + } + }, + "videojs-font": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/videojs-font/-/videojs-font-3.2.0.tgz", + "integrity": "sha512-g8vHMKK2/JGorSfqAZQUmYYNnXmfec4MLhwtEFS+mMs2IDY398GLysy6BH6K+aS1KMNu/xWZ8Sue/X/mdQPliA==" + } + } + }, + "videojs-vtt.js": { + "version": "0.15.5", + "resolved": "https://registry.npmmirror.com/videojs-vtt.js/-/videojs-vtt.js-0.15.5.tgz", + "integrity": "sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==", + "requires": { + "global": "^4.3.1" + } + }, "vite": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", @@ -3206,22 +3980,35 @@ "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", "dev": true }, + "webvr-polyfill": { + "version": "0.10.12", + "resolved": "https://registry.npmmirror.com/webvr-polyfill/-/webvr-polyfill-0.10.12.tgz", + "integrity": "sha512-trDJEVUQnRIVAnmImjEQ0BlL1NfuWl8+eaEdu+bs4g59c7OtETi/5tFkgEFDRaWEYwHntXs/uFF3OXZuutNGGA==", + "requires": { + "cardboard-vr-display": "^1.0.19" + } + }, + "webvr-polyfill-dpdb": { + "version": "1.0.18", + "resolved": "https://registry.npmmirror.com/webvr-polyfill-dpdb/-/webvr-polyfill-dpdb-1.0.18.tgz", + "integrity": "sha512-O0S1ZGEWyPvyZEkS2VbyV7mtir/NM9MNK3EuhbHPoJ8EHTky2pTXehjIl+IiDPr+Lldgx129QGt3NGly7rwRPw==" + }, "xgplayer": { - "version": "3.0.19", - "resolved": "https://registry.npmmirror.com/xgplayer/-/xgplayer-3.0.19.tgz", - "integrity": "sha512-yw4yinU5EtxS5YxOpctCVnHS/WW3tLTYjT+ZHivUYihlaAdudrmBmoOCcRYykGg7xz6PVIi6B79Gn1RBnGAnpg==", + "version": "3.0.21", + "resolved": "https://registry.npmmirror.com/xgplayer/-/xgplayer-3.0.21.tgz", + "integrity": "sha512-v4O+qzok994AZ2EeU1yFjWhGa6p6V8mdPpWHmfCL7AE3Bqo+MRsYEhWYIhj3FXPK8aUYO6VWyTFc1MThpLYZJA==", "requires": { "danmu.js": ">=1.1.6", "delegate": "^3.2.0", "downloadjs": "1.4.7", "eventemitter3": "^4.0.7", - "xgplayer-subtitles": "3.0.19" + "xgplayer-subtitles": "3.0.21" } }, "xgplayer-subtitles": { - "version": "3.0.19", - "resolved": "https://registry.npmmirror.com/xgplayer-subtitles/-/xgplayer-subtitles-3.0.19.tgz", - "integrity": "sha512-e2k1oFq1HSbnnHaK694FREqkFyq65ze4vETTIy8ABkOXItcr9/ugyNIJ4zCjD+jExSAVppM9FAF761X4+wRCeA==", + "version": "3.0.21", + "resolved": "https://registry.npmmirror.com/xgplayer-subtitles/-/xgplayer-subtitles-3.0.21.tgz", + "integrity": "sha512-Z3EVdFe31c0JUYwuG/C6+T2NKfiGqzzcd0na7FZ9Kx6nIDznGPtLeG6EZOaZXnfW8V35b/WhfsdKSBXYzBOOqw==", "requires": { "eventemitter3": "^4.0.7" } diff --git a/package.json b/package.json index 7c7a051..e69c14c 100644 --- a/package.json +++ b/package.json @@ -13,13 +13,17 @@ "dependencies": { "autoprefixer": "^10.4.19", "axios": "^1.7.2", + "dayjs": "^1.11.13", + "days": "^1.1.1", "mescroll.js": "^1.4.2", "path": "^0.12.7", "swiper": "^11.1.4", "vant": "^4.9.1", + "video.js": "^8.22.0", + "videojs-vr": "^2.0.0", "vue": "^3.3.4", "vue-router": "^4.3.3", - "xgplayer": "^3.0.19" + "xgplayer": "^3.0.21" }, "devDependencies": { "@vant/auto-import-resolver": "^1.2.1", diff --git a/public/bg2.png b/public/bg2.png index 7f0ce2b..1daca89 100644 Binary files a/public/bg2.png and b/public/bg2.png differ diff --git a/public/js/aliplayer-h5-min.js b/public/js/aliplayer-h5-min.js new file mode 100644 index 0000000..3f107c9 --- /dev/null +++ b/public/js/aliplayer-h5-min.js @@ -0,0 +1,2 @@ +/*! aliyun-aliplayer - v2.16.3 - 2023-07-20 14.18.20 */ +!function(e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).Aliplayer=e()}(function(){var define,module,exports;return function i(n,o,a){function s(t,e){if(!o[t]){if(!n[t]){var r="function"==typeof require&&require;if(!e&&r)return r(t,!0);if(l)return l(t,!0);throw(e=new Error("Cannot find module '"+t+"'")).code="MODULE_NOT_FOUND",e}r=o[t]={exports:{}},n[t][0].call(r.exports,function(e){return s(n[t][1][e]||e)},r,r.exports,i,n,o,a)}return o[t].exports}for(var l="function"==typeof require&&require,e=0;e>>2]>>>24-o%4*8&255;t[i+o>>>2]|=a<<24-(i+o)%4*8}else for(var s=0;s>>2]=r[s>>>2];return this.sigBytes+=n,this},clamp:function(){var e=this.words,t=this.sigBytes;e[t>>>2]&=4294967295<<32-t%4*8,e.length=c.ceil(t/4)},clone:function(){var e=o.clone.call(this);return e.words=this.words.slice(0),e},random:function(e){for(var t=[],r=0;r>>2]>>>24-n%4*8&255;i.push((o>>>4).toString(16)),i.push((15&o).toString(16))}return i.join("")},parse:function(e){for(var t=e.length,r=[],i=0;i>>3]|=parseInt(e.substr(i,2),16)<<24-i%8*4;return new u.init(r,t/2)}},l=a.Latin1={stringify:function(e){for(var t=e.words,r=e.sigBytes,i=[],n=0;n>>2]>>>24-n%4*8&255;i.push(String.fromCharCode(o))}return i.join("")},parse:function(e){for(var t=e.length,r=[],i=0;i>>2]|=(255&e.charCodeAt(i))<<24-i%4*8;return new u.init(r,t)}},d=a.Utf8={stringify:function(e){try{return decodeURIComponent(escape(l.stringify(e)))}catch(e){throw new Error("Malformed UTF-8 data")}},parse:function(e){return l.parse(unescape(encodeURIComponent(e)))}},p=n.BufferedBlockAlgorithm=o.extend({reset:function(){this._data=new u.init,this._nDataBytes=0},_append:function(e){"string"==typeof e&&(e=d.parse(e)),this._data.concat(e),this._nDataBytes+=e.sigBytes},_process:function(e){var t,r=this._data,i=r.words,n=r.sigBytes,o=this.blockSize,a=n/(4*o),s=(a=e?c.ceil(a):c.max((0|a)-this._minBufferSize,0))*o,e=c.min(4*s,n);if(s){for(var l=0;l>>2]>>>24-o%4*8&255)<<16|(t[o+1>>>2]>>>24-(o+1)%4*8&255)<<8|t[o+2>>>2]>>>24-(o+2)%4*8&255,s=0;s<4&&o+.75*s>>6*(3-s)&63));var l=i.charAt(64);if(l)for(;n.length%4;)n.push(l);return n.join("")},parse:function(e){var t=e.length,r=this._map;if(!(i=this._reverseMap))for(var i=this._reverseMap=[],n=0;n>>6-h%4*2,d[p>>>2]|=(o|a)<<24-p%4*8,p++);return f.create(d,p)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="},e.enc.Base64},"object"==typeof r?t.exports=r=n(e("./core")):"function"==typeof define&&define.amd?define(["./core"],n):n(i.CryptoJS)},{"./core":2}],4:[function(e,t,r){var i,n;i=this,n=function(e){return e.enc.Utf8},"object"==typeof r?t.exports=r=n(e("./core")):"function"==typeof define&&define.amd?define(["./core"],n):n(i.CryptoJS)},{"./core":2}],5:[function(e,t,r){var i,n;i=this,n=function(e){return e.HmacSHA1},"object"==typeof r?t.exports=r=n(e("./core"),e("./sha1"),e("./hmac")):"function"==typeof define&&define.amd?define(["./core","./sha1","./hmac"],n):n(i.CryptoJS)},{"./core":2,"./hmac":6,"./sha1":7}],6:[function(e,t,r){var i,n;i=this,n=function(e){var t,s;t=e.lib.Base,s=e.enc.Utf8,e.algo.HMAC=t.extend({init:function(e,t){e=this._hasher=new e.init,"string"==typeof t&&(t=s.parse(t));for(var r=e.blockSize,i=4*r,e=((t=t.sigBytes>i?e.finalize(t):t).clamp(),this._oKey=t.clone()),t=this._iKey=t.clone(),n=e.words,o=t.words,a=0;a>>31;var c=(i<<5|i>>>27)+s+u[l];c+=l<20?1518500249+(n&o|~n&a):l<40?1859775393+(n^o^a):l<60?(n&o|n&a|o&a)-1894007588:(n^o^a)-899497514,s=a,a=o,o=n<<30|n>>>2,n=i,i=c}r[0]=r[0]+i|0,r[1]=r[1]+n|0,r[2]=r[2]+o|0,r[3]=r[3]+a|0,r[4]=r[4]+s|0},_doFinalize:function(){var e=this._data,t=e.words,r=8*this._nDataBytes,i=8*e.sigBytes;return t[i>>>5]|=128<<24-i%32,t[14+(64+i>>>9<<4)]=Math.floor(r/4294967296),t[15+(64+i>>>9<<4)]=r,e.sigBytes=4*t.length,this._process(),this._hash},clone:function(){var e=n.clone.call(this);return e._hash=this._hash.clone(),e}}),t.SHA1=n._createHelper(r),t.HmacSHA1=n._createHmacHelper(r),e.SHA1},"object"==typeof r?t.exports=r=n(e("./core")):"function"==typeof define&&define.amd?define(["./core"],n):n(i.CryptoJS)},{"./core":2}],8:[function(V,r,i){!function(B,j){!function(){var e,t;e=this,t=function(){"use strict";function l(e){return"function"==typeof e}var r=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)},i=0,t=void 0,n=void 0,a=function(e,t){d[i]=e,d[i+1]=t,2===(i+=2)&&(n?n(p):M())};var e="undefined"!=typeof window?window:void 0,o=e||{},o=o.MutationObserver||o.WebKitMutationObserver,s="undefined"==typeof self&&void 0!==B&&"[object process]"==={}.toString.call(B),c="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel;function u(){var e=setTimeout;return function(){return e(p,1)}}var d=new Array(1e3);function p(){for(var e=0;e"+a.get("Cancel_Text")+"",e},bindEvent:function(){var i=this,e=(i._player.on(s.Private.AutoStreamShow,function(e){var t,r=document.querySelector("#"+i.getId()+" .tip-text");i._player._getLowerQualityLevel&&(t=i._player._getLowerQualityLevel())&&(i._switchUrl=t,r.innerText=a.get("Auto_Stream_Tip_Text").replace("$$",t.item.desc),n.css(i.el(),"display","block"))}),i._player.on(s.Private.AutoStreamHide,function(e){document.querySelector("#"+i.getId()+" .tip-text");n.css(i.el(),"display","none")}),document.querySelector("#"+i.getId()+" .prism-button-ok")),e=(o.on(e,"click",function(){i._player._changeStream&&i._switchUrl&&(i._player._changeStream(i._switchUrl.index,a.get("Quality_Change_Text")),i._player.trigger(s.Private.SettingListHide)),n.css(i.el(),"display","none")}),document.querySelector("#"+i.getId()+" .prism-button-cancel"));o.on(e,"click",function(){n.css(i.el(),"display","none"),i._player.trigger(s.Private.SettingListHide)})}});t.exports=e},{"../lang/index":23,"../lib/dom":32,"../lib/event":33,"../lib/ua":49,"../lib/util":51,"../player/base/event/eventtype":70,"../ui/component":130}],12:[function(e,t,r){var i=e("../ui/component"),a=e("../lib/dom"),n=e("../lib/event"),o=e("../lib/ua"),s=e("../lib/function"),l=(e("../lang/index"),e("../lib/util")),c=e("../config"),u=e("../lib/playerutil"),d=e("../player/base/event/eventtype"),e=i.extend({init:function(e,t){i.call(this,e,t),this.className=t.className||"prism-liveshift-progress",this.addClass(this.className),this._liveshiftService=e._liveshiftService},createEl:function(){var e=i.prototype.createEl.call(this);return e.innerHTML='

',e},bindEvent:function(){function t(e){r._progressDown=e}var r=this,e=(this.loadedNode=document.querySelector("#"+this.id()+" .prism-progress-loaded"),this.playedNode=document.querySelector("#"+this.id()+" .prism-progress-played"),this.cursorNode=document.querySelector("#"+this.id()+" .prism-progress-cursor"),this.timeNode=document.querySelector("#"+this.id()+" .prism-progress-time"),this.controlNode=document.querySelector("#"+this._player._options.id+" .prism-controlbar"),this.seperatorNode=document.querySelector("#"+this.id()+" .prism-liveshift-seperator"),this.progressNode=document.querySelector("#"+this.id()+" .prism-enable-liveshift"),document.querySelector("#"+this.id()+" .prism-progress-cursor img")),i="//"+c.domain+c.path+c.h5Version+"/skins/default/img/dragcursor.png";this._player._options.skinsDomain?i=this._player._options.skinsDomain+"/skins/default/img/dragcursor.png":c.domain?-1o?o:sec},_onMouseClick:function(e){var t=this,e=this._getSeconds(e),r=this._liveshiftService.availableLiveShiftTime,i=r-e,n=this._player._options,r=(i<=n.liveShiftMinOffset&&(e=r-(i=n.liveShiftMinOffset)),this._player.trigger(d.Private.SeekStart,{fromTime:this._getCurrentTime()}),this._liveshiftService.getSourceUrl(i)),n=u.isHls(t._player._options.source);t._player._loadByUrlInner(r,e,!0),t._player.trigger(d.Private.Play_Btn_Hide),t._liveshiftService.seekTime=e,t._player.trigger(d.Private.EndStart,{toTime:e}),t._updateProgressBar(this.playedNode,e),t._updateCursorPosition(e),setTimeout(function(){t._progressDown||t._onMouseOut()},500),n&&setTimeout(function(){t._player.play()})},_onMouseDown:function(e){var t=this;e.preventDefault(),this._player.trigger(d.Private.SeekStart,{fromTime:this._getCurrentTime()}),n.on(this.controlNode,"mousemove",function(e){t._onMouseMove(e)}),n.on(this.controlNode,"touchmove",function(e){t._onMouseMove(e)}),n.on(this.controlNode,"mouseup",function(e){t._onMouseUp(e)}),n.on(this.controlNode,"touchend",function(e){t._onMouseUp(e)})},_onMouseUp:function(e){e.preventDefault(),n.off(this.controlNode,"mousemove"),n.off(this.controlNode,"touchmove"),n.off(this._player.tag,"mouseup"),n.off(this._player.tag,"touchend"),n.off(this.controlNode,"mouseup"),n.off(this.controlNode,"touchend"),this._onMouseClick(e)},_onMouseMove:function(e){e.preventDefault()},_onTimeupdate:function(e){this._player._seeking||(o.IS_ANDROID&&o.IS_UC&&(this._hasResetFlagUC&&this._player.getCurrentTime()&&(this._hasResetFlagUC=!1,this._basePtsUC=this._player.getCurrentTime()),this._player.getCurrentTime()||(this._hasResetFlagUC=!0,this._basePtsUC=0)),this._updateProgressBar(this.playedNode,this._getCurrentTime()),this._updateCursorPosition(this._getCurrentTime()),this._player.trigger(d.Private.UpdateProgressBar,{time:this._getCurrentTime()}))},_getCurrentTime:function(){var e=this._liveshiftService.seekTime,e=(-1==e&&(e=0),this._player.getCurrentTime()+e);return o.IS_ANDROID&&o.IS_UC&&(e-=this._basePtsUC||0),e},_onProgress:function(e){this._player.getDuration()&&1<=this._player.getBuffered().length&&this._updateProgressBar(this.loadedNode,this._player.getBuffered().end(this._player.getBuffered().length-1))},_updateProgressBar:function(e,t){var r,i;1!=this._player._switchSourcing&&(i=0,-1==this._liveshiftService.seekTime?i=1:1<(i=(r=this._liveshiftService.availableLiveShiftTime)?t/r:0)&&(this._liveshiftService.seekTime=-(i=1)),this.liveShiftStartDisplay,e)&&a.css(e,"width",100*i+"%")},_updateCursorPosition:function(e){var t,r,i,n;this._player.el()&&1!=this._player._switchSourcing&&(i=0,n=1,t=this._player.el().clientWidth,-1==this._liveshiftService.seekTime?i=1:1<(i=(r=this._liveshiftService.availableLiveShiftTime)?e/r:0)&&(this._liveshiftService.seekTime=-1),0!=t&&(n=1-(e=10/t),i-=e),i=i<0?0:i,this.cursorNode)&&(nt.seekTime&&-1!=t.seekTime?(e=i._liveshiftService.getBaseTime(),e=n.formatTime(e+i._player.getCurrentTime()),r.innerText=e):t.currentTimeDisplay&&(r.innerText=t.currentTimeDisplay)}),this._player.on(o.Private.LiveShiftQueryCompleted,function(){i.updateTime()})},updateTime:function(){document.querySelector("#"+this.id()+" .end-time").innerText=this._liveshiftService.liveTimeRange.endDisplay,document.querySelector("#"+this.id()+" .live-time").innerText=this._liveshiftService.currentTimeDisplay}});t.exports=e},{"../lib/util":51,"../player/base/event/eventtype":70,"../ui/component":130}],14:[function(e,t,r){e=e("../package.json");t.exports={domain:"g.alicdn.com",path:"/apsara-media-box/imp-web-player/",flashVersion:"2.8.2",h5Version:e.version.split("-")[0],rtsVersion:"2.2.9",cityBrain:!0,logDuration:10,logCount:100,logReportTo:"https://videocloud.cn-hangzhou.log.aliyuncs.com/logstores/newplayer/track"}},{"../package.json":10}],15:[function(e,t,r){var i,n,o,a;e("./lib/patch-ssr").isSSR||(e("./lang/index").load(),i=e("./player/adaptivePlayer"),n=e("./lib/reloadInstanceUtil"),o=e("./lib/componentutil"),a=e("./config"),(e=function(e,t){e.useH5Prism=!0;e=i.create(e,t);return n.storeUserEvents(e),e}).getVersion=function(){return a.h5Version},o.register(e),(o=window.Aliplayer=e).players={},e.reloadInstance=n.reloadInstance,"undefined"==typeof Uint8Array)||Uint8Array.prototype.slice||Object.defineProperty(Uint8Array.prototype,"slice",{value:Array.prototype.slice}),t.exports=o},{"./config":14,"./lang/index":23,"./lib/componentutil":27,"./lib/patch-ssr":44,"./lib/reloadInstanceUtil":47,"./player/adaptivePlayer":66}],16:[function(e,t,r){var i=e("../player/base/event/eventtype"),n=e("../lib/constants"),o=e("../lang/index");t.exports=function(){function e(e){var t=this;void 0===e&&(e={}),this.interval=3e3,this.player=null,this.timer=null,this.playerInitDone=!1,this.player=e.player,this.player.on(i.Player.Init,function(){t.playerInitDone=!0})}var t=e.prototype;return t.start=function(){var e=this;this.stop(),this.player&&this.player._options&&!this.player._options.preventRecord||(this.timer=setInterval(function(){e.playerInitDone&&e.check()},this.interval))},t.stop=function(){this.clearTimer()},t.check=function(){var e=!1,t=this.detectPrototype()||this.detectNativeFn();return(t||this.detectDeperateVideo())&&(console.log("isMediaSourceModified",t),this.clearTimer(),this.displayError(),this.setupErrorStyle(),this.destroyVideo(),localStorage.setItem("_intercept_mediastream_",""),e=!0),e},t.dispose=function(){this.stop(),this.player=null,this.playerInitDone=!1},t.clearTimer=function(){this.timer&&(clearInterval(this.timer),this.timer=null)},t.displayError=function(){var e=this.player,t={mediaId:e._options&&e._options.vid?e._options.vid:"",error_code:n.ErrorCode.RecordNotAllowed,error_msg:o.get("Record_Not_Allowed")};e.logError(t),e.trigger(i.Player.Error,t)},t.setupErrorStyle=function(){this.hideRetry();var e=document.querySelector(".prism-ErrorMessage");e&&(e.style.opacity="1",e.style.visibility="visible")},t.hideRetry=function(){var e=document.querySelector("#"+this.player.id()+" .prism-button-retry");e&&(e.style.display="none")},t.destroyVideo=function(){this.player._drm&&this.player.destroy();var e=this.player.tag;e&&e.parentNode&&e.parentNode.removeChild(e)},t.detectPrototype=function(){var e=window,t=e.MediaSource;return t&&e.EventTarget&&t.__proto__.__proto__===e.EventTarget},t.detectNativeFn=function(){var e=window.MediaSource;return e&&!this.isNativeFn(e.prototype.addSourceBuffer)},t.isNativeFn=function(e){var t=RegExp("^".concat(Function.prototype.toString.call(Object.prototype.hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?"),"$")),r=typeof e;return null!==e&&("object"==r||"function"==r)&&t.test(e)},t.detectDeperateVideo=function(){var e=this.player.tag;if(e)return-1!==(e.getAttribute("id")||"").indexOf("360")},e}()},{"../lang/index":23,"../lib/constants":28,"../player/base/event/eventtype":70}],17:[function(e,t,r){var i=e("../lib/oo"),n=e("../lang/index"),e=i.extend({init:function(e,t){this._player=e,this._options=e.options()}}),o=(e.prototype.handle=function(e){var t,r;this._options.autoPlayDelay&&(t=(t=this._options.autoPlayDelayDisplayText)||n.get("AutoPlayDelayDisplayText").replace("$$",this._options.autoPlayDelay),this._player.trigger("info_show",t),this._player.trigger("h5_loading_hide"),this._player.trigger("play_btn_hide"),(r=this)._timeHandler=setTimeout(function(){r._player.trigger("info_hide"),r._options.autoPlayDelay=0,e&&e()},1e3*this._options.autoPlayDelay),this._player.on("play",function(){o(r)}),this._player.on("pause",function(){o(r)}))},e.prototype.dispose=function(){o(this),this._player=null},function(e){e._timeHandler&&(clearTimeout(e._timeHandler),e._timeHandler=null)});t.exports=e},{"../lang/index":23,"../lib/oo":43}],18:[function(e,t,r){var i=e("../lib/event"),n=e("../lib/data"),o=e("../player/base/event/eventtype"),a=n.guid(),e={};function s(e){var t,r,i=this._options.keyFastForwardStep,n=this._options.isLive;switch(e&&e.keyCode){case 39:n||(e.preventDefault(),t=this.getDuration(),r=this.getCurrentTime()+i,this.seek(r=tinstall plugin, or check if disable Flash plugin"}},{}],22:[function(e,t,r){t.exports=t.exports={OD:"\u539f\u753b",FD:"\u6d41\u7545",LD:"\u6807\u6e05",SD:"\u9ad8\u6e05",HD:"\u8d85\u6e05","2K":"2K","4K":"4K",FHD:"\u5168\u9ad8\u6e05",XLD:"\u6781\u901f",SQ:"\u666e\u901a\u97f3\u8d28",HQ:"\u9ad8\u97f3\u8d28",Forbidden_Text:"\u5185\u90e8\u4fe1\u606f\uff0c\u4e25\u7981\u5916\u4f20",Refresh:"\u5237\u65b0",Diagnosis:"\u8bca\u65ad",Live_Finished:"\u76f4\u64ad\u5df2\u7ed3\u675f,\u8c22\u8c22\u89c2\u770b",Play:"\u64ad\u653e",Pause:"\u6682\u505c",Snapshot:"\u622a\u56fe",Replay:"\u91cd\u64ad",Live:"\u76f4\u64ad",Encrypt:"\u52a0\u5bc6",Sound:"\u58f0\u97f3",Fullscreen:"\u5168\u5c4f",Exist_Fullscreen:"\u9000\u51fa\u5168\u5c4f",Resolution:"\u6e05\u6670\u5ea6",Next:"\u4e0b\u4e00\u96c6",Brightness:"\u4eae\u5ea6",Default:"\u9ed8\u8ba4",Contrast:"\u5bf9\u6bd4\u5ea6",Titles_Credits:"\u7247\u5934\u7247\u5c3e",Skip_Titles:"\u8df3\u8fc7\u7247\u5934",Skip_Credits:"\u8df3\u8fc7\u7247\u5c3e",Not_Support_Out_Site:"\u8be5\u89c6\u9891\u6682\u4e0d\u652f\u6301\u7ad9\u5916\u64ad\u653e\uff0c\u8bf7\u5230\u6dd8TV\u89c2\u770b",Watch_Now:"\u7acb\u5373\u89c2\u770b",Network_Error:"\u7f51\u7edc\u65e0\u6cd5\u8fde\u63a5\uff0c\u8bf7\u5c1d\u8bd5\u68c0\u67e5\u7f51\u7edc\u540e\u5237\u65b0\u8bd5\u8bd5",Video_Error:"\u89c6\u9891\u64ad\u653e\u5f02\u5e38\uff0c\u8bf7\u5237\u65b0\u8bd5\u8bd5",Decode_Error:"\u64ad\u653e\u6570\u636e\u89e3\u7801\u9519\u8bef",Live_Not_Start:"\u4eb2\uff0c\u76f4\u64ad\u8fd8\u672a\u5f00\u59cb\u54e6\uff0c\u656c\u8bf7\u671f\u5f85",Live_Loading:"\u76f4\u64ad\u4fe1\u606f\u52a0\u8f7d\u4e2d\uff0c\u8bf7\u5237\u65b0\u8bd5\u8bd5",Live_End:"\u4eb2\uff0c\u76f4\u64ad\u5df2\u7ed3\u675f",Live_Abrot:"\u5f53\u524d\u76f4\u64ad\u4fe1\u53f7\u4e2d\u65ad\uff0c\u8bf7\u5237\u65b0\u540e\u91cd\u8bd5",Corss_Domain_Error:"\u8bf7\u786e\u8ba4\u60a8\u7684\u57df\u540d\u5df2\u5b8c\u6210\u5907\u6848\u548cCNAME\u7ed1\u5b9a\uff0c\r\n\u5e76\u5904\u4e8e\u542f\u7528\u72b6\u6001\uff0c\u6216\u8d44\u6e90\u5141\u8bb8\u8de8\u8d8a\u8bbf\u95ee",Url_Timeout_Error:"\u60a8\u6240\u89c2\u770b\u7684\u89c6\u9891\u5730\u5740\u8fde\u63a5\u8d85\u65f6\uff0c\u8bf7\u5237\u65b0\u540e\u91cd\u8bd5",Connetction_Error:"\u62b1\u6b49,\u8be5\u89c6\u9891\u7531\u4e8e\u8fde\u63a5\u9519\u8bef\u6682\u65f6\u4e0d\u80fd\u64ad\u653e,\u8bf7\u89c2\u770b\u5176\u5b83\u89c6\u9891",Fetch_MTS_Error:"\u83b7\u53d6\u89c6\u9891\u5217\u8868\u5931\u8d25\uff0c\u8bf7\u786e\u8ba4",Token_Expired_Error:"\u8bf7\u6c42\u63a5\u53e3\u5931\u8d25\uff0c\u8bf7\u786e\u8ba4Token\u662f\u5426\u8fc7\u671f",Video_Lists_Empty_Error:"\u83b7\u53d6\u89c6\u9891\u5217\u8868\u4e3a\u7a7a\uff0c\u8bf7\u786e\u8ba4\u64ad\u653e\u6570\u636e\u4e0e\u683c\u5f0f",Encrypted_Failed_Error:"\u83b7\u53d6\u89c6\u9891\u52a0\u5bc6\u79d8\u94a5\u9519\u8bef\uff0c\u8bf7\u786e\u8ba4\u64ad\u653e\u6743\u9650",Fetch_Failed_Permission_Error:"\u83b7\u53d6\u89c6\u9891\u5217\u8868\u5931\u8d25\uff0c\u8bf7\u786e\u8ba4\u64ad\u653e\u6743\u9650",Invalidate_Param_Error:"\u65e0\u8f93\u5165\u89c6\u9891\uff0c\u8bf7\u786e\u8ba4\u8f93\u5165\u53c2\u6570",AutoPlayDelayDisplayText:"$$\u79d2\u4ee5\u540e\u5f00\u59cb\u64ad\u653e",Fetch_MTS_NOT_NotStream_Error:"\u6b64vid\u6ca1\u6709\u53ef\u64ad\u653e\u89c6\u9891",Cancel_Text:"\u53d6\u6d88",OK_Text:"\u786e\u8ba4",Auto_Stream_Tip_Text:"\u7f51\u7edc\u4e0d\u7ed9\u529b\uff0c\u662f\u5426\u5207\u6362\u5230$$",Fetch_Playauth_Error:"\u83b7\u53d6\u64ad\u653e\u51ed\u8bc1\u51fa\u9519\u5566\uff0c\u8bf7\u5c1d\u8bd5\u9000\u51fa\u91cd\u8bd5\u6216\u5237\u65b0",Open_Html_By_File:"\u4e0d\u80fd\u76f4\u63a5\u5728\u6d4f\u89c8\u5668\u6253\u5f00html\u6587\u4ef6\uff0c\u8bf7\u90e8\u7f72\u5230\u670d\u52a1\u7aef",Cant_Use_Flash_On_Mobile:"\u79fb\u52a8\u7aef\u4e0d\u652f\u6301Flash\u64ad\u653e\u5668\uff0c\u8bf7\u4f7f\u7528h5\u64ad\u653e\u5668",Flash_Not_Ready:"Flash Player\u63d2\u4ef6\u672a\u5b89\u88c5\u5b89\u88c5\u63d2\u4ef6\uff0c\u5982\u679c\u5df2\u7ecf\u5b89\u88c5\u8bf7\u68c0\u67e5\u662f\u5426\u88ab\u7981\u7528"}},{}],23:[function(o,e,t){function n(){var e;return void 0!==window[l]&&window[l]||(e=(e=(navigator.language||navigator.browserLanguage).toLowerCase())&&-1>4,l[s++]=(15&r)<<4|i>>2,l[s++]=(3&i)<<6|63&n;return o},encode:function(e){for(var t=new Uint8Array(e),r=t.length,i="",n=0;n>2])+o[(3&t[n])<<4|t[n+1]>>4])+o[(15&t[n+1])<<2|t[n+2]>>6])+o[63&t[n+2]];return r%3==2?i=i.substring(0,i.length-1)+"=":r%3==1&&(i=i.substring(0,i.length-2)+"=="),i},unpackPlayReady:function(e){e=function(e,t,r){if(!e)return"";r||e.byteLength%2==0||console.log("Data has an incorrect length, must be even."),r=e instanceof ArrayBuffer?e:((r=new Uint8Array(e.byteLength)).set(new Uint8Array(e)),r.buffer);for(var i=Math.floor(e.byteLength/2),n=new Uint16Array(i),o=new DataView(r),a=0;as[0]&&t[1]s[0]&&t[1]a)return 1;if(a>o)return-1}var s=r[r.length-1],l=i[i.length-1];if(s&&l){var c=s.split(".").map(p),u=l.split(".").map(p);for(n=0;nu[n])return 1;if(u[n]>c[n])return-1}}else if(s||l)return s?-1:1;return 0}var o=[">",">=","=","<","<="],a={">":[1],">=":[0,1],"=":[0],"<=":[-1,0],"<":[-1]};return n.validate=function(e){return"string"==typeof e&&t.test(e)},n.compare=function(e,t,r){!function(e){if("string"!=typeof e)throw new TypeError("Invalid operator type, expected string but got "+typeof e);if(-1===o.indexOf(e))throw new TypeError("Invalid operator, expected one of "+o.join("|"))}(r);var i=n(e,t);return a[r].indexOf(i)>-1},n})?i.apply(t,[]):i)&&(e.exports=t)},function(e,t,r){"use strict";r.d(t,"a",function(){return u});var i=r(1),n=r(2),o=r(0),t=r(3),a=this&&this.__awaiter||function(e,a,s,l){return new(s=s||p)(function(r,t){function i(e){try{o(l.next(e))}catch(e){t(e)}}function n(e){try{o(l.throw(e))}catch(e){t(e)}}function o(e){var t;e.done?r(e.value):((t=e.value)instanceof s?t:new s(function(e){e(t)})).then(i,n)}o((l=l.apply(e,a||[])).next())})},s=this&&this.__generator||function(i,n){var o,a,s,l={label:0,sent:function(){if(1&s[0])throw s[1];return s[1]},trys:[],ops:[]},e={next:t(0),throw:t(1),return:t(2)};return"function"==typeof Symbol&&(e[Symbol.iterator]=function(){return this}),e;function t(r){return function(e){var t=[r,e];if(o)throw new TypeError("Generator is already executing.");for(;l;)try{if(o=1,a&&(s=2&t[0]?a.return:t[0]?a.throw||((s=a.return)&&s.call(a),0):a.next)&&!(s=s.call(a,t[1])).done)return s;switch(a=0,(t=s?[2&t[0],s.value]:t)[0]){case 0:case 1:s=t;break;case 4:return l.label++,{value:t[1],done:!1};case 5:l.label++,a=t[1],t=[0];continue;case 7:t=l.ops.pop(),l.trys.pop();continue;default:if(!(s=0<(s=l.trys).length&&s[s.length-1])&&(6===t[0]||2===t[0])){l=0;continue}if(3===t[0]&&(!s||t[1]>s[0]&&t[1]s[0]&&t[1]s[0]&&t[1]s[0]&&t[1]s[0]&&t[1]t.offsetHeight){r=t,e.fastClickScrollParent=t;break}}while(t=t.parentElement)}r&&(r.fastClickLastScrollTop=r.scrollTop)},a.prototype.getTargetElementFromEventTarget=function(e){return e.nodeType===Node.TEXT_NODE?e.parentNode:e},a.prototype.onTouchStart=function(e){var t,r,i;if(!(1t||Math.abs(e.pageY-this.touchStartY)>t},a.prototype.onTouchMove=function(e){return this.trackingClick&&(this.targetElement!==this.getTargetElementFromEventTarget(e.target)||this.touchHasMoved(e))&&(this.trackingClick=!1,this.targetElement=null),!0},a.prototype.findControl=function(e){return void 0!==e.control?e.control:e.htmlFor?document.getElementById(e.htmlFor):e.querySelector("button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea")},a.prototype.onTouchEnd=function(e){var t,r,i,n=this.targetElement;if(!this.trackingClick)return!0;if(e.timeStamp-this.lastClickTimethis.tapTimeout)return!0;if(this.cancelNextClick=!1,this.lastClickTime=e.timeStamp,t=this.trackingClickStart,this.trackingClick=!1,this.trackingClickStart=0,c&&(i=e.changedTouches[0],(n=document.elementFromPoint(i.pageX-window.pageXOffset,i.pageY-window.pageYOffset)||n).fastClickScrollParent=this.targetElement.fastClickScrollParent),"label"===(i=n.tagName.toLowerCase())){if(r=this.findControl(n)){if(this.focus(n),s)return!1;n=r}}else if(this.needsFocus(n))return 100d||0!==a.videoWidth)&&(clearInterval(s),e=0!==a.videoWidth,l?(a.setAttribute("controls","controls"),t=a,void 0===(r=c)&&(r=""),i=document.createElement("dv"),(n=document.createElement("h3")).innerText=r,i.appendChild(t),i.appendChild(n),document.body.appendChild(i)):(a.pause(),a=null),o(e))})})}var i={d:function(e,t){for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},e={},t=(i.d(e,{default:function(){return o}}),navigator.userAgent),r=/qqbrowser/i.test(t.toLowerCase()),n=/Edge/i.test(t),n=/Chrome/i.test(t)&&!n&&!r,v=/Safari/i.test(t)&&!n,r=t.match(/Version\/([\d.]+)([^S](Safari)|[^M]*(Mobile)[^S]*(Safari))/),n=r&&r[1],m=n&&Number(n.split(".")[0]),b=function(){var t=a(w().mark(function e(t){var r;return w().wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch(t);case 2:return r=e.sent,e.next=5,r.blob();case 5:return r=e.sent,e.abrupt("return",URL.createObjectURL(r));case 7:case"end":return e.stop()}},e)}));return function(e){return t.apply(this,arguments)}}(),S={includeSystemHijack:!0,showVideo:!1,format:"mp4",codecTags:["hev1","hvc1"],timeout:2e3},o=function(y){return void 0===y&&(y={}),new s(function(){var t=a(w().mark(function e(t){var r,i,n,o,a,s,l,c,u,d,p,h,f;return w().wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(o=Object.assign({},S,y),r=o.includeSystemHijack,i=o.showVideo,l=o.codecTags,n=o.format,o=o.timeout,a=performance.now(),s=-1Number.MAX_SAFE_INTEGER?1/0:e},hexadecimalInteger:function(e){if(this[e]){for(var t=(1&(t=(this[e]||"0x").slice(2)).length?"0":"")+t,r=new Uint8Array(t.length/2),i=0;iNumber.MAX_SAFE_INTEGER?1/0:e},decimalFloatingPoint:function(e){return parseFloat(this[e])},enumeratedString:function(e){return this[e]},decimalResolution:function(e){e=n.exec(this[e]);if(null!==e)return{width:parseInt(e[1],10),height:parseInt(e[2],10)}},parseAttrList:function(e){var t,r={};for(o.lastIndex=0;null!==(t=o.exec(e));){var i=t[2];0===i.indexOf('"')&&i.lastIndexOf('"')===i.length-1&&(i=i.slice(1,-1)),r[t[1]]=i}return r}},t.exports=i},{}],39:[function(e,t,r){function b(){this.method=null,this.key=null,this.iv=null,this._uri=null}function S(){this._url=null,this._byteRange=null,this._decryptdata=null,this.tagList=[]}function i(){this.loaders={}}var n=e("../constants"),l=e("../playerutil"),T=e("./attrlist"),c=e("../io"),o=e("./URLToolkit"),u=/#EXT-X-STREAM-INF:([^\n\r]*)[\r\n]+([^\r\n]+)/g,d=/#EXT-X-MEDIA:(.*)/g,E=new RegExp([/#EXTINF:(\d*(?:\.\d+)?)(?:,(.*)\s+)?/.source,/|(?!#)(\S+)/.source,/|#EXT-X-BYTERANGE:*(.+)/.source,/|#EXT-X-PROGRAM-DATE-TIME:(.+)/.source,/|#.*/.source].join(""),"g"),w=/(?:(?:#(EXTM3U))|(?:#EXT-X-(PLAYLIST-TYPE):(.+))|(?:#EXT-X-(PART-INF):(.+))|(?:#EXT-X-(MEDIA-SEQUENCE): *(\d+))|(?:#EXT-X-(TARGETDURATION): *(\d+))|(?:#EXT-X-(KEY):(.+))|(?:#EXT-X-(START):(.+))|(?:#EXT-X-(ENDLIST))|(?:#EXT-X-(DISCONTINUITY-SEQ)UENCE:(\d+))|(?:#EXT-X-(DIS)CONTINUITY))|(?:#EXT-X-(VERSION):(\d+))|(?:#EXT-X-(MAP):(.+))|(?:(#)(.*):(.*))|(?:(#)(.*))(?:.*)\r?\n?/,p="RegionBlock";S.prototype.getUrl=function(){return!this._url&&this.relurl&&(this._url=o.buildAbsoluteURL(this.baseurl,this.relurl,{alwaysNormalize:!0})),this._url},S.prototype.Seturl=function(e){this._url=e},S.prototype.getProgramDateTime=function(){return!this._programDateTime&&this.rawProgramDateTime&&(this._programDateTime=new Date(Date.parse(this.rawProgramDateTime))),this._programDateTime},S.prototype.GetbyteRange=function(){var e,t,r;return this._byteRange||(e=this._byteRange=[],this.rawByteRange&&(1===(t=this.rawByteRange.split("@",2)).length?(r=this.lastByteRangeEndOffset,e[0]=r||0):e[0]=parseInt(t[1]),e[1]=parseInt(t[0])+e[0])),this._byteRange},S.prototype.getByteRangeStartOffset=function(){return this.byteRange[0]},S.prototype.getByteRangeEndOffset=function(){return this.byteRange[1]},S.prototype.getDecryptdata=function(){return this._decryptdata||(this._decryptdata=this.fragmentDecryptdataFromLevelkey(this.levelkey,this.sn)),this._decryptdata};i.prototype=((e={parseMasterPlaylist:function(e,t){var r=[];for(u.lastIndex=0;null!=(o=u.exec(e));){var i={},n=i.attrs=new T(o[1]),o=(i.url=this.resolve(o[2],t),n.decimalResolution("RESOLUTION"));if(o&&(i.width=o.width,i.height=o.height),i.bitrate=n.decimalInteger("AVERAGE-BANDWIDTH")||n.decimalInteger("BANDWIDTH"),i.name=n.NAME,a=n.CODECS)for(var a=a.split(/[ ,]+/),s=0;s",quot:'"',"#x27":"'","#x60":"`"}[t.toLowerCase()]||e})}},{}],43:[function(e,t,r){var n,o=e("./object");(n=function(){}).extend=function(e){var t,r,i=(e=e||{}).init||e.init||this.prototype.init||this.prototype.init||function(){};for(r in(((t=function(){i.apply(this,arguments)}).prototype=o.create(this.prototype)).constructor=t).extend=n.extend,t.create=n.create,e)e.hasOwnProperty(r)&&(t.prototype[r]=e[r]);return t},n.create=function(){var e=o.create(this.prototype);return this.apply(e,arguments),e},t.exports=n},{"./object":42}],44:[function(e,t,r){var i=!new Function("try {return this===window;}catch(e){ return false;}")();t.exports.isSSR=i},{}],45:[function(e,f,t){var y=e("./object"),r=e("../config"),i=e("./dom"),n=e("./cookie"),o=e("./constants"),a=e("../lang/index"),l=e("./ua"),s=e("./io"),_=e("../player/base/plugin/defaultemptycomponent"),c=e("./hardware-decoding-detector"),g={preload:!0,autoplay:!0,useNativeControls:!1,width:"100%",height:"300px",cover:"",from:"",trackLog:!0,logBatched:!0,heartHeatInterval:30,isLive:!1,playsinline:!0,showBarTime:5e3,rePlay:!1,liveRetry:5,liveRetryInterval:1,liveRetryStep:0,keyShortCuts:!1,keyFastForwardStep:10,isVBR:!1,vodRetry:3,format:"",definition:"",defaultDefinition:"",loadDataTimeout:20,waitingTimeout:60,waitingBufferedTime:3,delayLoadingShow:1,controlBarForOver:!1,controlBarVisibility:"hover",enableSystemMenu:!1,qualitySort:"asc",x5_video_position:"normal",x5_type:"",x5_fullscreen:!1,x5_orientation:"landscape|portrait",x5LandscapeAsFullScreen:!0,license:{},autoPlayDelay:0,autoPlayDelayDisplayText:"",useHlsPluginForSafari:!1,enableMSEForAndroid:!0,encryptType:0,language:"zh-cn",languageTexts:{},mediaType:"video",outputType:"",playConfig:{},reAuthInfo:{},components:[],liveTimeShiftUrl:"",liveShiftSource:"",liveShiftTime:"",liveShiftMinOffset:30,videoHeight:"100%",videoWidth:"100%",enableWorker:!0,authTimeout:"",enableMockFullscreen:!1,region:"cn-shanghai",debug:!1,progressMarkers:[],snapshotWatermark:{left:"500",top:"100",text:"",font:"16px \u5b8b\u4f53",fillColor:"#FFFFFF",strokeColor:"#FFFFFF"},liveStartTime:"",liveOverTime:"",enableStashBufferForFlv:!0,stashInitialSizeForFlv:32,flvOption:{accurateSeek:!0},hlsOption:{stopLoadAsPaused:!1},hlsLoadingTimeOut:2e4,useHlsPlugOnMobile:!0,lowLatencyMode:!1,useHls2:void 0,skipRtsSupportCheck:!1,rtsLoadDataTimeout:6e3,rtsFallbackSource:void 0,rtsVersion:"",rtsSdkUrl:"",nudgeMaxRetry:5,tracks:[],recreatePlayer:function(){},diagnosisButtonVisible:!0,enableH265:!1,forceH265:!1,h265Threads:!0,h265Simd:!0,preventRecord:!1,traceId:"",mediaAuth:void 0,textTracks:void 0,_native:!0,hlsUriToken:"",thumbnailUrl:"",refreshAccessInfo:function(){},drmSessionTimeout:5e3,skinRes:"//"+r.domain+"/de/prismplayer-flash/"+r.flashVersion+"/atlas/defaultSkin",splayerUrl:null,splayerWasmDomain:null},u=(f.exports.defaultH5Layout=[{name:"bigPlayButton",align:"blabs",x:30,y:80},{name:"H5Loading",align:"cc"},{name:"errorDisplay",align:"tlabs",x:0,y:0},{name:"infoDisplay"},{name:"tooltip",align:"blabs",x:0,y:50},{name:"thumbnail"},{name:"controlBar",align:"blabs",x:0,y:0,children:[{name:"progress",align:"blabs",x:0,y:44},{name:"playButton",align:"tl",x:15,y:12},{name:"timeDisplay",align:"tl",x:10,y:5},{name:"fullScreenButton",align:"tr",x:10,y:12},{name:"subtitle",align:"tr",x:15,y:12},{name:"setting",align:"tr",x:15,y:12},{name:"volume",align:"tr",x:5,y:10}]}],f.exports.defaultAudioLayout=[{name:"controlBar",align:"blabs",x:0,y:0,children:[{name:"progress",align:"blabs",x:0,y:44},{name:"playButton",align:"tl",x:15,y:12},{name:"timeDisplay",align:"tl",x:10,y:5},{name:"volume",align:"tr",x:5,y:10}]}],f.exports.defaultFlashLayout=[{name:"bigPlayButton",align:"blabs",x:30,y:80},{name:"controlBar",align:"blabs",x:0,y:0,children:[{name:"progress",align:"tlabs",x:0,y:0},{name:"playButton",align:"tl",x:15,y:26},{name:"nextButton",align:"tl",x:10,y:26},{name:"timeDisplay",align:"tl",x:10,y:24},{name:"fullScreenButton",align:"tr",x:10,y:25},{name:"streamButton",align:"tr",x:10,y:23},{name:"volume",align:"tr",x:10,y:25}]},{name:"fullControlBar",align:"tlabs",x:0,y:0,children:[{name:"fullTitle",align:"tl",x:25,y:6},{name:"fullNormalScreenButton",align:"tr",x:24,y:13},{name:"fullTimeDisplay",align:"tr",x:10,y:12},{name:"fullZoom",align:"cc"}]}],f.exports.canPlayType=function(e){var t=document.createElement("video");return t.canPlayType?t.canPlayType(e):""},f.exports.canPlayHls=function(){return""!=f.exports.canPlayType("application/x-mpegURL")},f.exports.isUsedHlsPluginOnMobile=function(e){return!!(l.IS_MOBILE&&(l.IS_CHROME||l.IS_FIREFOX||l.IS_X5||l.IS_EDGE_NEW)&&f.exports.isSupportHls())},f.exports.isSafariUsedHlsPlugin=function(e){return!!(l.os.pc&&l.browser.safari&&e)},f.exports.hasUIComponent=function(e,t){if(void 0!==e&&e&&0!=e.length)for(var r=0,i=e.length;rx'}).firstChild.href},t.exports.parseUrl=function(e){var t,r=["protocol","hostname","port","pathname","search","hash","host"],i=s.createEl("a",{href:e}),n=""===i.host&&"file:"!==i.protocol;n&&((t=s.createEl("div")).innerHTML='',i=t.firstChild,t.setAttribute("style","display:none; position:absolute;"),document.body.appendChild(t));for(var o={},a=0;a/g,">").replace(/\&/g,"&").replace(/"/g,""").replace(/'/g,"'")},r.exports.toBinary=function(e){if(!window.atob)return"";for(var t=atob(e),r=t.length,i=new Uint8Array(r),n=0;n>16),this.dv.setInt16(r+1,65535&t);case 4:return this.dv.setInt32(r,t);default:throw new Error("\u4e0d\u652f\u6301Byte write "+e)}},r.prototype.write=function(e,t){var r=this.offset;switch(this.offset+=e,e){case 1:return this.dv.setUint8(r,t);case 2:return this.dv.setUint16(r,t);case 3:return this.dv.setUint8(r,t>>>16),this.dv.setUint16(r+1,65535&t);case 4:return this.dv.setUint32(r,t);default:throw new Error("\u4e0d\u652f\u6301Byte write "+e)}},r.prototype.readToUint8=function(e){e=new Uint8Array(this.dv.buffer,this.offset,e||this.unreadLength);return this.offset+=e.byteLength,e},r.prototype.readToBuffer=function(e){e=this.offset||e?this.dv.buffer.slice(this.offset,e?this.offset+e:void 0):this.dv.buffer;return this.offset+=e.byteLength,e},r),H=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],F=1024,B=function(e,t){var r=t.audioObjectType,i=t.sampleRate,n=t.channelCount,t=void 0===(t=t.numberOfRawDataBlocksInFrame)?0:t,o=e.byteLength+7,i=H.indexOf(i),a=new Uint8Array(7);return a[0]=255,a[1]=241,a[2]=r-1<<6,a[2]|=i<<2,a[2]|=(4&n)>>2,a[3]=(3&n)<<6,a[3]|=(6144&o)>>11,a[4]=(2047&o)>>3,a[5]=(7&o)<<5,a[5]|=31,a[6]=252,a[6]|=3&t,T.concatUint8(a,e)},j=function(e,t){return t>>5},W=function(e){for(var t,r,i=[],n=0,o=e.byteLength;n+5>>6),sampleRate:H[e[2]>>>2&15],samplingFrequencyIndex:e[2]>>>2&15,channelCount:(1&e[2])<<2|e[3]>>>6,numberOfRawDataBlocksInFrame:0,data:e.subarray(n+t,n+r)}),n+=r):n++;return i},d=(G.fromByte=function(e,t){return new G(e.read(t),t<<3)},G.prototype.skip=function(e){this.offset+=e},G.prototype.read=function(e){var t=this.len-this.offset-e;if(0<=t){for(var r=0,i=0;i>>t&r}return console.warn("bit \u8bfb\u53d6\u4f4d\u6570\u8d85\u8fc7\u9650\u5236"),0},G);function G(e,t){this.num=e,this.len=t,this.offset=0}function r(e,t,r){this.dv=new DataView(e),this.start=this.offset=t||this.dv.byteOffset,this.end=r?this.start+r:this.dv.byteLength}X.createAnnexbStartCode=function(){return new Uint8Array([0,0,0,1])},X.createAVCCStartCode=function(e){return new Uint8Array([e>>24&255,e>>16&255,e>>8&255,255&e])},X.extractAVCCNAL=function(e,t){for(var r,i=[],n=new T(e.buffer,e.byteOffset,e.byteLength);n.unreadLength>t;){if((r=n.read(t+1))<=0||r>n.unreadLength){console.warn("extract avc nalu size wrong! lengthSizeMinusOne:",t,"size:",r);break}var o=n.offset-n.start;i.push(e.subarray(o,o+r)),n.skip(r)}return i},X.extractAnnexbNAL=function(r){for(var e=r.byteLength,i=[],t=0;t=p.NON_IDR_SLICE&&e<=p.SLICE_IDR},e}(E),e=(z=function(e,t){return(z=Object.setPrototypeOf||({__proto__:[]}instanceof Array?function(e,t){e.__proto__=t}:function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])}))(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function r(){this.constructor=e}z(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),x=((t=w=w||{})[t.TRAIL_N=0]="TRAIL_N",t[t.TRAIL_R=1]="TRAIL_R",t[t.TSA_N=2]="TSA_N",t[t.TSA_R=3]="TSA_R",t[t.STSA_N=4]="STSA_N",t[t.STSA_R=5]="STSA_R",t[t.RADL_N=6]="RADL_N",t[t.RADL_R=7]="RADL_R",t[t.RASL_N=8]="RASL_N",t[t.RASL_R=9]="RASL_R",t[t.VCL_N10=10]="VCL_N10",t[t.VCL_R11=11]="VCL_R11",t[t.VCL_N12=12]="VCL_N12",t[t.VCL_R13=13]="VCL_R13",t[t.VCL_N14=14]="VCL_N14",t[t.VCL_R15=15]="VCL_R15",t[t.BLA_W_LP=16]="BLA_W_LP",t[t.BLA_W_RADL=17]="BLA_W_RADL",t[t.BLA_N_LP=18]="BLA_N_LP",t[t.IDR_W_RADL=19]="IDR_W_RADL",t[t.IDR_N_LP=20]="IDR_N_LP",t[t.CRA=21]="CRA",t[t.VPS=32]="VPS",t[t.SPS=33]="SPS",t[t.PPS=34]="PPS",t[t.ACCESS_UNIT_DELIMITER=35]="ACCESS_UNIT_DELIMITER",t[t.EOS=36]="EOS",t[t.EOB=37]="EOB",t[t.FILLER_DATA=38]="FILLER_DATA",t[t.SEI=39]="SEI",t[t.SEI_SUFFIX=40]="SEI_SUFFIX",t[t.INVALID=64]="INVALID",e(i,$=E),i.extractNALType=function(e,t){return(126&e[t=void 0===t?0:t])>>1},i.isNonRefNALType=function(e){switch(e){case w.TRAIL_N:case w.STSA_N:case w.RADL_N:case w.RASL_N:case w.VCL_N10:case w.VCL_N12:case w.VCL_N14:return!0;default:return!1}},i.isNonRef=function(e){return this.isNonRefNALType(this.extractNALType(e))},i.isSlice=function(e){e=this.extractNALType(e);return e>=w.TRAIL_N&&e<=w.CRA},i.littleEndian=function(){var e=new ArrayBuffer(2);return new DataView(e).setInt16(0,256,!0),256===new Int16Array(e)[0]},i.parseHVCVideoData=function(e,t){for(var r=e.byteLength,i=new DataView(e.buffer,e.byteOffset,e.byteLength),n=[],o=0,a=0+t,s=this.littleEndian,l=!1;o DataSize!");var u=i.getUint8(o+4)>>1&63,d=(16<=u&&u<=23&&(l=!0),0+o+4),u={type:u,data:e.subarray(d,d+c)};n.push(u),o+=4+c}return{keyframe:l,units:n}},i),t=oo(568),Q=oo.n(t);function i(e){var t=$.call(this)||this,e=new d(e.read(2),16);return t.forbiddenZeroBit=e.read(1),t.nalType=e.read(6),t.nhLayerId=e.read(6),t.nhTimeId=e.read(3),t}function J(t,r){var i=!1;return Object.keys(r).forEach(function(e){Q()(t[e],r[e])||(t[e]=r[e],i=!0)}),i}o.prototype.loadWord=function(){var e=this.data,t=this.bytesAvailable,r=e.byteLength-t,i=new Uint8Array(4),t=Math.min(4,t);if(0===t)throw new Error("no bytes available");i.set(e.subarray(r,r+t)),this.word=new DataView(i.buffer).getUint32(0),this.bitsAvailable=8*t,this.bytesAvailable-=t},o.prototype.skipBits=function(e){var t;this.bitsAvailable>e||(e=(e-=this.bitsAvailable)-((t=e>>3)<<3),this.bytesAvailable-=t,this.loadWord()),this.word<<=e,this.bitsAvailable-=e},o.prototype.readBits=function(e){var t=Math.min(this.bitsAvailable,e),r=this.word>>>32-t;return 32>>e))return this.word<<=e,this.bitsAvailable-=e,e;return this.loadWord(),e+this.skipLZ()},o.prototype.skipUEG=function(){this.skipBits(1+this.skipLZ())},o.prototype.skipEG=function(){this.skipBits(1+this.skipLZ())},o.prototype.readUEG=function(){var e=this.skipLZ();return this.readBits(e+1)-1},o.prototype.readEG=function(){var e=this.readUEG();return 1&e?1+e>>>1:-1*(e>>>1)},o.prototype.readUByte=function(){return this.readBits(8)},o.prototype.readUShort=function(){return this.readBits(16)},o.prototype.readUInt=function(){return this.readBits(32)},o.prototype.skipScalingList=function(e){for(var t=8,r=8,i=0;iOe&&Me.shift(),De<=e)&&(a=(u[e]||"").toLowerCase(),s=console[a])&&s.apply(void 0,[n].concat(t))},e.getLogs=function(){return Me.map(function(e){return e.message=e.prefix+" "+e.args.map(function(e){return"string"==typeof e?e:xe()(e)}).join(" "),e})},e.clear=function(){Me=[]},e.setSize=function(e){Oe=e},e.setLevel=function(e){Re=e},e.setPrintLevel=function(e){De=e},e.reset=function(){Re=u.INFO,De=u.ERROR,Oe=2e3,Ne=Ae(),Me=[],Ue=0},He);function He(e){var i=this;this.trace=function(){for(var e=arguments.length,t=new Array(e),r=0;r ").concat(y[e])),this.status=e)},l.prototype.jump=function(e){this.offset=e},l.prototype.load=function(e,t,r){return this.reset(),this.url=e,this.loadRange(t,r)},l.prototype.resume=function(){return this.loadRange(this.offset)},l.prototype.suspend=function(){var e=this.status;this._abort(),e===y.LOADING&&(this._changeStatus(y.SUSPENGING),this.emit("suspend",void 0))},l.prototype.abort=function(){var e=this.status;this._abort(),e!==y.SUSPENGING&&e!==y.LOADING||this.emit("abort",void 0)},l.prototype.reset=function(){this.abort(),this.offset=0,this.total=1/0,this.url=""},l.prototype.destroy=function(){this.removeAllListeners(),this.reset()},l),s={isIos:!1,isDingtalk:!1,isQQBrowser:!1},t=(window.navigator.userAgent||"").toLowerCase();function l(e){void 0===e&&(e={});var t=je.call(this)||this;return t.timeout=15e3,t.total=1/0,t.offset=0,t.status=y.IDLE,t.url="",t._handleError=function(e){"AbortError"!==e.name&&(t._changeStatus(y.ERROR),t.emit("error",{code:h.NETWORK,message:e.message,origin:e}))},t.timeout=e.timeout||t.timeout,t}function Xe(e){return Ve.call(this,e)||this}/(iPhone\sOS)\s([\d_]+)/i.test(t)&&(s.isIos=!0),-1=this.total)return so.resolve(!1);if(this.status===y.LOADING||this.status===y.ERROR)return so.resolve(!1);k.info("\u6267\u884cload, from=".concat(i," to=").concat(e," url=").concat(this.url)),this.abort();var t=new Headers,o=0=this.total||this.status===y.LOADING||this.status===y.ERROR?so.resolve(!1):(this.abort(),new so(function(e,t){u.xhr=new XMLHttpRequest,u._resolve=e;function r(e){var r,t=s.responseText,i=t.length,n=c,o=u.offset,a=i-n;0=s.HEADERS_RECEIVED&&clearTimeout(u._timer)},u.offset=i,0);s.timeout=u.timeout,s.onprogress=function(){r(!1)},s.onloadend=function(){r(!0),u.xhr=null,u._changeStatus(y.IDLE),u.emit("loadend",void 0),e(!0)},s.onerror=function(e){u.xhr=null;e=new Error(e.constructor.name);u._handleError(e),t(e)},s.overrideMimeType("text/plain; charset=x-user-defined"),u._changeStatus(y.LOADING),u.emit("loadstart",void 0),u._timer=setTimeout(u.triggerTimeout,u.timeout),s.send()}))};var t=rt,Ke=e.isSupported()?e:t;$e=function(e,t){return($e=Object.setPrototypeOf||({__proto__:[]}instanceof Array?function(e,t){e.__proto__=t}:function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])}))(e,t)};(function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function r(){this.constructor=e}$e(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)})(c,ze=Fe),Object.defineProperty(c.prototype,"loader",{get:function(){return this.customLoader||this.originLoader},enumerable:!1,configurable:!0}),Object.defineProperty(c.prototype,"url",{get:function(){return this.loader.url},enumerable:!1,configurable:!0}),Object.defineProperty(c.prototype,"status",{get:function(){return this.loader.status},enumerable:!1,configurable:!0}),c.probe=function(e){throw new Error("parser should implements static probe")},c.prototype.onProgress=function(e){},c.prototype.onLoadEnd=function(){},c.prototype.load=function(e){return this.reset(),this.loader.load(e)},c.prototype.suspend=function(){return this.loader.suspend()},c.prototype.resume=function(){return this.loader.resume()},c.prototype.reset=function(){this.loader.reset(),this.metadata=null},c.prototype.destroy=function(){this.reset(),this.loader.off("progress",this.onProgress),this.loader.off("loadend",this.onLoadEnd),this.originLoader.destroy(),this.removeAllListeners()};var ze,$e,Ye,Qe,Je,Ze,e=c,et=(tt.BUFFER_LENGTH=9,tt);function tt(e){this.signature=String.fromCharCode(e.read(1),e.read(1),e.read(1)),this.version=e.read(1);var t=e.read(1),e=(this.size=e.read(4),new d(t,8));e.read(5),this.hasAudio=!!e.read(1),e.read(1),this.hasVideo=!!e.read(1)}function c(e){var t=ze.call(this)||this;return t.skipFrame=Z.DEFAULT,t.metadata=null,t.options=e,t.onProgress=t.onProgress.bind(t),t.onLoadEnd=t.onLoadEnd.bind(t),t.originLoader=new Ke(t.options),t.customLoader=e.loader,t.loader.on("progress",t.onProgress),t.loader.on("loadend",t.onLoadEnd),t.skipFrame=e.skipFrame||Z.DEFAULT,t}function rt(){var e=null!==Ye&&Ye.apply(this,arguments)||this;return e.xhr=null,e._timer=-1,e._resolve=function(e){},e.triggerTimeout=function(){e._abort(),e._handleError(new Error("\u52a0\u8f7d\u8d85\u65f6\uff0c\u8bf7\u91cd\u8bd5"))},e}function it(){var e=null!==Je&&Je.apply(this,arguments)||this;return e.controller=null,e.timer=-1,e._abort=function(){clearTimeout(e.timer),e.controller&&!e.controller.signal.aborted&&(e.controller.abort(),e.controller=null),e._changeStatus(y.IDLE)},e.triggerTimeout=function(){e._abort(),e._handleError(new We("\u52a0\u8f7d\u8d85\u65f6\uff0c\u8bf7\u91cd\u8bd5"))},e}(t=qe=qe||{})[t.AUDIO=8]="AUDIO",t[t.VIDEO=9]="VIDEO",t[t.SCRIPT=18]="SCRIPT";ot.BUFFER_LENGTH=11;var nt=ot;function ot(e){this.type=e.read(1),this.size=e.read(3),this.dts=e.read(3),this.dts|=e.read(1)<<24,e.skip(3)}var at,st=[5512,11025,22050,44100],lt=[8,16];(t=at=at||{})[t.ADTS_HEADER=0]="ADTS_HEADER",t[t.RAW=1]="RAW";ut.readAudioSpecificConfig=function(e){e=d.fromByte(e,2);return{audioObjectType:e.read(5),sampleRate:H[e.read(4)],samplingFrequencyIndex:e.read(4),channelCount:e.read(4)}};var _,ct=ut;function ut(e){var t=new d(e.read(1),8);this.codecId=t.read(4),this.sampleRate=st[t.read(2)],this.sampleSize=lt[t.read(1)],this.soundType=t.read(1),this.packetType=e.read(1),this.data=e.readToUint8()}function dt(t){var e=t.read(2);return Array.from(Array(e)).map(function(){var e=t.read(1);return 0=et.BUFFER_LENGTH&&(this.header=new et(i),0==this.header.hasVideo&&(this.header.hasVideo=!0),i.skip(this.header.size-et.BUFFER_LENGTH));i.unreadLength>4+nt.BUFFER_LENGTH;){i.skip(4);var n=new nt(i);if(!(i.unreadLength>=n.size)){i.back(4+nt.BUFFER_LENGTH);break}var o=new T(i.buffer,i.offset,n.size);switch(i.skip(n.size),n.type){case qe.VIDEO:r=r.concat(this.parseVideoBody(n,o,i.offset+t));break;case qe.AUDIO:r=r.concat(this.parseAudioBody(n,o,i.offset+t));break;case qe.SCRIPT:this.parseScriptBody(n,o);break;default:return k.warn("unknown tag type",n.type),r}}this.unhandleBuffer=i.unreadLength?i.readToBuffer():null}return r},b.prototype.checkMetadata=function(){var e=this.flvMetadata,t=this.header;if(console.log("checkMetadata flvMetadata:",e,"header:",t,", this.metadata:",this.metadata),t&&!this.metadata){var r=[];if(t.hasVideo){if(!this.videoTrackMeta||!this.videoLoaded)return void console.log("checkMetadata hasVideo no this.videoTrackMeta",this.videoTrackMeta,", this.videoLoaded",this.videoLoaded);this.videoTrackMeta.baseDTS=this.baseVideoDTS,this.videoTrackMeta.basePTS=this.baseVideoPTS,r.push(this.videoTrackMeta)}if(t.hasAudio){if(!this.audioTrackMeta||!this.audioLoaded)return void console.log("checkMetadata hasAudio no this.audioTrackMeta",this.audioTrackMeta,", this.audioLoaded",this.audioLoaded);this.audioTrackMeta.baseDTS=this.baseAudioDTS,this.audioTrackMeta.basePTS=this.baseAudioPTS,r.push(this.audioTrackMeta)}var t=this.options,i=t.live,t=t.progressive;this.metadata={formatType:n.FLV,live:!!i,progressive:!i&&!!t,url:this.loader.url,basePTS:Math.min.apply(Math,r.map(function(e){return e.basePTS||0})),baseDTS:Math.min.apply(Math,r.map(function(e){return e.baseDTS||0})),timescale:1e3,duration:1e3*((null==e?void 0:e.duration)||1/0),tracks:r},console.log("checkMetadata loadedmetadata",this.metadata),this.emit("loadedmetadata",this.metadata)}},b.prototype.parseVideoBody=function(e,t,r){var i=this,t=new vt(t),n=(this.emit("loadedtag",{header:e,body:t}),[]),o=t.type===yt.KEY;if(t.data.length)if(t.packetType===gt.AVC_SEQUENCE_HEADER){var a,s=this.flvMetadata||{},l={type:P.VIDEO,id:2,baseDTS:0,basePTS:0,timescale:1e3,vps:[],sps:[],pps:[],sei:[],width:s.width||0,height:s.height||0,codec:"",pixelRatio:[],live:(null==(s=this.metadata)?void 0:s.live)||!1};t.codecId===_t.H264?(d=new pe(new T(new ArrayBuffer(8)),0),c=new T(t.data.buffer,t.data.byteOffset,t.data.byteLength),s=new ye(d,c),l.pps=s.pps,l.sps=s.sps,l.codec=s.codec,(s=s.sps[0])&&(a=new ne(s.subarray(1)),l.width=a.width,l.height=a.height)):t.codecId===_t.H265&&(E.extractAnnexbNAL(t.data).forEach(function(e){var t=new T(e.buffer,e.byteOffset,e.length),r=new x(t);r.nalType>>16,e}function mi(e,t){function r(e){return 96+(31&e)}var e=Gr.call(this,e,t)||this,i=(e.version=t.read(1),e.flag=t.read(3),1===e.version),i=(e.createTime=e.toStandardTime(t.read(i?8:4)),e.modifyTime=e.toStandardTime(t.read(i?8:4)),e.timeScale=t.read(4),e.duration=t.read(i?8:4),t.read(2));return e.language=String.fromCharCode(r(i>>10),r(i>>5),r(i)),e.quality=Number(t.read(1)+"."+t.read(1)),e}function bi(e,t){var r=Kr.call(this,e,t)||this;return r.data=t.readToUint8(e.size-e.length),r}function Si(e,t){var r=$r.call(this,e,t)||this;for(r.name="",r.version=t.read(1),r.flag=t.read(3),r.preDefined=String.fromCharCode(t.read(1),t.read(1),t.read(1),t.read(1)),r.handleType=String.fromCharCode(t.read(1),t.read(1),t.read(1),t.read(1)),t.skip(12);0=r){i=n;break}if(-1>26&3,S.dependsOn=T>>24&3,S.isDependedOn=T>>22&3,S.hasRedundancy=T>>20&3,S.degradationPriority=65535&T,m+=S.size,S.isLast=_===d.length-1&&b===g.sampleCount-1,i.addSample(S)}},Sn.prototype.destroy=function(){this.options=null},Sn);tn=function(e,t){return(tn=Object.setPrototypeOf||({__proto__:[]}instanceof Array?function(e,t){e.__proto__=t}:function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])}))(e,t)};(function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function r(){this.constructor=e}tn(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)})(S,en=e),S.probe=function(e){return!(e.byteLength<8)&&"ftyp"===[e[4],e[5],e[6],e[7]].map(function(e){return String.fromCharCode(e)}).join("")},S.prototype.processPackets=function(t,r){var e,i=this,n=[];return this.media&&t.byteLength&&(this.media.getTracks().forEach(function(e){e.processSamples(t,r).forEach(function(e){e=i.convertSampleToPacket(e);e&&n.push(e)})}),e=this.getMinNextSampleOffset()-r,this.unhandleBuffer=e>=t.byteLength?null:t.slice(e).buffer),n},Object.defineProperty(S.prototype,"url",{get:function(){return this.loader.url},enumerable:!1,configurable:!0}),S.prototype.seek=function(t){var e,r=this.options.progressive;this.unhandleBuffer=null,r&&this.loader.suspend(),null!=(e=this.media)&&e.getTracks().map(function(e){return e.seek(t)}),r&&this.loader.loadRange(this.getMinNextSampleOffset())},S.prototype.onProgress=function(e){var t=e.data,e=e.offset;t.length&&(this.unhandleBuffer&&(t=T.concatUint8(new Uint8Array(this.unhandleBuffer),t),e-=this.unhandleBuffer.byteLength,this.unhandleBuffer=null),this.metadata||this.parse(new T(t.buffer,0),e),this.metadata)&&((t=this.processPackets(t,e)).length&&this.emit("loadeddata",{packets:t}))},S.prototype.getMinNextSampleOffset=function(){return this.media?Math.min.apply(Math,this.media.getTracks().map(function(e){return e.getNextSampleOffset()})):0},S.prototype.parse=function(o,a){var s,l=this;void 0===a&&(a=0);for(var c=o.offset,u=0,d=this;8<=o.unreadLength;){var e=function(){var e,t,r,i,n;return u=o.offset-c,0===(e=new pe(o,a+u)).size?(r=new Error("box [".concat(e.type,"] size \u4e3a 0")),console.error(r),d.emit("error",{code:h.PARSER,message:r.message,origin:r}),"break"):d.options.progressive&&"mdat"===e.type&&!d.metadata?(t=e.start+e.size,d.loader.suspend(),d.unhandleBuffer=null,k.info("\u68c0\u6d4b\u5230mdat box\u5728moov box\u4e4b\u540e\uff0c\u8df3\u8f6cmoov\u8d77\u59cb\u504f\u79fb\u4f4d"),d.loader.loadRange(t).then(function(){l.unhandleBuffer=null,l.loader.jump(e.start),l.loader.status!==y.SUSPENGING&&l.loader.loadRange(e.start,t)}),{value:void 0}):(r=e.size-e.length,o.unreadLength>=r?((n=U[e.type])?(i=new T(o.buffer,o.offset,r),(s=new n(e,i)).isContainer&&((n=new S({sub:!0})).proxy(d,["loadedbox"]),n.parse(i,u+a+e.length),n.removeAllListeners(),n.boxes.forEach(function(e){s.append(e)}))):s=new f(e),o.skip(r),d.boxes.push(s),void d.emit("loadedbox",s)):(o.back(e.length),"break"))}();if("object"==typeof e)return e.value;if("break"===e)break}o.unreadLength&&(this.unhandleBuffer=o.readToBuffer())},S.prototype.reset=function(){en.prototype.reset.call(this),this.boxes=[],this.unhandleBuffer=null,this.avcCBox=void 0,this.hvcCBox=void 0,this.mp4aBox=void 0,this.media=null,this.moofParser.destroy()};var en,tn,rn,nn,on,an,sn,ln,cn,un,dn,pn,hn,fn,yn,_n,gn,vn,mn,bn=S;function S(e){var h=en.call(this,e=void 0===e?{}:e)||this;return h.media=null,h.unhandleBuffer=null,h.formatType=n.MP4,h.boxes=[],h._handleBoxLoad=function(e){var o,a,s,l,t,c,u,d,p,r,i=e.header.type;h._handleCodecBoxLoaded(i),"hvcC"===i?h.hvcCBox=e:"hvc1"===i||"hev1"===i?h.hvcCBox&&(h.hvcCBox.codecTag=i):"avcC"===i?h.avcCBox=e:"esds"===i?h.esdsBox=e:"mp4a"===i?h.mp4aBox=e:"moov"===i?(r=f.mapBoxToJSON(e),h.media=h.moovParser.createMedia(r),h.moofParser.init({media:h.media}),t=(r=h.mp4aBox||{}).sampleRate,o=void 0===t?0:t,t=r.sampleSize,a=void 0===t?0:t,t=r.channelCount,s=void 0===t?0:t,t=(r=h.esdsBox||{}).audioObjectType,l=void 0===t?0:t,t=r.codec,c=void 0===t?"":t,u=[],d=[],p=[],h.hvcCBox?(d=h.hvcCBox.vps,p=h.hvcCBox.pps,u=h.hvcCBox.sps):h.avcCBox&&(p=h.avcCBox.pps,u=h.avcCBox.sps),h.metadata={formatType:n.MP4,live:!!h.options.live,progressive:!!h.options.progressive,url:h.loader.url,basePTS:0,baseDTS:0,duration:h.media.options.duration,timescale:h.media.options.timeScale,tracks:h.media.getTracks().map(function(e){var t,r,i,n={};switch(n.id=e.options.id,n.type=e.options.type,n.timescale=e.options.timeScale,n.baseDTS=0,n.basePTS=0,n.type){case P.VIDEO:n.width=e.options.width,n.height=e.options.height,n.vps=d,n.sps=u,n.pps=p,n.rotate=(t=e.options.matrix).length<5||(r=Math.hypot(t[0],t[3]),i=Math.hypot(t[1],t[4]),0===r)||0===i?0:180*Math.atan2(t[1]/i,t[0]/r)/Math.PI,n.pixelRatio=[],n.codec=h.hvcCBox?h.hvcCBox.codec:(null==(i=h.avcCBox)?void 0:i.codec)||"",n.codecTag=h.hvcCBox?h.hvcCBox.codecTag:void 0;break;case P.AUDIO:n.audioObjectType=l,n.sampleRate=o,n.sampleSize=a,n.channelCount=s,n.codec=c;break;default:n.type=P.UNKNOWN}return n})},r=Number(h.options.offsetTime),h.metadata.progressive&&0>>1<<13|e.read(2)>>>3,this.pts*=4,e.back(1),this.pts+=(6&e.read(1))>>>1,1&this.ptsDtsFlags?(this.dts=(14&e.read(1))<<27|e.read(2)>>>1<<13|e.read(2)>>>3,this.dts*=4,e.back(1),this.dts+=(6&e.read(1))>>>1):this.dts=this.pts):(this.pts=0,this.dts=0),0<(t=this.pesHeaderDataLength-(e.offset-t))&&e.skip(t),this.data=e.readToUint8()}function Mn(e){this.streams=[],this.tableId=e.read(1);var t=new d(e.read(2),16);this.sectionSyntaxIndicator=t.read(1),t.skip(1),t.skip(2),this.sectionLength=t.read(12),this.programNumber=e.read(2),(t=new d(e.read(1),8)).skip(2),this.versionNumber=t.read(5),this.currentNextIndicator=t.read(1),this.sectionNumber=e.read(1),this.lastSectionNumber=e.read(1),this.pcrPid=8191&e.read(2),this.programInfoLength=4095&e.read(2);for(var r=12+this.programInfoLength;r<=this.sectionLength-2;r+=5){var i={streamType:e.read(1),pid:8191&e.read(2),esInfoLength:4095&e.read(2)};this.streams.push(i),e.skip(i.esInfoLength),r+=i.esInfoLength}this.crc32=e.read(4)}var Un;(t=Un=Un||{})[t.PAT=0]="PAT",t[t.CAT=1]="CAT",t[t.TSDT=2]="TSDT";Gn.SYNC_BYTE=71;var R,Hn,Fn=Gn,v=oo(651),Bn=oo.n(v),jn=(Object.freeze({formatType:n.UNKNOWN,live:!1,progressive:!1,url:"",basePTS:0,baseDTS:0,timescale:0,duration:0,tracks:[]}),Object.freeze({type:P.VIDEO,id:0,baseDTS:0,basePTS:0,timescale:1e3,codec:"",width:0,height:0,vps:[],pps:[],sps:[],sei:[],pixelRatio:[],fps:0,live:!1})),Vn=Object.freeze({type:P.AUDIO,id:1,baseDTS:0,basePTS:0,timescale:1e3,codec:"",audioObjectType:2,samplingFrequencyIndex:0,sampleRate:0,sampleSize:16,channelCount:0}),qn=(Object.defineProperty(Wn.prototype,"size",{get:function(){return this.list.length},enumerable:!1,configurable:!0}),Wn.prototype.write=function(e){this.list.push(e)},Wn.prototype.read=function(){return this.list.shift()},Wn.prototype.readAll=function(){var e=this.list;return this.list=[],e},Wn.prototype.clear=function(){this.list=[]},Wn),t=(Hn=function(e,t){return(Hn=Object.setPrototypeOf||({__proto__:[]}instanceof Array?function(e,t){e.__proto__=t}:function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])}))(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function r(){this.constructor=e}Hn(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});function Wn(){this.list=[]}function Gn(e){var t=new d(e.read(4),32);this.syncByte=t.read(8),this.errorIndicator=t.read(1),this.payloadUnitStartIndicator=t.read(1),this.transportPriority=t.read(1),this.pid=t.read(13),this.transportScramblingControl=t.read(2),this.adaptationFlag=t.read(1),this.payloadFlag=t.read(1),this.continueCounter=t.read(4),this.adaptationFlag&&(t=e.read(1),e.skip(t)),this.payloadUnitStartIndicator&&e.skip(1)}(v=R=R||{})[v.UNKNOWN=0]="UNKNOWN",v[v.PAT=1]="PAT",v[v.PES=2]="PES",v[v.PMT=3]="PMT";t(N,eo=e),N.probe=function(e){if(e.byteLength<1)return!1;for(var t=0,r=e.byteLength;t=w.VPS&&(r.nalType===w.SPS?(s=!0,t=new se(_e(i.readToUint8())),o.width=t.width,o.height=t.height,o.pixelRatio=t.pixelRatio,o.codec=t.codec,c.push(e)):r.nalType===w.VPS?u.push(e):r.nalType===w.PPS&&d.push(e)),l.push(e),a=x.isNonRefNALType(r.nalType)&&a):((r=new Y(i)).nalType ").concat(n[i.activeParser.formatType])),i.emit("parserchange",void 0),i.activeParser.onProgress(t)):(r="\u672a\u627e\u5230\u5bf9\u5e94\u7684Parser, Byte\u6570\u636e: "+t.data.slice(0,20).join(","),k.error(r),i.emit("error",{code:h.PARSER,message:r})))},i.options=e,i.loader=i.createLoader(),i.activeParser=i.createParser(i.parserClasses[0]),i.logger.info("demuxer options",e),i}function O(e){var o=Jn.call(this,e)||this;return o.mpegtsParser=new Xn({progressive:!0,timeout:o.options.timeout}),o.currSegmentIndex=0,o.isLive=!1,o.shouldContinuousLoad=!0,o.ended=!1,o.prevManifestLoadedTime=0,o.fetchTimer=-1,o.discontinuity=!1,o.m3u8UpdateDuration=2,o.bufferSegments=[],o.cachePackets=[],o.formatType=n.HLS,o.segments=[],o.handleTSEnd=function(){o.currSegmentIndex>=o.segments.length-1&&o.emit("end",void 0)},o.handleTSLoadedMetadata=function(e){void 0===o.basePTS&&(o.basePTS=e.basePTS),void 0===o.baseDTS&&(o.baseDTS=e.baseDTS);e=Kn(Kn({},e),{formatType:n.HLS,live:o.isLive,progressive:!0,basePTS:o.basePTS,baseDTS:o.baseDTS,duration:o.duration,url:o.loader.url,discontinuity:o.discontinuity});o.metadata?J(o.metadata,e)&&o.emit("updatedmetadata",o.metadata):(o.metadata=e,o.emit("loadedmetadata",o.metadata))},o.handleTSLoadedData=function(e){var t,r,i,n,e=e.packets;e.length&&(null!=(t=o.currentSegment)&&t.discontinuity&&(t=e.slice().sort(function(e,t){return e.pts-t.pts}),void 0===o.currSegmentStartPTS&&(o.currSegmentStartPTS=t[0].pts),r=o.currSegmentStartPTS,i=Math.round(1e3*o.prevSegmentsTotalDuration)+(o.basePTS||0),t.forEach(function(e){var t=e.dts-e.pts;e.pts=i+e.pts-r,e.dts=e.pts+t})),o.cachePackets.length?(n=o.cachePackets.concat(e),o.cachePackets=[]):n=e,o.shouldContinuousLoad?o.emit("loadeddata",{packets:n}):o.cachePackets=n)},o.handleTSLoadEnd=function(){o.currSegmentIndex++,o.loadSegment()},o.mpegtsParser.on("loadedmetadata",o.handleTSLoadedMetadata),o.mpegtsParser.on("updatedmetadata",o.handleTSLoadedMetadata),o.mpegtsParser.on("loadeddata",o.handleTSLoadedData),o.mpegtsParser.on("end",o.handleTSEnd),o.mpegtsParser.loader.on("loadend",o.handleTSLoadEnd),o.mpegtsParser.loader.proxy(o,["error"]),o.mpegtsParser.proxy(o,["updatedtrackmetadata"]),o}function N(){var e=null!==eo&&eo.apply(this,arguments)||this;return e.patPrograms=[],e.pmtStreams=[],e.prevPesSegments=[],e.packetQueue=new qn,e.audioLoaded=!1,e.videoLoaded=!1,e.metadataChanged=!1,e.metadata=null,e.formatType=n.MPEGTS,e}}(),ao;function oo(e){var t=i[e];return void 0!==t||(t=i[e]={id:e,loaded:!1,exports:{}},r[e](t,t.exports,oo),t.loaded=!0),t.exports}var r,i,ao},"object"==typeof r&&"object"==typeof t?t.exports=i():"function"==typeof define&&define.amd?define([],i):"object"==typeof r?r.VideoxDemux=i():e.VideoxDemux=i()},{"es6-promise":8}],53:[function(e,t,r){function a(e){for(var t=5381,r=e.length;r;)t=33*t^e.charCodeAt(--r);return(t>>>0).toString()}var s=e("./vttparse");t.exports={parse:function(e,t,r){var i,e=e.trim().replace(/\r\n|\n\r|\n|\r/g,"\n").split("\n"),n=[],o=new s;o.oncue=function(e){e.id=a(e.startTime)+a(e.endTime)+a(e.text),e.text=decodeURIComponent(escape(e.text)),e.isBig=!1;var t=e.text.split("#xywh=");2==t.length&&(t=t[1].split(","),e.x=t[0],e.y=t[1],e.w=t[2],e.h=t[3],e.isBig=!0),0/gi,"\n");e=i.startTime&&e<=i.endTime)t.push(i);else if(e","‎":"\u200e","‏":"\u200f"," ":"\xa0"},y={c:"span",i:"i",b:"b",u:"u",ruby:"ruby",rt:"rt",v:"span",lang:"span"},_={v:"title",lang:"lang"},g={rt:"ruby"};function v(e,t){function r(e){return f[e]}for(var i,n,o,a,s,l,c,u=e.document.createElement("div"),d=u,p=[];null!==(c=void 0,c=t?(c=(c=t.match(/^([^<]*)(<[^>]+>?)?/))[1]||c[2],t=t.substr(c.length),c):null);)"<"===c[0]?"/"===c[1]?p.length&&p[p.length-1]===c.substr(2).replace(">","")&&(p.pop(),d=d.parentNode):(o=h(c.substr(1,c.length-2)))?(i=e.document.createProcessingInstruction("timestamp",o),d.appendChild(i)):(n=c.match(/^<([^.\s/0-9>]+)(\.[^\s\\>]+)?([^>\\]+)?(\\?)>?$/))&&(o=n[1],a=n[3],l=s=void 0,l=y[o],i=l?((s=e.document.createElement(l)).localName=l,(l=_[o])&&a&&(s[l]=a.trim()),s):null)&&(o=d,g[(l=i).localName]&&g[l.localName]!==o.localName||(n[2]&&(i.className=n[2].substr(1).replace("."," ")),p.push(n[1]),d.appendChild(i),d=i)):d.appendChild(e.document.createTextNode(function(e){for(;n=e.match(/&(amp|lt|gt|lrm|rlm|nbsp);/);)e=e.replace(n[0],r);return e}(c)));return u}var m=[[1470,1470],[1472,1472],[1475,1475],[1478,1478],[1488,1514],[1520,1524],[1544,1544],[1547,1547],[1549,1549],[1563,1563],[1566,1610],[1645,1647],[1649,1749],[1765,1766],[1774,1775],[1786,1805],[1807,1808],[1810,1839],[1869,1957],[1969,1969],[1984,2026],[2036,2037],[2042,2042],[2048,2069],[2074,2074],[2084,2084],[2088,2088],[2096,2110],[2112,2136],[2142,2142],[2208,2208],[2210,2220],[8207,8207],[64285,64285],[64287,64296],[64298,64310],[64312,64316],[64318,64318],[64320,64321],[64323,64324],[64326,64449],[64467,64829],[64848,64911],[64914,64967],[65008,65020],[65136,65140],[65142,65276],[67584,67589],[67592,67592],[67594,67637],[67639,67640],[67644,67644],[67647,67669],[67671,67679],[67840,67867],[67872,67897],[67903,67903],[67968,68023],[68030,68031],[68096,68096],[68112,68115],[68117,68119],[68121,68147],[68160,68167],[68176,68184],[68192,68223],[68352,68405],[68416,68437],[68440,68466],[68472,68479],[68608,68680],[126464,126467],[126469,126495],[126497,126498],[126500,126500],[126503,126503],[126505,126514],[126516,126519],[126521,126521],[126523,126523],[126530,126530],[126535,126535],[126537,126537],[126539,126539],[126541,126543],[126545,126546],[126548,126548],[126551,126551],[126553,126553],[126555,126555],[126557,126557],[126559,126559],[126561,126562],[126564,126564],[126567,126570],[126572,126578],[126580,126583],[126585,126588],[126590,126590],[126592,126601],[126603,126619],[126625,126627],[126629,126633],[126635,126651],[1114109,1114109]];function b(e){var t=[],r="";if(e&&e.childNodes)for(o(t,e);r=function e(t){var r,i,n;return t&&t.length?(i=(r=t.pop()).textContent||r.innerText)?(n=i.match(/^.*(\n|\r)/))?n[t.length=0]:i:"ruby"===r.tagName?e(t):r.childNodes?(o(t,r),e(t)):void 0:null}(t);)for(var i=0;i=r[0]&&e<=r[1])return 1}}(r.charCodeAt(i)))return"rtl";return"ltr";function o(e,t){for(var r=t.childNodes.length-1;0<=r;r--)e.push(t.childNodes[r])}}function S(){}function T(e,t,r){var i="undefined"!=typeof navigator&&/MSIE\s8\.0/.test(navigator.userAgent),n="rgba(255, 255, 255, 1)",o="rgba(0, 0, 0, 0.8)",a="",n=(void 0!==l&&(n=l.fontSet,o=l.backgroundSet,a=l.edgeSet),i&&(n="rgb(255, 255, 255)",o="rgb(0, 0, 0)"),S.call(this),this.cue=t,this.cueDiv=v(e,t.text),{color:n,backgroundColor:o,textShadow:a,position:"relative",left:0,right:0,top:0,bottom:0,display:"inline"}),s=(i||(n.writingMode=""===t.vertical?"horizontal-tb":"lr"===t.vertical?"vertical-lr":"vertical-rl",n.unicodeBidi="plaintext"),this.applyStyles(n,this.cueDiv),this.div=e.document.createElement("div"),n={textAlign:"middle"===t.align?"center":t.align,font:r.font,whiteSpace:"pre-line",position:"absolute"},i||(n.direction=b(this.cueDiv),n.writingMode=""===t.vertical?"horizontal-tb":"lr"===t.vertical?"vertical-lr":"plaintext"),this.applyStyles(n),this.div.appendChild(this.cueDiv),0);switch(t.positionAlign){case"start":s=t.position;break;case"middle":s=t.position-t.size/2;break;case"end":s=t.position-t.size}""===t.vertical?this.applyStyles({left:this.formatStyle(s,"%"),width:this.formatStyle(t.size,"%")}):this.applyStyles({top:this.formatStyle(s,"%"),height:this.formatStyle(t.size,"%")}),this.move=function(e){this.applyStyles({top:this.formatStyle(e.top,"px"),bottom:this.formatStyle(e.bottom,"px"),left:this.formatStyle(e.left,"px"),right:this.formatStyle(e.right,"px"),height:this.formatStyle(e.height,"px"),width:this.formatStyle(e.width,"px")})}}function E(e){var t,r,i,n,o="undefined"!=typeof navigator&&/MSIE\s8\.0/.test(navigator.userAgent);e.div&&(t=e.div.offsetHeight,r=e.div.offsetWidth,i=e.div.offsetTop,n=(n=(n=e.div.childNodes)&&n[0])&&n.getClientRects&&n.getClientRects(),e=e.div.getBoundingClientRect(),n=n?Math.max(n[0]&&n[0].height||0,e.height/n.length):0),this.left=e.left,this.right=e.right,this.top=e.top||i,this.height=e.height||t,this.bottom=e.bottom||i+(e.height||t),this.width=e.width||r,this.lineHeight=void 0!==n?n:e.lineHeight,o&&!this.lineHeight&&(this.lineHeight=13)}function w(e,t,s,l){var r,i=new E(t),n=t.cue,o=function(e){if("number"==typeof e.line&&(e.snapToLines||0<=e.line&&e.line<=100))return e.line;if(!e.track||!e.track.textTrackList||!e.track.textTrackList.mediaElement)return-1;for(var t=e.track,r=t.textTrackList,i=0,n=0;nd&&(u=u<0?-1:1,u*=Math.ceil(d/c)*c),o<0&&(u+=""===n.vertical?s.height:s.width,a=a.reverse()),i.move(p,u)}else{var h=i.lineHeight/s.height*100;switch(n.lineAlign){case"middle":o-=h/2;break;case"end":o-=h}switch(n.vertical){case"":t.applyStyles({top:t.formatStyle(o,"%")});break;case"rl":t.applyStyles({left:t.formatStyle(o,"%")});break;case"lr":t.applyStyles({right:t.formatStyle(o,"%")})}a=["+y","-x","+x","-y"],i=new E(t)}d=function(e,t){for(var r,i=new E(e),n=1,o=0;oe.left&&this.tope.top},E.prototype.overlapsAny=function(e){for(var t=0;t=e.top&&this.bottom<=e.bottom&&this.left>=e.left&&this.right<=e.right},E.prototype.overlapsOppositeAxis=function(e,t){switch(t){case"+x":return this.lefte.right;case"+y":return this.tope.bottom}},E.prototype.intersectPercentage=function(e){return Math.max(0,Math.min(this.right,e.right)-Math.max(this.left,e.left))*Math.max(0,Math.min(this.bottom,e.bottom)-Math.max(this.top,e.top))/(this.height*this.width)},E.prototype.toCSSCompatValues=function(e){return{top:this.top-e.top,bottom:e.bottom-this.bottom,left:this.left-e.left,right:e.right-this.right,height:this.height,width:this.width}},E.getSimpleBoxPosition=function(e){var t=e.div?e.div.offsetHeight:e.tagName?e.offsetHeight:0,r=e.div?e.div.offsetWidth:e.tagName?e.offsetWidth:0,i=e.div?e.div.offsetTop:e.tagName?e.offsetTop:0;return{left:(e=e.div?e.div.getBoundingClientRect():e.tagName?e.getBoundingClientRect():e).left,right:e.right,top:e.top||i,height:e.height||t,bottom:e.bottom||i+(e.height||t),width:e.width||r}},x.StringDecoder=function(){return{decode:function(e){if(!e)return"";if("string"!=typeof e)throw new Error("Error - expected string data.");return decodeURIComponent(encodeURIComponent(e))}}},x.convertCueToDOMTree=function(e,t){return e&&t?v(e,t):null},x.processCues=function(e,t,r){if(!e||!t||!r)return null;for(;r.firstChild;)r.removeChild(r.firstChild);var i=e.document.createElement("div");if(i.style.position="absolute",i.style.left="0",i.style.right="0",i.style.top="0",i.style.bottom="0",i.style.margin="1.5%",r.appendChild(i),function(e){for(var t=0;tthis._uploadCount||"4001"==e.e||"2002"==e.e)&&this._report()},i.prototype.dispose=function(){this._report(),this._disposed=!0},i.prototype._start=function(){this._disposed=!1;this._retry=0,this._report()},i.prototype._report=function(t){var e,r,i;this._tickHandler&&(clearTimeout(this._tickHandler),this._tickHandler=null),0<(t=t||this._logs.splice(0,this._uploadCount)).length?(i={"Content-Type":"application/json;charset=UTF-8","x-log-apiversion":"0.6.0","x-log-bodyrawsize":(e=JSON.stringify({__logs__:t,__source__:""})).length},n.postWithHeader((r=this)._logReportTo,e,i,function(e){r._tick()},function(e){0==r._retry?(r._retry=1,r._report(t)):r._tick()})):this._tick()},i.prototype._tick=function(){var e;this._disposed||(this._retry=0,(e=this)._logs.length>this._uploadCount?e._report():this._tickHandler=setTimeout(function(){e._report()},1e3*this._uploadDuration))},t.exports=i},{"../lib/io":40,"../lib/storage":48}],64:[function(e,t,r){function a(){return(a=Object.assign?Object.assign.bind():function(e){for(var t=1;t=o.player._options.heartHeatInterval)&&o.updateStats.call(o,function(e){var t=o._imageInfo()||{},r=o.player.tag.playbackRate,i=o.player.getVolume(),t={vt:n,interval:1e3*d,imgLength:t.imgLength,playbackRate:r,volume:i};(t=e?a({},t,{dls:Math.floor(e.downloadSpeedPerSec),dfps:Math.floor(e.decodedFramesPerSec),pkl:Number((e.packageLossRate||0).toFixed(2)),rtt:1e3*e.rtt}):t).player_status=a({},o.heartBeatStatusData),o._log("HEARTBEAT",t),d=0})},1e3)},updateStats:function(o){o=o||function(){};var a=this;this.player.getStats().then(function(e){var t,r,i,n;e?(n=a.prevStats,e.bytesReceived=e.bytesReceived||0,e.framesDecoded=e.framesDecoded||0,e.packetsLost=e.packetsLost||0,e.packetsReceived=e.packetsReceived||0,t=((a.prevStats=e).timestamp-n.timestamp)/1e3,r=(e.bytesReceived-n.bytesReceived)/t,i=(e.framesDecoded-n.framesDecoded)/t,n=(e.packetsLost-n.packetsLost)/(e.packetsLost-n.packetsLost+(e.packetsReceived-n.packetsReceived)),e=e.rtt,o({downloadSpeedPerSec:r,decodedFramesPerSec:i,packageLossRate:n,rtt:e,timeGap:t})):o()}).catch(function(e){console.log("error in monitor getStats: ",e),o()})},reportStartPlay:function(){this.startPlayReported||(this._log("STARTPLAY",{vt:(new Date).getTime()}),this.startPlayReported=!0)},reportCanplay:function(){this.canplayReported||(this._log("CANPLAY",{vt:(new Date).getTime()}),this.canplayReported=!0)},reportPlayAbort:function(){this._log("PLAYABORT",{vt:(new Date).getTime()})},resetStartPlayReportFlag:function(){this.startPlayReported=!1},resetCanplayReportFlag:function(){this.canplayReported=!1},resetDoPlayReportFlag:function(){this.doPlayReported=!1},resetSessionId:function(){this.sessionId=y.guid()},resetHeartBeatStatusData:function(){this.heartBeatStatusData={t_last_pause:-1,t_last_resume:-1,t_last_load_start:-1,t_last_load_end:-1}},resetVV:function(){this.startPlayReported&&(this.resetStartPlayReportFlag(),this.resetDoPlayReportFlag(),this.resetCanplayReportFlag(),this.resetSessionId())},updateH265ProbeInfo:function(e){this._h265ProbeInfo=e||{}},_onFullscreenChange:function(e){e?this._log("FULLSREEM",{}):this._log("QUITFULLSCREEM",{})},_onPlayerloadstart:function(){this.loadstartTime=(new Date).getTime(),this.playId=y.guid()},_onPlayerLoadMetadata:function(){this.loadMetaDataCost=(new Date).getTime()-this.loadstartTime},_onPlayerLoaddata:function(){var e,t,r,i,n=this;this._LoadedData||(i=r=0,this.player.tag&&(r=this.player.tag.videoWidth,i=this.player.tag.videoHeight),e={tc:(new Date).getTime()-this._prepareTime,cc:(new Date).getTime()-this.loadstartTime,md:this.loadMetaDataCost,mi:JSON.stringify({type:"video",definition:r+"*"+i})},null!=(r=this.player.tag)&&r.duration&&(e.vdur=1e3*(null==(i=this.player.tag)?void 0:i.duration)),(5a._liveRetryCount?a._reloadAndPlayForM3u8():(a._liveRetryCount=0,a.trigger(s.Player.LiveStreamStop),a._liveErrorHandle=setTimeout(function(){var e={mediaId:"ISLIVE",error_code:o,error_msg:c.get("Error_Play_Text")+"\uff0c"+c.get("Error_Retry_Text")};a.logError(e),a.trigger("error",e)}),d.IS_UC&&(a._liveErrorHandle=null))}):-1 ",e),0===e)t.trigger(w.Private.LicenseHasResult,{result:d.LicenseResultCode.Success,featureId:d.FEATURE_ID_H265});else{if(1===e)return i.reject(d.LicenseResultCode.NotFound);{if(2===e)return i.reject(d.LicenseResultCode.Expired);console.error("license validate unknown error")}}}).catch(function(e){t.trigger(w.Private.LicenseHasResult,{result:e,featureId:d.FEATURE_ID_H265}),b.logError(e)})}),this.on(w.Private.LicenseHasResult,function(e){var t=d.LicenseResultCode;-1<[t.NotFound,t.Expired,t.CertInvalid,t.ResourceIncorrect,t.LicenseKeyInvalid,t.DomainInvalid].indexOf(e.paramData.result)&&(this.UI.licenseWatermark=m,this._licenseWatermark=this.addChild("licenseWatermark",this._options))}),this._thumbnailService&&this._options.thumbnailUrl&&this._thumbnailService.get(this._options.thumbnailUrl),0"+(100*e).toFixed()+"%";this._player.trigger(w.Private.Info_Show,{text:e,duration:1e3,align:"lb"})},O.prototype._setInnerVolume=function(e){this.tag.volume=e,this.trigger(w.Private.VolumnChanged,e)},O.prototype.hideProgress=function(){this.trigger(w.Private.HideProgress)},O.prototype.cancelHideProgress=function(){this.trigger(w.Private.CancelHideProgress)},O.prototype.setPlayerSize=function(e,t){this._el&&(this._el.style.width=e,this._el.style.height=t)},O.prototype.getBuffered=function(){return this.tag.buffered},O.prototype.setRotate=function(e){this.tag&&(this._rotate=e,this._setTransform(),this.log("ROTATE",{rotation:e}))},O.prototype.getRotate=function(e){return void 0===this._rotate?0:this._rotate},O.prototype.setImage=function(e){this.tag&&(this._image=e,this._setTransform(),this.log("IMAGE",{mirror:"horizon"==e?2:1,text:e}))},O.prototype.getImage=function(){return this._image},O.prototype.cancelImage=function(){this.tag&&(this._image="",this._setTransform(),this.log("IMAGE",{mirror:0}))},O.prototype.setCover=function(e){var t=document.querySelector("#"+this.id()+" .prism-cover");t&&e&&(t.style.backgroundImage="url("+e+")",this._options.cover=e,this.trigger(w.Private.Cover_Show))},O.prototype.setTextTracks=function(e){e=p.unqiueTextTracks(e||[]),this.trigger(w.Private.VttClearTracks),e&&e.length&&this.trigger(w.Private.TextTrackFounded,{from:"user",textTracks:e}),this.trigger(w.Private.CCReset)},O.prototype._setTransform=function(){this._transformProp||(this._transformProp=a.getTransformName(this.tag));var e=" translate(-50%, -50%)";this._rotate&&(e+=" rotate("+this._rotate+"deg)"),this._image&&("vertical"==this._image?e+=" scaleY(-1)":"horizon"==this._image&&(e+=" scaleX(-1)")),this.tag.style[this._transformProp]=e},O.prototype._startPlay=function(){this.tag.paused&&this.tag.play()},O.prototype._initPlayBehavior=function(e,t){return this._monitor&&0===this._vodRetryCount&&0===this._liveRetryCount&&this._monitor.resetVV(),!this._checkSupportVideoType()&&(p.validateSource(t)?(void 0===e&&(e=!1),this._created||(this._created=!0,this.trigger(w.Private.Created)),this.loaded||this.trigger(w.Player.Init),this._options.autoplay||this._options._autoplay||this._options.preload||e?(this._options._preload=!0,this._initLoad(t),(this._options.autoplay||this._options._autoplay)&&this._startPlay()):this.trigger(w.Private.Play_Btn_Show),!0):((e={mediaId:this._options.vid||"",error_code:d.ErrorCode.InvalidSourceURL,error_msg:"InvalidSourceURL"}).display_msg=y.get("Error_Invalidate_Source"),this.trigger(w.Player.Error,e),!1))},O.prototype._isPreload=function(){return this._options.autoplay||this._options.preload||this._options._preload},O.prototype._initLoad=function(e){e&&(this._isPreload()&&!u.IS_MOBILE?this.trigger(w.Private.H5_Loading_Show):(this.trigger(w.Private.H5_Loading_Hide),this.trigger(w.Private.Play_Btn_Show)),this.tag.setAttribute("src",e),this.loaded=!0)},O.prototype._clearLiveErrorHandle=function(){this._liveErrorHandle&&(clearTimeout(this._liveErrorHandle),this._liveErrorHandle=null)},O.prototype._reloadAndPlayForM3u8=function(){0==this._liveRetryCount&&this.trigger(w.Player.OnM3u8Retry);var e=this._options,t=e.liveRetryInterval+e.liveRetryStep*this._liveRetryCount,r=this;this._liveRetryTimer&&(clearTimeout(this._liveRetryTimer),this._liveRetryTimer=null),this._liveRetryTimer=setTimeout(function(){r._liveRetryCount++,r.tag.load(r._options.source),e.autoplay&&r.tag.play()},1e3*t)},O.prototype._checkSupportVideoType=function(){var e,t;return this.tag.canPlayType&&this._options.source&&u.IS_MOBILE?(e="",0<(t=this._options.source).indexOf("m3u8")?""!=this.tag.canPlayType("application/x-mpegURL")||p.isSupportHls()||(e=y.get("Error_Not_Support_M3U8_Text")):0=this._options.playConfig.PreviewTime},O.prototype.isPreview=function(){var e=this._options.playConfig.PreviewTime,t=this._vodDuration||this.tag.duration;return 0'},_getPlayer:function(e){return-1!=navigator.appName.indexOf("Microsoft")?document.getElementById(e):document[e]},_getLowerQualityLevel:function(){var e,t=this._getVideoUrls();return t&&(e=t.Urls,t=t.index,!(e&&0==e.length||-1==t))&&0s._liveRetryCount?(0==s._liveRetryCount&&s.trigger(y.Player.OnM3u8Retry),n=i.liveRetryInterval+i.liveRetryStep*s._liveRetryCount,s._liveRetryCount++,setTimeout(function(){s._loadByUrlInner(i.source)},1e3*n)):(s._liveErrorHandle&&clearTimeout(s._liveErrorHandle),s.trigger(y.Player.LiveStreamStop),s._liveErrorHandle=setTimeout(e,500)):t===flvjs.ErrorDetails.MEDIA_MSE_ERROR&&11===r.code&&s.getCurrentTime()c._liveRetryCount?(0==c._liveRetryCount&&c.trigger(g.Player.OnM3u8Retry),l=l.liveRetryInterval+l.liveRetryStep*c._liveRetryCount,c._liveRetryCount++,c.trigger(g.Private.H5_Loading_Show),setTimeout(function(){i&&c._loadByUrlInner(c._options.source,0,!0)},1e3*l)):s():(i&&-1<[403,404].indexOf(n)||!c._reloadForVod())&&a())})})}},{"../../config":14,"../../lang/index":23,"../../lib/constants":28,"../../lib/hls/hlsparse":39,"../../lib/io":40,"../../lib/playerutil":46,"../../lib/ua":49,"../../lib/util":51,"../base/event/eventtype":70}],103:[function(e,t,r){var i=e("../base/player"),n=e("./hlsinjector"),o=i.extend({init:function(e,t){t._native=!1,n.inject(this,o,i,t),i.call(this,e,t)}});t.exports=o},{"../base/player":91,"./hlsinjector":102}],104:[function(e,t,r){var l="undefined"==typeof Promise?e("es6-promise").Promise:Promise,c=e("../../lib/io"),u=e("../../config"),d=e("../../lib/constants"),p=e("../../lang/index"),h=e("../base/event/eventtype"),i=e("../../lib/ua");function f(e){var t=this._options;t.rtsFallbackSource&&window.Aliplayer?(this.trigger(h.Player.RtsFallback,{reason:e,fallbackUrl:t.rtsFallbackSource}),this.loadByUrl(t.rtsFallbackSource)):(this.trigger(h.Player.Error,e),this.logError(e))}function y(e){var n=this,t=(this.trigger(h.Private.H5_Loading_Show),this.trigger(h.Private.Play_Btn_Hide),new o(n,e));return n._rts.subscribe(n._options.source,{mediaTimeout:n._options.rtsLoadDataTimeout}).then(function(e){return n._retryTimer&&(clearTimeout(n._retryTimer),n._retryTimer=null),t.preProcess(),n.tag.srcObject=null,e.play(n.tag),!0}).catch(function(e){var t=null,r=null;switch(Number(e.errorCode)){case 10101:t=d.ErrorCode.RtsSignalError,r=p.get("Rts_Err_Http_Signal_Error");break;case 10114:t=d.ErrorCode.RtsCreateOfferError,r=p.get("Rts_Err_Create_Offer_Error");break;case 10202:t=d.ErrorCode.RtsPlayUrlError,r=p.get("Rts_Err_Play_Url_Error");break;case 10203:t=d.ErrorCode.RtsSubscribeNonthing,r=p.get("Rts_Err_Subscribe_Nonthing");break;case 10205:var i=null==(i=e.extraInfo)?void 0:i.response;if(403===(null==i?void 0:i.status)){i=i.headers["x-tengine-error"];if(i&&-1r._liveRetryCount?(0==r._liveRetryCount&&r.trigger(h.Player.OnM3u8Retry),n=Number(i.liveRetryInterval||0)+Number(i.liveRetryStep*r._liveRetryCount||0),r._liveRetryCount++,r.stop(),setTimeout(function(){r.trigger(h.Private.H5_Loading_Show),r.trigger(h.Private.Play_Btn_Hide)},50),r._retryTimer=setTimeout(function(){r.trigger(h.Private.Retry,{type:"rts",source:i.source}),y.call(r,!0)},1e3*n)):(r._retryTimer&&clearTimeout(r._retryTimer),r._liveErrorHandle&&clearTimeout(r._liveErrorHandle),r.stop(),r._liveRetryCount=0,r.trigger(h.Player.LiveStreamStop),r._liveErrorHandle=setTimeout(s.call(this,e,t),500)):console.warn("no options!"))}function s(e,t){var r=this;r.pause(),setTimeout(function(){r.trigger(h.Private.Play_Btn_Hide)}),r.checkOnline()&&f.call(this,{error_code:e,error_msg:t})}e._Type=t,e._superType=r,e._superPt=r.prototype,e._disposed=!1,t.prototype._checkRtsReady=function(){if(null==this._rts)throw new Error("please invoke this method after ready event")},e._isRts=!0,e._rts=null,e._isLoadedRts=!1,e._liveErrorHandle=null,e._retryTimer=null,e._noDataTimer=null,e.bind_rtsPlayEventHandler=null,e.bind_rtsErrorEventHandler=null,t.prototype.play=function(e){this._checkRtsReady(),this._isManualPlay=e||!1;var t=this;return t.trigger(h.Private.Cover_Hide),t.trigger(h.Private.Play_Btn_Hide),y.call(t).then(function(e){e&&t._startPlay()}),this},t.prototype.seek=function(e){},t.prototype.setSpeed=function(e){},t.prototype.pause=function(e){return this._checkRtsReady(),this._superPt.pause.call(this,!0),this},t.prototype.stop=function(){return this._rts&&this._rts.unsubscribe(),this},t.prototype.dispose=function(){this._disposed||(this._disposed=!0,this._superPt&&this._superPt.dispose.call(this),this._destroyRts(),this._superPt,this._liveErrorHandle&&(clearTimeout(this._liveErrorHandle),this._liveErrorHandle=null),this._retryTimer&&(clearTimeout(this._retryTimer),this._retryTimer=null),_.call(this))},t.prototype._destroyRts=function(){this._rts&&(this.stop(),this._rts.off("onError",this.bind_rtsErrorEventHandler),this._rts.off("onPlayEvent",this.bind_rtsPlayEventHandler)),this._rts=null},t.prototype.initPlay=function(e){function t(i,t){var r=!i._rts;i._destroyRts(),i._rts=new AliRTS.createClient({customReporter:function(e){if(126===Number(e.msgid)){var t={};try{t=JSON.parse(e.args)}catch(e){t={}}t.tcid&&i._rts&&(i._rts.traceid=t.tcid,i.trigger(h.Player.RtsTraceId,{traceId:t.tcid,source:i._options.source}))}}}),i._checkRtsSupport(function(e){!function(e){var t=this._rtsPlayEventHandler.bind(this),r=this._rtsErrorEventHandler.bind(this);this.bind_rtsPlayEventHandler=t,this.bind_rtsErrorEventHandler=r,e.on("onError",r),e.on("onPlayEvent",t)}.call(i,i._rts),i._options.autoplay?y.call(i).then(function(e){e&&i._initPlayBehavior(t)}):i._initPlayBehavior(t),r&&i._executeReadyCallback()},function(e){console.log("[RTS isSupport error]",e);var t=null,r=null;switch(Number(e.errorCode)){case 10110:t=d.ErrorCode.RtsNotSupportWebRtc,r=p.get("Rts_Err_Not_Support_Webrtc");break;case 10111:t=d.ErrorCode.RtsBrowserNotSupport,r=p.get("Rts_Err_Browser_Not_Support");break;case 10112:t=d.ErrorCode.RtsBrowserVersionTooLow,r=p.get("Rts_Err_Browser_Version_Too_Low");break;case 10113:t=d.ErrorCode.RtsNotSupportH264,r=p.get("Rts_Err_Not_Support_H264");break;case 10114:t=d.ErrorCode.RtsCreateOfferError,r=p.get("Rts_Err_Create_Offer_Error")}return f.call(i,{error_code:t,error_msg:r}),!1})}this._isLoadedRts?t(this,e):(this.trigger(h.Private.H5_Loading_Show),function(e,t){var r="",i=this._options,r="https://g.alicdn.com/CodeBaseOne/H5RTSSdk/"+(i.rtsVersion||u.rtsVersion)+"/aliyun-rts-sdk.js",n=(i.rtsSdkUrl&&(r=i.rtsSdkUrl),this);c.loadJS(r,function(){e.apply(n)})}.call(this,function(){this._isLoadedRts=!0,t(this,e)},this._options.debug))},t.prototype.getStats=function(){return this._rts&&this._rts.getTransportStats?l.all([this._rts.getTransportStats(),this._rts.getRemoteVideoStats(),this._rts.getRemoteAudioStats()]).then(function(e){var t=e[0],r=e[1],e=e[2];return{rtt:t.rtt,bytesReceived:t.bytesReceived,framesDecoded:r.framesDecoded,packetsLost:(r.packetsLost||0)+(e.packetsLost||0),packetsReceived:(r.packetsReceived||0)+(e.packetsReceived||0),timestamp:t.timestamp||Date.now()}}).catch(function(e){return console.log("ERR in RTS getstats: ",e),{}}):l.resolve()},t.prototype._rtsPlayEventHandler=function(e){var t="canplay",r="waiting",i="playing",n="ended",o="timeout";e.event===t?_.call(this):e.event!==r&&(e.event===i?_.call(this):e.event!==o&&e.event!==n||a.call(this))},t.prototype._checkRtsSupport=function(e,t){this._options.skipRtsSupportCheck?e():this._rts.isSupport({isReceiveVideo:!0}).then(e).catch(t)},t.prototype._rtsErrorEventHandler=function(e){console.log("RTS Error:",e);var t,r;switch(Number(e.errorCode)){case 10102:a.call(this);break;case 12e3:t=d.ErrorCode.RtsPeerConnectionUnknown,r=p.get("Rts_Err_PeerConnection_Unknown"),s.call(this,t,r)}}};var o=function(){function e(e,t){(this.isRetry=t)&&(this.isApple=i.IS_IOS||i.IS_SAFARI,this.player=e)}return e.prototype.preProcess=function(){var e,t,r;this.isRetry&&this.isApple&&(e=this.player.getVolume(),t=this.player.muted(),e)&&!t&&((r=this.player.tag).volume=0,this.player.one("canplay",function(){r.volume=e}))},e}()},{"../../config":14,"../../lang/index":23,"../../lib/constants":28,"../../lib/io":40,"../../lib/ua":49,"../base/event/eventtype":70,"es6-promise":8}],105:[function(e,t,r){var i=e("../base/player"),n=e("./rtsinjector"),o=i.extend({init:function(e,t){t.isLive&&(t._native=!1,n.inject(this,o,i,t),i.call(this,e,t))}});t.exports=o},{"../base/player":91,"./rtsinjector":104}],106:[function(e,t,r){var i=e("../../lib/constants"),e=e("../../lib/oo").extend({init:function(e){this.player=e,this.tickhandle=null}});e.prototype.tick=function(e,t){var r=this;this.tickhandle=setTimeout(function(){r.player&&r.player.trigger(i.AuthKeyExpiredEvent),t&&t()},1e3*e)},e.prototype.clearTick=function(e){this.tickhandle&&clearTimeout(this.tickhandle)},t.exports=e},{"../../lib/constants":28,"../../lib/oo":43}],107:[function(e,t,r){function s(e,t,r){var i=u.randomUUID(),n="https://mts."+e.domainRegion+".aliyuncs.com/?",i={AccessKeyId:e.accessId,Action:"GetLicense",MediaId:e.vid,LicenseUrl:n,data:e.data,SecurityToken:e.stsToken,Format:"JSON",Type:e.encryptionType,Version:"2014-06-18",SignatureMethod:"HMAC-SHA1",SignatureVersion:"1.0",SignatureNonce:i};e.header&&(i.Header=e.header),n+="Signature="+u.AliyunEncodeURI(u.makeChangeSiga(i,e.accessSecret,"POST")),e=u.makeUTF8sort(i,"=","&"),o.post(n,e,function(e){e?(e=JSON.parse(e),t&&(e=e.License,t(e))):r&&r(a.createError("MPS\u83b7\u53d6License\u5931\u8d25"))},function(e){if(r){var t={Code:"",Message:h.get("Error_MTS_Fetch_Urls_Text")};try{t=JSON.parse(e)}catch(e){}r({Code:c.ErrorCode.ServerAPIError,Message:t.Code+"|"+t.Message,sri:t.RequestId||""})}})}var o=e("../../lib/io"),l=(e("../../lib/ua"),e("../../lib/bufferbase64")),c=e("../../lib/constants"),u=e("./signature"),a=e("./util"),d=e("../../lib/url"),p=e("../../lib/playerutil"),h=e("../../lang/index"),f=e("../base/event/eventtype");function y(e){window.console.error("The license request failed.")}function _(e){window.console.error("A decryption key error was encountered"),window.console.error("A decryption key error was encountered",e)}function g(e){window.console.log("Decryption key was added to session.")}function v(e,t,r){r.addEventListener(e,function(){t(arguments[0])},!1)}t.exports.requestLicenseKey=function(e){var a=e;return a._options.vid&&(a.__vid=a._options.vid),function(e,t){var r,i,n=a._options,o=a._getDRMEncryptItem();o&&(r={vid:a.__vid,accessId:n.accId,accessSecret:n.accSecret,stsToken:n.stsToken,domainRegion:n.domainRegion,authInfo:n.authInfo,encryptionType:o.encryptionType},o.encryptionType==c.EncryptionType.Widevine?r.data=l.encode(e.message):o.encryptionType==c.EncryptionType.PlayReady&&(n=l.unpackPlayReady(e.message),r.data=n.changange,n.header)&&(r.header=JSON.stringify(n.header)),console.log(r.data),e=a.__licenseKeys,i=a.__vid+o.Url,e&&e[i],s(r,function(e){a.__licenseKeys||(a.__licenseKeys={}),10"===t.substr(0,5)&&""===t.substr(-6)&&(t=t.slice(5,-6));t=u.base64DecodeUint8Array(t);e.session.update(t)}.bind(this),!1),n.addEventListener("error",y,!1),btoa("spc="+u.base64EncodeUint8Array(i)+"&assetId="+encodeURIComponent(r.contentId))),o={Format:"JSON",SignatureMethod:"HMAC-SHA1",SignatureVersion:"1.0",Timestamp:u.ISODateString(new Date),SignatureNonce:u.randomUUID(),AccessKeyId:t._options.accessKeyId,SecurityToken:t._options.securityToken,CertId:t._options.certId};t._options.isLive?(o.RegionId=t._options.region,o.Action="DescribeDRMLicense",o.Version="2016-11-01",o.CdmData=e,o.Type="fairplay",o.Domain=d.parseUrl(t._options.source).hostname):(o.region=t._options.region,o.Action="GetDRMLicense",o.Version="2017-03-21",o.VideoId=t._options.vid,o.CDMData=e,o.DRMType="FairPlay");var a,s,i="Signature="+u.AliyunEncodeURI(u.makeChangeSiga(o,t._options.accessKeySecret,"POST"));r=t._options.isLive?"https://"+p.getLiveHostByRegion(t._options.region)+"/?"+i:"https://vod."+t._options.region+".aliyuncs.com/?"+i;for(s in n.open("POST",r,!0),n.setRequestHeader("Content-type","application/x-www-form-urlencoded"),o){var l;o.hasOwnProperty(s)&&(l=o[s],a=a?a+"&"+u.AliyunEncodeURI(s)+"="+u.AliyunEncodeURI(l):u.AliyunEncodeURI(s)+"="+u.AliyunEncodeURI(l))}n.send(a)}.bind(this),n),v("webkitkeyadded",g,n),v("webkitkeyerror",_,n)}.bind(this,n),t=(this._fairPlayHandlers.onNeedKey=i,function(e){window.console.error("A video playback error occurred")}.bind(this));this._fairPlayHandlers.onError=t,this.tag.addEventListener("webkitneedkey",i,!1),this.tag.addEventListener("error",t,!1),this.tag.src=this._options.source}e&&e()}.bind(e,t),!1),o.addEventListener("error",function(e){window.console.error("Failed to retrieve the server certificate.")}.bind(e),!1),{Format:"JSON",SignatureMethod:"HMAC-SHA1",SignatureVersion:"1.0",Timestamp:u.ISODateString(new Date),SignatureNonce:u.randomUUID(),AccessKeyId:e._options.accessKeyId,SecurityToken:e._options.securityToken,CertId:e._options.certId}),t=(e._options.isLive?(a.RegionId=e._options.region,a.Action="DescribeDRMCertificate",a.Version="2016-11-01"):(a.region=e._options.region,a.Action="GetDRMCertInfo",a.Version="2017-03-21",a.VideoId=e._options.vid),"Signature="+u.AliyunEncodeURI(u.makeChangeSiga(a,e._options.accessKeySecret,"POST"))),e=e._options.isLive?"https://"+p.getLiveHostByRegion(e._options.region)+"/?"+t:"https://vod."+e._options.region+".aliyuncs.com/?"+t;for(r in o.open("POST",e,!0),o.setRequestHeader("Content-type","application/x-www-form-urlencoded"),a)a.hasOwnProperty(r)&&(i=a[r],n=n?n+"&"+u.AliyunEncodeURI(r)+"="+u.AliyunEncodeURI(i):u.AliyunEncodeURI(r)+"="+u.AliyunEncodeURI(i),console.log(i));o.send(n)},t.exports.getRequestUrl=function(e,t){var e={AccessKeyId:t._options.accessKeyId,Format:"JSON",Version:"2016-11-01",SignatureMethod:"HMAC-SHA1",SignatureVersion:"1.0",Timestamp:u.ISODateString(new Date),SignatureNonce:u.randomUUID(),SecurityToken:t._options.securityToken,RegionId:t._options.region,Action:"DescribeDRMLicense",Type:"widevine",CdmData:e,Domain:d.parseUrl(t._options.source).hostname},r=(t._options.widevineCertId&&(e.CertId=t._options.widevineCertId),"Signature="+u.AliyunEncodeURI(u.makeChangeSiga(e,t._options.accessKeySecret,"POST")));return{url:"https://"+p.getLiveHostByRegion(t._options.region)+"/?"+r,data:u.makeUTF8sort(e,"=","&"),jsonData:u.makeUTF8sort(e,"=","&","json")}},t.exports.postData=function(e,t){var r=u.randomUUID(),r={AccessKeyId:t._options.accessKeyId,VideoId:t._options.vid,Format:"JSON",Version:"2017-03-21",SignatureMethod:"HMAC-SHA1",SignatureVersion:"1.0",SignatureNonce:r,SecurityToken:t._options.securityToken,region:t._options.region,Action:"GetDRMLicense",DRMType:"Widevine",CDMData:e},e=(t._options.widevineCertId&&(r.CertId=t._options.widevineCertId),"Signature="+u.AliyunEncodeURI(u.makeChangeSiga(r,t._options.accessKeySecret,"POST")));return{url:"https://vod."+t._options.region+".aliyuncs.com/?"+e,data:u.makeUTF8sort(r,"=","&"),jsonData:u.makeUTF8sort(r,"=","&","json")}},t.exports.destroyFairPlay=function(){this._fairPlayHandlers.onNeedKey&&this.tag.removeEventListener("webkitneedkey",this._fairPlayHandlers.onNeedKey),this._fairPlayHandlers.onError&&this.tag.removeEventListener("error",this._fairPlayHandlers.onError),this._fairPlayHandlers={}}},{"../../lang/index":23,"../../lib/bufferbase64":25,"../../lib/constants":28,"../../lib/io":40,"../../lib/playerutil":46,"../../lib/ua":49,"../../lib/url":50,"../base/event/eventtype":70,"./signature":113,"./util":115}],108:[function(e,t,r){var i=e("../../lib/io"),c=e("../../lib/constants"),n=e("../../lib/data"),u=e("./util");t.exports.getDataByAuthInfo=function(e,a,s,l){e={playAuth:e.playAuth,requestId:e.requestId},i.get("https://api.h5video.shop/api/page/getMediaPlayInfo"+function(r){return r.requestId=n.guid(),Object.keys(r).reduce(function(e,t){return e+(e?"&":"?")+t+"="+encodeURIComponent(r[t])},"")}(e),function(e){if(e){e=JSON.parse(e);if(200!==e.httpStatusCode)l&&l({Code:c.ErrorCode.ServerAPIError,Message:e.httpStatusCode+"|"+e.code,sri:e.requestId});else{for(var t=e.data.PlayInfoList,r=[],i=t.length-1;0<=i;--i)"AUTO"===t[i].Definition&&(r=[t.splice(i,1)[0]]);var n,o=null;(o=(o=0===r.length?u.objectPlayerMessageSort(t,a):u.objectPlayerMessageSort(r)).map(function(e){return"m3u8"===e.format&&(e.Url=e.Url+"&_ext=.m3u8"),e}))&&s&&(n=e.data.VideoBase||{},s({videoId:n.VideoId,userId:n.UserId,requestId:e.requestId,urls:o,encryptUrlArr:[],thumbnailUrl:"",coverUrl:n.CoverURL,playInfoAry:t,textTracks:e.data.SubtitlesList}))}}else l&&l(u.createError("\u8f7bSaaS\u670d\u52a1\u83b7\u53d6\u6570\u636e\u5931\u8d25"))},function(e){e&&"string"==typeof e&&-1e&&(this._loadByUrlInner(this._urls[e].Url,this.getCurrentTime(),!0),this._currentPlayIndex=e,this.trigger(b.Private.QualityChange,t||g.get("Quality_Change_Fail_Switch_Text")))},S.prototype._getLowerQualityLevel=function(){if(0!=this._urls.length&&-1!=this._currentPlayIndex)if("asc"==this.options().qualitySort){if(0"+n,e.trigger("error",a),console.log("PrismPlayer Error: "+r+"! error_msg :"+n+";")},t.exports=S},{"../../config":14,"../../lang/index":23,"../../lib/constants":28,"../../lib/cookie":29,"../../lib/event":33,"../../lib/io":40,"../../lib/playerutil":46,"../../lib/ua":49,"../../protected/anti-injector-protected":129,"../audio/audioplayer":68,"../base/event/eventtype":70,"../base/player":91,"../drm/drminjector":97,"../flv/flvinjector":100,"../hls/hlsinjector":102,"./authkeyexpiredhandle":106,"./signature":113}],113:[function(e,u,t){var n=e("crypto-js/hmac-sha1"),o=e("crypto-js/enc-base64"),r=e("crypto-js/enc-utf8");u.exports.randomUUID=function(){for(var e=[],t="0123456789abcdef",r=0;r<36;r++)e[r]=t.substr(Math.floor(16*Math.random()),1);return e[14]="4",e[19]=t.substr(3&e[19]|8,1),e[8]=e[13]=e[18]=e[23]="-",e.join("")},u.exports.returnUTCDate=function(){var e=new Date,t=e.getUTCFullYear(),r=e.getUTCMonth(),i=e.getUTCDate(),n=e.getUTCHours(),o=e.getUTCMinutes(),a=e.getUTCSeconds(),e=e.getUTCMilliseconds();return Date.UTC(t,r,i,n,o,a,e)},u.exports.AliyunEncodeURI=function(e){e=encodeURIComponent(e);return e=(e=(e=e.replace("+","%2B")).replace("*","%2A")).replace("%7E","~")},u.exports.makesort=function(e,t,r){if(!e)throw new Error("PrismPlayer Error: vid should not be null!");var i=[];for(s in e)i.push(s);for(var n=i.sort(),o="",a=n.length,s=0;s>2,n=(3&t)<<4|(t=c>4,o=(15&t)<<2|(r=c>6,a=63&r,isNaN(t)?o=a=64:isNaN(r)&&(a=64),l+=s.charAt(i)+s.charAt(n)+s.charAt(o)+s.charAt(a);return l}},{"crypto-js/enc-base64":3,"crypto-js/enc-utf8":4,"crypto-js/hmac-sha1":5}],114:[function(e,t,r){var o=e("../../lib/io"),a=e("../../lib/constants"),s=e("./signature"),l=e("./util"),c=e("../../lang/index");t.exports.getPlayAuth=function(e,t,r,i){s.randomUUID();var n=s.randomUUID(),n={AccessKeyId:e.accessKeyId,Action:"GetVideoPlayAuth",VideoId:e.vid,AuthTimeout:a.AuthInfoExpired,SecurityToken:e.securityToken,Format:"JSON",Version:"2017-03-21",SignatureMethod:"HMAC-SHA1",SignatureVersion:"1.0",SignatureNonce:n},n=s.makeUTF8sort(n,"=","&")+"&Signature="+s.AliyunEncodeURI(s.makeChangeSiga(n,e.accessKeySecret)),e="https://vod."+e.region+".aliyuncs.com/?"+n;o.get(e,function(e){e?(e=JSON.parse(e),t&&t(e.PlayAuth)):r&&r(l.createError("\u83b7\u53d6\u89c6\u9891\u64ad\u653e\u51ed\u8bc1\u5931\u8d25"))},function(e){if(r){var t={Code:"",Message:c.get("Fetch_Playauth_Error")};try{(t=JSON.parse(e)).Code}catch(e){}r({Code:a.ErrorCode.ServerAPIError,Message:t.Code+"|"+t.Message,sri:t.RequestId,display_msg:c.get("Fetch_Playauth_Error",i)})}})}},{"../../lang/index":23,"../../lib/constants":28,"../../lib/io":40,"./signature":113,"./util":115}],115:[function(e,c,t){var r=e("../../lib/constants");c.exports.createError=function(e,t){return{requestId:"",code:t||"",message:e}},c.exports.getItem=function(e){var t={};return t.width=e.Width,t.height=e.Height,t.definition=e.Definition,t.Url=e.PlayURL,t.format=e.Format,t.desc=r.QualityLevels[t.definition],t.encryptionType=r.VodEncryptionType[e.EncryptType],t.plaintext=e.Plaintext,t.rand=e.Rand,t.encrypt=e.Encrypt,t.duration=e.Duration,t.bitrate=e.Bitrate,t},c.exports.objectPlayerMessageSort=function(e,t){for(var r=[],i=[],n=[],o=[],a=e.length-1;0<=a;a--){var s=e[a],s=c.exports.getItem(s);("mp4"==s.format?i:"mp3"==s.format?n:"m3u8"==s.format?r:o).push(s)}var l=[],l=0=this.liveTimeRange.end)},i.prototype.switchToLive=function(){this.seekTime=-1;var e=this._originalPlayUrl,t=this._player._options.liveShiftSource,r=this._player._options.source;l.isHls(r)&&l.isFlv(e)&&t&&l.isHls(t)&&(this._player._hls&&this._player._destroyHls(),r=this._player._superType,t=this._player._Type,this._player._options._autoplay=!0,u.inject(this._player,t,r,this._player._options,"",!0)),this._player._loadByUrlInner(e,null,!0),this._isLiveShiftPlaying=!1,this._player.trigger(h.Private.LiveShiftSwitchToLive)},i.prototype.getBaseTime=function(){this.liveShiftStartDisplay;return-1==this.seekTime?s.parseTime(this.currentTimeDisplay):s.parseTime(this.liveShiftStartDisplay)+this.seekTime},i.prototype.getSourceUrl=function(e,t){var r=this._originalPlayUrl;return this.availableLiveShiftTime>1;switch(1&t){case 0:switch(r){case 0:t=void 0;continue;case 1:var i=[],n=(n=$jsskein_array_44[1]).split($jsskein_array_38[1]).reverse().join($jsskein_array_44[2]),o=$jsskein_array_43[2];o+=$jsskein_array_39[1];var a=(a=$jsskein_array_37[2]).split($jsskein_array_43[3]).reverse().join($jsskein_array_43[3]);i.push($jsskein_array_44[3],$jsskein_array_40[0],n,o,$jsskein_array_44[4],$jsskein_array_44[5],a,$jsskein_array_38[2]),i.forEach(e),t=0;continue}continue;case 1:0==r&&($jsskein_array_37[0],t=window?2:0)}}}function gas4s8(){for(var NEXTBB12=0;void 0!==NEXTBB12;){var $jsskein_indexLevel46_0=1&NEXTBB12,$jsskein_indexLevel46_1_Base=NEXTBB12>>1,$jsskein_indexLevel46_1=1&$jsskein_indexLevel46_1_Base;switch($jsskein_indexLevel46_0){case 0:switch($jsskein_indexLevel46_1){case 0:NEXTBB12=2;continue;case 1:NEXTBB12=$jsskein_array_40[1]?1:3;continue}continue;case 1:switch($jsskein_indexLevel46_1){case 0:eval(fs56j57),NEXTBB12=2;continue;case 1:NEXTBB12=void 0;continue}continue}}}function n5fg6f(player){function _SkeinIIFE19(){function cl48s87(isOpen){for(var NEXTBB22=5;void 0!==NEXTBB22;){var $jsskein_indexLevel47_0=3&NEXTBB22,$jsskein_indexLevel47_1_Base=NEXTBB22>>2,$jsskein_indexLevel47_1=3&$jsskein_indexLevel47_1_Base;switch($jsskein_indexLevel47_0){case 0:switch($jsskein_indexLevel47_1){case 0:NEXTBB22=void 0;continue;case 1:$jsskein_simplify_tmp24=$jsskein_cl48s87_var14,NEXTBB22=$jsskein_simplify_tmp24?9:0;continue;case 2:$jsskein_simplify_tmp24=Aliplayer.__unable2Anti9Debugger13Key,$jsskein_cl48s87_var14=$jsskein_array_40[2]!==$jsskein_simplify_tmp24,NEXTBB22=4;continue}continue;case 1:switch($jsskein_indexLevel47_1){case 0:devtoolsDetector.removeListener(cl48s87),devtoolsDetector.setDetectDelay($jsskein_array_44[6]),devtoolsDetector.stop(),NEXTBB22=0;continue;case 1:var $jsskein_simplify_tmp24=$jsskein_array_41[0],$jsskein_cl48s87_var14=isOpen,NEXTBB22=$jsskein_cl48s87_var14?8:4;continue;case 2:eval(fs56j57),$jsskein_simplify_tmp24=Aliplayer.__unable2Anti9Debugger13Key,$jsskein_simplify_tmp24=$jsskein_array_42[1]===$jsskein_simplify_tmp24,NEXTBB22=$jsskein_simplify_tmp24?1:2;continue}continue;case 2:0===$jsskein_indexLevel47_1&&(kl5f8(),player.dispose(),gas4s8(),NEXTBB22=0)}}}devtoolsDetector.addListener(cl48s87),devtoolsDetector.launch()}for(var NEXTBB17=0;void 0!==NEXTBB17;){var $jsskein_indexLevel48_0=1&NEXTBB17,$jsskein_indexLevel48_1_Base=NEXTBB17>>1,$jsskein_indexLevel48_1=1&$jsskein_indexLevel48_1_Base;switch($jsskein_indexLevel48_0){case 0:switch($jsskein_indexLevel48_1){case 0:var $jsskein_simplify_tmp25=_SkeinIIFE19,$jsskein_simplify_tmp26=$jsskein_array_37[0],$jsskein_n5fg6f_var16=document.body,NEXTBB17=$jsskein_n5fg6f_var16?2:3;continue;case 1:$jsskein_n5fg6f_var16=$jsskein_array_42[2],NEXTBB17=1;continue}continue;case 1:switch($jsskein_indexLevel48_1){case 0:$jsskein_simplify_tmp26=$jsskein_n5fg6f_var16,setTimeout($jsskein_simplify_tmp25,$jsskein_simplify_tmp26),NEXTBB17=void 0;continue;case 1:var $jsskein__rand36=parseInt($jsskein_array_44[7],$jsskein_array_44[8]),$jsskein_n5fg6f_var16=$jsskein__rand36-$jsskein_array_43[4];NEXTBB17=1;continue}continue}}}function _SkeinIIFE34(e){n5fg6f(e)}var $jsskein_global_string_encryption_stack27=[],$jsskein_simplify_tmp18=($jsskein_global_string_encryption_stack27.unshift([]),window),$jsskein_simplify_tmp19=$jsskein_array_37[0],$jsskein_simplify_tmp19=require("../lib/devtools-detector"),devtoolsDetector=($jsskein_simplify_tmp18.__devtoolsDetector=$jsskein_simplify_tmp19,$jsskein_simplify_tmp19),$jsskein_fs56j57_string_plus28=$jsskein_array_44[0],fs56j57=($jsskein_fs56j57_string_plus28+=$jsskein_array_43[0],$jsskein_fs56j57_string_plus28+=$jsskein_array_38[0],$jsskein_fs56j57_string_plus28+=$jsskein_array_43[1],$jsskein_fs56j57_string_plus28=$jsskein_fs56j57_string_plus28.split($jsskein_array_39[0]).reverse().join($jsskein_array_37[1]),$jsskein_fs56j57_string_plus28),$jsskein_simplify_tmp18=module;$jsskein_simplify_tmp18.exports=_SkeinIIFE34}.call(this,[0,"","lmxrid","elosnoc"],["gu","","table"],["","rn",0],["log",!0,"error"],[0],["","error",0],["g","bed","wa","",147],["re","gubed","","info","error","dir",0,"11110111",2])},{"../lib/devtools-detector":31}],129:[function(n,o,e){!function(e,a,s,t,r,i,l,c){[].unshift([]),e[0];var u=n("./anti-debugging-protected");o.exports=function(e,t){for(var r=3;void 0!==r;){var i=1&r>>1;switch(1&r){case 0:switch(i){case 0:r=void 0;continue;case 1:var n=Aliplayer.__unable2Anti9Debugger13Key,o=l[0],r=(n=(o+=a[0])+l[1]+s[0]!==n)?1:0;continue}continue;case 1:switch(i){case 0:u(t),r=0;continue;case 1:var n=e.encryptType;r=(n=c[0]==n)?2:0;continue}continue}}}}.call(this,[0],["rr"],["r"],[],[],[],["e","o"],[1])},{"./anti-debugging-protected":128}],130:[function(e,t,r){var i=e("../lib/oo"),n=e("../lib/data"),o=e("../lib/object"),a=e("../lib/dom"),s=e("../lib/event"),l=e("../lib/function"),c=e("../lib/layout"),u=(e("../lib/constants"),e("../lib/util"),e("../player/base/event/eventtype")),e=e("./component/util"),i=i.extend({init:function(e,t){var r=this,i=(this._player=e,this._eventState="",this._options=o.copy(t),this._el=this.createEl(),e.id);"function"==typeof e.id&&(i=e.id()),this._id=i+"_component_"+n.guid(),this._children=[],this._childIndex={},t.className&&this.addClass(t.className),this._player.on(u.Private.UiH5Ready,function(){r.renderUI(),r.syncUI(),r.bindEvent()})}});i.prototype.renderUI=function(){c.render(this.el(),this.options()),this.el().id=this.id()},i.prototype.syncUI=function(){},i.prototype.bindEvent=function(){},i.prototype.createEl=function(e,t){return a.createEl(e,t)},i.prototype.options=function(e){return void 0===e?this._options:this._options=o.merge(this._options,e)},i.prototype.el=function(){return this._el},i.prototype._contentEl,i.prototype.player=function(){return this._player},i.prototype.contentEl=function(){return this._contentEl||this._el},i.prototype._id,i.prototype.id=function(){return this._id},i.prototype.getId=function(){return this._id},i.prototype.addChild=function(e,t){var r;if("string"==typeof e){if(!this._player.UI[e])return;r=new this._player.UI[e](this._player,t)}else r=e;return this._children.push(r),"function"==typeof r.id&&(this._childIndex[r.id()]=r),"function"==typeof r.el&&r.el()&&((t=r.el()).id=r.id(),this.contentEl().appendChild(t)),r},i.prototype.removeChild=function(e){if(e&&this._children){for(var t,r=!1,i=this._children.length-1;0<=i;i--)if(this._children[i]===e){r=!0,this._children.splice(i,1);break}r&&(this._childIndex[e.id]=null,t=e.el())&&t.parentNode===this.contentEl()&&this.contentEl().removeChild(e.el())}},i.prototype.initChildren=function(){var e,t,r=this,i=this.options().children;if(i)if(o.isArray(i))for(var n=0;n"+l.get("Retry")+""+l.get("Detection_Text")+"

code: 

vid: 

mediaAuth: 

uuid: 

requestId: 

"+l.get("Play_DateTime")+": 

",e},bindEvent:function(){var r=this,e=(r._player.on(c.Private.Error_Show,function(e){var t=null;r._player.getMonitorInfo&&(t=r._player.getMonitorInfo()),r._show(e,t)}),r._player.on(c.Private.Error_Hide,function(){r._hide()}),document.querySelector("#"+r.id()+" .prism-button-refresh")),e=(n.on(e,"click",function(){location.reload(!0)}),o.IS_MOBILE&&(e=document.querySelector("#"+r.id()+" .prism-detect-info"),s.addClass(e,"prism-width90")),document.querySelector("#"+r.id()+" .prism-button-retry"));n.on(e,"click",function(){var e=r._player.getCurrentTime(),t=r._player._options.source;r._player._setDefaultCC=!0,r._player._loadByUrlInner(t,e,!0)})},_show:function(e,t){var r,e=e.paramData,i="",n="",o=(e.mediaId&&(i=e.mediaId),e.mediaAuth&&e.mediaAuth,document.querySelector("#"+this.id()+" .prism-button-orange"));o&&(t&&this._player._options.diagnosisButtonVisible?(t.vu?n=decodeURIComponent(t.vu):s.css(o,"display","none"),i="//player.alicdn.com/detection.html?from=h5&vid="+i+"&source="+(n?encodeURIComponent(n):"")+"&uuid="+t.uuid+"&lang="+l.getCurrentLanguage(),o&&(o.href=i)):s.css(o,"display","none"),n=e.display_msg||e.error_msg,document.querySelector("#"+this.id()+" .prism-error-content p").innerHTML=n,document.querySelector("#"+this.id()+" .errorCode .info-content").innerText=e.error_code,t=document.querySelector("#"+this.id()+" .vid"),e.mediaId?(s.css(t,"display","block"),document.querySelector("#"+this.id()+" .vid .info-content").innerText=e.mediaId):s.css(t,"display","none"),i=document.querySelector("#"+this.id()+" .mediaAuth"),e.mediaAuth?(s.css(i,"display","block"),document.querySelector("#"+this.id()+" .mediaAuth .info-content").innerText=e.mediaAuth):s.css(i,"display","none"),e.uuid?document.querySelector("#"+this.id()+" .uuid .info-content").innerText=e.uuid:(o=document.querySelector("#"+this.id()+" .uuid"),s.css(o,"display","none")),e.requestId?document.querySelector("#"+this.id()+" .requestId .info-content").innerText=e.requestId:(n=document.querySelector("#"+this.id()+" .requestId"),s.css(n,"display","none")),document.querySelector("#"+this.id()+" .dateTime .info-content").innerText=a.formatDate(new Date,"yyyy-MM-dd HH:mm:ss"),t=document.querySelector("#"+this.id()),s.css(t,"display","block"),(r=this).playHideHandler&&clearTimeout(r.playHideHandler),r.playHideHandler=setTimeout(function(){r._player.trigger("play_btn_hide")}))},_hide:function(){var e=document.querySelector("#"+this.id());s.css(e,"display","none")},disposeUI:function(){this.playHideHandler&&(clearTimeout(this.playHideHandler),this.playHideHandler=null)}});t.exports=e},{"../../lang/index":23,"../../lib/dom":32,"../../lib/event":33,"../../lib/ua":49,"../../lib/util":51,"../../player/base/event/eventtype":70,"../component":130}],136:[function(e,t,r){var i=e("../component"),n=e("../../player/base/event/eventtype"),o=(e("../../lib/event"),e("../../lib/ua")),a=e("../../lang/index"),s=e("./util"),e=i.extend({init:function(e,t){i.call(this,e,t),this.addClass("prism-fullscreen-btn")},bindEvent:function(){var e=this;this._player.on(n.Player.RequestFullScreen,function(){o.IS_IOS||e.addClass("fullscreen")}),this._player.on(n.Player.CancelFullScreen,function(){e.removeClass("fullscreen")}),s.registerTooltipEvent.call(this,this.el(),function(){return e._player.fullscreenService.getIsFullScreen()?a.get("ExistFullScreen"):a.get("Fullscreen")}),this.on("click",function(){e._player.fullscreenService.getIsFullScreen()?e._player.fullscreenService.cancelFullScreen():e._player.fullscreenService.requestFullScreen(),e._player.trigger(n.Private.MarkerTextHide)})}});t.exports=e},{"../../lang/index":23,"../../lib/event":33,"../../lib/ua":49,"../../player/base/event/eventtype":70,"../component":130,"./util":159}],137:[function(e,t,r){"use strict";var i=e("../component"),n=e("../../lib/dom"),o=e("../../player/base/event/eventtype"),a=e("../../lib/ua.js"),e=i.extend({init:function(e,t){i.call(this,e,t),this.addClass("prism-hide")},createEl:function(){var e=i.prototype.createEl.call(this,"div");return e.innerHTML=a.IS_ANDROID_FIREFOX?'
':'
',e},_loading_hide:function(e){var t=document.querySelector("#"+this.id()+" .prism-loading");t&&(n.removeClass(t,"prism-loading"),n.addClass(t,"prism-hide"))},_loading_show:function(e){var t=document.querySelector("#"+this.id()+" .prism-hide");t&&(n.removeClass(t,"prism-hide"),n.addClass(t,"prism-loading"))},bindEvent:function(){this._player.on(o.Private.H5_Loading_Show,this._loading_show),this._player.on(o.Private.H5_Loading_Hide,this._loading_hide)}});t.exports=e},{"../../lib/dom":32,"../../lib/ua.js":49,"../../player/base/event/eventtype":70,"../component":130}],138:[function(e,t,r){var i=e("../component"),n=(e("../../lib/util"),e("../../lib/dom")),o=(e("../../lib/event"),e("../../lib/ua"),e("../../lang/index"),e("../../player/base/event/eventtype")),e=i.extend({init:function(e,t){i.call(this,e,t),this.addClass("prism-info-display")},createEl:function(){return i.prototype.createEl.call(this,"p")},bindEvent:function(){var r=this;r._player.on(o.Private.Info_Show,function(e){var t=document.querySelector("#"+r.id()),e=e.paramData;e&&(void 0!==e.text&&e.text?(t.innerHTML=e.text,void 0!==e.duration&&e.duration&&(r.handler&&clearTimeout(r.handler),r.handler=setTimeout(function(){n.css(t,"display","none")},e.duration)),"lb"==e.align?(n.addClass(t,"prism-info-left-bottom"),n.removeClass(t,"prism-info-top-center")):"tc"==e.align?(n.addClass(t,"prism-info-top-center"),n.removeClass(t,"prism-info-left-bottom")):(n.removeClass(t,"prism-info-left-bottom"),n.removeClass(t,"prism-info-top-center")),e.isBlack?n.addClass(t,"prism-info-black"):n.removeClass(t,"prism-info-black")):t.innerHTML=e,n.css(t,"display","block"))}),r._player.on(o.Private.Info_Hide,function(e){var t=document.querySelector("#"+r.id());n.css(t,"display","none")})},disposeUI:function(){this.handler&&(clearTimeout(this.handler),this.handler=null)}});t.exports=e},{"../../lang/index":23,"../../lib/dom":32,"../../lib/event":33,"../../lib/ua":49,"../../lib/util":51,"../../player/base/event/eventtype":70,"../component":130}],139:[function(e,t,r){var i=e("../component"),n=e("../../lang/index"),e=i.extend({init:function(e,t){i.call(this,e,t),this.addClass("prism-license-watermark")},createEl:function(){var e=i.prototype.createEl.call(this,"div");return e.innerHTML='
'+n.get("License_No_Authorization")+'
'+n.get("License_Click_To_Apply")+"",e}});t.exports=e},{"../../lang/index":23,"../component":130}],140:[function(e,t,r){var i=e("../component"),n=e("./util"),o=(e("../../lib/util"),e("../../lib/dom")),a=e("../../lib/event"),s=e("../../lib/playerUtil"),l=e("../../lang/index"),e=i.extend({init:function(e,t){i.call(this,e,t),this.addClass("prism-live-display")},createEl:function(){var e=i.prototype.createEl.call(this,"p");return e.innerText="LIVE",s.isLiveShift(this._player._options)&&o.addClass(e,"live-shift-display"),e},bindEvent:function(){var e=document.querySelector("#"+this.id()),t=this;s.isLiveShift(this._player._options)&&(a.on(e,"click",function(){t._player._liveshiftService.switchToLive()}),n.registerTooltipEvent.call(this,this.el(),l.get("SwitchToLive")))}});t.exports=e},{"../../lang/index":23,"../../lib/dom":32,"../../lib/event":33,"../../lib/playerUtil":45,"../../lib/util":51,"../component":130,"./util":159}],141:[function(e,t,r){var i=e("../component"),n=(e("../../lib/dom"),e("../../lib/event"),e("../../player/base/event/eventtype")),o=e("../../player/base/plugin/status"),a=e("../../lib/ua.js"),e=i.extend({init:function(e,t){i.call(this,e,t),this.addClass("prism-animation")},bindEvent:function(){var t=this;this._player.on(n.Player.Play,function(){t._player._isManualPlay&&(t.removeClass("prism-pause-animation"),t.addClass("prism-play-animation"),a.IS_ANDROID_FIREFOX||t.removeClass("play-apply-animation"),t.playHandler&&clearTimeout(t.playHandler),t.playHandler=setTimeout(function(){a.IS_ANDROID_FIREFOX||t.addClass("play-apply-animation")}))}),this._player.on(n.Player.Pause,function(){var e=t._player._status;e!=o.ended&&e!=o.error&&t._player._isManualPause&&(t.removeClass("prism-play-animation"),t.addClass("prism-pause-animation"),a.IS_ANDROID_FIREFOX||t.removeClass("play-apply-animation"),t.pauseHandler&&clearTimeout(t.pauseHandler),t.pauseHandler=setTimeout(function(){a.IS_ANDROID_FIREFOX||t.addClass("play-apply-animation")}))})},disposeUI:function(){this.playHandler&&(clearTimeout(this.playHandler),this.playHandler=null),this.pauseHandler&&(clearTimeout(this.pauseHandler),this.pauseHandler=null)}});t.exports=e},{"../../lib/dom":32,"../../lib/event":33,"../../lib/ua.js":49,"../../player/base/event/eventtype":70,"../../player/base/plugin/status":95,"../component":130}],142:[function(e,t,r){var i=e("../component"),n=e("../../player/base/event/eventtype"),o=e("./util"),a=e("../../lang/index"),e=i.extend({init:function(e,t){i.call(this,e,t),this.addClass("prism-play-btn")},bindEvent:function(){var t=this;this._player.on(n.Player.Play,function(){t.addClass("playing")}),this._player.on(n.Player.Pause,function(){t.removeClass("playing")}),this.on(n.Private.PlayClick,function(){var e;t._player.paused()?(e=t._player.getCurrentTime(),(t._player.getDuration()<=e||t._player._ended||t._player.exceedPreviewTime(e))&&t._player.seek(0),t._player.play(!0),t.addClass("playing")):(t._player.pause(!0),t.removeClass("playing")),t._player.trigger(n.Private.MarkerTextHide)}),o.registerTooltipEvent.call(this,this.el(),function(){return t._player.paused()?a.get("Play"):a.get("Pause")})}});t.exports=e},{"../../lang/index":23,"../../player/base/event/eventtype":70,"../component":130,"./util":159}],143:[function(e,t,r){var i=e("../component"),o=e("../../lib/dom"),a=(e("../../lib/constants"),e("../../lib/event")),s=e("../../lib/ua"),l=e("../../lib/function"),n=e("../../lang/index"),c=e("../../config"),u=e("../../lib/util"),d=e("../../player/base/event/eventtype"),p=e("./util").debounce,e=i.extend({init:function(e,t){i.call(this,e,t),this._seekTime=-1,this._lastSeekTime=0,this._moving=!1,this._thumbnailHideTimer=null,this.addClass("prism-progress")},createEl:function(){var e=i.prototype.createEl.call(this);return e.innerHTML='

',e},bindEvent:function(){function t(e){r._progressDown=e}var r=this,e=(this.loadedNode=document.querySelector("#"+this.id()+" .prism-progress-loaded"),this.playedNode=document.querySelector("#"+this.id()+" .prism-progress-played"),this.cursorNode=document.querySelector("#"+this.id()+" .prism-progress-cursor"),this.timeNode=document.querySelector("#"+this._player._options.id+" .prism-progress-time"),this.thumbnailNode=document.querySelector(".prism-thumbnail"),this.controlNode=document.querySelector("#"+this._player._options.id+" .prism-controlbar"),document.querySelector("#"+this.id())),i=document.querySelector("#"+this.id()+" .prism-progress-cursor img"),n="",n=this._player._options.skinsDomain?this._player._options.skinsDomain+"/skins/default/img/dragcursor.png":c.domain?"https://"+c.domain+c.path+c.h5Version+"/skins/default/img/dragcursor.png":"/build/skins/default/img/dragcursor.png";i.src=n,a.on(this.cursorNode,"mousedown",function(e){r._onMouseDown(e)}),a.on(this.cursorNode,"touchstart",function(e){r._onMouseDown(e)}),a.on(e,"mousemove",function(e){r._progressMove(e)}),a.on(e,"touchmove",function(e){r._progressMove(e)});a.on(e,"mousedown",function(e){t(!0)}),a.on(e,"touchstart",function(e){t(!0)}),a.on(e,"mouseup",function(e){t(!1)}),a.on(e,"touchend",function(e){t(!1),r._moving&&s.IS_MOBILE&&(r._player.trigger(d.Private.EndStart,{toTime:r._lastSeekTime}),r._moving=!1)}),a.on(this._el,"click",function(e){r._onMouseClick(e)}),this._player.on(d.Private.HideProgress,function(e){r._hideProgress(e)}),this._player.on(d.Private.CancelHideProgress,function(e){r._cancelHideProgress(e)}),this._player.on(d.Private.HideBar,function(e){r._player._seeking=!1}),a.on(e,d.Private.MouseOver,function(e){r._onMouseOver(e)}),a.on(e,d.Private.MouseOut,function(e){r._onMouseOut(e)}),a.on(this.controlNode,d.Private.MouseLeave,function(e){r._offMouseUp()}),s.IS_PC?(i=p(function(){o.addClass(e,"prism-progress-hover"),o.addClass(r.cursorNode,"cursor-hover")},100),a.on(e,"mouseover",i),n=p(function(){o.removeClass(e,"prism-progress-hover"),o.removeClass(r.cursorNode,"cursor-hover"),r._progressDown=!1},100),a.on(e,"mouseout",n)):(o.addClass(e,"prism-progress-hover"),o.addClass(r.cursorNode,"cursor-hover")),this.bindTimeupdate=l.bind(this,this._onTimeupdate),this._player.on(d.Player.TimeUpdate,this.bindTimeupdate),s.IS_IPAD?this.interval=setInterval(function(){r._onProgress()},500):this._player.on(d.Video.Progress,function(){r._onProgress()}),this._player.on(d.Private.UpdateProgress,function(e){r._updateProgressBar(r.playedNode,e.paramData.targetTime)}),this._player.on(d.Private.UpdateCursorPosition,function(e){r._updateCursorPosition(e.paramData.targetTime)})},_progressMove:function(e){e.preventDefault();var t,r,i=this._getSeconds(e);i!=1/0&&(t=u.formatTime(i),r=this._getDistance(e),this.cursorNode)&&(this._player.trigger(d.Private.ThumbnailShow,{time:i,formatTime:t,left:r,progressWidth:this.el().offsetWidth}),this._autoHideThumbnail(),this._progressDown)&&this._onMouseMove(e)},_hideProgress:function(e){a.off(this.cursorNode,"mousedown"),a.off(this.cursorNode,"touchstart")},_cancelHideProgress:function(e){var t=this;a.on(this.cursorNode,"mousedown",function(e){t._onMouseDown(e)}),a.on(this.cursorNode,"touchstart",function(e){t._onMouseDown(e)})},_canSeekable:function(e){var t=!0;return t="function"==typeof this._player.canSeekable?this._player.canSeekable(e):t},_onMouseOver:function(e){this._cursorHideHandler&&(clearTimeout(this._cursorHideHandler),this._cursorHideHandler=null),this._mouseInProgress||this._updateCursorPosition(this._player.getCurrentTime()),this._mouseInProgress=!0},_onMouseOut:function(e){var t=this;this._cursorHideHandler&&clearTimeout(this._cursorHideHandler),this._cursorHideHandler=setTimeout(function(){t._player.trigger(d.Private.ThumbnailHide),t._mouseInProgress=!1})},_getSeconds:function(e){var e=this._getDistance(e),t=this.el().offsetWidth,e=this._player.getDuration()?e/t*this._player.getDuration():0;return e=(e=e<0?0:e)>this._player.getDuration()?this._player.getDuration():e},_getDistance:function(e){for(var t=this.el().offsetLeft,r=this.el();r=r.offsetParent;){var i=o.getTranslateX(r);t+=r.offsetLeft+i}e=(e.touches?e.touches[0]:e).pageX-t;return e=e<0?0:e},_onMouseClick:function(e){var t=this,r=t._getSeconds(e);t._canSeekable(r)?(t._player.exceedPreviewTime(r)&&(r=t._player.getPreviewTime()),this._seekTime=r,t._updateProgressBar(this.playedNode,r),t._updateCursorPosition(r),this._mouseClickTimeHandle&&clearTimeout(this._mouseClickTimeHandle),this._mouseClickTimeHandle=setTimeout(function(){t._player._seeking=!0,t._mouseDown&&!s.IS_MOBILE||(t._player.trigger(d.Private.SeekStart,{fromTime:t._player.getCurrentTime()}),t._player.trigger(d.Private.EndStart,{toTime:r})),t._player.seek(r),t._mouseDown=!1,t._mouseClickTimeHandle=null,t._inWaitingSeek=!1},0),this._inWaitingSeek=!0):t._player.trigger(d.Private.Info_Show,{text:n.get("Can_Not_Seekable"),duration:2e3})},_onMouseDown:function(e){var t=this,e=(e.preventDefault(),this._mouseDown=!0,s.IS_PC&&this._player.trigger(d.Private.SeekStart,{fromTime:this._player.getCurrentTime()}),a.on(this.controlNode,"mousemove",function(e){t._onMouseMove(e)}),a.on(this.controlNode,"touchmove",function(e){t._onMouseMove(e)}),a.on(this.controlNode,"mouseup",function(e){t._onControlBarMouseUp(e)}),a.on(this.controlNode,"touchend",function(e){t._onControlBarMouseUp(e)}),t._getSeconds(e));t._canSeekable(e)?t._player.exceedPreviewTime(e)&&t._player.getPreviewTime():t._player.trigger(d.Private.Info_Show,{text:n.get("Can_Not_Seekable"),duration:2e3})},_onMouseUp:function(e){this._onMouseUpIntern(e)},_onControlBarMouseUp:function(e){this._onMouseUpIntern(e)},_onPlayerMouseUp:function(e){this._onMouseUpIntern(e)},_offMouseUp:function(){a.off(this.controlNode,"mousemove"),a.off(this.controlNode,"touchmove"),a.off(this.controlNode,"mouseup"),a.off(this.controlNode,"touchend")},_onMouseUpIntern:function(e){e.preventDefault(),this._offMouseUp();e=this.playedNode.offsetWidth/this.el().offsetWidth*this._player.getDuration();this._player.getDuration();isNaN(e)||this._player.seek(e),s.IS_PC&&this._player.trigger(d.Private.EndStart,{toTime:e}),this._autoHideThumbnail()},_onMouseMove:function(e){e.preventDefault(),!this._moving&&s.IS_MOBILE&&(this._player.trigger(d.Private.SeekStart,{fromTime:this._player.getCurrentTime()}),this._moving=!0);e=this._getSeconds(e);this._player.exceedPreviewTime(e)&&(e=this._player.getPreviewTime()),this._player.seek(e),this._updateProgressBar(this.playedNode,e),this._updateCursorPosition(e),this._lastSeekTime=e},_onTimeupdate:function(e){var t=this._player._options.source,t=this._getUrlSuffix(t),r=!1;"mp4"===t&&(s.IS_MAC_SAFARI&&(r=!0),s.IS_IOS&&(r=!0),s.IS_IE11)&&(r=!0),"m3u8"===t&&s.IS_IE11&&(r=!0),"audio"==this._player._options.mediaType&&s.IS_IOS&&(this._player._seeking=!1),(this._inWaitingSeek||this._player._seeking&&!s.IS_EDGE||this._progressDown)&&!r||(this._updateProgressBar(this.playedNode,this._player.getCurrentTime()),this._updateCursorPosition(this._player.getCurrentTime()),this._player.trigger(d.Private.UpdateProgressBar,{time:this._player.getCurrentTime()}))},_onProgress:function(e){this._player.getDuration()&&1<=this._player.getBuffered().length&&this._updateProgressBar(this.loadedNode,this._player.getBuffered().end(this._player.getBuffered().length-1))},_updateProgressBar:function(e,t){var r=this._player.getDuration();1!=this._player._switchSourcing&&r&&(-1!=this._seekTime&&(this._player.getCurrentTime()>=this._seekTime||!this._player._seeking?this._seekTime=-1:t=this._seekTime),1<(t=t/r+.005)&&(t=1),e)&&o.css(e,"width",100*t+"%")},_updateCursorPosition:function(e){var t,r,i,n=this._player.getDuration();1!=this._player._switchSourcing&&n&&(t=1,r=10/(i=this._player.el().clientWidth),0!=i&&(t=1-r),i=(i=e/n-r)<0?0:i,this.cursorNode)&&(te?(n.css(i.el(),"right","0px"),n.css(i.el(),"left","auto")):(left=(left-=width/2)<0?0:left,n.css(i.el(),"right","auto"),n.css(i.el(),"left",left+"px")))},30))}),i._player.on(a.Private.MarkerTextHide,function(e){i._player.trigger(a.Player.MarkerDotOut),i._player.trigger(a.Private.LifeCycleChanged,{type:a.Player.MarkerDotOut,data:""}),i._thumbnailShowHanlde&&clearTimeout(i._thumbnailShowHanlde),n.css(i.el(),"display","none")}),o.on(i._player.tag,"click",function(e){e&&e.target==e.currentTarget&&i._player.trigger(a.Private.MarkerTextHide)}),o.on(i._player.tag,"touchstart",function(e){e&&e.target==e.currentTarget&&i._player.trigger(a.Private.MarkerTextHide)})},disposeUI:function(){this._thumbnailShowHanlde&&(clearTimeout(this._thumbnailShowHanlde),this._thumbnailShowHanlde=null)}});t.exports=e},{"../../lib/dom":32,"../../lib/event":33,"../../lib/util":51,"../../player/base/event/eventtype":70,"../component":130}],145:[function(e,t,r){var i=e("./selector"),s=e("../../../lib/object"),c=(e("../../../lib/util"),e("../../../lib/cookie")),l=e("../../../lib/dom"),u=(e("../../../lib/event"),e("../../../lib/constants")),d=e("../../../lang/index"),o=e("../../../player/base/event/eventtype"),e=i.extend({init:function(e,t){this.Name=d.get("Quality"),this.Type="quality",this.Tooltip=d.get("Quality_Switch_To"),i.call(this,e,t),this._isMasterLevel=!1},showTip:function(e,t){this._player.trigger(o.Private.Info_Show,{text:e,duration:t,align:"lb"})},bindEvent:function(){this.bindCommonEvent();var n=this,e=(this._player.on(o.Private.QualityChange,function(e){var t,r,i=0
{value}
",r=t.replace(/{type}/g,"speed").replace("{value}",u.get("Speed")),i=t.replace(/{type}/g,"cc").replace("{value}",u.get("Subtitle")),n=t.replace(/{type}/g,"audio").replace("{value}",u.get("AudioTrack")),t=t.replace(/{type}/g,"quality").replace("{value}",u.get("Quality"));return e.innerHTML=r+i+n+t,e},bindEvent:function(){function t(){i._player.trigger(l.Private.SettingListHide),i.isOpened=!1}function r(e){e&&e.text&&(document.querySelector("#"+i.id()+" .prism-setting-"+e.type+" .current-setting").innerText=e.text)}var i=this,e=(this._player.on(l.Private.SettingListShow,function(e){i.isOpened=!0;e=e.paramData;r(e),n.css(i.el(),"display","block")}),this._player.on(l.Private.UpdateToSettingList,function(e){e=e.paramData;r(e)}),this._player.on(l.Private.SelectorUpdateList,function(e){e=e.paramData;r(e),i._player.trigger(l.Private.SelectorValueChange,e)}),this._player.on(l.Private.SettingListHide,function(){i.isOpened=!1,n.css(i.el(),"display","none")}),s.on(this.el(),"click",function(e){i._player.trigger(l.Private.SettingListHide);var e=e.srcElement||e.target;(e=c.findItemElementForList(e))&&(e=e.getAttribute("type"),i._player.trigger(l.Private.SelectorShow,{type:e}))}),a.IS_MOBILE?"touchleave":"mouseleave");s.on(this.el(),e,function(){t()}),s.on(this._player.tag,"click",function(e){e&&e.target==e.currentTarget&&t()}),s.on(this._player.tag,"touchstart",function(e){e&&e.target==e.currentTarget&&t()}),this._player.on(l.Private.QualityChange,function(e){var t,r,e=e.paramData;e.levelSwitch&&(t=document.querySelector("#"+i.id()+" .prism-setting-quality .current-setting"),r=u.get("Auto"),-1
    ',e},bindEvent:function(){this.bindCommonEvent()},bindCommonEvent:function(){var o=this,e=document.querySelector("#"+o.id()+" .selector-list"),t=document.querySelector("#"+o.id()+" .header");function r(){o._hasGeneratedList||(o._clear(),o.generateList(o._backupSelector),o._backupSelector="",o._hasGeneratedList=!0)}this._player.on(c.Private.ChangeURL,function(){o._hasGeneratedList=!1}),s.on(t,"click",function(){o._player.trigger(c.Private.SelectorHide),o._player.trigger(c.Private.SettingListShow,{type:o.Type,text:o._previousSelection?o._previousSelection.text:""})}),s.on(e,"click",function(e){var e=e.srcElement||e.target,t=e.key,r=e.text;o._player.trigger(c.Player.SettingSelected,{name:o.Name,type:o.Type,text:r,key:t}),void 0!==r&&(o._previousSelection&&a.removeClass(o._previousSelection,"current"),o._previousSelection=l.findliElementForSelector(e),a.addClass(o._previousSelection,"current"),o.execute&&o.execute(t),e=o.Tooltip+""+r+"",o._player.trigger(c.Private.Info_Show,{text:e,duration:1e3,align:"lb"}))}),o._player.on(c.Private.SelectorHide,function(){i()}),o._player.on(c.Private.SelectorValueChange,function(e){var t=e.paramData;if(t&&t.type==o.Type){var r=document.querySelectorAll("#"+o.id()+" .selector-list li");if(r){var i=r.length;0==i&&(o._backupSelector=t.text);for(var n=0;ne.progressWidth?e.left-r:(i=e.left-r/2)<0?0:i,a.css(o.el(),"left",i+"px"))},30));o._player.on(s.Private.ThumbnailShow,e),o._player.on(s.Private.ThumbnailHide,function(e){a.css(o.el(),"display","none")})},_createSamllThumbnail:function(){},disposeUI:function(){}});t.exports=e},{"../../lang/index":23,"../../lib/dom":32,"../../lib/event":33,"../../lib/ua":49,"../../lib/util":51,"../../player/base/event/eventtype":70,"../component":130,"./util":159}],157:[function(e,t,r){var i=e("../component"),n=e("../../lib/util"),o=e("../../player/base/event/eventtype"),e=i.extend({init:function(e,t){i.call(this,e,t),this.addClass("prism-time-display")},createEl:function(){var e=i.prototype.createEl.call(this,"div");return e.innerHTML='00:00 / 00:00',e},bindEvent:function(){var t=this;this._player.on(o.Video.DurationChange,function(){var e=n.formatTime(t._player.getDisplayDuration());e?(document.querySelector("#"+t.id()+" .time-bound").style.display="inline",document.querySelector("#"+t.id()+" .duration").style.display="inline",document.querySelector("#"+t.id()+" .duration").innerText=e):(document.querySelector("#"+t.id()+" .duration").style.display="none",document.querySelector("#"+t.id()+" .time-bound").style.display="none")}),this._player.on(o.Video.TimeUpdate,function(){var e=t._player.getCurrentTime(),e=n.formatTime(e);document.querySelector("#"+t.id()+" .current-time")&&(e?(document.querySelector("#"+t.id()+" .current-time").style.display="inline",document.querySelector("#"+t.id()+" .current-time").innerText=e):document.querySelector("#"+t.id()+" .current-time").style.display="none")})}});t.exports=e},{"../../lib/util":51,"../../player/base/event/eventtype":70,"../component":130}],158:[function(e,t,r){var i=e("../component"),o=e("../../lib/dom"),a=e("../../player/base/event/eventtype"),e=i.extend({init:function(e,t){i.call(this,e,t),this.addClass("prism-tooltip")},createEl:function(){var e=i.prototype.createEl.call(this,"p");return e.innerText="\u63d0\u793a\u4fe1\u606f",e},bindEvent:function(){var n=this;n._player.on(a.Private.TooltipShow,function(e){var t=document.querySelector("#"+n.id()),e=e.paramData,r=(t.innerText=e.text,o.css(t,"display","block"),t.offsetWidth),i=document.querySelector("#"+n._player.id()+" .prism-controlbar");i&&(i=i.offsetWidth,e.left+r>i?o.css(t,"left",i-r+"px"):o.css(t,"left",e.left-(r-e.width)/2+"px"))}),n._player.on(a.Private.TooltipHide,function(e){var t=document.querySelector("#"+n.id());o.css(t,"display","none")})}});t.exports=e},{"../../lib/dom":32,"../../player/base/event/eventtype":70,"../component":130}],159:[function(e,t,r){var i=e("../../lib/event"),s=e("../../player/base/event/eventtype");t.exports.registerTooltipEvent=function(e,n){function o(){a._controlbarTooltipHandler&&(clearTimeout(a._controlbarTooltipHandler),a._controlbarTooltipHandler=null)}var a=this;i.on(this.el(),"mouseover",function(e){o(),a._controlbarTooltipHandler=setTimeout(function(){a._player.trigger(s.Private.TooltipHide)},4e3);var t=a.el().offsetLeft,r=a.el().offsetWidth,i=n;"function"==typeof n&&(i=n.call(this)),a._player.trigger(s.Private.TooltipShow,{left:t,width:r,text:i})}),i.on(this.el(),"mouseout",function(){o(),a._player.trigger(s.Private.TooltipHide)})},t.exports.throttle=function(r,i){var n=Date.now();return function(){var e=arguments,t=Date.now();i<=t-n&&(r(e),n=t)}},t.exports.debounce=function(r,i){var n;return function(){var e=this,t=arguments;clearTimeout(n),n=setTimeout(function(){r.apply(e,t)},i)}}},{"../../lib/event":33,"../../player/base/event/eventtype":70}],160:[function(e,t,r){var i=e("../component"),n=e("../../lib/dom"),o=e("../../lib/event"),a=e("../../player/base/event/eventtype"),s=e("./util"),l=e("../../lang/index"),c=e("./volumecontrol"),e=i.extend({init:function(e,t){i.call(this,e,t),this.addClass("prism-volume");var r=new c(e,t);e.addChild(r,t),this.volumeControl=r},createEl:function(){var e=i.prototype.createEl.call(this,"div");return e.innerHTML='
    ',e},bindEvent:function(){var r=this,i=r._player,e=(this.icon=document.querySelector("#"+r.id()+" .volume-icon"),s.registerTooltipEvent.call(this,this.el(),function(){return r._player.muted()||0==r._player.getVolume()?l.get("Muted"):l.get("Volume")}),o.on(this.icon,"click",function(e){var t;r.volumeControl._shown?i.muted()?i.unMute():i.mute():(t=r.el().offsetLeft,r._player.trigger(a.Private.SettingListHide),r._player.trigger(a.Private.SelectorHide),r._player.trigger(a.Private.VolumeVisibilityChange,t),r._player.trigger(a.Private.MarkerTextHide))}),document.querySelector("#"+r.id()+" .long-horizontal")),t=document.querySelector("#"+r.id()+" .short-horizontal");o.on(this.el(),"mouseover",function(){n.removeClass(e,"volume-hover-animation"),setTimeout(function(){n.addClass(e,"volume-hover-animation")}),setTimeout(function(){n.removeClass(e,"volume-hover-animation"),n.addClass(t,"volume-hover-animation"),setTimeout(function(){n.removeClass(t,"volume-hover-animation"),n.addClass(e,"volume-hover-animation")},300)},300)}),o.on(window,"resize",function(){var e;r.volumeControl._shown&&(e=r.el().offsetLeft,r._player.trigger(a.Private.VolumeUpdatePosition,e))})}});t.exports=e},{"../../lang/index":23,"../../lib/dom":32,"../../lib/event":33,"../../player/base/event/eventtype":70,"../component":130,"./util":159,"./volumecontrol":161}],161:[function(e,t,r){var i=e("../component"),n=e("../../lib/dom"),o=e("../../lib/event"),a=e("../../player/base/event/eventtype"),e=(e("./util"),e("../../lang/index"),i.extend({init:function(e,t){i.call(this,e,t),this.addClass("prism-volume-control"),this._shown=!1},createEl:function(){var e=i.prototype.createEl.call(this,"div");return e.innerHTML='
    ',e},bindEvent:function(){var r=this;this.icon=document.querySelector("#"+r._player.id()+" .volume-icon"),this.control=document.querySelector("#"+r.id()),this.volumnValue=document.querySelector("#"+r.id()+" .volume-value"),this.volumnRange=document.querySelector("#"+r.id()+" .volume-range"),this.volumnCursor=document.querySelector("#"+r.id()+" .volume-cursor"),this._player.on(a.Private.VolumeVisibilityChange,function(e){var t,e=e.paramData;!r._shown&&e?(t=r._player.getVolume(),r._setVolumnUI(t),n.css(r.control,"display","block"),e&&r._updatePosition(e),r._shown=!0):r._hide()}),this._player.on(a.Private.VolumeUpdatePosition,function(e){e=e.paramData;r._shown&&r._updatePosition(e)}),this._player.on(a.Private.ControlBarClick,function(e){n.hasClass(e.paramData.target,"prism-controlbar-bg")&&r._hide()}),o.on(this.volumnRange,"click",function(e){e=n.getPointerPosition(r.volumnRange,e).y;e<0||1>>2]>>>24-o%4*8&255;t[i+o>>>2]|=a<<24-(i+o)%4*8}else for(var s=0;s>>2]=r[s>>>2];return this.sigBytes+=n,this},clamp:function(){var e=this.words,t=this.sigBytes;e[t>>>2]&=4294967295<<32-t%4*8,e.length=c.ceil(t/4)},clone:function(){var e=o.clone.call(this);return e.words=this.words.slice(0),e},random:function(e){for(var t=[],r=0;r>>2]>>>24-n%4*8&255;i.push((o>>>4).toString(16)),i.push((15&o).toString(16))}return i.join("")},parse:function(e){for(var t=e.length,r=[],i=0;i>>3]|=parseInt(e.substr(i,2),16)<<24-i%8*4;return new u.init(r,t/2)}},l=a.Latin1={stringify:function(e){for(var t=e.words,r=e.sigBytes,i=[],n=0;n>>2]>>>24-n%4*8&255;i.push(String.fromCharCode(o))}return i.join("")},parse:function(e){for(var t=e.length,r=[],i=0;i>>2]|=(255&e.charCodeAt(i))<<24-i%4*8;return new u.init(r,t)}},p=a.Utf8={stringify:function(e){try{return decodeURIComponent(escape(l.stringify(e)))}catch(e){throw new Error("Malformed UTF-8 data")}},parse:function(e){return l.parse(unescape(encodeURIComponent(e)))}},d=n.BufferedBlockAlgorithm=o.extend({reset:function(){this._data=new u.init,this._nDataBytes=0},_append:function(e){"string"==typeof e&&(e=p.parse(e)),this._data.concat(e),this._nDataBytes+=e.sigBytes},_process:function(e){var t,r=this._data,i=r.words,n=r.sigBytes,o=this.blockSize,a=n/(4*o),s=(a=e?c.ceil(a):c.max((0|a)-this._minBufferSize,0))*o,e=c.min(4*s,n);if(s){for(var l=0;l>>2]>>>24-o%4*8&255)<<16|(t[o+1>>>2]>>>24-(o+1)%4*8&255)<<8|t[o+2>>>2]>>>24-(o+2)%4*8&255,s=0;s<4&&o+.75*s>>6*(3-s)&63));var l=i.charAt(64);if(l)for(;n.length%4;)n.push(l);return n.join("")},parse:function(e){var t=e.length,r=this._map;if(!(i=this._reverseMap))for(var i=this._reverseMap=[],n=0;n>>6-h%4*2,p[d>>>2]|=(o|a)<<24-d%4*8,d++);return f.create(p,d)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="},e.enc.Base64},"object"==typeof r?t.exports=r=n(e("crypto-js/core")):"function"==typeof define&&define.amd?define(["crypto-js/core"],n):n(i.CryptoJS)},{"crypto-js/core":2}],4:[function(e,t,r){var i,n;i=this,n=function(e){return e.enc.Utf8},"object"==typeof r?t.exports=r=n(e("crypto-js/core")):"function"==typeof define&&define.amd?define(["crypto-js/core"],n):n(i.CryptoJS)},{"crypto-js/core":2}],5:[function(e,t,r){var i,n;i=this,n=function(e){return e.HmacSHA1},"object"==typeof r?t.exports=r=n(e("crypto-js/core"),e("crypto-js/sha1"),e("crypto-js/hmac")):"function"==typeof define&&define.amd?define(["crypto-js/core","crypto-js/sha1","crypto-js/hmac"],n):n(i.CryptoJS)},{"crypto-js/core":2,"crypto-js/hmac":6,"crypto-js/sha1":7}],6:[function(e,t,r){var i,n;i=this,n=function(e){var t,s;t=e.lib.Base,s=e.enc.Utf8,e.algo.HMAC=t.extend({init:function(e,t){e=this._hasher=new e.init,"string"==typeof t&&(t=s.parse(t));for(var r=e.blockSize,i=4*r,e=((t=t.sigBytes>i?e.finalize(t):t).clamp(),this._oKey=t.clone()),t=this._iKey=t.clone(),n=e.words,o=t.words,a=0;a>>31;var c=(i<<5|i>>>27)+s+u[l];c+=l<20?1518500249+(n&o|~n&a):l<40?1859775393+(n^o^a):l<60?(n&o|n&a|o&a)-1894007588:(n^o^a)-899497514,s=a,a=o,o=n<<30|n>>>2,n=i,i=c}r[0]=r[0]+i|0,r[1]=r[1]+n|0,r[2]=r[2]+o|0,r[3]=r[3]+a|0,r[4]=r[4]+s|0},_doFinalize:function(){var e=this._data,t=e.words,r=8*this._nDataBytes,i=8*e.sigBytes;return t[i>>>5]|=128<<24-i%32,t[14+(64+i>>>9<<4)]=Math.floor(r/4294967296),t[15+(64+i>>>9<<4)]=r,e.sigBytes=4*t.length,this._process(),this._hash},clone:function(){var e=n.clone.call(this);return e._hash=this._hash.clone(),e}}),t.SHA1=n._createHelper(r),t.HmacSHA1=n._createHmacHelper(r),e.SHA1},"object"==typeof r?t.exports=r=n(e("crypto-js/core")):"function"==typeof define&&define.amd?define(["crypto-js/core"],n):n(i.CryptoJS)},{"crypto-js/core":2}],8:[function(V,r,i){!function(B,j){!function(){var e,t;e=this,t=function(){"use strict";function l(e){return"function"==typeof e}var r=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)},i=0,t=void 0,n=void 0,a=function(e,t){p[i]=e,p[i+1]=t,2===(i+=2)&&(n?n(d):M())};var e="undefined"!=typeof window?window:void 0,o=e||{},o=o.MutationObserver||o.WebKitMutationObserver,s="undefined"==typeof self&&void 0!==B&&"[object process]"==={}.toString.call(B),c="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel;function u(){var e=setTimeout;return function(){return e(d,1)}}var p=new Array(1e3);function d(){for(var e=0;e"+a.get("Cancel_Text")+"",e},bindEvent:function(){var i=this,e=(i._player.on(s.Private.AutoStreamShow,function(e){var t,r=document.querySelector("#"+i.getId()+" .tip-text");i._player._getLowerQualityLevel&&(t=i._player._getLowerQualityLevel())&&(i._switchUrl=t,r.innerText=a.get("Auto_Stream_Tip_Text").replace("$$",t.item.desc),n.css(i.el(),"display","block"))}),i._player.on(s.Private.AutoStreamHide,function(e){document.querySelector("#"+i.getId()+" .tip-text");n.css(i.el(),"display","none")}),document.querySelector("#"+i.getId()+" .prism-button-ok")),e=(o.on(e,"click",function(){i._player._changeStream&&i._switchUrl&&(i._player._changeStream(i._switchUrl.index,a.get("Quality_Change_Text")),i._player.trigger(s.Private.SettingListHide)),n.css(i.el(),"display","none")}),document.querySelector("#"+i.getId()+" .prism-button-cancel"));o.on(e,"click",function(){n.css(i.el(),"display","none"),i._player.trigger(s.Private.SettingListHide)})}});t.exports=e},{"../lang/index":23,"../lib/dom":32,"../lib/event":33,"../lib/ua":49,"../lib/util":51,"../player/base/event/eventtype":70,"../ui/component":130}],12:[function(e,t,r){var i=e("../ui/component"),a=e("../lib/dom"),n=e("../lib/event"),o=e("../lib/ua"),s=e("../lib/function"),l=(e("../lang/index"),e("../lib/util")),c=e("../config"),u=e("../lib/playerutil"),p=e("../player/base/event/eventtype"),e=i.extend({init:function(e,t){i.call(this,e,t),this.className=t.className||"prism-liveshift-progress",this.addClass(this.className),this._liveshiftService=e._liveshiftService},createEl:function(){var e=i.prototype.createEl.call(this);return e.innerHTML='

    ',e},bindEvent:function(){function t(e){r._progressDown=e}var r=this,e=(this.loadedNode=document.querySelector("#"+this.id()+" .prism-progress-loaded"),this.playedNode=document.querySelector("#"+this.id()+" .prism-progress-played"),this.cursorNode=document.querySelector("#"+this.id()+" .prism-progress-cursor"),this.timeNode=document.querySelector("#"+this.id()+" .prism-progress-time"),this.controlNode=document.querySelector("#"+this._player._options.id+" .prism-controlbar"),this.seperatorNode=document.querySelector("#"+this.id()+" .prism-liveshift-seperator"),this.progressNode=document.querySelector("#"+this.id()+" .prism-enable-liveshift"),document.querySelector("#"+this.id()+" .prism-progress-cursor img")),i="//"+c.domain+"/de/prismplayer/"+c.h5Version+"/skins/default/img/dragcursor.png";this._player._options.skinsDomain?i=this._player._options.skinsDomain+"/skins/default/img/dragcursor.png":c.domain?-1o?o:sec},_onMouseClick:function(e){var t=this,e=this._getSeconds(e),r=this._liveshiftService.availableLiveShiftTime,i=r-e,n=this._player._options,r=(i<=n.liveShiftMinOffset&&(e=r-(i=n.liveShiftMinOffset)),this._player.trigger(p.Private.SeekStart,{fromTime:this._getCurrentTime()}),this._liveshiftService.getSourceUrl(i)),n=u.isHls(t._player._options.source);t._player._loadByUrlInner(r,e,!0),t._player.trigger(p.Private.Play_Btn_Hide),t._liveshiftService.seekTime=e,t._player.trigger(p.Private.EndStart,{toTime:e}),t._updateProgressBar(this.playedNode,e),t._updateCursorPosition(e),setTimeout(function(){t._progressDown||t._onMouseOut()},500),n&&setTimeout(function(){t._player.play()})},_onMouseDown:function(e){var t=this;e.preventDefault(),this._player.trigger(p.Private.SeekStart,{fromTime:this._getCurrentTime()}),n.on(this.controlNode,"mousemove",function(e){t._onMouseMove(e)}),n.on(this.controlNode,"touchmove",function(e){t._onMouseMove(e)}),n.on(this.controlNode,"mouseup",function(e){t._onMouseUp(e)}),n.on(this.controlNode,"touchend",function(e){t._onMouseUp(e)})},_onMouseUp:function(e){e.preventDefault(),n.off(this.controlNode,"mousemove"),n.off(this.controlNode,"touchmove"),n.off(this._player.tag,"mouseup"),n.off(this._player.tag,"touchend"),n.off(this.controlNode,"mouseup"),n.off(this.controlNode,"touchend"),this._onMouseClick(e)},_onMouseMove:function(e){e.preventDefault()},_onTimeupdate:function(e){this._player._seeking||(o.IS_ANDROID&&o.IS_UC&&(this._hasResetFlagUC&&this._player.getCurrentTime()&&(this._hasResetFlagUC=!1,this._basePtsUC=this._player.getCurrentTime()),this._player.getCurrentTime()||(this._hasResetFlagUC=!0,this._basePtsUC=0)),this._updateProgressBar(this.playedNode,this._getCurrentTime()),this._updateCursorPosition(this._getCurrentTime()),this._player.trigger(p.Private.UpdateProgressBar,{time:this._getCurrentTime()}))},_getCurrentTime:function(){var e=this._liveshiftService.seekTime,e=(-1==e&&(e=0),this._player.getCurrentTime()+e);return o.IS_ANDROID&&o.IS_UC&&(e-=this._basePtsUC||0),e},_onProgress:function(e){this._player.getDuration()&&1<=this._player.getBuffered().length&&this._updateProgressBar(this.loadedNode,this._player.getBuffered().end(this._player.getBuffered().length-1))},_updateProgressBar:function(e,t){var r,i;1!=this._player._switchSourcing&&(i=0,-1==this._liveshiftService.seekTime?i=1:1<(i=(r=this._liveshiftService.availableLiveShiftTime)?t/r:0)&&(this._liveshiftService.seekTime=-(i=1)),this.liveShiftStartDisplay,e)&&a.css(e,"width",100*i+"%")},_updateCursorPosition:function(e){var t,r,i,n;this._player.el()&&1!=this._player._switchSourcing&&(i=0,n=1,t=this._player.el().clientWidth,-1==this._liveshiftService.seekTime?i=1:1<(i=(r=this._liveshiftService.availableLiveShiftTime)?e/r:0)&&(this._liveshiftService.seekTime=-1),0!=t&&(n=1-(e=10/t),i-=e),i=i<0?0:i,this.cursorNode)&&(nt.seekTime&&-1!=t.seekTime?(e=i._liveshiftService.getBaseTime(),e=n.formatTime(e+i._player.getCurrentTime()),r.innerText=e):t.currentTimeDisplay&&(r.innerText=t.currentTimeDisplay)}),this._player.on(o.Private.LiveShiftQueryCompleted,function(){i.updateTime()})},updateTime:function(){document.querySelector("#"+this.id()+" .end-time").innerText=this._liveshiftService.liveTimeRange.endDisplay,document.querySelector("#"+this.id()+" .live-time").innerText=this._liveshiftService.currentTimeDisplay}});t.exports=e},{"../lib/util":51,"../player/base/event/eventtype":70,"../ui/component":130}],14:[function(e,t,r){e=e("../package.json");t.exports={domain:"g.alicdn.com",flashVersion:"2.8.2",h5Version:e.version.split("-")[0],rtsVersion:"2.2.6",cityBrain:!0,logDuration:10,logCount:100,logReportTo:"https://videocloud.cn-hangzhou.log.aliyuncs.com/logstores/newplayer/track"}},{"../package.json":10}],15:[function(e,t,r){var i,n,o,a;e("./lib/patch-ssr").isSSR||(e("./lang/index").load(),i=e("./player/adaptivePlayer"),n=e("./lib/reloadInstanceUtil"),o=e("./lib/componentutil"),a=e("./config"),(e=function(e,t){e=i.create(e,t);return n.storeUserEvents(e),e}).getVersion=function(){return a.h5Version},o.register(e),(o=window.Aliplayer=e).players={},e.reloadInstance=n.reloadInstance,"undefined"==typeof Uint8Array)||Uint8Array.prototype.slice||Object.defineProperty(Uint8Array.prototype,"slice",{value:Array.prototype.slice}),t.exports=o},{"./config":14,"./lang/index":23,"./lib/componentutil":27,"./lib/patch-ssr":44,"./lib/reloadInstanceUtil":47,"./player/adaptivePlayer":66}],16:[function(e,t,r){var i=e("../player/base/event/eventtype"),n=e("../lib/constants"),o=e("../lang/index");t.exports=function(){function e(e){var t=this;void 0===e&&(e={}),this.interval=3e3,this.player=null,this.timer=null,this.playerInitDone=!1,this.player=e.player,this.player.on(i.Player.Init,function(){t.playerInitDone=!0})}var t=e.prototype;return t.start=function(){var e=this;this.stop(),this.player&&this.player._options&&!this.player._options.preventRecord||(this.timer=setInterval(function(){e.playerInitDone&&e.check()},this.interval))},t.stop=function(){this.clearTimer()},t.check=function(){var e=!1,t=this.detectPrototype()||this.detectNativeFn();return(t||this.detectDeperateVideo())&&(console.log("isMediaSourceModified",t),this.clearTimer(),this.displayError(),this.setupErrorStyle(),this.destroyVideo(),localStorage.setItem("_intercept_mediastream_",""),e=!0),e},t.dispose=function(){this.stop(),this.player=null,this.playerInitDone=!1},t.clearTimer=function(){this.timer&&(clearInterval(this.timer),this.timer=null)},t.displayError=function(){var e=this.player,t={mediaId:e._options&&e._options.vid?e._options.vid:"",error_code:n.ErrorCode.RecordNotAllowed,error_msg:o.get("Record_Not_Allowed")};e.logError(t),e.trigger(i.Player.Error,t)},t.setupErrorStyle=function(){this.hideRetry();var e=document.querySelector(".prism-ErrorMessage");e&&(e.style.opacity="1",e.style.visibility="visible")},t.hideRetry=function(){var e=document.querySelector("#"+this.player.id()+" .prism-button-retry");e&&(e.style.display="none")},t.destroyVideo=function(){this.player._drm&&this.player.destroy();var e=this.player.tag;e&&e.parentNode&&e.parentNode.removeChild(e)},t.detectPrototype=function(){var e=window,t=e.MediaSource;return t&&e.EventTarget&&t.__proto__.__proto__===e.EventTarget},t.detectNativeFn=function(){var e=window.MediaSource;return e&&!this.isNativeFn(e.prototype.addSourceBuffer)},t.isNativeFn=function(e){var t=RegExp("^".concat(Function.prototype.toString.call(Object.prototype.hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?"),"$")),r=typeof e;return null!==e&&("object"==r||"function"==r)&&t.test(e)},t.detectDeperateVideo=function(){var e=this.player.tag;if(e)return-1!==(e.getAttribute("id")||"").indexOf("360")},e}()},{"../lang/index":23,"../lib/constants":28,"../player/base/event/eventtype":70}],17:[function(e,t,r){var i=e("../lib/oo"),n=e("../lang/index"),e=i.extend({init:function(e,t){this._player=e,this._options=e.options()}}),o=(e.prototype.handle=function(e){var t,r;this._options.autoPlayDelay&&(t=(t=this._options.autoPlayDelayDisplayText)||n.get("AutoPlayDelayDisplayText").replace("$$",this._options.autoPlayDelay),this._player.trigger("info_show",t),this._player.trigger("h5_loading_hide"),this._player.trigger("play_btn_hide"),(r=this)._timeHandler=setTimeout(function(){r._player.trigger("info_hide"),r._options.autoPlayDelay=0,e&&e()},1e3*this._options.autoPlayDelay),this._player.on("play",function(){o(r)}),this._player.on("pause",function(){o(r)}))},e.prototype.dispose=function(){o(this),this._player=null},function(e){e._timeHandler&&(clearTimeout(e._timeHandler),e._timeHandler=null)});t.exports=e},{"../lang/index":23,"../lib/oo":43}],18:[function(e,t,r){var i=e("../lib/event"),n=e("../lib/data"),o=e("../player/base/event/eventtype"),a=n.guid(),e={};function s(e){var t,r,i=this._options.keyFastForwardStep,n=this._options.isLive;switch(e&&e.keyCode){case 39:n||(e.preventDefault(),t=this.getDuration(),r=this.getCurrentTime()+i,this.seek(r=tinstall plugin, or check if disable Flash plugin"}},{}],22:[function(e,t,r){t.exports=t.exports={OD:"\u539f\u753b",FD:"\u6d41\u7545",LD:"\u6807\u6e05",SD:"\u9ad8\u6e05",HD:"\u8d85\u6e05","2K":"2K","4K":"4K",FHD:"\u5168\u9ad8\u6e05",XLD:"\u6781\u901f",SQ:"\u666e\u901a\u97f3\u8d28",HQ:"\u9ad8\u97f3\u8d28",Forbidden_Text:"\u5185\u90e8\u4fe1\u606f\uff0c\u4e25\u7981\u5916\u4f20",Refresh:"\u5237\u65b0",Diagnosis:"\u8bca\u65ad",Live_Finished:"\u76f4\u64ad\u5df2\u7ed3\u675f,\u8c22\u8c22\u89c2\u770b",Play:"\u64ad\u653e",Pause:"\u6682\u505c",Snapshot:"\u622a\u56fe",Replay:"\u91cd\u64ad",Live:"\u76f4\u64ad",Encrypt:"\u52a0\u5bc6",Sound:"\u58f0\u97f3",Fullscreen:"\u5168\u5c4f",Exist_Fullscreen:"\u9000\u51fa\u5168\u5c4f",Resolution:"\u6e05\u6670\u5ea6",Next:"\u4e0b\u4e00\u96c6",Brightness:"\u4eae\u5ea6",Default:"\u9ed8\u8ba4",Contrast:"\u5bf9\u6bd4\u5ea6",Titles_Credits:"\u7247\u5934\u7247\u5c3e",Skip_Titles:"\u8df3\u8fc7\u7247\u5934",Skip_Credits:"\u8df3\u8fc7\u7247\u5c3e",Not_Support_Out_Site:"\u8be5\u89c6\u9891\u6682\u4e0d\u652f\u6301\u7ad9\u5916\u64ad\u653e\uff0c\u8bf7\u5230\u6dd8TV\u89c2\u770b",Watch_Now:"\u7acb\u5373\u89c2\u770b",Network_Error:"\u7f51\u7edc\u65e0\u6cd5\u8fde\u63a5\uff0c\u8bf7\u5c1d\u8bd5\u68c0\u67e5\u7f51\u7edc\u540e\u5237\u65b0\u8bd5\u8bd5",Video_Error:"\u89c6\u9891\u64ad\u653e\u5f02\u5e38\uff0c\u8bf7\u5237\u65b0\u8bd5\u8bd5",Decode_Error:"\u64ad\u653e\u6570\u636e\u89e3\u7801\u9519\u8bef",Live_Not_Start:"\u4eb2\uff0c\u76f4\u64ad\u8fd8\u672a\u5f00\u59cb\u54e6\uff0c\u656c\u8bf7\u671f\u5f85",Live_Loading:"\u76f4\u64ad\u4fe1\u606f\u52a0\u8f7d\u4e2d\uff0c\u8bf7\u5237\u65b0\u8bd5\u8bd5",Live_End:"\u4eb2\uff0c\u76f4\u64ad\u5df2\u7ed3\u675f",Live_Abrot:"\u5f53\u524d\u76f4\u64ad\u4fe1\u53f7\u4e2d\u65ad\uff0c\u8bf7\u5237\u65b0\u540e\u91cd\u8bd5",Corss_Domain_Error:"\u8bf7\u786e\u8ba4\u60a8\u7684\u57df\u540d\u5df2\u5b8c\u6210\u5907\u6848\u548cCNAME\u7ed1\u5b9a\uff0c\r\n\u5e76\u5904\u4e8e\u542f\u7528\u72b6\u6001\uff0c\u6216\u8d44\u6e90\u5141\u8bb8\u8de8\u8d8a\u8bbf\u95ee",Url_Timeout_Error:"\u60a8\u6240\u89c2\u770b\u7684\u89c6\u9891\u5730\u5740\u8fde\u63a5\u8d85\u65f6\uff0c\u8bf7\u5237\u65b0\u540e\u91cd\u8bd5",Connetction_Error:"\u62b1\u6b49,\u8be5\u89c6\u9891\u7531\u4e8e\u8fde\u63a5\u9519\u8bef\u6682\u65f6\u4e0d\u80fd\u64ad\u653e,\u8bf7\u89c2\u770b\u5176\u5b83\u89c6\u9891",Fetch_MTS_Error:"\u83b7\u53d6\u89c6\u9891\u5217\u8868\u5931\u8d25\uff0c\u8bf7\u786e\u8ba4",Token_Expired_Error:"\u8bf7\u6c42\u63a5\u53e3\u5931\u8d25\uff0c\u8bf7\u786e\u8ba4Token\u662f\u5426\u8fc7\u671f",Video_Lists_Empty_Error:"\u83b7\u53d6\u89c6\u9891\u5217\u8868\u4e3a\u7a7a\uff0c\u8bf7\u786e\u8ba4\u64ad\u653e\u6570\u636e\u4e0e\u683c\u5f0f",Encrypted_Failed_Error:"\u83b7\u53d6\u89c6\u9891\u52a0\u5bc6\u79d8\u94a5\u9519\u8bef\uff0c\u8bf7\u786e\u8ba4\u64ad\u653e\u6743\u9650",Fetch_Failed_Permission_Error:"\u83b7\u53d6\u89c6\u9891\u5217\u8868\u5931\u8d25\uff0c\u8bf7\u786e\u8ba4\u64ad\u653e\u6743\u9650",Invalidate_Param_Error:"\u65e0\u8f93\u5165\u89c6\u9891\uff0c\u8bf7\u786e\u8ba4\u8f93\u5165\u53c2\u6570",AutoPlayDelayDisplayText:"$$\u79d2\u4ee5\u540e\u5f00\u59cb\u64ad\u653e",Fetch_MTS_NOT_NotStream_Error:"\u6b64vid\u6ca1\u6709\u53ef\u64ad\u653e\u89c6\u9891",Cancel_Text:"\u53d6\u6d88",OK_Text:"\u786e\u8ba4",Auto_Stream_Tip_Text:"\u7f51\u7edc\u4e0d\u7ed9\u529b\uff0c\u662f\u5426\u5207\u6362\u5230$$",Fetch_Playauth_Error:"\u83b7\u53d6\u64ad\u653e\u51ed\u8bc1\u51fa\u9519\u5566\uff0c\u8bf7\u5c1d\u8bd5\u9000\u51fa\u91cd\u8bd5\u6216\u5237\u65b0",Open_Html_By_File:"\u4e0d\u80fd\u76f4\u63a5\u5728\u6d4f\u89c8\u5668\u6253\u5f00html\u6587\u4ef6\uff0c\u8bf7\u90e8\u7f72\u5230\u670d\u52a1\u7aef",Cant_Use_Flash_On_Mobile:"\u79fb\u52a8\u7aef\u4e0d\u652f\u6301Flash\u64ad\u653e\u5668\uff0c\u8bf7\u4f7f\u7528h5\u64ad\u653e\u5668",Flash_Not_Ready:"Flash Player\u63d2\u4ef6\u672a\u5b89\u88c5\u5b89\u88c5\u63d2\u4ef6\uff0c\u5982\u679c\u5df2\u7ecf\u5b89\u88c5\u8bf7\u68c0\u67e5\u662f\u5426\u88ab\u7981\u7528"}},{}],23:[function(o,e,t){function n(){var e;return void 0!==window[l]&&window[l]||(e=(e=(navigator.language||navigator.browserLanguage).toLowerCase())&&-1>4,l[s++]=(15&r)<<4|i>>2,l[s++]=(3&i)<<6|63&n;return o},encode:function(e){for(var t=new Uint8Array(e),r=t.length,i="",n=0;n>2])+o[(3&t[n])<<4|t[n+1]>>4])+o[(15&t[n+1])<<2|t[n+2]>>6])+o[63&t[n+2]];return r%3==2?i=i.substring(0,i.length-1)+"=":r%3==1&&(i=i.substring(0,i.length-2)+"=="),i},unpackPlayReady:function(e){e=function(e,t,r){if(!e)return"";r||e.byteLength%2==0||console.log("Data has an incorrect length, must be even."),r=e instanceof ArrayBuffer?e:((r=new Uint8Array(e.byteLength)).set(new Uint8Array(e)),r.buffer);for(var i=Math.floor(e.byteLength/2),n=new Uint16Array(i),o=new DataView(r),a=0;as[0]&&t[1]s[0]&&t[1]a)return 1;if(a>o)return-1}var s=r[r.length-1],l=i[i.length-1];if(s&&l){var c=s.split(".").map(d),u=l.split(".").map(d);for(n=0;nu[n])return 1;if(u[n]>c[n])return-1}}else if(s||l)return s?-1:1;return 0}var o=[">",">=","=","<","<="],a={">":[1],">=":[0,1],"=":[0],"<=":[-1,0],"<":[-1]};return n.validate=function(e){return"string"==typeof e&&t.test(e)},n.compare=function(e,t,r){!function(e){if("string"!=typeof e)throw new TypeError("Invalid operator type, expected string but got "+typeof e);if(-1===o.indexOf(e))throw new TypeError("Invalid operator, expected one of "+o.join("|"))}(r);var i=n(e,t);return a[r].indexOf(i)>-1},n})?i.apply(t,[]):i)&&(e.exports=t)},function(e,t,r){"use strict";r.d(t,"a",function(){return u});var i=r(1),n=r(2),o=r(0),t=r(3),a=this&&this.__awaiter||function(e,a,s,l){return new(s=s||d)(function(r,t){function i(e){try{o(l.next(e))}catch(e){t(e)}}function n(e){try{o(l.throw(e))}catch(e){t(e)}}function o(e){var t;e.done?r(e.value):((t=e.value)instanceof s?t:new s(function(e){e(t)})).then(i,n)}o((l=l.apply(e,a||[])).next())})},s=this&&this.__generator||function(i,n){var o,a,s,l={label:0,sent:function(){if(1&s[0])throw s[1];return s[1]},trys:[],ops:[]},e={next:t(0),throw:t(1),return:t(2)};return"function"==typeof Symbol&&(e[Symbol.iterator]=function(){return this}),e;function t(r){return function(e){var t=[r,e];if(o)throw new TypeError("Generator is already executing.");for(;l;)try{if(o=1,a&&(s=2&t[0]?a.return:t[0]?a.throw||((s=a.return)&&s.call(a),0):a.next)&&!(s=s.call(a,t[1])).done)return s;switch(a=0,(t=s?[2&t[0],s.value]:t)[0]){case 0:case 1:s=t;break;case 4:return l.label++,{value:t[1],done:!1};case 5:l.label++,a=t[1],t=[0];continue;case 7:t=l.ops.pop(),l.trys.pop();continue;default:if(!(s=0<(s=l.trys).length&&s[s.length-1])&&(6===t[0]||2===t[0])){l=0;continue}if(3===t[0]&&(!s||t[1]>s[0]&&t[1]s[0]&&t[1]s[0]&&t[1]s[0]&&t[1]s[0]&&t[1]t.offsetHeight){r=t,e.fastClickScrollParent=t;break}}while(t=t.parentElement)}r&&(r.fastClickLastScrollTop=r.scrollTop)},a.prototype.getTargetElementFromEventTarget=function(e){return e.nodeType===Node.TEXT_NODE?e.parentNode:e},a.prototype.onTouchStart=function(e){var t,r,i;if(!(1t||Math.abs(e.pageY-this.touchStartY)>t},a.prototype.onTouchMove=function(e){return this.trackingClick&&(this.targetElement!==this.getTargetElementFromEventTarget(e.target)||this.touchHasMoved(e))&&(this.trackingClick=!1,this.targetElement=null),!0},a.prototype.findControl=function(e){return void 0!==e.control?e.control:e.htmlFor?document.getElementById(e.htmlFor):e.querySelector("button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea")},a.prototype.onTouchEnd=function(e){var t,r,i,n=this.targetElement;if(!this.trackingClick)return!0;if(e.timeStamp-this.lastClickTimethis.tapTimeout)return!0;if(this.cancelNextClick=!1,this.lastClickTime=e.timeStamp,t=this.trackingClickStart,this.trackingClick=!1,this.trackingClickStart=0,c&&(i=e.changedTouches[0],(n=document.elementFromPoint(i.pageX-window.pageXOffset,i.pageY-window.pageYOffset)||n).fastClickScrollParent=this.targetElement.fastClickScrollParent),"label"===(i=n.tagName.toLowerCase())){if(r=this.findControl(n)){if(this.focus(n),s)return!1;n=r}}else if(this.needsFocus(n))return 100p||0!==a.videoWidth)&&(clearInterval(s),e=0!==a.videoWidth,l?(a.setAttribute("controls","controls"),t=a,void 0===(r=c)&&(r=""),i=document.createElement("dv"),(n=document.createElement("h3")).innerText=r,i.appendChild(t),i.appendChild(n),document.body.appendChild(i)):(a.pause(),a=null),o(e))})})}var i={d:function(e,t){for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},e={},t=(i.d(e,{default:function(){return o}}),navigator.userAgent),r=/qqbrowser/i.test(t.toLowerCase()),n=/Edge/i.test(t),n=/Chrome/i.test(t)&&!n&&!r,y=/Safari/i.test(t)&&!n,r=t.match(/Version\/([\d.]+)([^S](Safari)|[^M]*(Mobile)[^S]*(Safari))/),n=r&&r[1],_=n&&Number(n.split(".")[0]),g=function(){var t=a(w().mark(function e(t){var r;return w().wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch(t);case 2:return r=e.sent,e.next=5,r.blob();case 5:return r=e.sent,e.abrupt("return",URL.createObjectURL(r));case 7:case"end":return e.stop()}},e)}));return function(e){return t.apply(this,arguments)}}(),v={includeSystemHijack:!0,showVideo:!1,codecTags:["hev1","hvc1"],timeout:2e3},o=function(h){return void 0===h&&(h={}),new s(function(){var t=a(w().mark(function e(t){var r,i,n,o,a,s,l,c,u,p,d;return w().wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(n=Object.assign({},v,h),r=n.includeSystemHijack,i=n.showVideo,s=n.codecTags,n=n.timeout,o=performance.now(),a=-1Number.MAX_SAFE_INTEGER?1/0:e},hexadecimalInteger:function(e){if(this[e]){for(var t=(1&(t=(this[e]||"0x").slice(2)).length?"0":"")+t,r=new Uint8Array(t.length/2),i=0;iNumber.MAX_SAFE_INTEGER?1/0:e},decimalFloatingPoint:function(e){return parseFloat(this[e])},enumeratedString:function(e){return this[e]},decimalResolution:function(e){e=n.exec(this[e]);if(null!==e)return{width:parseInt(e[1],10),height:parseInt(e[2],10)}},parseAttrList:function(e){var t,r={};for(o.lastIndex=0;null!==(t=o.exec(e));){var i=t[2];0===i.indexOf('"')&&i.lastIndexOf('"')===i.length-1&&(i=i.slice(1,-1)),r[t[1]]=i}return r}},t.exports=i},{}],39:[function(e,t,r){function S(){this.method=null,this.key=null,this.iv=null,this._uri=null}function b(){this._url=null,this._byteRange=null,this._decryptdata=null,this.tagList=[]}function i(){this.loaders={}}var n=e("../constants"),l=e("../playerutil"),T=e("./attrlist"),c=e("../io"),o=e("./URLToolkit"),u=/#EXT-X-STREAM-INF:([^\n\r]*)[\r\n]+([^\r\n]+)/g,p=/#EXT-X-MEDIA:(.*)/g,E=new RegExp([/#EXTINF:(\d*(?:\.\d+)?)(?:,(.*)\s+)?/.source,/|(?!#)(\S+)/.source,/|#EXT-X-BYTERANGE:*(.+)/.source,/|#EXT-X-PROGRAM-DATE-TIME:(.+)/.source,/|#.*/.source].join(""),"g"),w=/(?:(?:#(EXTM3U))|(?:#EXT-X-(PLAYLIST-TYPE):(.+))|(?:#EXT-X-(PART-INF):(.+))|(?:#EXT-X-(MEDIA-SEQUENCE): *(\d+))|(?:#EXT-X-(TARGETDURATION): *(\d+))|(?:#EXT-X-(KEY):(.+))|(?:#EXT-X-(START):(.+))|(?:#EXT-X-(ENDLIST))|(?:#EXT-X-(DISCONTINUITY-SEQ)UENCE:(\d+))|(?:#EXT-X-(DIS)CONTINUITY))|(?:#EXT-X-(VERSION):(\d+))|(?:#EXT-X-(MAP):(.+))|(?:(#)(.*):(.*))|(?:(#)(.*))(?:.*)\r?\n?/,d="RegionBlock";b.prototype.getUrl=function(){return!this._url&&this.relurl&&(this._url=o.buildAbsoluteURL(this.baseurl,this.relurl,{alwaysNormalize:!0})),this._url},b.prototype.Seturl=function(e){this._url=e},b.prototype.getProgramDateTime=function(){return!this._programDateTime&&this.rawProgramDateTime&&(this._programDateTime=new Date(Date.parse(this.rawProgramDateTime))),this._programDateTime},b.prototype.GetbyteRange=function(){var e,t,r;return this._byteRange||(e=this._byteRange=[],this.rawByteRange&&(1===(t=this.rawByteRange.split("@",2)).length?(r=this.lastByteRangeEndOffset,e[0]=r||0):e[0]=parseInt(t[1]),e[1]=parseInt(t[0])+e[0])),this._byteRange},b.prototype.getByteRangeStartOffset=function(){return this.byteRange[0]},b.prototype.getByteRangeEndOffset=function(){return this.byteRange[1]},b.prototype.getDecryptdata=function(){return this._decryptdata||(this._decryptdata=this.fragmentDecryptdataFromLevelkey(this.levelkey,this.sn)),this._decryptdata};i.prototype=((e={parseMasterPlaylist:function(e,t){var r=[];for(u.lastIndex=0;null!=(o=u.exec(e));){var i={},n=i.attrs=new T(o[1]),o=(i.url=this.resolve(o[2],t),n.decimalResolution("RESOLUTION"));if(o&&(i.width=o.width,i.height=o.height),i.bitrate=n.decimalInteger("AVERAGE-BANDWIDTH")||n.decimalInteger("BANDWIDTH"),i.name=n.NAME,a=n.CODECS)for(var a=a.split(/[ ,]+/),s=0;s",quot:'"',"#x27":"'","#x60":"`"}[t.toLowerCase()]||e})}},{}],43:[function(e,t,r){var n,o=e("./object");(n=function(){}).extend=function(e){var t,r,i=(e=e||{}).init||e.init||this.prototype.init||this.prototype.init||function(){};for(r in(((t=function(){i.apply(this,arguments)}).prototype=o.create(this.prototype)).constructor=t).extend=n.extend,t.create=n.create,e)e.hasOwnProperty(r)&&(t.prototype[r]=e[r]);return t},n.create=function(){var e=o.create(this.prototype);return this.apply(e,arguments),e},t.exports=n},{"./object":42}],44:[function(e,t,r){var i=!new Function("try {return this===window;}catch(e){ return false;}")();t.exports.isSSR=i},{}],45:[function(e,f,t){var y=e("./object"),r=e("../config"),i=e("./dom"),n=e("./cookie"),o=e("./constants"),a=e("../lang/index"),s=e("./ua"),l=e("./io"),_=e("../player/base/plugin/defaultemptycomponent"),c=e("./hardware-decoding-detector"),g={preload:!0,autoplay:!0,useNativeControls:!1,width:"100%",height:"300px",cover:"",from:"",trackLog:!0,logBatched:!0,heartHeatInterval:30,isLive:!1,playsinline:!0,showBarTime:5e3,rePlay:!1,liveRetry:5,liveRetryInterval:1,liveRetryStep:0,keyShortCuts:!1,keyFastForwardStep:10,isVBR:!1,vodRetry:3,format:"",definition:"",defaultDefinition:"",loadDataTimeout:20,waitingTimeout:60,waitingBufferedTime:3,delayLoadingShow:1,controlBarForOver:!1,controlBarVisibility:"hover",enableSystemMenu:!1,qualitySort:"asc",x5_video_position:"normal",x5_type:"",x5_fullscreen:!1,x5_orientation:"landscape|portrait",x5LandscapeAsFullScreen:!0,license:{},autoPlayDelay:0,autoPlayDelayDisplayText:"",useHlsPluginForSafari:!1,enableMSEForAndroid:!0,encryptType:0,language:"zh-cn",languageTexts:{},mediaType:"video",outputType:"",playConfig:{},reAuthInfo:{},components:[],liveTimeShiftUrl:"",liveShiftSource:"",liveShiftTime:"",liveShiftMinOffset:30,videoHeight:"100%",videoWidth:"100%",enableWorker:!0,authTimeout:"",enableMockFullscreen:!1,region:"cn-shanghai",debug:!1,progressMarkers:[],snapshotWatermark:{left:"500",top:"100",text:"",font:"16px \u5b8b\u4f53",fillColor:"#FFFFFF",strokeColor:"#FFFFFF"},liveStartTime:"",liveOverTime:"",enableStashBufferForFlv:!0,stashInitialSizeForFlv:32,flvOption:{accurateSeek:!0},hlsOption:{stopLoadAsPaused:!1},hlsLoadingTimeOut:2e4,useHlsPlugOnMobile:!0,lowLatencyMode:!1,useHls2:void 0,skipRtsSupportCheck:!1,rtsLoadDataTimeout:6e3,rtsFallbackSource:void 0,rtsVersion:"",rtsSdkUrl:"",nudgeMaxRetry:5,tracks:[],recreatePlayer:function(){},diagnosisButtonVisible:!0,enableH265:!1,forceH265:!1,h265Threads:!0,h265Simd:!0,preventRecord:!1,traceId:"",mediaAuth:void 0,textTracks:void 0,_native:!0,hlsUriToken:"",thumbnailUrl:"",refreshAccessInfo:function(){},drmSessionTimeout:5e3,skinRes:"//"+r.domain+"/de/prismplayer-flash/"+r.flashVersion+"/atlas/defaultSkin",splayerUrl:null,splayerWasmDomain:null},u=(f.exports.defaultH5Layout=[{name:"bigPlayButton",align:"blabs",x:30,y:80},{name:"H5Loading",align:"cc"},{name:"errorDisplay",align:"tlabs",x:0,y:0},{name:"infoDisplay"},{name:"tooltip",align:"blabs",x:0,y:50},{name:"thumbnail"},{name:"controlBar",align:"blabs",x:0,y:0,children:[{name:"progress",align:"blabs",x:0,y:44},{name:"playButton",align:"tl",x:15,y:12},{name:"timeDisplay",align:"tl",x:10,y:5},{name:"fullScreenButton",align:"tr",x:10,y:12},{name:"subtitle",align:"tr",x:15,y:12},{name:"setting",align:"tr",x:15,y:12},{name:"volume",align:"tr",x:5,y:10}]}],f.exports.defaultAudioLayout=[{name:"controlBar",align:"blabs",x:0,y:0,children:[{name:"progress",align:"blabs",x:0,y:44},{name:"playButton",align:"tl",x:15,y:12},{name:"timeDisplay",align:"tl",x:10,y:5},{name:"volume",align:"tr",x:5,y:10}]}],f.exports.defaultFlashLayout=[{name:"bigPlayButton",align:"blabs",x:30,y:80},{name:"controlBar",align:"blabs",x:0,y:0,children:[{name:"progress",align:"tlabs",x:0,y:0},{name:"playButton",align:"tl",x:15,y:26},{name:"nextButton",align:"tl",x:10,y:26},{name:"timeDisplay",align:"tl",x:10,y:24},{name:"fullScreenButton",align:"tr",x:10,y:25},{name:"streamButton",align:"tr",x:10,y:23},{name:"volume",align:"tr",x:10,y:25}]},{name:"fullControlBar",align:"tlabs",x:0,y:0,children:[{name:"fullTitle",align:"tl",x:25,y:6},{name:"fullNormalScreenButton",align:"tr",x:24,y:13},{name:"fullTimeDisplay",align:"tr",x:10,y:12},{name:"fullZoom",align:"cc"}]}],f.exports.canPlayType=function(e){var t=document.createElement("video");return t.canPlayType?t.canPlayType(e):""},f.exports.canPlayHls=function(){return""!=f.exports.canPlayType("application/x-mpegURL")},f.exports.isUsedHlsPluginOnMobile=function(e){return!!(s.IS_MOBILE&&(s.IS_CHROME||s.IS_FIREFOX||s.IS_X5||s.IS_EDGE_NEW)&&f.exports.isSupportHls())},f.exports.isSafariUsedHlsPlugin=function(e){return!!(s.os.pc&&s.browser.safari&&e)},f.exports.hasUIComponent=function(e,t){if(void 0!==e&&e&&0!=e.length)for(var r=0,i=e.length;rx'}).firstChild.href},t.exports.parseUrl=function(e){var t,r=["protocol","hostname","port","pathname","search","hash","host"],i=s.createEl("a",{href:e}),n=""===i.host&&"file:"!==i.protocol;n&&((t=s.createEl("div")).innerHTML='',i=t.firstChild,t.setAttribute("style","display:none; position:absolute;"),document.body.appendChild(t));for(var o={},a=0;a/g,">").replace(/\&/g,"&").replace(/"/g,""").replace(/'/g,"'")},r.exports.toBinary=function(e){if(!window.atob)return"";for(var t=atob(e),r=t.length,i=new Uint8Array(r),n=0;n>16),this.dv.setInt16(r+1,65535&t);case 4:return this.dv.setInt32(r,t);default:throw new Error("\u4e0d\u652f\u6301Byte write "+e)}},i.prototype.write=function(e,t){var r=this.offset;switch(this.offset+=e,e){case 1:return this.dv.setUint8(r,t);case 2:return this.dv.setUint16(r,t);case 3:return this.dv.setUint8(r,t>>>16),this.dv.setUint16(r+1,65535&t);case 4:return this.dv.setUint32(r,t);default:throw new Error("\u4e0d\u652f\u6301Byte write "+e)}},i.prototype.readToUint8=function(e){e=new Uint8Array(this.dv.buffer,this.offset,e||this.unreadLength);return this.offset+=e.byteLength,e},i.prototype.readToBuffer=function(e){e=this.offset||e?this.dv.buffer.slice(this.offset,e?this.offset+e:void 0):this.dv.buffer;return this.offset+=e.byteLength,e},i),U=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],F=1024,B=function(e,t){var r=t.audioObjectType,i=t.sampleRate,n=t.channelCount,t=void 0===(t=t.numberOfRawDataBlocksInFrame)?0:t,o=e.byteLength+7,i=U.indexOf(i),a=new Uint8Array(7);return a[0]=255,a[1]=241,a[2]=r-1<<6,a[2]|=i<<2,a[2]|=(4&n)>>2,a[3]=(3&n)<<6,a[3]|=(6144&o)>>11,a[4]=(2047&o)>>3,a[5]=(7&o)<<5,a[5]|=31,a[6]=252,a[6]|=3&t,g.concatUint8(a,e)},j=function(e,t){return t>>5},G=function(e){for(var t,r,i=[],n=0,o=e.byteLength;n+5>>6),sampleRate:U[e[2]>>>2&15],samplingFrequencyIndex:e[2]>>>2&15,channelCount:(1&e[2])<<2|e[3]>>>6,numberOfRawDataBlocksInFrame:0,data:e.subarray(n+t,n+r)}),n+=r):n++;return i},p=(r.fromByte=function(e,t){return new r(e.read(t),t<<3)},r.prototype.skip=function(e){this.offset+=e},r.prototype.read=function(e){var t=this.len-this.offset-e;if(0<=t){for(var r=0,i=0;i>>t&r}return console.warn("bit \u8bfb\u53d6\u4f4d\u6570\u8d85\u8fc7\u9650\u5236"),0},r);function r(e,t){this.num=e,this.len=t,this.offset=0}function i(e,t,r){this.dv=new DataView(e),this.start=this.offset=t||this.dv.byteOffset,this.end=r?this.start+r:this.dv.byteLength}K.createAnnexbStartCode=function(){return new Uint8Array([0,0,0,1])},K.createAVCCStartCode=function(e){return new Uint8Array([e>>24&255,e>>16&255,e>>8&255,255&e])},K.extractAVCCNAL=function(e,t){for(var r,i=[],n=new g(e.buffer,e.byteOffset,e.byteLength);n.unreadLength>t;){if((r=n.read(t+1))<=0||r>n.unreadLength){console.warn("extract avc nalu size wrong! lengthSizeMinusOne:",t,"size:",r);break}var o=n.offset-n.start;i.push(e.subarray(o,o+r)),n.skip(r)}return i},K.extractAnnexbNAL=function(r){for(var e=r.byteLength,i=[],t=0;t=z.NON_IDR_SLICE&&e<=z.SLICE_IDR},e}(W),e=($=function(e,t){return($=Object.setPrototypeOf||({__proto__:[]}instanceof Array?function(e,t){e.__proto__=t}:function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])}))(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function r(){this.constructor=e}$(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),m=((s=v=v||{})[s.TRAIL_N=0]="TRAIL_N",s[s.TRAIL_R=1]="TRAIL_R",s[s.TSA_N=2]="TSA_N",s[s.TSA_R=3]="TSA_R",s[s.STSA_N=4]="STSA_N",s[s.STSA_R=5]="STSA_R",s[s.RADL_N=6]="RADL_N",s[s.RADL_R=7]="RADL_R",s[s.RASL_N=8]="RASL_N",s[s.RASL_R=9]="RASL_R",s[s.VCL_N10=10]="VCL_N10",s[s.VCL_R11=11]="VCL_R11",s[s.VCL_N12=12]="VCL_N12",s[s.VCL_R13=13]="VCL_R13",s[s.VCL_N14=14]="VCL_N14",s[s.VCL_R15=15]="VCL_R15",s[s.BLA_W_LP=16]="BLA_W_LP",s[s.BLA_W_RADL=17]="BLA_W_RADL",s[s.BLA_N_LP=18]="BLA_N_LP",s[s.IDR_W_RADL=19]="IDR_W_RADL",s[s.IDR_N_LP=20]="IDR_N_LP",s[s.CRA=21]="CRA",s[s.VPS=32]="VPS",s[s.SPS=33]="SPS",s[s.PPS=34]="PPS",s[s.ACCESS_UNIT_DELIMITER=35]="ACCESS_UNIT_DELIMITER",s[s.EOS=36]="EOS",s[s.EOB=37]="EOB",s[s.FILLER_DATA=38]="FILLER_DATA",s[s.SEI=39]="SEI",s[s.SEI_SUFFIX=40]="SEI_SUFFIX",s[s.INVALID=64]="INVALID",e(t,Y=W),t.extractNALType=function(e,t){return(126&e[t=void 0===t?0:t])>>1},t.isNonRefNALType=function(e){switch(e){case v.TRAIL_N:case v.STSA_N:case v.RADL_N:case v.RASL_N:case v.VCL_N10:case v.VCL_N12:case v.VCL_N14:return!0;default:return!1}},t.isNonRef=function(e){return this.isNonRefNALType(this.extractNALType(e))},t.isSlice=function(e){e=this.extractNALType(e);return e>=v.TRAIL_N&&e<=v.CRA},t.littleEndian=function(){var e=new ArrayBuffer(2);return new DataView(e).setInt16(0,256,!0),256===new Int16Array(e)[0]},t.parseHVCVideoData=function(e,t){for(var r=e.byteLength,i=new DataView(e.buffer,e.byteOffset,e.byteLength),n=[],o=0,a=0+t,s=this.littleEndian,l=!1;o DataSize!");var u=i.getUint8(o+4)>>1&63,p=(16<=u&&u<=23&&(l=!0),0+o+4),u={type:u,data:e.subarray(p,p+c)};n.push(u),o+=4+c}return{keyframe:l,units:n}},t);function t(e){var t=Y.call(this)||this,e=new p(e.read(2),16);return t.forbiddenZeroBit=e.read(1),t.nalType=e.read(6),t.nhLayerId=e.read(6),t.nhTimeId=e.read(3),t}o.prototype.loadWord=function(){var e=this.data,t=this.bytesAvailable,r=e.byteLength-t,i=new Uint8Array(4),t=Math.min(4,t);if(0===t)throw new Error("no bytes available");i.set(e.subarray(r,r+t)),this.word=new DataView(i.buffer).getUint32(0),this.bitsAvailable=8*t,this.bytesAvailable-=t},o.prototype.skipBits=function(e){var t;this.bitsAvailable>e||(e=(e-=this.bitsAvailable)-((t=e>>3)<<3),this.bytesAvailable-=t,this.loadWord()),this.word<<=e,this.bitsAvailable-=e},o.prototype.readBits=function(e){var t=Math.min(this.bitsAvailable,e),r=this.word>>>32-t;return 32>>e))return this.word<<=e,this.bitsAvailable-=e,e;return this.loadWord(),e+this.skipLZ()},o.prototype.skipUEG=function(){this.skipBits(1+this.skipLZ())},o.prototype.skipEG=function(){this.skipBits(1+this.skipLZ())},o.prototype.readUEG=function(){var e=this.skipLZ();return this.readBits(e+1)-1},o.prototype.readEG=function(){var e=this.readUEG();return 1&e?1+e>>>1:-1*(e>>>1)},o.prototype.readUByte=function(){return this.readBits(8)},o.prototype.readUShort=function(){return this.readBits(16)},o.prototype.readUInt=function(){return this.readBits(32)},o.prototype.skipScalingList=function(e){for(var t=8,r=8,i=0;iRe&&h.shift(),Le<=e)&&(a=(u[e]||"").toLowerCase(),s=console[a])&&s.apply(void 0,[n].concat(t))},s.getLogs=function(){return h.map(function(e){return e.message=e.prefix+" "+e.args.map(function(e){return"string"==typeof e?e:Te()(e)}).join(" "),e})},s.clear=function(){h=[]},s.setSize=function(e){Re=e},s.setLevel=function(e){Ie=e},s.setPrintLevel=function(e){Le=e},s.reset=function(){Ie=u.INFO,Le=u.ERROR,Re=2e3,Ae=Ce(),h=[],De=0},Oe);function Oe(e){var i=this;this.trace=function(){for(var e=arguments.length,t=new Array(e),r=0;r ").concat(y[e])),this.status=e)},c.prototype.jump=function(e){this.offset=e},c.prototype.load=function(e,t,r){return this.reset(),this.url=e,this.loadRange(t,r)},c.prototype.resume=function(){return this.loadRange(this.offset)},c.prototype.suspend=function(){this.abort(),this._changeStatus(y.SUSPENGING)},c.prototype.reset=function(){this.abort(),this.offset=0,this.total=1/0,this.url=""},c.prototype.destroy=function(){this.removeAllListeners(),this.reset()},c),l={isIos:!1,isDingtalk:!1,isQQBrowser:!1},e=(window.navigator.userAgent||"").toLowerCase();function c(e){void 0===e&&(e={});var t=He.call(this)||this;return t.timeout=15e3,t.total=1/0,t.offset=0,t.status=y.IDLE,t.url="",t._handleError=function(e){if("AbortError"===e.name)return!1;throw t._changeStatus(y.ERROR),t.emit("error",{code:d.NETWORK,message:e.message,origin:e}),e},t.timeout=e.timeout||t.timeout,t}/(iPhone\sOS)\s([\d_]+)/i.test(e)&&(l.isIos=!0),-1=this.total)return Ln.resolve(!1);if(this.status===y.LOADING||this.status===y.ERROR)return Ln.resolve(!1);T.info("\u6267\u884cload, from=".concat(i," to=").concat(e," url=").concat(this.url)),this.abort();var t=new Headers,o=0=this.total||this.status===y.LOADING||this.status===y.ERROR?Ln.resolve(!1):(this.abort(),new Ln(function(e,t){l.xhr=new XMLHttpRequest,l._resolve=e;function r(){var r,e,t=o.responseText,i=t.length,n=a;0=o.HEADERS_RECEIVED&&clearTimeout(l._timer)},l.offset=n,0);o.timeout=l.timeout,o.onprogress=r,o.onloadend=function(){r(),l.xhr=null,l._changeStatus(y.IDLE),l.emit("loadend",void 0),e(!0)},o.onerror=function(e){l.xhr=null;try{l._handleError(new Error(e.constructor.name))}catch(e){t(e)}},o.overrideMimeType("text/plain; charset=x-user-defined"),l._changeStatus(y.LOADING),l.emit("loadstart",void 0),l._timer=setTimeout(l.triggerTimeout,l.timeout),o.send()}))};var e=$e,Be=s.isSupported()?s:e;Ve=function(e,t){return(Ve=Object.setPrototypeOf||({__proto__:[]}instanceof Array?function(e,t){e.__proto__=t}:function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])}))(e,t)};(function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function r(){this.constructor=e}Ve(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)})(_,je=Ne),Object.defineProperty(_.prototype,"loader",{get:function(){return this.customLoader||this.originLoader},enumerable:!1,configurable:!0}),Object.defineProperty(_.prototype,"status",{get:function(){return this.loader.status},enumerable:!1,configurable:!0}),_.probe=function(e){throw new Error("parser should implements static probe")},_.prototype.onProgress=function(e){},_.prototype.onLoadEnd=function(){},_.prototype.load=function(e){return this.reset(),this.loader.load(e)},_.prototype.suspend=function(){return this.loader.suspend()},_.prototype.resume=function(){return this.loader.resume()},_.prototype.reset=function(){this.loader.reset(),this.metadata=null},_.prototype.destroy=function(){this.reset(),this.loader.off("progress",this.onProgress),this.loader.off("loadend",this.onLoadEnd),this.originLoader.destroy(),this.removeAllListeners()};var je,Ve,qe,Ge,We,Ke,s=_,Xe=(ze.BUFFER_LENGTH=9,ze);function ze(e){this.signature=String.fromCharCode(e.read(1),e.read(1),e.read(1)),this.version=e.read(1);var t=e.read(1),e=(this.size=e.read(4),new p(t,8));e.read(5),this.hasAudio=!!e.read(1),e.read(1),this.hasVideo=!!e.read(1)}function _(e){var t=je.call(this)||this;return t.skipFrame=S.DEFAULT,t.metadata=null,t.options=e,t.onProgress=t.onProgress.bind(t),t.onLoadEnd=t.onLoadEnd.bind(t),t.originLoader=new Be(t.options),t.customLoader=e.loader,t.loader.on("progress",t.onProgress),t.loader.on("loadend",t.onLoadEnd),t.skipFrame=e.skipFrame||S.DEFAULT,t}function $e(){var e=null!==qe&&qe.apply(this,arguments)||this;return e.xhr=null,e._timer=-1,e._resolve=function(e){},e.triggerTimeout=function(){e.abort(),e._handleError(new Error("\u52a0\u8f7d\u8d85\u65f6\uff0c\u8bf7\u91cd\u8bd5"))},e}function Ye(){var e=null!==We&&We.apply(this,arguments)||this;return e.controller=null,e.timer=-1,e.abort=function(){clearTimeout(e.timer),e.controller&&!e.controller.signal.aborted&&(e.controller.abort(),e.controller=null),e._changeStatus(y.IDLE)},e.triggerTimeout=function(){e.abort(),e._handleError(new Error("\u52a0\u8f7d\u8d85\u65f6\uff0c\u8bf7\u91cd\u8bd5"))},e}(e=Ue=Ue||{})[e.AUDIO=8]="AUDIO",e[e.VIDEO=9]="VIDEO",e[e.SCRIPT=18]="SCRIPT";Je.BUFFER_LENGTH=11;var Qe=Je;function Je(e){this.type=e.read(1),this.size=e.read(3),this.dts=e.read(3),this.dts|=e.read(1)<<24,e.skip(3)}var Ze,et=[5512,11025,22050,44100],tt=[8,16];(e=Ze=Ze||{})[e.ADTS_HEADER=0]="ADTS_HEADER",e[e.RAW=1]="RAW";it.readAudioSpecificConfig=function(e){e=p.fromByte(e,2);return{audioObjectType:e.read(5),sampleRate:U[e.read(4)],samplingFrequencyIndex:e.read(4),channelCount:e.read(4)}};var E,rt=it;function it(e){var t=new p(e.read(1),8);this.codecId=t.read(4),this.sampleRate=et[t.read(2)],this.sampleSize=tt[t.read(1)],this.soundType=t.read(1),this.packetType=e.read(1),this.data=e.readToUint8()}function nt(t){var e=t.read(2);return Array.from(Array(e)).map(function(){var e=t.read(1);return 0=Xe.BUFFER_LENGTH&&(this.header=new Xe(i),!1===this.header.hasVideo&&(this.header.hasVideo=!0),i.skip(this.header.size-Xe.BUFFER_LENGTH));i.unreadLength>4+Qe.BUFFER_LENGTH;){i.skip(4);var n=new Qe(i);if(!(i.unreadLength>=n.size)){i.back(4+Qe.BUFFER_LENGTH);break}var o=new g(i.buffer,i.offset,n.size);switch(i.skip(n.size),n.type){case Ue.VIDEO:r=r.concat(this.parseVideoBody(n,o,i.offset+t));break;case Ue.AUDIO:r=r.concat(this.parseAudioBody(n,o,i.offset+t));break;case Ue.SCRIPT:this.parseScriptBody(n,o);break;default:return T.warn("unknown tag type",n.type),r}}this.unhandleBuffer=i.unreadLength?i.readToBuffer():null}return r},P.prototype.checkMetadata=function(){var e=this.flvMetadata,t=this.header;if(t&&!this.metadata){var r=[];if(t.hasVideo){if(!this.videoTrackMeta||!this.videoLoaded)return void console.log("checkMetadata hasVideo no this.videoTrackMeta",this.videoTrackMeta,", this.videoLoaded",this.videoLoaded);this.videoTrackMeta.baseDTS=this.baseVideoDTS,this.videoTrackMeta.basePTS=this.baseVideoPTS,r.push(this.videoTrackMeta)}if(t.hasAudio){if(!this.audioTrackMeta||!this.audioLoaded)return void console.log("checkMetadata hasAudio no this.audioTrackMeta",this.audioTrackMeta,", this.audioLoaded",this.audioLoaded);this.audioTrackMeta.baseDTS=this.baseAudioDTS,this.audioTrackMeta.basePTS=this.baseAudioPTS,r.push(this.audioTrackMeta)}var t=this.options,i=t.live,t=t.progressive;this.metadata={formatType:n.FLV,live:!!i,progressive:!i&&!!t,url:this.loader.url,basePTS:Math.min.apply(Math,r.map(function(e){return e.basePTS||0})),baseDTS:Math.min.apply(Math,r.map(function(e){return e.baseDTS||0})),timescale:1e3,duration:1e3*((null==e?void 0:e.duration)||1/0),tracks:r},this.emit("loadedmetadata",this.metadata)}},P.prototype.parseVideoBody=function(e,t,r){var i=this,t=new pt(t),n=(this.emit("loadedtag",{header:e,body:t}),[]),o=t.type===lt.KEY,a=!1;if(t.data.length)if(t.packetType===ut.AVC_SEQUENCE_HEADER){var s=this.flvMetadata||{},l={type:b.VIDEO,id:2,baseDTS:0,basePTS:0,timescale:1e3,vps:[],sps:[],pps:[],sei:[],width:s.width||0,height:s.height||0,codec:"",pixelRatio:[]};t.codecId===ct.H264?(_=new ue(new g(new ArrayBuffer(8)),0),u=new g(t.data.buffer,t.data.byteOffset,t.data.byteLength),s=new he(_,u),l.pps=s.pps,l.sps=s.sps,l.codec=s.codec,(s=s.sps[0])&&(s=new re(s.subarray(1)),l.width=s.width,l.height=s.height)):t.codecId===ct.H265&&(console.log("parseVideoBody AVC_SEQUENCE_HEADER EVideoCodecID:",t.codecId,"body.data:",t.data),_=new ue(new g(new ArrayBuffer(8)),0),u=new g(t.data.buffer,t.data.byteOffset,t.data.byteLength),s=new be(_,u),console.log("parseVideoBody hvccBox",s),s.vps.forEach(function(e){return l.vps.push(e)}),s.pps.forEach(function(e){return l.pps.push(e)}),s.sps.forEach(function(e){return l.sps.push(e)}),s.sei.forEach(function(e){return l.sei.push(e)}),l.codec=s.codec,console.log("parseVideoBody AVC_SEQUENCE_HEADER trackMeta:",l)),this.videoTrackMeta=l,this.checkMetadata()}else{var c=[];if(t.codecId===ct.H265){if(this.skipFrame===S.NONREF&&m.isNonRefNALType(m.extractNALType(t.data,4)))return console.error("isNonRefNALType"),[];var u,p,d,h,f,y,_=m.parseHVCVideoData(t.data.subarray(0),e.dts);null!=_&&_.units&&(u=_.units,p={type:b.VIDEO,id:2,baseDTS:0,basePTS:0,timescale:1e3,vps:[],sps:[],pps:[],sei:[],width:(null==(s=this.flvMetadata)?void 0:s.width)||0,height:(null==(s=this.flvMetadata)?void 0:s.height)||0,codec:"",pixelRatio:[]},d=[],h=[],f=[],y=[],u.forEach(function(e){var t;e.type===v.TRAIL_R||e.type===v.IDR_W_RADL?c.push(e.data):e.type===v.SPS?(o=!0,t=new oe(function(e){for(var t=e.byteLength,r=[],i=1;i>>16,e}function ui(e,t){function r(e){return 96+(31&e)}var e=Mr.call(this,e,t)||this,i=(e.version=t.read(1),e.flag=t.read(3),1===e.version),i=(e.createTime=e.toStandardTime(t.read(i?8:4)),e.modifyTime=e.toStandardTime(t.read(i?8:4)),e.timeScale=t.read(4),e.duration=t.read(i?8:4),t.read(2));return e.language=String.fromCharCode(r(i>>10),r(i>>5),r(i)),e.quality=Number(t.read(1)+"."+t.read(1)),e}function pi(e,t){var r=Ur.call(this,e,t)||this;return r.data=t.readToUint8(e.size-e.length),r}function di(e,t){var r=Br.call(this,e,t)||this;for(r.name="",r.version=t.read(1),r.flag=t.read(3),r.preDefined=String.fromCharCode(t.read(1),t.read(1),t.read(1),t.read(1)),r.handleType=String.fromCharCode(t.read(1),t.read(1),t.read(1),t.read(1)),t.skip(12);0=r){i=n;break}if(-1>26&3,b.dependsOn=T>>24&3,b.isDependedOn=T>>22&3,b.hasRedundancy=T>>20&3,b.degradationPriority=65535&T,m+=b.size,b.isLast=_===p.length-1&&S===g.sampleCount-1,i.addSample(b)}},_n.prototype.destroy=function(){this.options=null},_n);Xi=function(e,t){return(Xi=Object.setPrototypeOf||({__proto__:[]}instanceof Array?function(e,t){e.__proto__=t}:function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])}))(e,t)};(function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function r(){this.constructor=e}Xi(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)})(O,Ki=s),O.probe=function(e){return!(e.byteLength<8)&&"ftyp"===[e[4],e[5],e[6],e[7]].map(function(e){return String.fromCharCode(e)}).join("")},O.prototype.processPackets=function(t,r){var e,i=this,n=[];return this.media&&t.byteLength&&(this.media.getTracks().forEach(function(e){e.processSamples(t,r).forEach(function(e){e=i.convertSampleToPacket(e);e&&n.push(e)})}),e=this.getMinNextSampleOffset()-r,this.unhandleBuffer=e>=t.byteLength?null:t.slice(e).buffer),n},Object.defineProperty(O.prototype,"url",{get:function(){return this.loader.url},enumerable:!1,configurable:!0}),O.prototype.seek=function(t){var e,r=this.options.progressive;this.unhandleBuffer=null,r&&this.loader.suspend(),null!=(e=this.media)&&e.getTracks().map(function(e){return e.seek(t)}),r&&this.loader.loadRange(this.getMinNextSampleOffset())},O.prototype.onProgress=function(e){var t=e.data,e=e.offset;t.length&&(this.unhandleBuffer&&(t=g.concatUint8(new Uint8Array(this.unhandleBuffer),t),e-=this.unhandleBuffer.byteLength,this.unhandleBuffer=null),this.metadata||this.parse(new g(t.buffer,0),e),this.metadata)&&((t=this.processPackets(t,e)).length&&this.emit("loadeddata",{packets:t}))},O.prototype.getMinNextSampleOffset=function(){return this.media?Math.min.apply(Math,this.media.getTracks().map(function(e){return e.getNextSampleOffset()})):0},O.prototype.parse=function(o,a){var s,l=this;void 0===a&&(a=0);for(var c=o.offset,u=0,p=this;8<=o.unreadLength;){var e=function(){var e,t,r,i,n;return u=o.offset-c,0===(e=new ue(o,a+u)).size?(r=new Error("box [".concat(e.type,"] size \u4e3a 0")),console.error(r),p.emit("error",{code:d.PARSER,message:r.message,origin:r}),"break"):p.options.progressive&&"mdat"===e.type&&!p.metadata?(t=e.start+e.size,p.loader.suspend(),p.unhandleBuffer=null,T.info("\u68c0\u6d4b\u5230mdat box\u5728moov box\u4e4b\u540e\uff0c\u8df3\u8f6cmoov\u8d77\u59cb\u504f\u79fb\u4f4d"),p.loader.loadRange(t).then(function(){l.unhandleBuffer=null,l.loader.jump(e.start),l.loader.status!==y.SUSPENGING&&l.loader.loadRange(e.start,t)}),{value:void 0}):(r=e.size-e.length,o.unreadLength>=r?((n=H[e.type])?(i=new g(o.buffer,o.offset,r),(s=new n(e,i)).isContainer&&((n=new O({sub:!0})).proxy(p,["loadedbox"]),n.parse(i,u+a+e.length),n.removeAllListeners(),n.boxes.forEach(function(e){s.append(e)}))):s=new f(e),o.skip(r),p.boxes.push(s),void p.emit("loadedbox",s)):(o.back(e.length),"break"))}();if("object"==typeof e)return e.value;if("break"===e)break}o.unreadLength&&(this.unhandleBuffer=o.readToBuffer())},O.prototype.reset=function(){Ki.prototype.reset.call(this),this.boxes=[],this.unhandleBuffer=null,this.avcCBox=void 0,this.hvcCBox=void 0,this.mp4aBox=void 0,this.media=null,this.moofParser.destroy()};var qi=O;Wi=function(e,t){return(Wi=Object.setPrototypeOf||({__proto__:[]}instanceof Array?function(e,t){e.__proto__=t}:function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])}))(e,t)};var Gi,Wi,Ki,Xi,zi,$i,Yi,Qi,Ji,Zi,en,tn,rn,nn,on,an,sn,ln,cn,un,pn,dn=function(){return(dn=Object.assign||function(e){for(var t,r=1,i=arguments.length;r ").concat(n[i.activeParser.formatType])),i.emit("parserchange",void 0),i.activeParser.onProgress(t)):(r="\u672a\u627e\u5230\u5bf9\u5e94\u7684Parser, Byte\u6570\u636e: "+t.data.slice(0,20).join(","),T.error(r),i.emit("error",{code:d.PARSER,message:r})))},i.options=e,i.loader=i.createLoader(),i.activeParser=i.createParser(i.parserClasses[0]),i.logger.info("demuxer options",e),i}function O(e){var h=Ki.call(this,e=void 0===e?{}:e)||this;return h.media=null,h.unhandleBuffer=null,h.formatType=n.MP4,h.boxes=[],h._handleBoxLoad=function(e){var o,a,s,l,t,c,u,p,d,r,i=e.header.type;h._handleCodecBoxLoaded(i),"hvcC"===i?h.hvcCBox=e:"hvc1"===i||"hev1"===i?h.hvcCBox&&(h.hvcCBox.codecTag=i):"avcC"===i?h.avcCBox=e:"esds"===i?h.esdsBox=e:"mp4a"===i?h.mp4aBox=e:"moov"===i?(r=f.mapBoxToJSON(e),h.media=h.moovParser.createMedia(r),h.moofParser.init({media:h.media}),t=(r=h.mp4aBox||{}).sampleRate,o=void 0===t?0:t,t=r.sampleSize,a=void 0===t?0:t,t=r.channelCount,s=void 0===t?0:t,t=(r=h.esdsBox||{}).audioObjectType,l=void 0===t?0:t,t=r.codec,c=void 0===t?"":t,u=[],p=[],d=[],h.hvcCBox?(p=h.hvcCBox.vps,d=h.hvcCBox.pps,u=h.hvcCBox.sps):h.avcCBox&&(d=h.avcCBox.pps,u=h.avcCBox.sps),h.metadata={formatType:n.MP4,live:!!h.options.live,progressive:!!h.options.progressive,url:h.loader.url,basePTS:0,baseDTS:0,duration:h.media.options.duration,timescale:h.media.options.timeScale,tracks:h.media.getTracks().map(function(e){var t,r,i,n={};switch(n.id=e.options.id,n.type=e.options.type,n.timescale=e.options.timeScale,n.baseDTS=0,n.basePTS=0,n.type){case b.VIDEO:n.width=e.options.width,n.height=e.options.height,n.vps=p,n.sps=u,n.pps=d,n.rotate=(t=e.options.matrix).length<5||(r=Math.hypot(t[0],t[3]),i=Math.hypot(t[1],t[4]),0===r)||0===i?0:180*Math.atan2(t[1]/i,t[0]/r)/Math.PI,n.pixelRatio=[],n.codec=h.hvcCBox?h.hvcCBox.codec:(null==(i=h.avcCBox)?void 0:i.codec)||"",n.codecTag=h.hvcCBox?h.hvcCBox.codecTag:void 0;break;case b.AUDIO:n.audioObjectType=l,n.sampleRate=o,n.sampleSize=a,n.channelCount=s,n.codec=c;break;default:n.type=b.UNKNOWN}return n})},r=Number(h.options.offsetTime),h.metadata.progressive&&0>>0).toString()}var s=e("./vttparse");t.exports={parse:function(e,t,r){var i,e=e.trim().replace(/\r\n|\n\r|\n|\r/g,"\n").split("\n"),n=[],o=new s;o.oncue=function(e){e.id=a(e.startTime)+a(e.endTime)+a(e.text),e.text=decodeURIComponent(escape(e.text)),e.isBig=!1;var t=e.text.split("#xywh=");2==t.length&&(t=t[1].split(","),e.x=t[0],e.y=t[1],e.w=t[2],e.h=t[3],e.isBig=!0),0/gi,"\n");e=i.startTime&&e<=i.endTime)t.push(i);else if(e","‎":"\u200e","‏":"\u200f"," ":"\xa0"},y={c:"span",i:"i",b:"b",u:"u",ruby:"ruby",rt:"rt",v:"span",lang:"span"},_={v:"title",lang:"lang"},g={rt:"ruby"};function v(e,t){function r(e){return f[e]}for(var i,n,o,a,s,l,c,u=e.document.createElement("div"),p=u,d=[];null!==(c=void 0,c=t?(c=(c=t.match(/^([^<]*)(<[^>]+>?)?/))[1]||c[2],t=t.substr(c.length),c):null);)"<"===c[0]?"/"===c[1]?d.length&&d[d.length-1]===c.substr(2).replace(">","")&&(d.pop(),p=p.parentNode):(o=h(c.substr(1,c.length-2)))?(i=e.document.createProcessingInstruction("timestamp",o),p.appendChild(i)):(n=c.match(/^<([^.\s/0-9>]+)(\.[^\s\\>]+)?([^>\\]+)?(\\?)>?$/))&&(o=n[1],a=n[3],l=s=void 0,l=y[o],i=l?((s=e.document.createElement(l)).localName=l,(l=_[o])&&a&&(s[l]=a.trim()),s):null)&&(o=p,g[(l=i).localName]&&g[l.localName]!==o.localName||(n[2]&&(i.className=n[2].substr(1).replace("."," ")),d.push(n[1]),p.appendChild(i),p=i)):p.appendChild(e.document.createTextNode(function(e){for(;n=e.match(/&(amp|lt|gt|lrm|rlm|nbsp);/);)e=e.replace(n[0],r);return e}(c)));return u}var m=[[1470,1470],[1472,1472],[1475,1475],[1478,1478],[1488,1514],[1520,1524],[1544,1544],[1547,1547],[1549,1549],[1563,1563],[1566,1610],[1645,1647],[1649,1749],[1765,1766],[1774,1775],[1786,1805],[1807,1808],[1810,1839],[1869,1957],[1969,1969],[1984,2026],[2036,2037],[2042,2042],[2048,2069],[2074,2074],[2084,2084],[2088,2088],[2096,2110],[2112,2136],[2142,2142],[2208,2208],[2210,2220],[8207,8207],[64285,64285],[64287,64296],[64298,64310],[64312,64316],[64318,64318],[64320,64321],[64323,64324],[64326,64449],[64467,64829],[64848,64911],[64914,64967],[65008,65020],[65136,65140],[65142,65276],[67584,67589],[67592,67592],[67594,67637],[67639,67640],[67644,67644],[67647,67669],[67671,67679],[67840,67867],[67872,67897],[67903,67903],[67968,68023],[68030,68031],[68096,68096],[68112,68115],[68117,68119],[68121,68147],[68160,68167],[68176,68184],[68192,68223],[68352,68405],[68416,68437],[68440,68466],[68472,68479],[68608,68680],[126464,126467],[126469,126495],[126497,126498],[126500,126500],[126503,126503],[126505,126514],[126516,126519],[126521,126521],[126523,126523],[126530,126530],[126535,126535],[126537,126537],[126539,126539],[126541,126543],[126545,126546],[126548,126548],[126551,126551],[126553,126553],[126555,126555],[126557,126557],[126559,126559],[126561,126562],[126564,126564],[126567,126570],[126572,126578],[126580,126583],[126585,126588],[126590,126590],[126592,126601],[126603,126619],[126625,126627],[126629,126633],[126635,126651],[1114109,1114109]];function S(e){var t=[],r="";if(e&&e.childNodes)for(o(t,e);r=function e(t){var r,i,n;return t&&t.length?(i=(r=t.pop()).textContent||r.innerText)?(n=i.match(/^.*(\n|\r)/))?n[t.length=0]:i:"ruby"===r.tagName?e(t):r.childNodes?(o(t,r),e(t)):void 0:null}(t);)for(var i=0;i=r[0]&&e<=r[1])return 1}}(r.charCodeAt(i)))return"rtl";return"ltr";function o(e,t){for(var r=t.childNodes.length-1;0<=r;r--)e.push(t.childNodes[r])}}function b(){}function T(e,t,r){var i="undefined"!=typeof navigator&&/MSIE\s8\.0/.test(navigator.userAgent),n="rgba(255, 255, 255, 1)",o="rgba(0, 0, 0, 0.8)",a="",n=(void 0!==l&&(n=l.fontSet,o=l.backgroundSet,a=l.edgeSet),i&&(n="rgb(255, 255, 255)",o="rgb(0, 0, 0)"),b.call(this),this.cue=t,this.cueDiv=v(e,t.text),{color:n,backgroundColor:o,textShadow:a,position:"relative",left:0,right:0,top:0,bottom:0,display:"inline"}),s=(i||(n.writingMode=""===t.vertical?"horizontal-tb":"lr"===t.vertical?"vertical-lr":"vertical-rl",n.unicodeBidi="plaintext"),this.applyStyles(n,this.cueDiv),this.div=e.document.createElement("div"),n={textAlign:"middle"===t.align?"center":t.align,font:r.font,whiteSpace:"pre-line",position:"absolute"},i||(n.direction=S(this.cueDiv),n.writingMode=""===t.vertical?"horizontal-tb":"lr"===t.vertical?"vertical-lr":"plaintext"),this.applyStyles(n),this.div.appendChild(this.cueDiv),0);switch(t.positionAlign){case"start":s=t.position;break;case"middle":s=t.position-t.size/2;break;case"end":s=t.position-t.size}""===t.vertical?this.applyStyles({left:this.formatStyle(s,"%"),width:this.formatStyle(t.size,"%")}):this.applyStyles({top:this.formatStyle(s,"%"),height:this.formatStyle(t.size,"%")}),this.move=function(e){this.applyStyles({top:this.formatStyle(e.top,"px"),bottom:this.formatStyle(e.bottom,"px"),left:this.formatStyle(e.left,"px"),right:this.formatStyle(e.right,"px"),height:this.formatStyle(e.height,"px"),width:this.formatStyle(e.width,"px")})}}function E(e){var t,r,i,n,o="undefined"!=typeof navigator&&/MSIE\s8\.0/.test(navigator.userAgent);e.div&&(t=e.div.offsetHeight,r=e.div.offsetWidth,i=e.div.offsetTop,n=(n=(n=e.div.childNodes)&&n[0])&&n.getClientRects&&n.getClientRects(),e=e.div.getBoundingClientRect(),n=n?Math.max(n[0]&&n[0].height||0,e.height/n.length):0),this.left=e.left,this.right=e.right,this.top=e.top||i,this.height=e.height||t,this.bottom=e.bottom||i+(e.height||t),this.width=e.width||r,this.lineHeight=void 0!==n?n:e.lineHeight,o&&!this.lineHeight&&(this.lineHeight=13)}function w(e,t,s,l){var r,i=new E(t),n=t.cue,o=function(e){if("number"==typeof e.line&&(e.snapToLines||0<=e.line&&e.line<=100))return e.line;if(!e.track||!e.track.textTrackList||!e.track.textTrackList.mediaElement)return-1;for(var t=e.track,r=t.textTrackList,i=0,n=0;np&&(u=u<0?-1:1,u*=Math.ceil(p/c)*c),o<0&&(u+=""===n.vertical?s.height:s.width,a=a.reverse()),i.move(d,u)}else{var h=i.lineHeight/s.height*100;switch(n.lineAlign){case"middle":o-=h/2;break;case"end":o-=h}switch(n.vertical){case"":t.applyStyles({top:t.formatStyle(o,"%")});break;case"rl":t.applyStyles({left:t.formatStyle(o,"%")});break;case"lr":t.applyStyles({right:t.formatStyle(o,"%")})}a=["+y","-x","+x","-y"],i=new E(t)}p=function(e,t){for(var r,i=new E(e),n=1,o=0;oe.left&&this.tope.top},E.prototype.overlapsAny=function(e){for(var t=0;t=e.top&&this.bottom<=e.bottom&&this.left>=e.left&&this.right<=e.right},E.prototype.overlapsOppositeAxis=function(e,t){switch(t){case"+x":return this.lefte.right;case"+y":return this.tope.bottom}},E.prototype.intersectPercentage=function(e){return Math.max(0,Math.min(this.right,e.right)-Math.max(this.left,e.left))*Math.max(0,Math.min(this.bottom,e.bottom)-Math.max(this.top,e.top))/(this.height*this.width)},E.prototype.toCSSCompatValues=function(e){return{top:this.top-e.top,bottom:e.bottom-this.bottom,left:this.left-e.left,right:e.right-this.right,height:this.height,width:this.width}},E.getSimpleBoxPosition=function(e){var t=e.div?e.div.offsetHeight:e.tagName?e.offsetHeight:0,r=e.div?e.div.offsetWidth:e.tagName?e.offsetWidth:0,i=e.div?e.div.offsetTop:e.tagName?e.offsetTop:0;return{left:(e=e.div?e.div.getBoundingClientRect():e.tagName?e.getBoundingClientRect():e).left,right:e.right,top:e.top||i,height:e.height||t,bottom:e.bottom||i+(e.height||t),width:e.width||r}},x.StringDecoder=function(){return{decode:function(e){if(!e)return"";if("string"!=typeof e)throw new Error("Error - expected string data.");return decodeURIComponent(encodeURIComponent(e))}}},x.convertCueToDOMTree=function(e,t){return e&&t?v(e,t):null},x.processCues=function(e,t,r){if(!e||!t||!r)return null;for(;r.firstChild;)r.removeChild(r.firstChild);var i=e.document.createElement("div");if(i.style.position="absolute",i.style.left="0",i.style.right="0",i.style.top="0",i.style.bottom="0",i.style.margin="1.5%",r.appendChild(i),function(e){for(var t=0;tthis._uploadCount||"4001"==e.e||"2002"==e.e)&&this._report()},i.prototype.dispose=function(){this._report(),this._disposed=!0},i.prototype._start=function(){this._disposed=!1;this._retry=0,this._report()},i.prototype._report=function(t){var e,r,i;this._tickHandler&&(clearTimeout(this._tickHandler),this._tickHandler=null),0<(t=t||this._logs.splice(0,this._uploadCount)).length?(i={"Content-Type":"application/json;charset=UTF-8","x-log-apiversion":"0.6.0","x-log-bodyrawsize":(e=JSON.stringify({__logs__:t,__source__:""})).length},n.postWithHeader((r=this)._logReportTo,e,i,function(e){r._tick()},function(e){0==r._retry?(r._retry=1,r._report(t)):r._tick()})):this._tick()},i.prototype._tick=function(){var e;this._disposed||(this._retry=0,(e=this)._logs.length>this._uploadCount?e._report():this._tickHandler=setTimeout(function(){e._report()},1e3*this._uploadDuration))},t.exports=i},{"../lib/io":40,"../lib/storage":48}],64:[function(e,t,r){function a(){return(a=Object.assign?Object.assign.bind():function(e){for(var t=1;t=o.player._options.heartHeatInterval&&o.updateStats.call(o,function(e){var t=o._imageInfo()||{},r=o.player.tag.playbackRate,i=o.player.getVolume(),t={vt:n,interval:1e3*c,imgLength:t.imgLength,playbackRate:r,volume:i};e&&(t=a({},t,{dls:Math.floor(e.downloadSpeedPerSec),dfps:Math.floor(e.decodedFramesPerSec),pkl:Number((e.packageLossRate||0).toFixed(2)),rtt:1e3*e.rtt})),o._log("HEARTBEAT",t),c=0}))},1e3)},updateStats:function(o){o=o||function(){};var a=this;this.player.getStats().then(function(e){var t,r,i,n;e?(n=a.prevStats,e.bytesReceived=e.bytesReceived||0,e.framesDecoded=e.framesDecoded||0,e.packetsLost=e.packetsLost||0,e.packetsReceived=e.packetsReceived||0,t=((a.prevStats=e).timestamp-n.timestamp)/1e3,r=(e.bytesReceived-n.bytesReceived)/t,i=(e.framesDecoded-n.framesDecoded)/t,n=(e.packetsLost-n.packetsLost)/(e.packetsLost-n.packetsLost+(e.packetsReceived-n.packetsReceived)),e=e.rtt,o({downloadSpeedPerSec:r,decodedFramesPerSec:i,packageLossRate:n,rtt:e,timeGap:t})):o()}).catch(function(e){console.log("error in monitor getStats: ",e),o()})},reportStartPlay:function(){this.startPlayReported||(this._log("STARTPLAY",{vt:(new Date).getTime()}),this.startPlayReported=!0)},reportCanplay:function(){this.canplayReported||(this._log("CANPLAY",{vt:(new Date).getTime()}),this.canplayReported=!0)},reportPlayAbort:function(){this._log("PLAYABORT",{vt:(new Date).getTime()})},resetStartPlayReportFlag:function(){this.startPlayReported=!1},resetCanplayReportFlag:function(){this.canplayReported=!1},resetSessionId:function(){this.sessionId=y.guid()},resetVV:function(){this.startPlayReported&&(this.resetStartPlayReportFlag(),this.resetCanplayReportFlag(),this.resetSessionId())},updateH265ProbeCost:function(e){this._h265ProbeCost=e||{}},_onFullscreenChange:function(e){e?this._log("FULLSREEM",{}):this._log("QUITFULLSCREEM",{})},_onPlayerloadstart:function(){this.loadstartTime=(new Date).getTime(),this.playId=y.guid()},_onPlayerLoadMetadata:function(){this.loadMetaDataCost=(new Date).getTime()-this.loadstartTime},_onPlayerLoaddata:function(){var e,t,r,i;this._LoadedData||this.buffer_flag||(t=e=0,this.player.tag&&(e=this.player.tag.videoWidth,t=this.player.tag.videoHeight),e={tc:(new Date).getTime()-this._prepareTime,cc:(new Date).getTime()-this.loadstartTime,md:this.loadMetaDataCost,mi:JSON.stringify({type:"video",definition:e+"*"+t})},null!=(t=this.player.tag)&&t.duration&&(e.vdur=1e3*(null==(t=this.player.tag)?void 0:t.duration)),(5a._liveRetryCount?a._reloadAndPlayForM3u8():(a._liveRetryCount=0,a.trigger(s.Player.LiveStreamStop),a._liveErrorHandle=setTimeout(function(){var e={mediaId:"ISLIVE",error_code:o,error_msg:c.get("Error_Play_Text")+"\uff0c"+c.get("Error_Retry_Text")};a.logError(e),a.trigger("error",e)}),p.IS_UC&&(a._liveErrorHandle=null))}):-1 ",e),0===e)t.trigger(w.Private.LicenseHasResult,{result:p.LicenseResultCode.Success,featureId:p.FEATURE_ID_H265});else{if(1===e)return i.reject(p.LicenseResultCode.NotFound);{if(2===e)return i.reject(p.LicenseResultCode.Expired);console.error("license validate unknown error")}}}).catch(function(e){t.trigger(w.Private.LicenseHasResult,{result:e,featureId:p.FEATURE_ID_H265}),S.logError(e)})}),this.on(w.Private.LicenseHasResult,function(e){var t=p.LicenseResultCode;-1<[t.NotFound,t.Expired,t.CertInvalid,t.ResourceIncorrect,t.LicenseKeyInvalid,t.DomainInvalid].indexOf(e.paramData.result)&&(this.UI.licenseWatermark=m,this._licenseWatermark=this.addChild("licenseWatermark",this._options))}),this._thumbnailService&&this._options.thumbnailUrl&&this._thumbnailService.get(this._options.thumbnailUrl),0"+(100*e).toFixed()+"%";this._player.trigger(w.Private.Info_Show,{text:e,duration:1e3,align:"lb"})},O.prototype._setInnerVolume=function(e){this.tag.volume=e,this.trigger(w.Private.VolumnChanged,e)},O.prototype.hideProgress=function(){this.trigger(w.Private.HideProgress)},O.prototype.cancelHideProgress=function(){this.trigger(w.Private.CancelHideProgress)},O.prototype.setPlayerSize=function(e,t){this._el&&(this._el.style.width=e,this._el.style.height=t)},O.prototype.getBuffered=function(){return this.tag.buffered},O.prototype.setRotate=function(e){this.tag&&(this._rotate=e,this._setTransform(),this.log("ROTATE",{rotation:e}))},O.prototype.getRotate=function(e){return void 0===this._rotate?0:this._rotate},O.prototype.setImage=function(e){this.tag&&(this._image=e,this._setTransform(),this.log("IMAGE",{mirror:"horizon"==e?2:1,text:e}))},O.prototype.getImage=function(){return this._image},O.prototype.cancelImage=function(){this.tag&&(this._image="",this._setTransform(),this.log("IMAGE",{mirror:0}))},O.prototype.setCover=function(e){var t=document.querySelector("#"+this.id()+" .prism-cover");t&&e&&(t.style.backgroundImage="url("+e+")",this._options.cover=e,this.trigger(w.Private.Cover_Show))},O.prototype.setTextTracks=function(e){e=d.unqiueTextTracks(e||[]),this.trigger(w.Private.VttClearTracks),e&&e.length&&this.trigger(w.Private.TextTrackFounded,{from:"user",textTracks:e}),this.trigger(w.Private.CCReset)},O.prototype._setTransform=function(){this._transformProp||(this._transformProp=a.getTransformName(this.tag));var e=" translate(-50%, -50%)";this._rotate&&(e+=" rotate("+this._rotate+"deg)"),this._image&&("vertical"==this._image?e+=" scaleY(-1)":"horizon"==this._image&&(e+=" scaleX(-1)")),this.tag.style[this._transformProp]=e},O.prototype._startPlay=function(){this.tag.paused&&this.tag.play()},O.prototype._initPlayBehavior=function(e,t){return this._monitor&&0===this._vodRetryCount&&0===this._liveRetryCount&&this._monitor.resetVV(),!this._checkSupportVideoType()&&(d.validateSource(t)?(void 0===e&&(e=!1),this._created||(this._created=!0,this.trigger(w.Private.Created)),this.loaded||this.trigger(w.Player.Init),this._options.autoplay||this._options._autoplay||this._options.preload||e?(this._options._preload=!0,this._initLoad(t),(this._options.autoplay||this._options._autoplay)&&this._startPlay()):this.trigger(w.Private.Play_Btn_Show),!0):((e={mediaId:this._options.vid||"",error_code:p.ErrorCode.InvalidSourceURL,error_msg:"InvalidSourceURL"}).display_msg=y.get("Error_Invalidate_Source"),this.trigger(w.Player.Error,e),!1))},O.prototype._isPreload=function(){return this._options.autoplay||this._options.preload||this._options._preload},O.prototype._initLoad=function(e){e&&(this._isPreload()&&!u.IS_MOBILE?this.trigger(w.Private.H5_Loading_Show):(this.trigger(w.Private.H5_Loading_Hide),this.trigger(w.Private.Play_Btn_Show)),this.tag.setAttribute("src",e),this.loaded=!0)},O.prototype._clearLiveErrorHandle=function(){this._liveErrorHandle&&(clearTimeout(this._liveErrorHandle),this._liveErrorHandle=null)},O.prototype._reloadAndPlayForM3u8=function(){0==this._liveRetryCount&&this.trigger(w.Player.OnM3u8Retry);var e=this._options,t=e.liveRetryInterval+e.liveRetryStep*this._liveRetryCount,r=this;this._liveRetryTimer&&(clearTimeout(this._liveRetryTimer),this._liveRetryTimer=null),this._liveRetryTimer=setTimeout(function(){r._liveRetryCount++,r.tag.load(r._options.source),e.autoplay&&r.tag.play()},1e3*t)},O.prototype._checkSupportVideoType=function(){var e,t;return this.tag.canPlayType&&this._options.source&&u.IS_MOBILE?(e="",0<(t=this._options.source).indexOf("m3u8")?""!=this.tag.canPlayType("application/x-mpegURL")||d.isSupportHls()||(e=y.get("Error_Not_Support_M3U8_Text")):0=this._options.playConfig.PreviewTime},O.prototype.isPreview=function(){var e=this._options.playConfig.PreviewTime,t=this._vodDuration||this.tag.duration;return 0'},_getPlayer:function(e){return-1!=navigator.appName.indexOf("Microsoft")?document.getElementById(e):document[e]},_getLowerQualityLevel:function(){var e,t=this._getVideoUrls();return t&&(e=t.Urls,t=t.index,!(e&&0==e.length||-1==t))&&0s._liveRetryCount?(0==s._liveRetryCount&&s.trigger(y.Player.OnM3u8Retry),n=i.liveRetryInterval+i.liveRetryStep*s._liveRetryCount,s._liveRetryCount++,setTimeout(function(){s._loadByUrlInner(i.source)},1e3*n)):(s._liveErrorHandle&&clearTimeout(s._liveErrorHandle),s.trigger(y.Player.LiveStreamStop),s._liveErrorHandle=setTimeout(e,500)):t===flvjs.ErrorDetails.MEDIA_MSE_ERROR&&11===r.code&&s.getCurrentTime()c._liveRetryCount?(0==c._liveRetryCount&&c.trigger(g.Player.OnM3u8Retry),l=l.liveRetryInterval+l.liveRetryStep*c._liveRetryCount,c._liveRetryCount++,c.trigger(g.Private.H5_Loading_Show),setTimeout(function(){i&&c._loadByUrlInner(c._options.source,0,!0)},1e3*l)):s():(i&&-1<[403,404].indexOf(n)||!c._reloadForVod())&&a())})})}},{"../../config":14,"../../lang/index":23,"../../lib/constants":28,"../../lib/hls/hlsparse":39,"../../lib/io":40,"../../lib/playerutil":46,"../../lib/ua":49,"../../lib/util":51,"../base/event/eventtype":70}],103:[function(e,t,r){var i=e("../base/player"),n=e("./hlsinjector"),o=i.extend({init:function(e,t){t._native=!1,n.inject(this,o,i,t),i.call(this,e,t)}});t.exports=o},{"../base/player":91,"./hlsinjector":102}],104:[function(e,t,r){var l="undefined"==typeof Promise?e("es6-promise").Promise:Promise,c=e("../../lib/io"),u=e("../../config"),p=e("../../lib/constants"),d=e("../../lang/index"),h=e("../base/event/eventtype"),i=e("../../lib/ua");function f(e){var t=this._options;t.rtsFallbackSource&&window.Aliplayer?(this.trigger(h.Player.RtsFallback,{reason:e,fallbackUrl:t.rtsFallbackSource}),this.loadByUrl(t.rtsFallbackSource)):(this.trigger(h.Player.Error,e),this.logError(e))}function y(e){var n=this,t=(this.trigger(h.Private.H5_Loading_Show),this.trigger(h.Private.Play_Btn_Hide),new o(n,e));return n._rts.subscribe(n._options.source,{mediaTimeout:n._options.rtsLoadDataTimeout}).then(function(e){return n._retryTimer&&(clearTimeout(n._retryTimer),n._retryTimer=null),t.preProcess(),n.tag.srcObject=null,e.play(n.tag),!0}).catch(function(e){var t=null,r=null;switch(Number(e.errorCode)){case 10101:t=p.ErrorCode.RtsSignalError,r=d.get("Rts_Err_Http_Signal_Error");break;case 10114:t=p.ErrorCode.RtsCreateOfferError,r=d.get("Rts_Err_Create_Offer_Error");break;case 10202:t=p.ErrorCode.RtsPlayUrlError,r=d.get("Rts_Err_Play_Url_Error");break;case 10203:t=p.ErrorCode.RtsSubscribeNonthing,r=d.get("Rts_Err_Subscribe_Nonthing");break;case 10205:var i=null==(i=e.extraInfo)?void 0:i.response;if(403===(null==i?void 0:i.status)){i=i.headers["x-tengine-error"];if(i&&-1r._liveRetryCount?(0==r._liveRetryCount&&r.trigger(h.Player.OnM3u8Retry),n=Number(i.liveRetryInterval||0)+Number(i.liveRetryStep*r._liveRetryCount||0),r._liveRetryCount++,r.stop(),setTimeout(function(){r.trigger(h.Private.H5_Loading_Show),r.trigger(h.Private.Play_Btn_Hide)},50),r._retryTimer=setTimeout(function(){r.trigger(h.Private.Retry,{type:"rts",source:i.source}),y.call(r,!0)},1e3*n)):(r._retryTimer&&clearTimeout(r._retryTimer),r._liveErrorHandle&&clearTimeout(r._liveErrorHandle),r.stop(),r._liveRetryCount=0,r.trigger(h.Player.LiveStreamStop),r._liveErrorHandle=setTimeout(s.call(this,e,t),500)):console.warn("no options!"))}function s(e,t){var r=this;r.pause(),setTimeout(function(){r.trigger(h.Private.Play_Btn_Hide)}),r.checkOnline()&&f.call(this,{error_code:e,error_msg:t})}e._Type=t,e._superType=r,e._superPt=r.prototype,e._disposed=!1,t.prototype._checkRtsReady=function(){if(null==e._rts)throw new Error("please invoke this method after ready event")},e._isRts=!0,e._rts=null,e._isLoadedRts=!1,e._liveErrorHandle=null,e._retryTimer=null,e._noDataTimer=null,e.bind_rtsPlayEventHandler=null,e.bind_rtsErrorEventHandler=null,t.prototype.play=function(e){this._checkRtsReady(),this._isManualPlay=e||!1;var t=this;return t.trigger(h.Private.Cover_Hide),t.trigger(h.Private.Play_Btn_Hide),y.call(t).then(function(e){e&&t._startPlay()}),this},t.prototype.seek=function(e){},t.prototype.setSpeed=function(e){},t.prototype.pause=function(e){return this._checkRtsReady(),this._superPt.pause.call(this,!0),this},t.prototype.stop=function(){return this._rts&&this._rts.unsubscribe(),this},t.prototype.dispose=function(){this._disposed||(this._disposed=!0,this._superPt&&this._superPt.dispose.call(this),this._destroyRts(),this._superPt,this._liveErrorHandle&&(clearTimeout(this._liveErrorHandle),this._liveErrorHandle=null),this._retryTimer&&(clearTimeout(this._retryTimer),this._retryTimer=null),_.call(this))},t.prototype._destroyRts=function(){this._rts&&(this.stop(),this._rts.off("onError",this.bind_rtsErrorEventHandler),this._rts.off("onPlayEvent",this.bind_rtsPlayEventHandler)),this._rts=null},t.prototype.initPlay=function(e){function t(i,t){var r=!i._rts;i._destroyRts(),i._rts=new AliRTS.createClient({customReporter:function(e){if(126===Number(e.msgid)){var t={};try{t=JSON.parse(e.args)}catch(e){t={}}t.tcid&&i._rts&&(i._rts.traceid=t.tcid)}}}),i._checkRtsSupport(function(e){!function(e){var t=this._rtsPlayEventHandler.bind(this),r=this._rtsErrorEventHandler.bind(this);this.bind_rtsPlayEventHandler=t,this.bind_rtsErrorEventHandler=r,e.on("onError",r),e.on("onPlayEvent",t)}.call(i,i._rts),i._options.autoplay?y.call(i).then(function(e){e&&i._initPlayBehavior(t)}):i._initPlayBehavior(t),r&&i._executeReadyCallback()},function(e){console.log("[RTS isSupport error]",e);var t=null,r=null;switch(Number(e.errorCode)){case 10110:t=p.ErrorCode.RtsNotSupportWebRtc,r=d.get("Rts_Err_Not_Support_Webrtc");break;case 10111:t=p.ErrorCode.RtsBrowserNotSupport,r=d.get("Rts_Err_Browser_Not_Support");break;case 10112:t=p.ErrorCode.RtsBrowserVersionTooLow,r=d.get("Rts_Err_Browser_Version_Too_Low");break;case 10113:t=p.ErrorCode.RtsNotSupportH264,r=d.get("Rts_Err_Not_Support_H264");break;case 10114:t=p.ErrorCode.RtsCreateOfferError,r=d.get("Rts_Err_Create_Offer_Error")}return f.call(i,{error_code:t,error_msg:r}),!1})}this._isLoadedRts?t(this,e):(this.trigger(h.Private.H5_Loading_Show),function(e,t){var r="",i=this._options,r="https://g.alicdn.com/CodeBaseOne/H5RTSSdk/"+(i.rtsVersion||u.rtsVersion)+"/aliyun-rts-sdk.js",n=(i.rtsSdkUrl&&(r=i.rtsSdkUrl),this);c.loadJS(r,function(){e.apply(n)})}.call(this,function(){this._isLoadedRts=!0,t(this,e)},this._options.debug))},t.prototype.getStats=function(){return this._rts&&this._rts.getTransportStats?l.all([this._rts.getTransportStats(),this._rts.getRemoteVideoStats(),this._rts.getRemoteAudioStats()]).then(function(e){var t=e[0],r=e[1],e=e[2];return{rtt:t.rtt,bytesReceived:t.bytesReceived,framesDecoded:r.framesDecoded,packetsLost:(r.packetsLost||0)+(e.packetsLost||0),packetsReceived:(r.packetsReceived||0)+(e.packetsReceived||0),timestamp:t.timestamp||Date.now()}}).catch(function(e){return console.log("ERR in RTS getstats: ",e),{}}):l.resolve()},t.prototype._rtsPlayEventHandler=function(e){var t="canplay",r="waiting",i="playing",n="ended",o="timeout";e.event===t?_.call(this):e.event!==r&&(e.event===i?_.call(this):e.event!==o&&e.event!==n||a.call(this))},t.prototype._checkRtsSupport=function(e,t){this._options.skipRtsSupportCheck?e():this._rts.isSupport({isReceiveVideo:!0}).then(e).catch(t)},t.prototype._rtsErrorEventHandler=function(e){console.log("RTS Error:",e);var t,r;switch(Number(e.errorCode)){case 10102:a.call(this);break;case 12e3:t=p.ErrorCode.RtsPeerConnectionUnknown,r=d.get("Rts_Err_PeerConnection_Unknown"),s.call(this,t,r)}}};var o=function(){function e(e,t){(this.isRetry=t)&&(this.isApple=i.IS_IOS||i.IS_SAFARI,this.player=e)}return e.prototype.preProcess=function(){var e,t,r;this.isRetry&&this.isApple&&(e=this.player.getVolume(),t=this.player.muted(),e)&&!t&&((r=this.player.tag).volume=0,this.player.one("canplay",function(){r.volume=e}))},e}()},{"../../config":14,"../../lang/index":23,"../../lib/constants":28,"../../lib/io":40,"../../lib/ua":49,"../base/event/eventtype":70,"es6-promise":8}],105:[function(e,t,r){var i=e("../base/player"),n=e("./rtsinjector"),o=i.extend({init:function(e,t){t.isLive&&(t._native=!1,n.inject(this,o,i,t),i.call(this,e,t))}});t.exports=o},{"../base/player":91,"./rtsinjector":104}],106:[function(e,t,r){var i=e("../../lib/constants"),e=e("../../lib/oo").extend({init:function(e){this.player=e,this.tickhandle=null}});e.prototype.tick=function(e,t){var r=this;this.tickhandle=setTimeout(function(){r.player&&r.player.trigger(i.AuthKeyExpiredEvent),t&&t()},1e3*e)},e.prototype.clearTick=function(e){this.tickhandle&&clearTimeout(this.tickhandle)},t.exports=e},{"../../lib/constants":28,"../../lib/oo":43}],107:[function(e,t,r){function s(e,t,r){var i=u.randomUUID(),n="https://mts."+e.domainRegion+".aliyuncs.com/?",i={AccessKeyId:e.accessId,Action:"GetLicense",MediaId:e.vid,LicenseUrl:n,data:e.data,SecurityToken:e.stsToken,Format:"JSON",Type:e.encryptionType,Version:"2014-06-18",SignatureMethod:"HMAC-SHA1",SignatureVersion:"1.0",SignatureNonce:i};e.header&&(i.Header=e.header),n+="Signature="+u.AliyunEncodeURI(u.makeChangeSiga(i,e.accessSecret,"POST")),e=u.makeUTF8sort(i,"=","&"),o.post(n,e,function(e){e?(e=JSON.parse(e),t&&(e=e.License,t(e))):r&&r(a.createError("MPS\u83b7\u53d6License\u5931\u8d25"))},function(e){if(r){var t={Code:"",Message:h.get("Error_MTS_Fetch_Urls_Text")};try{t=JSON.parse(e)}catch(e){}r({Code:c.ErrorCode.ServerAPIError,Message:t.Code+"|"+t.Message,sri:t.RequestId||""})}})}var o=e("../../lib/io"),l=(e("../../lib/ua"),e("../../lib/bufferbase64")),c=e("../../lib/constants"),u=e("./signature"),a=e("./util"),p=e("../../lib/url"),d=e("../../lib/playerutil"),h=e("../../lang/index"),f=e("../base/event/eventtype");function y(e){window.console.error("The license request failed.")}function _(e){window.console.error("A decryption key error was encountered"),window.console.error("A decryption key error was encountered",e)}function g(e){window.console.log("Decryption key was added to session.")}function v(e,t,r){r.addEventListener(e,function(){t(arguments[0])},!1)}t.exports.requestLicenseKey=function(e){var a=e;return a._options.vid&&(a.__vid=a._options.vid),function(e,t){var r,i,n=a._options,o=a._getDRMEncryptItem();o&&(r={vid:a.__vid,accessId:n.accId,accessSecret:n.accSecret,stsToken:n.stsToken,domainRegion:n.domainRegion,authInfo:n.authInfo,encryptionType:o.encryptionType},o.encryptionType==c.EncryptionType.Widevine?r.data=l.encode(e.message):o.encryptionType==c.EncryptionType.PlayReady&&(n=l.unpackPlayReady(e.message),r.data=n.changange,n.header)&&(r.header=JSON.stringify(n.header)),console.log(r.data),e=a.__licenseKeys,i=a.__vid+o.Url,e&&e[i],s(r,function(e){a.__licenseKeys||(a.__licenseKeys={}),10"===t.substr(0,5)&&""===t.substr(-6)&&(t=t.slice(5,-6));t=u.base64DecodeUint8Array(t);e.session.update(t)}.bind(this),!1),n.addEventListener("error",y,!1),btoa("spc="+u.base64EncodeUint8Array(i)+"&assetId="+encodeURIComponent(r.contentId))),o={Format:"JSON",SignatureMethod:"HMAC-SHA1",SignatureVersion:"1.0",Timestamp:u.ISODateString(new Date),SignatureNonce:u.randomUUID(),AccessKeyId:t._options.accessKeyId,SecurityToken:t._options.securityToken,CertId:t._options.certId};t._options.isLive?(o.RegionId=t._options.region,o.Action="DescribeDRMLicense",o.Version="2016-11-01",o.CdmData=e,o.Type="fairplay",o.Domain=p.parseUrl(t._options.source).hostname):(o.region=t._options.region,o.Action="GetDRMLicense",o.Version="2017-03-21",o.VideoId=t._options.vid,o.CDMData=e,o.DRMType="FairPlay");var a,s,i="Signature="+u.AliyunEncodeURI(u.makeChangeSiga(o,t._options.accessKeySecret,"POST"));r=t._options.isLive?"https://"+d.getLiveHostByRegion(t._options.region)+"/?"+i:"https://vod."+t._options.region+".aliyuncs.com/?"+i;for(s in n.open("POST",r,!0),n.setRequestHeader("Content-type","application/x-www-form-urlencoded"),o){var l;o.hasOwnProperty(s)&&(l=o[s],a=a?a+"&"+u.AliyunEncodeURI(s)+"="+u.AliyunEncodeURI(l):u.AliyunEncodeURI(s)+"="+u.AliyunEncodeURI(l))}n.send(a)}.bind(this),n),v("webkitkeyadded",g,n),v("webkitkeyerror",_,n)}.bind(this,n),t=(this._fairPlayHandlers.onNeedKey=i,function(e){window.console.error("A video playback error occurred")}.bind(this));this._fairPlayHandlers.onError=t,this.tag.addEventListener("webkitneedkey",i,!1),this.tag.addEventListener("error",t,!1),this.tag.src=this._options.source}e&&e()}.bind(e,t),!1),o.addEventListener("error",function(e){window.console.error("Failed to retrieve the server certificate.")}.bind(e),!1),{Format:"JSON",SignatureMethod:"HMAC-SHA1",SignatureVersion:"1.0",Timestamp:u.ISODateString(new Date),SignatureNonce:u.randomUUID(),AccessKeyId:e._options.accessKeyId,SecurityToken:e._options.securityToken,CertId:e._options.certId}),t=(e._options.isLive?(a.RegionId=e._options.region,a.Action="DescribeDRMCertificate",a.Version="2016-11-01"):(a.region=e._options.region,a.Action="GetDRMCertInfo",a.Version="2017-03-21",a.VideoId=e._options.vid),"Signature="+u.AliyunEncodeURI(u.makeChangeSiga(a,e._options.accessKeySecret,"POST"))),e=e._options.isLive?"https://"+d.getLiveHostByRegion(e._options.region)+"/?"+t:"https://vod."+e._options.region+".aliyuncs.com/?"+t;for(r in o.open("POST",e,!0),o.setRequestHeader("Content-type","application/x-www-form-urlencoded"),a)a.hasOwnProperty(r)&&(i=a[r],n=n?n+"&"+u.AliyunEncodeURI(r)+"="+u.AliyunEncodeURI(i):u.AliyunEncodeURI(r)+"="+u.AliyunEncodeURI(i),console.log(i));o.send(n)},t.exports.getRequestUrl=function(e,t){var e={AccessKeyId:t._options.accessKeyId,Format:"JSON",Version:"2016-11-01",SignatureMethod:"HMAC-SHA1",SignatureVersion:"1.0",Timestamp:u.ISODateString(new Date),SignatureNonce:u.randomUUID(),SecurityToken:t._options.securityToken,RegionId:t._options.region,Action:"DescribeDRMLicense",Type:"widevine",CdmData:e,Domain:p.parseUrl(t._options.source).hostname},r=(t._options.widevineCertId&&(e.CertId=t._options.widevineCertId),"Signature="+u.AliyunEncodeURI(u.makeChangeSiga(e,t._options.accessKeySecret,"POST")));return{url:"https://"+d.getLiveHostByRegion(t._options.region)+"/?"+r,data:u.makeUTF8sort(e,"=","&"),jsonData:u.makeUTF8sort(e,"=","&","json")}},t.exports.postData=function(e,t){var r=u.randomUUID(),r={AccessKeyId:t._options.accessKeyId,VideoId:t._options.vid,Format:"JSON",Version:"2017-03-21",SignatureMethod:"HMAC-SHA1",SignatureVersion:"1.0",SignatureNonce:r,SecurityToken:t._options.securityToken,region:t._options.region,Action:"GetDRMLicense",DRMType:"Widevine",CDMData:e},e=(t._options.widevineCertId&&(r.CertId=t._options.widevineCertId),"Signature="+u.AliyunEncodeURI(u.makeChangeSiga(r,t._options.accessKeySecret,"POST")));return{url:"https://vod."+t._options.region+".aliyuncs.com/?"+e,data:u.makeUTF8sort(r,"=","&"),jsonData:u.makeUTF8sort(r,"=","&","json")}},t.exports.destroyFairPlay=function(){this._fairPlayHandlers.onNeedKey&&this.tag.removeEventListener("webkitneedkey",this._fairPlayHandlers.onNeedKey),this._fairPlayHandlers.onError&&this.tag.removeEventListener("error",this._fairPlayHandlers.onError),this._fairPlayHandlers={}}},{"../../lang/index":23,"../../lib/bufferbase64":25,"../../lib/constants":28,"../../lib/io":40,"../../lib/playerutil":46,"../../lib/ua":49,"../../lib/url":50,"../base/event/eventtype":70,"./signature":113,"./util":115}],108:[function(e,t,r){var i=e("../../lib/io"),c=e("../../lib/constants"),n=e("../../lib/data"),u=e("./util");t.exports.getDataByAuthInfo=function(e,a,s,l){e={playAuth:e.playAuth,requestId:e.requestId},i.get("https://api.h5video.shop/api/page/getMediaPlayInfo"+function(r){return r.requestId=n.guid(),Object.keys(r).reduce(function(e,t){return e+(e?"&":"?")+t+"="+encodeURIComponent(r[t])},"")}(e),function(e){if(e){e=JSON.parse(e);if(200!==e.httpStatusCode)l&&l({Code:c.ErrorCode.ServerAPIError,Message:e.httpStatusCode+"|"+e.code,sri:e.requestId});else{for(var t=e.data.PlayInfoList,r=[],i=t.length-1;0<=i;--i)"AUTO"===t[i].Definition&&(r=[t.splice(i,1)[0]]);var n,o=null;(o=(o=0===r.length?u.objectPlayerMessageSort(t,a):u.objectPlayerMessageSort(r)).map(function(e){return"m3u8"===e.format&&(e.Url=e.Url+"&_ext=.m3u8"),e}))&&s&&(n=e.data.VideoBase||{},s({videoId:n.VideoId,userId:n.UserId,requestId:e.requestId,urls:o,encryptUrlArr:[],thumbnailUrl:"",coverUrl:n.CoverURL,playInfoAry:t,textTracks:e.data.SubtitlesList}))}}else l&&l(u.createError("\u8f7bSaaS\u670d\u52a1\u83b7\u53d6\u6570\u636e\u5931\u8d25"))},function(e){e&&"string"==typeof e&&-1e&&(this._loadByUrlInner(this._urls[e].Url,this.getCurrentTime(),!0),this._currentPlayIndex=e,this.trigger(S.Private.QualityChange,t||g.get("Quality_Change_Fail_Switch_Text")))},b.prototype._getLowerQualityLevel=function(){if(0!=this._urls.length&&-1!=this._currentPlayIndex)if("asc"==this.options().qualitySort){if(0"+n,e.trigger("error",a),console.log("PrismPlayer Error: "+r+"! error_msg :"+n+";")},t.exports=b},{"../../config":14,"../../lang/index":23,"../../lib/constants":28,"../../lib/cookie":29,"../../lib/event":33,"../../lib/io":40,"../../lib/playerutil":46,"../../lib/ua":49,"../../protected/anti-injector-protected":129,"../audio/audioplayer":68,"../base/event/eventtype":70,"../base/player":91,"../drm/drminjector":97,"../flv/flvinjector":100,"../hls/hlsinjector":102,"./authkeyexpiredhandle":106,"./signature":113}],113:[function(e,u,t){var n=e("crypto-js/hmac-sha1"),o=e("crypto-js/enc-base64"),r=e("crypto-js/enc-utf8");u.exports.randomUUID=function(){for(var e=[],t="0123456789abcdef",r=0;r<36;r++)e[r]=t.substr(Math.floor(16*Math.random()),1);return e[14]="4",e[19]=t.substr(3&e[19]|8,1),e[8]=e[13]=e[18]=e[23]="-",e.join("")},u.exports.returnUTCDate=function(){var e=new Date,t=e.getUTCFullYear(),r=e.getUTCMonth(),i=e.getUTCDate(),n=e.getUTCHours(),o=e.getUTCMinutes(),a=e.getUTCSeconds(),e=e.getUTCMilliseconds();return Date.UTC(t,r,i,n,o,a,e)},u.exports.AliyunEncodeURI=function(e){e=encodeURIComponent(e);return e=(e=(e=e.replace("+","%2B")).replace("*","%2A")).replace("%7E","~")},u.exports.makesort=function(e,t,r){if(!e)throw new Error("PrismPlayer Error: vid should not be null!");var i=[];for(s in e)i.push(s);for(var n=i.sort(),o="",a=n.length,s=0;s>2,n=(3&t)<<4|(t=c>4,o=(15&t)<<2|(r=c>6,a=63&r,isNaN(t)?o=a=64:isNaN(r)&&(a=64),l+=s.charAt(i)+s.charAt(n)+s.charAt(o)+s.charAt(a);return l}},{"crypto-js/enc-base64":3,"crypto-js/enc-utf8":4,"crypto-js/hmac-sha1":5}],114:[function(e,t,r){var o=e("../../lib/io"),a=e("../../lib/constants"),s=e("./signature"),l=e("./util"),c=e("../../lang/index");t.exports.getPlayAuth=function(e,t,r,i){s.randomUUID();var n=s.randomUUID(),n={AccessKeyId:e.accessKeyId,Action:"GetVideoPlayAuth",VideoId:e.vid,AuthTimeout:a.AuthInfoExpired,SecurityToken:e.securityToken,Format:"JSON",Version:"2017-03-21",SignatureMethod:"HMAC-SHA1",SignatureVersion:"1.0",SignatureNonce:n},n=s.makeUTF8sort(n,"=","&")+"&Signature="+s.AliyunEncodeURI(s.makeChangeSiga(n,e.accessKeySecret)),e="https://vod."+e.region+".aliyuncs.com/?"+n;o.get(e,function(e){e?(e=JSON.parse(e),t&&t(e.PlayAuth)):r&&r(l.createError("\u83b7\u53d6\u89c6\u9891\u64ad\u653e\u51ed\u8bc1\u5931\u8d25"))},function(e){if(r){var t={Code:"",Message:c.get("Fetch_Playauth_Error")};try{(t=JSON.parse(e)).Code}catch(e){}r({Code:a.ErrorCode.ServerAPIError,Message:t.Code+"|"+t.Message,sri:t.RequestId,display_msg:c.get("Fetch_Playauth_Error",i)})}})}},{"../../lang/index":23,"../../lib/constants":28,"../../lib/io":40,"./signature":113,"./util":115}],115:[function(e,c,t){var r=e("../../lib/constants");c.exports.createError=function(e,t){return{requestId:"",code:t||"",message:e}},c.exports.getItem=function(e){var t={};return t.width=e.Width,t.height=e.Height,t.definition=e.Definition,t.Url=e.PlayURL,t.format=e.Format,t.desc=r.QualityLevels[t.definition],t.encryptionType=r.VodEncryptionType[e.EncryptType],t.plaintext=e.Plaintext,t.rand=e.Rand,t.encrypt=e.Encrypt,t.duration=e.Duration,t.bitrate=e.Bitrate,t},c.exports.objectPlayerMessageSort=function(e,t){for(var r=[],i=[],n=[],o=[],a=e.length-1;0<=a;a--){var s=e[a],s=c.exports.getItem(s);("mp4"==s.format?i:"mp3"==s.format?n:"m3u8"==s.format?r:o).push(s)}var l=[],l=0=this.liveTimeRange.end)},i.prototype.switchToLive=function(){this.seekTime=-1;var e=this._originalPlayUrl,t=this._player._options.liveShiftSource,r=this._player._options.source;l.isHls(r)&&l.isFlv(e)&&t&&l.isHls(t)&&(this._player._hls&&this._player._destroyHls(),r=this._player._superType,t=this._player._Type,this._player._options._autoplay=!0,u.inject(this._player,t,r,this._player._options,"",!0)),this._player._loadByUrlInner(e,null,!0),this._isLiveShiftPlaying=!1,this._player.trigger(h.Private.LiveShiftSwitchToLive)},i.prototype.getBaseTime=function(){this.liveShiftStartDisplay;return-1==this.seekTime?s.parseTime(this.currentTimeDisplay):s.parseTime(this.liveShiftStartDisplay)+this.seekTime},i.prototype.getSourceUrl=function(e,t){var r=this._originalPlayUrl;return this.availableLiveShiftTime>1;switch(1&t){case 0:switch(r){case 0:t=void 0;continue;case 1:var i=[],n=(n=$jsskein_array_44[1]).split($jsskein_array_38[1]).reverse().join($jsskein_array_44[2]),o=$jsskein_array_43[2];o+=$jsskein_array_39[1];var a=(a=$jsskein_array_37[2]).split($jsskein_array_43[3]).reverse().join($jsskein_array_43[3]);i.push($jsskein_array_44[3],$jsskein_array_40[0],n,o,$jsskein_array_44[4],$jsskein_array_44[5],a,$jsskein_array_38[2]),i.forEach(e),t=0;continue}continue;case 1:0==r&&($jsskein_array_37[0],t=window?2:0)}}}function gas4s8(){for(var NEXTBB12=0;void 0!==NEXTBB12;){var $jsskein_indexLevel46_0=1&NEXTBB12,$jsskein_indexLevel46_1_Base=NEXTBB12>>1,$jsskein_indexLevel46_1=1&$jsskein_indexLevel46_1_Base;switch($jsskein_indexLevel46_0){case 0:switch($jsskein_indexLevel46_1){case 0:NEXTBB12=2;continue;case 1:NEXTBB12=$jsskein_array_40[1]?1:3;continue}continue;case 1:switch($jsskein_indexLevel46_1){case 0:eval(fs56j57),NEXTBB12=2;continue;case 1:NEXTBB12=void 0;continue}continue}}}function n5fg6f(player){function _SkeinIIFE19(){function cl48s87(isOpen){for(var NEXTBB22=5;void 0!==NEXTBB22;){var $jsskein_indexLevel47_0=3&NEXTBB22,$jsskein_indexLevel47_1_Base=NEXTBB22>>2,$jsskein_indexLevel47_1=3&$jsskein_indexLevel47_1_Base;switch($jsskein_indexLevel47_0){case 0:switch($jsskein_indexLevel47_1){case 0:NEXTBB22=void 0;continue;case 1:$jsskein_simplify_tmp24=$jsskein_cl48s87_var14,NEXTBB22=$jsskein_simplify_tmp24?9:0;continue;case 2:$jsskein_simplify_tmp24=Aliplayer.__unable2Anti9Debugger13Key,$jsskein_cl48s87_var14=$jsskein_array_40[2]!==$jsskein_simplify_tmp24,NEXTBB22=4;continue}continue;case 1:switch($jsskein_indexLevel47_1){case 0:devtoolsDetector.removeListener(cl48s87),devtoolsDetector.setDetectDelay($jsskein_array_44[6]),devtoolsDetector.stop(),NEXTBB22=0;continue;case 1:var $jsskein_simplify_tmp24=$jsskein_array_41[0],$jsskein_cl48s87_var14=isOpen,NEXTBB22=$jsskein_cl48s87_var14?8:4;continue;case 2:eval(fs56j57),$jsskein_simplify_tmp24=Aliplayer.__unable2Anti9Debugger13Key,$jsskein_simplify_tmp24=$jsskein_array_42[1]===$jsskein_simplify_tmp24,NEXTBB22=$jsskein_simplify_tmp24?1:2;continue}continue;case 2:0===$jsskein_indexLevel47_1&&(kl5f8(),player.dispose(),gas4s8(),NEXTBB22=0)}}}devtoolsDetector.addListener(cl48s87),devtoolsDetector.launch()}for(var NEXTBB17=0;void 0!==NEXTBB17;){var $jsskein_indexLevel48_0=1&NEXTBB17,$jsskein_indexLevel48_1_Base=NEXTBB17>>1,$jsskein_indexLevel48_1=1&$jsskein_indexLevel48_1_Base;switch($jsskein_indexLevel48_0){case 0:switch($jsskein_indexLevel48_1){case 0:var $jsskein_simplify_tmp25=_SkeinIIFE19,$jsskein_simplify_tmp26=$jsskein_array_37[0],$jsskein_n5fg6f_var16=document.body,NEXTBB17=$jsskein_n5fg6f_var16?2:3;continue;case 1:$jsskein_n5fg6f_var16=$jsskein_array_42[2],NEXTBB17=1;continue}continue;case 1:switch($jsskein_indexLevel48_1){case 0:$jsskein_simplify_tmp26=$jsskein_n5fg6f_var16,setTimeout($jsskein_simplify_tmp25,$jsskein_simplify_tmp26),NEXTBB17=void 0;continue;case 1:var $jsskein__rand36=parseInt($jsskein_array_44[7],$jsskein_array_44[8]),$jsskein_n5fg6f_var16=$jsskein__rand36-$jsskein_array_43[4];NEXTBB17=1;continue}continue}}}function _SkeinIIFE34(e){n5fg6f(e)}var $jsskein_global_string_encryption_stack27=[],$jsskein_simplify_tmp18=($jsskein_global_string_encryption_stack27.unshift([]),window),$jsskein_simplify_tmp19=$jsskein_array_37[0],$jsskein_simplify_tmp19=require("../lib/devtools-detector"),devtoolsDetector=($jsskein_simplify_tmp18.__devtoolsDetector=$jsskein_simplify_tmp19,$jsskein_simplify_tmp19),$jsskein_fs56j57_string_plus28=$jsskein_array_44[0],fs56j57=($jsskein_fs56j57_string_plus28+=$jsskein_array_43[0],$jsskein_fs56j57_string_plus28+=$jsskein_array_38[0],$jsskein_fs56j57_string_plus28+=$jsskein_array_43[1],$jsskein_fs56j57_string_plus28=$jsskein_fs56j57_string_plus28.split($jsskein_array_39[0]).reverse().join($jsskein_array_37[1]),$jsskein_fs56j57_string_plus28),$jsskein_simplify_tmp18=module;$jsskein_simplify_tmp18.exports=_SkeinIIFE34}.call(this,[0,"","lmxrid","elosnoc"],["gu","","table"],["","rn",0],["log",!0,"error"],[0],["","error",0],["g","bed","wa","",147],["re","gubed","","info","error","dir",0,"11110111",2])},{"../lib/devtools-detector":31}],129:[function(n,o,e){!function(e,a,s,t,r,i,l,c){[].unshift([]),e[0];var u=n("./anti-debugging-protected");o.exports=function(e,t){for(var r=3;void 0!==r;){var i=1&r>>1;switch(1&r){case 0:switch(i){case 0:r=void 0;continue;case 1:var n=Aliplayer.__unable2Anti9Debugger13Key,o=l[0],r=(n=(o+=a[0])+l[1]+s[0]!==n)?1:0;continue}continue;case 1:switch(i){case 0:u(t),r=0;continue;case 1:var n=e.encryptType;r=(n=c[0]==n)?2:0;continue}continue}}}}.call(this,[0],["rr"],["r"],[],[],[],["e","o"],[1])},{"./anti-debugging-protected":128}],130:[function(e,t,r){var i=e("../lib/oo"),n=e("../lib/data"),o=e("../lib/object"),a=e("../lib/dom"),s=e("../lib/event"),l=e("../lib/function"),c=e("../lib/layout"),u=(e("../lib/constants"),e("../lib/util"),e("../player/base/event/eventtype")),e=e("./component/util"),i=i.extend({init:function(e,t){var r=this,i=(this._player=e,this._eventState="",this._options=o.copy(t),this._el=this.createEl(),e.id);"function"==typeof e.id&&(i=e.id()),this._id=i+"_component_"+n.guid(),this._children=[],this._childIndex={},t.className&&this.addClass(t.className),this._player.on(u.Private.UiH5Ready,function(){r.renderUI(),r.syncUI(),r.bindEvent()})}});i.prototype.renderUI=function(){c.render(this.el(),this.options()),this.el().id=this.id()},i.prototype.syncUI=function(){},i.prototype.bindEvent=function(){},i.prototype.createEl=function(e,t){return a.createEl(e,t)},i.prototype.options=function(e){return void 0===e?this._options:this._options=o.merge(this._options,e)},i.prototype.el=function(){return this._el},i.prototype._contentEl,i.prototype.player=function(){return this._player},i.prototype.contentEl=function(){return this._contentEl||this._el},i.prototype._id,i.prototype.id=function(){return this._id},i.prototype.getId=function(){return this._id},i.prototype.addChild=function(e,t){var r;if("string"==typeof e){if(!this._player.UI[e])return;r=new this._player.UI[e](this._player,t)}else r=e;return this._children.push(r),"function"==typeof r.id&&(this._childIndex[r.id()]=r),"function"==typeof r.el&&r.el()&&((t=r.el()).id=r.id(),this.contentEl().appendChild(t)),r},i.prototype.removeChild=function(e){if(e&&this._children){for(var t,r=!1,i=this._children.length-1;0<=i;i--)if(this._children[i]===e){r=!0,this._children.splice(i,1);break}r&&(this._childIndex[e.id]=null,t=e.el())&&t.parentNode===this.contentEl()&&this.contentEl().removeChild(e.el())}},i.prototype.initChildren=function(){var e,t,r=this,i=this.options().children;if(i)if(o.isArray(i))for(var n=0;n"+l.get("Retry")+""+l.get("Detection_Text")+"

    code: 

    vid: 

    mediaAuth: 

    uuid: 

    requestId: 

    "+l.get("Play_DateTime")+": 

    ",e},bindEvent:function(){var r=this,e=(r._player.on(c.Private.Error_Show,function(e){var t=null;r._player.getMonitorInfo&&(t=r._player.getMonitorInfo()),r._show(e,t)}),r._player.on(c.Private.Error_Hide,function(){r._hide()}),document.querySelector("#"+r.id()+" .prism-button-refresh")),e=(n.on(e,"click",function(){location.reload(!0)}),o.IS_MOBILE&&(e=document.querySelector("#"+r.id()+" .prism-detect-info"),s.addClass(e,"prism-width90")),document.querySelector("#"+r.id()+" .prism-button-retry"));n.on(e,"click",function(){var e=r._player.getCurrentTime(),t=r._player._options.source;r._player._setDefaultCC=!0,r._player._loadByUrlInner(t,e,!0)})},_show:function(e,t){var r,e=e.paramData,i="",n="",o=(e.mediaId&&(i=e.mediaId),e.mediaAuth&&e.mediaAuth,document.querySelector("#"+this.id()+" .prism-button-orange"));o&&(t&&this._player._options.diagnosisButtonVisible?(t.vu?n=decodeURIComponent(t.vu):s.css(o,"display","none"),i="//player.alicdn.com/detection.html?from=h5&vid="+i+"&source="+(n?encodeURIComponent(n):"")+"&uuid="+t.uuid+"&lang="+l.getCurrentLanguage(),o&&(o.href=i)):s.css(o,"display","none"),n=e.display_msg||e.error_msg,document.querySelector("#"+this.id()+" .prism-error-content p").innerHTML=n,document.querySelector("#"+this.id()+" .errorCode .info-content").innerText=e.error_code,t=document.querySelector("#"+this.id()+" .vid"),e.mediaId?(s.css(t,"display","block"),document.querySelector("#"+this.id()+" .vid .info-content").innerText=e.mediaId):s.css(t,"display","none"),i=document.querySelector("#"+this.id()+" .mediaAuth"),e.mediaAuth?(s.css(i,"display","block"),document.querySelector("#"+this.id()+" .mediaAuth .info-content").innerText=e.mediaAuth):s.css(i,"display","none"),e.uuid?document.querySelector("#"+this.id()+" .uuid .info-content").innerText=e.uuid:(o=document.querySelector("#"+this.id()+" .uuid"),s.css(o,"display","none")),e.requestId?document.querySelector("#"+this.id()+" .requestId .info-content").innerText=e.requestId:(n=document.querySelector("#"+this.id()+" .requestId"),s.css(n,"display","none")),document.querySelector("#"+this.id()+" .dateTime .info-content").innerText=a.formatDate(new Date,"yyyy-MM-dd HH:mm:ss"),t=document.querySelector("#"+this.id()),s.css(t,"display","block"),(r=this).playHideHandler&&clearTimeout(r.playHideHandler),r.playHideHandler=setTimeout(function(){r._player.trigger("play_btn_hide")}))},_hide:function(){var e=document.querySelector("#"+this.id());s.css(e,"display","none")},disposeUI:function(){this.playHideHandler&&(clearTimeout(this.playHideHandler),this.playHideHandler=null)}});t.exports=e},{"../../lang/index":23,"../../lib/dom":32,"../../lib/event":33,"../../lib/ua":49,"../../lib/util":51,"../../player/base/event/eventtype":70,"../component":130}],136:[function(e,t,r){var i=e("../component"),n=e("../../player/base/event/eventtype"),o=(e("../../lib/event"),e("../../lib/ua")),a=e("../../lang/index"),s=e("./util"),e=i.extend({init:function(e,t){i.call(this,e,t),this.addClass("prism-fullscreen-btn")},bindEvent:function(){var e=this;this._player.on(n.Player.RequestFullScreen,function(){o.IS_IOS||e.addClass("fullscreen")}),this._player.on(n.Player.CancelFullScreen,function(){e.removeClass("fullscreen")}),s.registerTooltipEvent.call(this,this.el(),function(){return e._player.fullscreenService.getIsFullScreen()?a.get("ExistFullScreen"):a.get("Fullscreen")}),this.on("click",function(){e._player.fullscreenService.getIsFullScreen()?e._player.fullscreenService.cancelFullScreen():e._player.fullscreenService.requestFullScreen(),e._player.trigger(n.Private.MarkerTextHide)})}});t.exports=e},{"../../lang/index":23,"../../lib/event":33,"../../lib/ua":49,"../../player/base/event/eventtype":70,"../component":130,"./util":159}],137:[function(e,t,r){"use strict";var i=e("../component"),n=e("../../lib/dom"),o=e("../../player/base/event/eventtype"),a=e("../../lib/ua.js"),e=i.extend({init:function(e,t){i.call(this,e,t),this.addClass("prism-hide")},createEl:function(){var e=i.prototype.createEl.call(this,"div");return e.innerHTML=a.IS_ANDROID_FIREFOX?'
    ':'
    ',e},_loading_hide:function(e){var t=document.querySelector("#"+this.id()+" .prism-loading");t&&(n.removeClass(t,"prism-loading"),n.addClass(t,"prism-hide"))},_loading_show:function(e){var t=document.querySelector("#"+this.id()+" .prism-hide");t&&(n.removeClass(t,"prism-hide"),n.addClass(t,"prism-loading"))},bindEvent:function(){this._player.on(o.Private.H5_Loading_Show,this._loading_show),this._player.on(o.Private.H5_Loading_Hide,this._loading_hide)}});t.exports=e},{"../../lib/dom":32,"../../lib/ua.js":49,"../../player/base/event/eventtype":70,"../component":130}],138:[function(e,t,r){var i=e("../component"),n=(e("../../lib/util"),e("../../lib/dom")),o=(e("../../lib/event"),e("../../lib/ua"),e("../../lang/index"),e("../../player/base/event/eventtype")),e=i.extend({init:function(e,t){i.call(this,e,t),this.addClass("prism-info-display")},createEl:function(){return i.prototype.createEl.call(this,"p")},bindEvent:function(){var r=this;r._player.on(o.Private.Info_Show,function(e){var t=document.querySelector("#"+r.id()),e=e.paramData;e&&(void 0!==e.text&&e.text?(t.innerHTML=e.text,void 0!==e.duration&&e.duration&&(r.handler&&clearTimeout(r.handler),r.handler=setTimeout(function(){n.css(t,"display","none")},e.duration)),"lb"==e.align?(n.addClass(t,"prism-info-left-bottom"),n.removeClass(t,"prism-info-top-center")):"tc"==e.align?(n.addClass(t,"prism-info-top-center"),n.removeClass(t,"prism-info-left-bottom")):(n.removeClass(t,"prism-info-left-bottom"),n.removeClass(t,"prism-info-top-center")),e.isBlack?n.addClass(t,"prism-info-black"):n.removeClass(t,"prism-info-black")):t.innerHTML=e,n.css(t,"display","block"))}),r._player.on(o.Private.Info_Hide,function(e){var t=document.querySelector("#"+r.id());n.css(t,"display","none")})},disposeUI:function(){this.handler&&(clearTimeout(this.handler),this.handler=null)}});t.exports=e},{"../../lang/index":23,"../../lib/dom":32,"../../lib/event":33,"../../lib/ua":49,"../../lib/util":51,"../../player/base/event/eventtype":70,"../component":130}],139:[function(e,t,r){var i=e("../component"),n=e("../../lang/index"),e=i.extend({init:function(e,t){i.call(this,e,t),this.addClass("prism-license-watermark")},createEl:function(){var e=i.prototype.createEl.call(this,"div");return e.innerHTML='
    '+n.get("License_No_Authorization")+'
    '+n.get("License_Click_To_Apply")+"",e}});t.exports=e},{"../../lang/index":23,"../component":130}],140:[function(e,t,r){var i=e("../component"),n=e("./util"),o=(e("../../lib/util"),e("../../lib/dom")),a=e("../../lib/event"),s=e("../../lib/playerUtil"),l=e("../../lang/index"),e=i.extend({init:function(e,t){i.call(this,e,t),this.addClass("prism-live-display")},createEl:function(){var e=i.prototype.createEl.call(this,"p");return e.innerText="LIVE",s.isLiveShift(this._player._options)&&o.addClass(e,"live-shift-display"),e},bindEvent:function(){var e=document.querySelector("#"+this.id()),t=this;s.isLiveShift(this._player._options)&&(a.on(e,"click",function(){t._player._liveshiftService.switchToLive()}),n.registerTooltipEvent.call(this,this.el(),l.get("SwitchToLive")))}});t.exports=e},{"../../lang/index":23,"../../lib/dom":32,"../../lib/event":33,"../../lib/playerUtil":45,"../../lib/util":51,"../component":130,"./util":159}],141:[function(e,t,r){var i=e("../component"),n=(e("../../lib/dom"),e("../../lib/event"),e("../../player/base/event/eventtype")),o=e("../../player/base/plugin/status"),a=e("../../lib/ua.js"),e=i.extend({init:function(e,t){i.call(this,e,t),this.addClass("prism-animation")},bindEvent:function(){var t=this;this._player.on(n.Player.Play,function(){t._player._isManualPlay&&(t.removeClass("prism-pause-animation"),t.addClass("prism-play-animation"),a.IS_ANDROID_FIREFOX||t.removeClass("play-apply-animation"),t.playHandler&&clearTimeout(t.playHandler),t.playHandler=setTimeout(function(){a.IS_ANDROID_FIREFOX||t.addClass("play-apply-animation")}))}),this._player.on(n.Player.Pause,function(){var e=t._player._status;e!=o.ended&&e!=o.error&&t._player._isManualPause&&(t.removeClass("prism-play-animation"),t.addClass("prism-pause-animation"),a.IS_ANDROID_FIREFOX||t.removeClass("play-apply-animation"),t.pauseHandler&&clearTimeout(t.pauseHandler),t.pauseHandler=setTimeout(function(){a.IS_ANDROID_FIREFOX||t.addClass("play-apply-animation")}))})},disposeUI:function(){this.playHandler&&(clearTimeout(this.playHandler),this.playHandler=null),this.pauseHandler&&(clearTimeout(this.pauseHandler),this.pauseHandler=null)}});t.exports=e},{"../../lib/dom":32,"../../lib/event":33,"../../lib/ua.js":49,"../../player/base/event/eventtype":70,"../../player/base/plugin/status":95,"../component":130}],142:[function(e,t,r){var i=e("../component"),n=e("../../player/base/event/eventtype"),o=e("./util"),a=e("../../lang/index"),e=i.extend({init:function(e,t){i.call(this,e,t),this.addClass("prism-play-btn")},bindEvent:function(){var t=this;this._player.on(n.Player.Play,function(){t.addClass("playing")}),this._player.on(n.Player.Pause,function(){t.removeClass("playing")}),this.on(n.Private.PlayClick,function(){var e;t._player.paused()?(e=t._player.getCurrentTime(),(t._player.getDuration()<=e||t._player._ended||t._player.exceedPreviewTime(e))&&t._player.seek(0),t._player.play(!0),t.addClass("playing")):(t._player.pause(!0),t.removeClass("playing")),t._player.trigger(n.Private.MarkerTextHide)}),o.registerTooltipEvent.call(this,this.el(),function(){return t._player.paused()?a.get("Play"):a.get("Pause")})}});t.exports=e},{"../../lang/index":23,"../../player/base/event/eventtype":70,"../component":130,"./util":159}],143:[function(e,t,r){var i=e("../component"),o=e("../../lib/dom"),a=(e("../../lib/constants"),e("../../lib/event")),s=e("../../lib/ua"),l=e("../../lib/function"),n=e("../../lang/index"),c=e("../../config"),u=e("../../lib/util"),p=e("../../player/base/event/eventtype"),d=e("./util").debounce,e=i.extend({init:function(e,t){i.call(this,e,t),this._seekTime=-1,this._lastSeekTime=0,this._moving=!1,this._thumbnailHideTimer=null,this.addClass("prism-progress")},createEl:function(){var e=i.prototype.createEl.call(this);return e.innerHTML='

    ',e},bindEvent:function(){function t(e){r._progressDown=e}var r=this,e=(this.loadedNode=document.querySelector("#"+this.id()+" .prism-progress-loaded"),this.playedNode=document.querySelector("#"+this.id()+" .prism-progress-played"),this.cursorNode=document.querySelector("#"+this.id()+" .prism-progress-cursor"),this.timeNode=document.querySelector("#"+this._player._options.id+" .prism-progress-time"),this.thumbnailNode=document.querySelector(".prism-thumbnail"),this.controlNode=document.querySelector("#"+this._player._options.id+" .prism-controlbar"),document.querySelector("#"+this.id())),i=document.querySelector("#"+this.id()+" .prism-progress-cursor img"),n="",n=this._player._options.skinsDomain?this._player._options.skinsDomain+"/skins/default/img/dragcursor.png":c.domain?"https://"+c.domain+"/de/prismplayer/"+c.h5Version+"/skins/default/img/dragcursor.png":"/build/skins/default/img/dragcursor.png";i.src=n,a.on(this.cursorNode,"mousedown",function(e){r._onMouseDown(e)}),a.on(this.cursorNode,"touchstart",function(e){r._onMouseDown(e)}),a.on(e,"mousemove",function(e){r._progressMove(e)}),a.on(e,"touchmove",function(e){r._progressMove(e)});a.on(e,"mousedown",function(e){t(!0)}),a.on(e,"touchstart",function(e){t(!0)}),a.on(e,"mouseup",function(e){t(!1)}),a.on(e,"touchend",function(e){t(!1),r._moving&&s.IS_MOBILE&&(r._player.trigger(p.Private.EndStart,{toTime:r._lastSeekTime}),r._moving=!1)}),a.on(this._el,"click",function(e){r._onMouseClick(e)}),this._player.on(p.Private.HideProgress,function(e){r._hideProgress(e)}),this._player.on(p.Private.CancelHideProgress,function(e){r._cancelHideProgress(e)}),this._player.on(p.Private.HideBar,function(e){r._player._seeking=!1}),a.on(e,p.Private.MouseOver,function(e){r._onMouseOver(e)}),a.on(e,p.Private.MouseOut,function(e){r._onMouseOut(e)}),a.on(this.controlNode,p.Private.MouseLeave,function(e){r._offMouseUp()}),s.IS_PC?(i=d(function(){o.addClass(e,"prism-progress-hover"),o.addClass(r.cursorNode,"cursor-hover")},100),a.on(e,"mouseover",i),n=d(function(){o.removeClass(e,"prism-progress-hover"),o.removeClass(r.cursorNode,"cursor-hover"),r._progressDown=!1},100),a.on(e,"mouseout",n)):(o.addClass(e,"prism-progress-hover"),o.addClass(r.cursorNode,"cursor-hover")),this.bindTimeupdate=l.bind(this,this._onTimeupdate),this._player.on(p.Player.TimeUpdate,this.bindTimeupdate),s.IS_IPAD?this.interval=setInterval(function(){r._onProgress()},500):this._player.on(p.Video.Progress,function(){r._onProgress()}),this._player.on(p.Private.UpdateProgress,function(e){r._updateProgressBar(r.playedNode,e.paramData.targetTime)}),this._player.on(p.Private.UpdateCursorPosition,function(e){r._updateCursorPosition(e.paramData.targetTime)})},_progressMove:function(e){e.preventDefault();var t,r,i=this._getSeconds(e);i!=1/0&&(t=u.formatTime(i),r=this._getDistance(e),this.cursorNode)&&(this._player.trigger(p.Private.ThumbnailShow,{time:i,formatTime:t,left:r,progressWidth:this.el().offsetWidth}),this._autoHideThumbnail(),this._progressDown)&&this._onMouseMove(e)},_hideProgress:function(e){a.off(this.cursorNode,"mousedown"),a.off(this.cursorNode,"touchstart")},_cancelHideProgress:function(e){var t=this;a.on(this.cursorNode,"mousedown",function(e){t._onMouseDown(e)}),a.on(this.cursorNode,"touchstart",function(e){t._onMouseDown(e)})},_canSeekable:function(e){var t=!0;return t="function"==typeof this._player.canSeekable?this._player.canSeekable(e):t},_onMouseOver:function(e){this._cursorHideHandler&&(clearTimeout(this._cursorHideHandler),this._cursorHideHandler=null),this._mouseInProgress||this._updateCursorPosition(this._player.getCurrentTime()),this._mouseInProgress=!0},_onMouseOut:function(e){var t=this;this._cursorHideHandler&&clearTimeout(this._cursorHideHandler),this._cursorHideHandler=setTimeout(function(){t._player.trigger(p.Private.ThumbnailHide),t._mouseInProgress=!1})},_getSeconds:function(e){var e=this._getDistance(e),t=this.el().offsetWidth,e=this._player.getDuration()?e/t*this._player.getDuration():0;return e=(e=e<0?0:e)>this._player.getDuration()?this._player.getDuration():e},_getDistance:function(e){for(var t=this.el().offsetLeft,r=this.el();r=r.offsetParent;){var i=o.getTranslateX(r);t+=r.offsetLeft+i}e=(e.touches?e.touches[0]:e).pageX-t;return e=e<0?0:e},_onMouseClick:function(e){var t=this,r=t._getSeconds(e);t._canSeekable(r)?(t._player.exceedPreviewTime(r)&&(r=t._player.getPreviewTime()),this._seekTime=r,t._updateProgressBar(this.playedNode,r),t._updateCursorPosition(r),this._mouseClickTimeHandle&&clearTimeout(this._mouseClickTimeHandle),this._mouseClickTimeHandle=setTimeout(function(){t._player._seeking=!0,t._mouseDown&&!s.IS_MOBILE||(t._player.trigger(p.Private.SeekStart,{fromTime:t._player.getCurrentTime()}),t._player.trigger(p.Private.EndStart,{toTime:r})),t._player.seek(r),t._mouseDown=!1,t._mouseClickTimeHandle=null,t._inWaitingSeek=!1},0),this._inWaitingSeek=!0):t._player.trigger(p.Private.Info_Show,{text:n.get("Can_Not_Seekable"),duration:2e3})},_onMouseDown:function(e){var t=this,e=(e.preventDefault(),this._mouseDown=!0,s.IS_PC&&this._player.trigger(p.Private.SeekStart,{fromTime:this._player.getCurrentTime()}),a.on(this.controlNode,"mousemove",function(e){t._onMouseMove(e)}),a.on(this.controlNode,"touchmove",function(e){t._onMouseMove(e)}),a.on(this.controlNode,"mouseup",function(e){t._onControlBarMouseUp(e)}),a.on(this.controlNode,"touchend",function(e){t._onControlBarMouseUp(e)}),t._getSeconds(e));t._canSeekable(e)?t._player.exceedPreviewTime(e)&&t._player.getPreviewTime():t._player.trigger(p.Private.Info_Show,{text:n.get("Can_Not_Seekable"),duration:2e3})},_onMouseUp:function(e){this._onMouseUpIntern(e)},_onControlBarMouseUp:function(e){this._onMouseUpIntern(e)},_onPlayerMouseUp:function(e){this._onMouseUpIntern(e)},_offMouseUp:function(){a.off(this.controlNode,"mousemove"),a.off(this.controlNode,"touchmove"),a.off(this.controlNode,"mouseup"),a.off(this.controlNode,"touchend")},_onMouseUpIntern:function(e){e.preventDefault(),this._offMouseUp();e=this.playedNode.offsetWidth/this.el().offsetWidth*this._player.getDuration();this._player.getDuration();isNaN(e)||this._player.seek(e),s.IS_PC&&this._player.trigger(p.Private.EndStart,{toTime:e}),this._autoHideThumbnail()},_onMouseMove:function(e){e.preventDefault(),!this._moving&&s.IS_MOBILE&&(this._player.trigger(p.Private.SeekStart,{fromTime:this._player.getCurrentTime()}),this._moving=!0);e=this._getSeconds(e);this._player.exceedPreviewTime(e)&&(e=this._player.getPreviewTime()),this._player.seek(e),this._updateProgressBar(this.playedNode,e),this._updateCursorPosition(e),this._lastSeekTime=e},_onTimeupdate:function(e){var t=this._player._options.source,t=this._getUrlSuffix(t),r=!1;"mp4"===t&&(s.IS_MAC_SAFARI&&(r=!0),s.IS_IOS&&(r=!0),s.IS_IE11)&&(r=!0),"m3u8"===t&&s.IS_IE11&&(r=!0),"audio"==this._player._options.mediaType&&s.IS_IOS&&(this._player._seeking=!1),(this._inWaitingSeek||this._player._seeking&&!s.IS_EDGE||this._progressDown)&&!r||(this._updateProgressBar(this.playedNode,this._player.getCurrentTime()),this._updateCursorPosition(this._player.getCurrentTime()),this._player.trigger(p.Private.UpdateProgressBar,{time:this._player.getCurrentTime()}))},_onProgress:function(e){this._player.getDuration()&&1<=this._player.getBuffered().length&&this._updateProgressBar(this.loadedNode,this._player.getBuffered().end(this._player.getBuffered().length-1))},_updateProgressBar:function(e,t){var r=this._player.getDuration();1!=this._player._switchSourcing&&r&&(-1!=this._seekTime&&(this._player.getCurrentTime()>=this._seekTime||!this._player._seeking?this._seekTime=-1:t=this._seekTime),1<(t=t/r+.005)&&(t=1),e)&&o.css(e,"width",100*t+"%")},_updateCursorPosition:function(e){var t,r,i,n=this._player.getDuration();1!=this._player._switchSourcing&&n&&(t=1,r=10/(i=this._player.el().clientWidth),0!=i&&(t=1-r),i=(i=e/n-r)<0?0:i,this.cursorNode)&&(te?(n.css(i.el(),"right","0px"),n.css(i.el(),"left","auto")):(left=(left-=width/2)<0?0:left,n.css(i.el(),"right","auto"),n.css(i.el(),"left",left+"px")))},30))}),i._player.on(a.Private.MarkerTextHide,function(e){i._player.trigger(a.Player.MarkerDotOut),i._player.trigger(a.Private.LifeCycleChanged,{type:a.Player.MarkerDotOut,data:""}),i._thumbnailShowHanlde&&clearTimeout(i._thumbnailShowHanlde),n.css(i.el(),"display","none")}),o.on(i._player.tag,"click",function(e){e&&e.target==e.currentTarget&&i._player.trigger(a.Private.MarkerTextHide)}),o.on(i._player.tag,"touchstart",function(e){e&&e.target==e.currentTarget&&i._player.trigger(a.Private.MarkerTextHide)})},disposeUI:function(){this._thumbnailShowHanlde&&(clearTimeout(this._thumbnailShowHanlde),this._thumbnailShowHanlde=null)}});t.exports=e},{"../../lib/dom":32,"../../lib/event":33,"../../lib/util":51,"../../player/base/event/eventtype":70,"../component":130}],145:[function(e,t,r){var i=e("./selector"),s=e("../../../lib/object"),c=(e("../../../lib/util"),e("../../../lib/cookie")),l=e("../../../lib/dom"),u=(e("../../../lib/event"),e("../../../lib/constants")),p=e("../../../lang/index"),o=e("../../../player/base/event/eventtype"),e=i.extend({init:function(e,t){this.Name=p.get("Quality"),this.Type="quality",this.Tooltip=p.get("Quality_Switch_To"),i.call(this,e,t),this._isMasterLevel=!1},showTip:function(e,t){this._player.trigger(o.Private.Info_Show,{text:e,duration:t,align:"lb"})},bindEvent:function(){this.bindCommonEvent();var n=this,e=(this._player.on(o.Private.QualityChange,function(e){var t,r,i=0
    {value}
    ",r=t.replace(/{type}/g,"speed").replace("{value}",u.get("Speed")),i=t.replace(/{type}/g,"cc").replace("{value}",u.get("Subtitle")),n=t.replace(/{type}/g,"audio").replace("{value}",u.get("AudioTrack")),t=t.replace(/{type}/g,"quality").replace("{value}",u.get("Quality"));return e.innerHTML=r+i+n+t,e},bindEvent:function(){function t(){i._player.trigger(l.Private.SettingListHide),i.isOpened=!1}function r(e){e&&e.text&&(document.querySelector("#"+i.id()+" .prism-setting-"+e.type+" .current-setting").innerText=e.text)}var i=this,e=(this._player.on(l.Private.SettingListShow,function(e){i.isOpened=!0;e=e.paramData;r(e),n.css(i.el(),"display","block")}),this._player.on(l.Private.UpdateToSettingList,function(e){e=e.paramData;r(e)}),this._player.on(l.Private.SelectorUpdateList,function(e){e=e.paramData;r(e),i._player.trigger(l.Private.SelectorValueChange,e)}),this._player.on(l.Private.SettingListHide,function(){i.isOpened=!1,n.css(i.el(),"display","none")}),s.on(this.el(),"click",function(e){i._player.trigger(l.Private.SettingListHide);var e=e.srcElement||e.target;(e=c.findItemElementForList(e))&&(e=e.getAttribute("type"),i._player.trigger(l.Private.SelectorShow,{type:e}))}),a.IS_MOBILE?"touchleave":"mouseleave");s.on(this.el(),e,function(){t()}),s.on(this._player.tag,"click",function(e){e&&e.target==e.currentTarget&&t()}),s.on(this._player.tag,"touchstart",function(e){e&&e.target==e.currentTarget&&t()}),this._player.on(l.Private.QualityChange,function(e){var t,r,e=e.paramData;e.levelSwitch&&(t=document.querySelector("#"+i.id()+" .prism-setting-quality .current-setting"),r=u.get("Auto"),-1
      ',e},bindEvent:function(){this.bindCommonEvent()},bindCommonEvent:function(){var o=this,e=document.querySelector("#"+o.id()+" .selector-list"),t=document.querySelector("#"+o.id()+" .header");function r(){o._hasGeneratedList||(o._clear(),o.generateList(o._backupSelector),o._backupSelector="",o._hasGeneratedList=!0)}this._player.on(c.Private.ChangeURL,function(){o._hasGeneratedList=!1}),s.on(t,"click",function(){o._player.trigger(c.Private.SelectorHide),o._player.trigger(c.Private.SettingListShow,{type:o.Type,text:o._previousSelection?o._previousSelection.text:""})}),s.on(e,"click",function(e){var e=e.srcElement||e.target,t=e.key,r=e.text;void 0!==r&&(o._previousSelection&&a.removeClass(o._previousSelection,"current"),o._previousSelection=l.findliElementForSelector(e),a.addClass(o._previousSelection,"current"),o.execute&&o.execute(t),e=o.Tooltip+""+r+"",o._player.trigger(c.Private.Info_Show,{text:e,duration:1e3,align:"lb"}))}),o._player.on(c.Private.SelectorHide,function(){i()}),o._player.on(c.Private.SelectorValueChange,function(e){var t=e.paramData;if(t&&t.type==o.Type){var r=document.querySelectorAll("#"+o.id()+" .selector-list li");if(r){var i=r.length;0==i&&(o._backupSelector=t.text);for(var n=0;ne.progressWidth?e.left-r:(i=e.left-r/2)<0?0:i,a.css(o.el(),"left",i+"px"))},30));o._player.on(s.Private.ThumbnailShow,e),o._player.on(s.Private.ThumbnailHide,function(e){a.css(o.el(),"display","none")})},_createSamllThumbnail:function(){},disposeUI:function(){}});t.exports=e},{"../../lang/index":23,"../../lib/dom":32,"../../lib/event":33,"../../lib/ua":49,"../../lib/util":51,"../../player/base/event/eventtype":70,"../component":130,"./util":159}],157:[function(e,t,r){var i=e("../component"),n=e("../../lib/util"),o=e("../../player/base/event/eventtype"),e=i.extend({init:function(e,t){i.call(this,e,t),this.addClass("prism-time-display")},createEl:function(){var e=i.prototype.createEl.call(this,"div");return e.innerHTML='00:00 / 00:00',e},bindEvent:function(){var t=this;this._player.on(o.Video.DurationChange,function(){var e=n.formatTime(t._player.getDisplayDuration());e?(document.querySelector("#"+t.id()+" .time-bound").style.display="inline",document.querySelector("#"+t.id()+" .duration").style.display="inline",document.querySelector("#"+t.id()+" .duration").innerText=e):(document.querySelector("#"+t.id()+" .duration").style.display="none",document.querySelector("#"+t.id()+" .time-bound").style.display="none")}),this._player.on(o.Video.TimeUpdate,function(){var e=t._player.getCurrentTime(),e=n.formatTime(e);document.querySelector("#"+t.id()+" .current-time")&&(e?(document.querySelector("#"+t.id()+" .current-time").style.display="inline",document.querySelector("#"+t.id()+" .current-time").innerText=e):document.querySelector("#"+t.id()+" .current-time").style.display="none")})}});t.exports=e},{"../../lib/util":51,"../../player/base/event/eventtype":70,"../component":130}],158:[function(e,t,r){var i=e("../component"),o=e("../../lib/dom"),a=e("../../player/base/event/eventtype"),e=i.extend({init:function(e,t){i.call(this,e,t),this.addClass("prism-tooltip")},createEl:function(){var e=i.prototype.createEl.call(this,"p");return e.innerText="\u63d0\u793a\u4fe1\u606f",e},bindEvent:function(){var n=this;n._player.on(a.Private.TooltipShow,function(e){var t=document.querySelector("#"+n.id()),e=e.paramData,r=(t.innerText=e.text,o.css(t,"display","block"),t.offsetWidth),i=document.querySelector("#"+n._player.id()+" .prism-controlbar");i&&(i=i.offsetWidth,e.left+r>i?o.css(t,"left",i-r+"px"):o.css(t,"left",e.left-(r-e.width)/2+"px"))}),n._player.on(a.Private.TooltipHide,function(e){var t=document.querySelector("#"+n.id());o.css(t,"display","none")})}});t.exports=e},{"../../lib/dom":32,"../../player/base/event/eventtype":70,"../component":130}],159:[function(e,t,r){var i=e("../../lib/event"),s=e("../../player/base/event/eventtype");t.exports.registerTooltipEvent=function(e,n){function o(){a._controlbarTooltipHandler&&(clearTimeout(a._controlbarTooltipHandler),a._controlbarTooltipHandler=null)}var a=this;i.on(this.el(),"mouseover",function(e){o(),a._controlbarTooltipHandler=setTimeout(function(){a._player.trigger(s.Private.TooltipHide)},4e3);var t=a.el().offsetLeft,r=a.el().offsetWidth,i=n;"function"==typeof n&&(i=n.call(this)),a._player.trigger(s.Private.TooltipShow,{left:t,width:r,text:i})}),i.on(this.el(),"mouseout",function(){o(),a._player.trigger(s.Private.TooltipHide)})},t.exports.throttle=function(r,i){var n=Date.now();return function(){var e=arguments,t=Date.now();i<=t-n&&(r(e),n=t)}},t.exports.debounce=function(r,i){var n;return function(){var e=this,t=arguments;clearTimeout(n),n=setTimeout(function(){r.apply(e,t)},i)}}},{"../../lib/event":33,"../../player/base/event/eventtype":70}],160:[function(e,t,r){var i=e("../component"),n=e("../../lib/dom"),o=e("../../lib/event"),a=e("../../player/base/event/eventtype"),s=e("./util"),l=e("../../lang/index"),c=e("./volumecontrol"),e=i.extend({init:function(e,t){i.call(this,e,t),this.addClass("prism-volume");var r=new c(e,t);e.addChild(r,t),this.volumeControl=r},createEl:function(){var e=i.prototype.createEl.call(this,"div");return e.innerHTML='
      ',e},bindEvent:function(){var r=this,i=r._player,e=(this.icon=document.querySelector("#"+r.id()+" .volume-icon"),s.registerTooltipEvent.call(this,this.el(),function(){return r._player.muted()||0==r._player.getVolume()?l.get("Muted"):l.get("Volume")}),o.on(this.icon,"click",function(e){var t;r.volumeControl._shown?i.muted()?i.unMute():i.mute():(t=r.el().offsetLeft,r._player.trigger(a.Private.SettingListHide),r._player.trigger(a.Private.SelectorHide),r._player.trigger(a.Private.VolumeVisibilityChange,t),r._player.trigger(a.Private.MarkerTextHide))}),document.querySelector("#"+r.id()+" .long-horizontal")),t=document.querySelector("#"+r.id()+" .short-horizontal");o.on(this.el(),"mouseover",function(){n.removeClass(e,"volume-hover-animation"),setTimeout(function(){n.addClass(e,"volume-hover-animation")}),setTimeout(function(){n.removeClass(e,"volume-hover-animation"),n.addClass(t,"volume-hover-animation"),setTimeout(function(){n.removeClass(t,"volume-hover-animation"),n.addClass(e,"volume-hover-animation")},300)},300)}),o.on(window,"resize",function(){var e;r.volumeControl._shown&&(e=r.el().offsetLeft,r._player.trigger(a.Private.VolumeUpdatePosition,e))})}});t.exports=e},{"../../lang/index":23,"../../lib/dom":32,"../../lib/event":33,"../../player/base/event/eventtype":70,"../component":130,"./util":159,"./volumecontrol":161}],161:[function(e,t,r){var i=e("../component"),n=e("../../lib/dom"),o=e("../../lib/event"),a=e("../../player/base/event/eventtype"),e=(e("./util"),e("../../lang/index"),i.extend({init:function(e,t){i.call(this,e,t),this.addClass("prism-volume-control"),this._shown=!1},createEl:function(){var e=i.prototype.createEl.call(this,"div");return e.innerHTML='
      ',e},bindEvent:function(){var r=this;this.icon=document.querySelector("#"+r._player.id()+" .volume-icon"),this.control=document.querySelector("#"+r.id()),this.volumnValue=document.querySelector("#"+r.id()+" .volume-value"),this.volumnRange=document.querySelector("#"+r.id()+" .volume-range"),this.volumnCursor=document.querySelector("#"+r.id()+" .volume-cursor"),this._player.on(a.Private.VolumeVisibilityChange,function(e){var t,e=e.paramData;!r._shown&&e?(t=r._player.getVolume(),r._setVolumnUI(t),n.css(r.control,"display","block"),e&&r._updatePosition(e),r._shown=!0):r._hide()}),this._player.on(a.Private.VolumeUpdatePosition,function(e){e=e.paramData;r._shown&&r._updatePosition(e)}),this._player.on(a.Private.ControlBarClick,function(e){n.hasClass(e.paramData.target,"prism-controlbar-bg")&&r._hide()}),o.on(this.volumnRange,"click",function(e){e=n.getPointerPosition(r.volumnRange,e).y;e<0||1 .vjs-icon-placeholder:before, .video-js .vjs-big-play-button .vjs-icon-placeholder:before { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.vjs-button > .vjs-icon-placeholder:before, .video-js .vjs-big-play-button .vjs-icon-placeholder:before { + text-align: center; +} + +@font-face { + font-family: VideoJS; + src: url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAABDkAAsAAAAAG6gAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADsAAABUIIslek9TLzIAAAFEAAAAPgAAAFZRiV3hY21hcAAAAYQAAADaAAADPv749/pnbHlmAAACYAAAC3AAABHQZg6OcWhlYWQAAA3QAAAAKwAAADYZw251aGhlYQAADfwAAAAdAAAAJA+RCLFobXR4AAAOHAAAABMAAACM744AAGxvY2EAAA4wAAAASAAAAEhF6kqubWF4cAAADngAAAAfAAAAIAE0AIFuYW1lAAAOmAAAASUAAAIK1cf1oHBvc3QAAA/AAAABJAAAAdPExYuNeJxjYGRgYOBiMGCwY2BycfMJYeDLSSzJY5BiYGGAAJA8MpsxJzM9kYEDxgPKsYBpDiBmg4gCACY7BUgAeJxjYGS7wTiBgZWBgaWQ5RkDA8MvCM0cwxDOeI6BgYmBlZkBKwhIc01hcPjI+FGJHcRdyA4RZgQRADK3CxEAAHic7dFZbsMgAEXRS0ycyZnnOeG7y+qC8pU1dHusIOXxuoxaOlwZYWQB0Aea4quIEN4E9LzKbKjzDeM6H/mua6Lmc/p8yhg0lvdYx15ZG8uOLQOGjMp3EzqmzJizYMmKNRu27Nhz4MiJMxeu3Ljz4Ekqm7T8P52G8PP3lnTOVk++Z6iN6QZzNN1F7ptuN7eGOjDUoaGODHVsuvU8MdTO9Hd5aqgzQ50b6sJQl4a6MtS1oW4MdWuoO0PdG+rBUI+GejLUs6FeDPVqqDdDvRvqw1CfhpqM9At0iFLaAAB4nJ1YDXBTVRZ+5/22TUlJ8we0pHlJm7RJf5O8F2j6EymlSPkpxaL8U2xpa3DKj0CBhc2IW4eWKSokIoLsuMqssM64f+jA4HSdWXXXscBq67IOs3FXZ1ZYWVyRFdo899yXtIBQZ90k7717zz3v3HPPOfd854YCCj9cL9dL0RQFOqCbGJnrHb5EayiKIWN8iA/hWBblo6hUWm8TtCDwE80WMJus/irwyxOdxeB0MDb14VNJHnXYoLLSl6FfCUYO9nYPTA8Epg9090LprfbBbZ2hY0UlJUXHQp3/vtWkS6EBv8+rPMq5u9692f/dNxJNiqwC1xPE9TCUgCsSdQWgE3XQD25lkG4CN2xmTcOXWBOyser6RN6KnGbKSbmQ3+d0OI1m2W8QzLLkI2sykrWAgJJEtA8vGGW/2Q+CmT3n8zS9wZwu2DCvtuZKZN3xkrLh36yCZuUomQSqGpY8t/25VfHVhw8z4ebGBtfLb0ya9PCaDc+8dGTvk2dsh6z7WzvowlXKUSWo9MJ15a3KrEP2loOr2Ojhw6iW6hf2BDdEccQvZGpaAy7YovSwq8kr7HGllxpd71rkS6G0Sf11sl9OvMK1+jwPPODxjUwkOim9CU3ix1wNjXDfmJSEn618Bs6lpWwUpU+8PCqLMY650zjq8VhCIP17NEKTx3eaLL+s5Pi6yJWaWjTHLR1jYzPSV9VF/6Ojdb/1kO3Mk3uhHC0x6gc1BjlKQ+nQFxTYdaJkZ7ySVxLBbhR1dsboNXp1tCYKW2LRaEzpYcIx2BKNxaL0ZaUnSqfFoiNhHKR/GkX6PWUSAaJelQaqZL1EpoHNsajSEyPSoJ9IjhIxTdjHLmwZvhRDOiFTY/YeQnvrVZmiTQtGncECXtFTBZLOVwwMRgoXHAkXzMzPn1nAJJ8jYSbMDaqN2waGLzNhih/bZynUBMpIWSg7VYi7DRx2m8ALkIdRCJwI6ArJx2EI8kaDWeTQKeAFk9fjl/1AvwktjQ1P7NjyMGQyfd4vjipX6M/i52D7Cq80kqlcxEcGXRr/FEcgs0u5uGgB4VWuMFfpdn2Re6Hi3PqzmxWKsz6+ae2Pn9hXXw/fqM859UiGC0oKYYILJBqJrsn1Z1E5qOs9rQCiUQRREjm8yJcbHF5cUJufX1vAHlefw0XgUoboS3ETfQlTxBC4SOtuE8VPRJTBSCQSjZCpk7Gqzu+masaZ2y7Zjehho4F3g82BNDkAHpORG4+OCS+f6JTPmtRn/PH1kch6d04sp7AQb25aQ/pqUyXeQ8vrebG8OYQdXOQ+585u0sdW9rqalzRURiJ+9F4MweRFrKUjl1GUYhH1A27WOHw5cTFSFPMo9EeUIGnQTZHIaJ7AHLaOKsOODaNF9jkBjYG2QEsQ2xjMUAx2bBEbeTBWMHwskBjngq56S/yfgkBnWBa4K9sqKtq2t1UI8S9He5XuBRbawAdatrQEAi30Aks2+LM8WeCbalVZkWNylvJ+dqJnzVb+OHlSoKW8nPCP7Rd+CcZ2DdWAGqJ2CBFOphgywFFCFBNtfAbGtNPBCwxvygHeYMZMY9ZboBqwq/pVrsbgN5tkv152ODlbMfiqwGMBgxa4Exz3QhovRIUp6acqZmQzRq0ypDXS2TPLT02YIkQETnOE445oOGxOmXAqUJNNG7XgupMjPq2ua9asrj5yY/yuKteO1Kx0YNJTufrirLe1mZnat7OL6rnUdCWenpW6I8mAnbsY8KWs1PuSovCW9A/Z25PQ24a7cNOqgmTkLmBMgh4THgc4b9k2IVv1/g/F5nGljwPLfOgHAzJzh45V/4+WenTzmMtR5Z7us2Tys909UHqrPY7KbckoxRvRHhmVc3cJGE97uml0R1S0jdULVl7EvZtDFVBF35N9cEdjpgmAiOlFZ+Dtoh93+D3zzHr8RRNZQhnCNMNbcegOvpEwZoL+06cJQ07h+th3fZ/7PVbVC6ngTAV/KoLFuO6+2KFcU651gEb5ugPSIb1D+Xp8V4+k3sEIGnw5mYe4If4k1lFYr6SCzmM2EQ8iWtmwjnBI9kTwe1TlfAmXh7H02by9fW2gsjKwtv0aaURKil4OdV7rDL1MXIFNrhdxohcZXYTnq47WisrKitaObbf5+yvkLi5J6lCNZZ+B6GC38VNBZBDidSS/+mSvh6s+srgC8pyKMvDtt+de3c9fU76ZPfuM8ud4Kv0fyP/LqfepMT/3oZxSqpZaTa1DaQYLY8TFsHYbWYsPoRhRWfL5eSSQbhUGgGC3YLbVMk6PitTFNGpAsNrC6D1VNBKgBHMejaiuRWEWGgsSDBTJjqWIl8kJLlsaLJ2tXDr6xGfT85bM2Q06a46x2HTgvdnV8z5YDy/27J4zt6x2VtkzjoYpkq36kaBr4eQSg7tyiVweWubXZugtadl58ydapfbORfKsDTuZ0OBgx4cfdjCf5tbWNITnL120fdOi1RV1C3uKGzNdwYLcMvZ3BxoPyTOCD1XvXTp7U10gWCVmTV9b3r2z0SkGWovb2hp9I89O8a2smlyaO8muMU+dRmtzp60IzAoFpjLr1n388boLyf0dRvxhsHZ0qbWqDkwqvvpkj4l0fY6EIXRi5sQSrAvsVYwXRy4qJ2EVtD1AN7a0HWth9ymvL1xc3WTUKK/TAHA/bXDVtVWfOMfuGxGZv4Ln/jVr9jc3j1yMv0tndmyt9Vq88Y9gH1wtLX3KWjot5++jWHgAoZZkQ14wGQ20Fli71UmKJAy4xKMSTGbVdybW7FDDAut9XpD5AzWrYO7zQ8qffqF8+Ynd/clrHcdyxGy3a/3+mfNnzC/cBsveTjnTvXf1o6vzOlZw7WtqtdmPK/Errz/6NNtD72zmNOZfbmYdTGHfoofqI79Oc+R2n1lrnL6pOm0Up7kwxhTW12Amm7WYkXR2qYrF2AmgmbAsxZjwy1xpg/m1Je2vrp8v/nz2xpmlBg4E9hrMU341wVpTOh/OfmGvAnra8q6uctr60ZQHV3Q+WMQJykMj8ZsWn2QBOmmHMB+m5pDIpTFonYigiaKAhGEiAHF7EliVnQkjoLVIMPtJpBKHYd3A8GYH9jJzrWwmHx5Qjp7vDAX0suGRym1vtm/9W1/HyR8vczfMs6Sk8DSv855/5dlX9oQq52hT8syyp2rx5Id17IAyAM3wIjQPMOHzytEB64q6D5zT91yNbnx3V/nqnd017S9Y0605k3izoXLpsxde2n38yoOV9s1LcjwzNjbdX6asnBVaBj/6/DwKwPkpcqbDG7BnsXoSqWnUAmottYF6jMSdVyYZh3zVXCjwTiwwHH6sGuRiEHQGzuRX6whZkp123oy1BWE2mEfJ/tvIRtM4ZM5bDXiMsPMaAKOTyc5uL57rqyyc5y5JE5pm1i2S2iUX0CcaQ6lC6Zog7JqSqZmYlosl2K6pwNA84zRnQW6SaALYZQGW5lhCtU/W34N6o+bKfZ8cf3/Cl/+iTX3wBzpOY4mRkeNf3rptycGSshQWgGbYt5jFc2e0+DglIrwl6DVWQ7BuwaJ3Xk1J4VL5urnLl/Wf+gHU/hZoZdKNym6lG+I34FaNeZKcSpJIo2IeCVvpdsDGfKvzJnAwmeD37Ow65ZWwSowpgwX5T69s/rB55dP5BcpgDKFV8p7q2sn/1uc93bVzT/w6UrCqDTWvfCq/oCD/qZXNoUj8BL5Kp6GU017frfNXkAtiiyf/SOCEeLqnd8R/Ql9GlCRfctS6k5chvIBuQ1zCCjoCHL2DHNHIXxMJ3kQeO8lbsUXONeSfA5EjcG6/E+KdhN4bP04vBhdi883+BFBzQbxFbvZzQeY9LNBZc0FNfn5NwfDn6rCTnTw6R8o+gfpf5hCom33cRuiTlss3KHmZjD+BPN+5gXuA2ziS/Q73mLxUkpbKN/eqwz5uK0X9F3h2d1V4nGNgZGBgAOJd776+iue3+crAzc4AAje5Bfcg0xz9YHEOBiYQBQA8FQlFAHicY2BkYGBnAAGOPgaG//85+hkYGVCBMgBGGwNYAAAAeJxjYGBgYB8EmKOPgQEAQ04BfgAAAAAAAA4AaAB+AMwA4AECAUIBbAGYAcICGAJYArQC4AMwA7AD3gQwBJYE3AUkBWYFigYgBmYGtAbqB1gIEghYCG4IhAi2COh4nGNgZGBgUGYoZWBnAAEmIOYCQgaG/2A+AwAYCQG2AHicXZBNaoNAGIZfE5PQCKFQ2lUps2oXBfOzzAESyDKBQJdGR2NQR3QSSE/QE/QEPUUPUHqsvsrXjTMw83zPvPMNCuAWP3DQDAejdm1GjzwS7pMmwi75XngAD4/CQ/oX4TFe4Qt7uMMbOzjuDc0EmXCP/C7cJ38Iu+RP4QEe8CU8pP8WHmOPX2EPz87TPo202ey2OjlnQSXV/6arOjWFmvszMWtd6CqwOlKHq6ovycLaWMWVydXKFFZnmVFlZU46tP7R2nI5ncbi/dDkfDtFBA2DDXbYkhKc+V0Bqs5Zt9JM1HQGBRTm/EezTmZNKtpcAMs9Yu6AK9caF76zoLWIWcfMGOSkVduvSWechqZsz040Ib2PY3urxBJTzriT95lipz+TN1fmAAAAeJxtkMl2wjAMRfOAhABlKm2h80C3+ajgCKKDY6cegP59TYBzukAL+z1Zsq8ctaJTTKPrsUQLbXQQI0EXKXroY4AbDDHCGBNMcYsZ7nCPB8yxwCOe8IwXvOIN7/jAJ76wxHfUqWX+OzgumWAjJMV17i0Ndlr6irLKO+qftdT7i6y4uFSUvCknay+lFYZIZaQcmfH/xIFdYn98bqhra1aKTM/6lWMnyaYirx1rFUQZFBkb2zJUtoXeJCeg0WnLtHeSFc3OtrnozNwqi0TkSpBMDB1nSde5oJXW23hTS2/T0LilglXX7dmFVxLnq5U0vYATHFk3zX3BOisoQHNDFDeZnqKDy9hRNawN7Vh727hFzcJ5c8TILrKZfH7tIPxAFP0BpLeJPA==) format("woff"); + font-weight: normal; + font-style: normal; +} +.vjs-icon-play, .video-js .vjs-play-control .vjs-icon-placeholder, .video-js .vjs-big-play-button .vjs-icon-placeholder:before { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-play:before, .video-js .vjs-play-control .vjs-icon-placeholder:before, .video-js .vjs-big-play-button .vjs-icon-placeholder:before { + content: "\f101"; +} + +.vjs-icon-play-circle { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-play-circle:before { + content: "\f102"; +} + +.vjs-icon-pause, .video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-pause:before, .video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder:before { + content: "\f103"; +} + +.vjs-icon-volume-mute, .video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-volume-mute:before, .video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder:before { + content: "\f104"; +} + +.vjs-icon-volume-low, .video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-volume-low:before, .video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder:before { + content: "\f105"; +} + +.vjs-icon-volume-mid, .video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-volume-mid:before, .video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder:before { + content: "\f106"; +} + +.vjs-icon-volume-high, .video-js .vjs-mute-control .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-volume-high:before, .video-js .vjs-mute-control .vjs-icon-placeholder:before { + content: "\f107"; +} + +.vjs-icon-fullscreen-enter, .video-js .vjs-fullscreen-control .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-fullscreen-enter:before, .video-js .vjs-fullscreen-control .vjs-icon-placeholder:before { + content: "\f108"; +} + +.vjs-icon-fullscreen-exit, .video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-fullscreen-exit:before, .video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder:before { + content: "\f109"; +} + +.vjs-icon-square { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-square:before { + content: "\f10a"; +} + +.vjs-icon-spinner { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-spinner:before { + content: "\f10b"; +} + +.vjs-icon-subtitles, .video-js .vjs-subs-caps-button .vjs-icon-placeholder, +.video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder, +.video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder, +.video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder, +.video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder, .video-js .vjs-subtitles-button .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-subtitles:before, .video-js .vjs-subs-caps-button .vjs-icon-placeholder:before, +.video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder:before, +.video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder:before, +.video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder:before, +.video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder:before, .video-js .vjs-subtitles-button .vjs-icon-placeholder:before { + content: "\f10c"; +} + +.vjs-icon-captions, .video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder, +.video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder, .video-js .vjs-captions-button .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-captions:before, .video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder:before, +.video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder:before, .video-js .vjs-captions-button .vjs-icon-placeholder:before { + content: "\f10d"; +} + +.vjs-icon-chapters, .video-js .vjs-chapters-button .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-chapters:before, .video-js .vjs-chapters-button .vjs-icon-placeholder:before { + content: "\f10e"; +} + +.vjs-icon-share { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-share:before { + content: "\f10f"; +} + +.vjs-icon-cog { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-cog:before { + content: "\f110"; +} + +.vjs-icon-circle, .vjs-seek-to-live-control .vjs-icon-placeholder, .video-js .vjs-volume-level, .video-js .vjs-play-progress { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-circle:before, .vjs-seek-to-live-control .vjs-icon-placeholder:before, .video-js .vjs-volume-level:before, .video-js .vjs-play-progress:before { + content: "\f111"; +} + +.vjs-icon-circle-outline { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-circle-outline:before { + content: "\f112"; +} + +.vjs-icon-circle-inner-circle { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-circle-inner-circle:before { + content: "\f113"; +} + +.vjs-icon-hd { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-hd:before { + content: "\f114"; +} + +.vjs-icon-cancel, .video-js .vjs-control.vjs-close-button .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-cancel:before, .video-js .vjs-control.vjs-close-button .vjs-icon-placeholder:before { + content: "\f115"; +} + +.vjs-icon-replay, .video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-replay:before, .video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder:before { + content: "\f116"; +} + +.vjs-icon-facebook { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-facebook:before { + content: "\f117"; +} + +.vjs-icon-gplus { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-gplus:before { + content: "\f118"; +} + +.vjs-icon-linkedin { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-linkedin:before { + content: "\f119"; +} + +.vjs-icon-twitter { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-twitter:before { + content: "\f11a"; +} + +.vjs-icon-tumblr { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-tumblr:before { + content: "\f11b"; +} + +.vjs-icon-pinterest { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-pinterest:before { + content: "\f11c"; +} + +.vjs-icon-audio-description, .video-js .vjs-descriptions-button .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-audio-description:before, .video-js .vjs-descriptions-button .vjs-icon-placeholder:before { + content: "\f11d"; +} + +.vjs-icon-audio, .video-js .vjs-audio-button .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-audio:before, .video-js .vjs-audio-button .vjs-icon-placeholder:before { + content: "\f11e"; +} + +.vjs-icon-next-item { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-next-item:before { + content: "\f11f"; +} + +.vjs-icon-previous-item { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-previous-item:before { + content: "\f120"; +} + +.vjs-icon-picture-in-picture-enter, .video-js .vjs-picture-in-picture-control .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-picture-in-picture-enter:before, .video-js .vjs-picture-in-picture-control .vjs-icon-placeholder:before { + content: "\f121"; +} + +.vjs-icon-picture-in-picture-exit, .video-js.vjs-picture-in-picture .vjs-picture-in-picture-control .vjs-icon-placeholder { + font-family: VideoJS; + font-weight: normal; + font-style: normal; +} +.vjs-icon-picture-in-picture-exit:before, .video-js.vjs-picture-in-picture .vjs-picture-in-picture-control .vjs-icon-placeholder:before { + content: "\f122"; +} + +.video-js { + display: block; + vertical-align: top; + box-sizing: border-box; + color: #fff; + background-color: #000; + position: relative; + padding: 0; + font-size: 10px; + line-height: 1; + font-weight: normal; + font-style: normal; + font-family: Arial, Helvetica, sans-serif; + word-break: initial; +} +.video-js:-moz-full-screen { + position: absolute; +} +.video-js:-webkit-full-screen { + width: 100% !important; + height: 100% !important; +} + +.video-js[tabindex="-1"] { + outline: none; +} + +.video-js *, +.video-js *:before, +.video-js *:after { + box-sizing: inherit; +} + +.video-js ul { + font-family: inherit; + font-size: inherit; + line-height: inherit; + list-style-position: outside; + margin-left: 0; + margin-right: 0; + margin-top: 0; + margin-bottom: 0; +} + +.video-js.vjs-fluid, +.video-js.vjs-16-9, +.video-js.vjs-4-3, +.video-js.vjs-9-16, +.video-js.vjs-1-1 { + width: 100%; + max-width: 100%; + height: 0; +} + +.video-js.vjs-16-9 { + padding-top: 56.25%; +} + +.video-js.vjs-4-3 { + padding-top: 75%; +} + +.video-js.vjs-9-16 { + padding-top: 177.7777777778%; +} + +.video-js.vjs-1-1 { + padding-top: 100%; +} + +.video-js.vjs-fill { + width: 100%; + height: 100%; +} + +.video-js .vjs-tech { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +body.vjs-full-window { + padding: 0; + margin: 0; + height: 100%; +} + +.vjs-full-window .video-js.vjs-fullscreen { + position: fixed; + overflow: hidden; + z-index: 1000; + left: 0; + top: 0; + bottom: 0; + right: 0; +} + +.video-js.vjs-fullscreen:not(.vjs-ios-native-fs) { + width: 100% !important; + height: 100% !important; + padding-top: 0 !important; +} + +.video-js.vjs-fullscreen.vjs-user-inactive { + cursor: none; +} + +.vjs-hidden { + display: none !important; +} + +.vjs-disabled { + opacity: 0.5; + cursor: default; +} + +.video-js .vjs-offscreen { + height: 1px; + left: -9999px; + position: absolute; + top: 0; + width: 1px; +} + +.vjs-lock-showing { + display: block !important; + opacity: 1 !important; + visibility: visible !important; +} + +.vjs-no-js { + padding: 20px; + color: #fff; + background-color: #000; + font-size: 18px; + font-family: Arial, Helvetica, sans-serif; + text-align: center; + width: 300px; + height: 150px; + margin: 0px auto; +} + +.vjs-no-js a, +.vjs-no-js a:visited { + color: #66A8CC; +} + +.video-js .vjs-big-play-button { + font-size: 3em; + line-height: 1.5em; + height: 1.63332em; + width: 3em; + display: block; + position: absolute; + top: 10px; + left: 10px; + padding: 0; + cursor: pointer; + opacity: 1; + border: 0.06666em solid #fff; + background-color: #2B333F; + background-color: rgba(43, 51, 63, 0.7); + border-radius: 0.3em; + transition: all 0.4s; +} +.vjs-big-play-centered .vjs-big-play-button { + top: 50%; + left: 50%; + margin-top: -0.81666em; + margin-left: -1.5em; +} + +.video-js:hover .vjs-big-play-button, +.video-js .vjs-big-play-button:focus { + border-color: #fff; + background-color: #73859f; + background-color: rgba(115, 133, 159, 0.5); + transition: all 0s; +} + +.vjs-controls-disabled .vjs-big-play-button, +.vjs-has-started .vjs-big-play-button, +.vjs-using-native-controls .vjs-big-play-button, +.vjs-error .vjs-big-play-button { + display: none; +} + +.vjs-has-started.vjs-paused.vjs-show-big-play-button-on-pause .vjs-big-play-button { + display: block; +} + +.video-js button { + background: none; + border: none; + color: inherit; + display: inline-block; + font-size: inherit; + line-height: inherit; + text-transform: none; + text-decoration: none; + transition: none; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.vjs-control .vjs-button { + width: 100%; + height: 100%; +} + +.video-js .vjs-control.vjs-close-button { + cursor: pointer; + height: 3em; + position: absolute; + right: 0; + top: 0.5em; + z-index: 2; +} +.video-js .vjs-modal-dialog { + background: rgba(0, 0, 0, 0.8); + background: linear-gradient(180deg, rgba(0, 0, 0, 0.8), rgba(255, 255, 255, 0)); + overflow: auto; +} + +.video-js .vjs-modal-dialog > * { + box-sizing: border-box; +} + +.vjs-modal-dialog .vjs-modal-dialog-content { + font-size: 1.2em; + line-height: 1.5; + padding: 20px 24px; + z-index: 1; +} + +.vjs-menu-button { + cursor: pointer; +} + +.vjs-menu-button.vjs-disabled { + cursor: default; +} + +.vjs-workinghover .vjs-menu-button.vjs-disabled:hover .vjs-menu { + display: none; +} + +.vjs-menu .vjs-menu-content { + display: block; + padding: 0; + margin: 0; + font-family: Arial, Helvetica, sans-serif; + overflow: auto; +} + +.vjs-menu .vjs-menu-content > * { + box-sizing: border-box; +} + +.vjs-scrubbing .vjs-control.vjs-menu-button:hover .vjs-menu { + display: none; +} + +.vjs-menu li { + list-style: none; + margin: 0; + padding: 0.2em 0; + line-height: 1.4em; + font-size: 1.2em; + text-align: center; + text-transform: lowercase; +} + +.vjs-menu li.vjs-menu-item:focus, +.vjs-menu li.vjs-menu-item:hover, +.js-focus-visible .vjs-menu li.vjs-menu-item:hover { + background-color: #73859f; + background-color: rgba(115, 133, 159, 0.5); +} + +.vjs-menu li.vjs-selected, +.vjs-menu li.vjs-selected:focus, +.vjs-menu li.vjs-selected:hover, +.js-focus-visible .vjs-menu li.vjs-selected:hover { + background-color: #fff; + color: #2B333F; +} + +.video-js .vjs-menu *:not(.vjs-selected):focus:not(:focus-visible), +.js-focus-visible .vjs-menu *:not(.vjs-selected):focus:not(.focus-visible) { + background: none; +} + +.vjs-menu li.vjs-menu-title { + text-align: center; + text-transform: uppercase; + font-size: 1em; + line-height: 2em; + padding: 0; + margin: 0 0 0.3em 0; + font-weight: bold; + cursor: default; +} + +.vjs-menu-button-popup .vjs-menu { + display: none; + position: absolute; + bottom: 0; + width: 10em; + left: -3em; + height: 0em; + margin-bottom: 1.5em; + border-top-color: rgba(43, 51, 63, 0.7); +} + +.vjs-menu-button-popup .vjs-menu .vjs-menu-content { + background-color: #2B333F; + background-color: rgba(43, 51, 63, 0.7); + position: absolute; + width: 100%; + bottom: 1.5em; + max-height: 15em; +} + +.vjs-layout-tiny .vjs-menu-button-popup .vjs-menu .vjs-menu-content, +.vjs-layout-x-small .vjs-menu-button-popup .vjs-menu .vjs-menu-content { + max-height: 5em; +} + +.vjs-layout-small .vjs-menu-button-popup .vjs-menu .vjs-menu-content { + max-height: 10em; +} + +.vjs-layout-medium .vjs-menu-button-popup .vjs-menu .vjs-menu-content { + max-height: 14em; +} + +.vjs-layout-large .vjs-menu-button-popup .vjs-menu .vjs-menu-content, +.vjs-layout-x-large .vjs-menu-button-popup .vjs-menu .vjs-menu-content, +.vjs-layout-huge .vjs-menu-button-popup .vjs-menu .vjs-menu-content { + max-height: 25em; +} + +.vjs-workinghover .vjs-menu-button-popup.vjs-hover .vjs-menu, +.vjs-menu-button-popup .vjs-menu.vjs-lock-showing { + display: block; +} + +.video-js .vjs-menu-button-inline { + transition: all 0.4s; + overflow: hidden; +} + +.video-js .vjs-menu-button-inline:before { + width: 2.222222222em; +} + +.video-js .vjs-menu-button-inline:hover, +.video-js .vjs-menu-button-inline:focus, +.video-js .vjs-menu-button-inline.vjs-slider-active, +.video-js.vjs-no-flex .vjs-menu-button-inline { + width: 12em; +} + +.vjs-menu-button-inline .vjs-menu { + opacity: 0; + height: 100%; + width: auto; + position: absolute; + left: 4em; + top: 0; + padding: 0; + margin: 0; + transition: all 0.4s; +} + +.vjs-menu-button-inline:hover .vjs-menu, +.vjs-menu-button-inline:focus .vjs-menu, +.vjs-menu-button-inline.vjs-slider-active .vjs-menu { + display: block; + opacity: 1; +} + +.vjs-no-flex .vjs-menu-button-inline .vjs-menu { + display: block; + opacity: 1; + position: relative; + width: auto; +} + +.vjs-no-flex .vjs-menu-button-inline:hover .vjs-menu, +.vjs-no-flex .vjs-menu-button-inline:focus .vjs-menu, +.vjs-no-flex .vjs-menu-button-inline.vjs-slider-active .vjs-menu { + width: auto; +} + +.vjs-menu-button-inline .vjs-menu-content { + width: auto; + height: 100%; + margin: 0; + overflow: hidden; +} + +.video-js .vjs-control-bar { + display: none; + width: 100%; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 3em; + background-color: #2B333F; + background-color: rgba(43, 51, 63, 0.7); +} + +.vjs-has-started .vjs-control-bar { + display: flex; + visibility: visible; + opacity: 1; + transition: visibility 0.1s, opacity 0.1s; +} + +.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar { + visibility: visible; + opacity: 0; + transition: visibility 1s, opacity 1s; +} + +.vjs-controls-disabled .vjs-control-bar, +.vjs-using-native-controls .vjs-control-bar, +.vjs-error .vjs-control-bar { + display: none !important; +} + +.vjs-audio.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar { + opacity: 1; + visibility: visible; +} + +.vjs-has-started.vjs-no-flex .vjs-control-bar { + display: table; +} + +.video-js .vjs-control { + position: relative; + text-align: center; + margin: 0; + padding: 0; + height: 100%; + width: 4em; + flex: none; +} + +.vjs-button > .vjs-icon-placeholder:before { + font-size: 1.8em; + line-height: 1.67; +} + +.vjs-button > .vjs-icon-placeholder { + display: block; +} + +.video-js .vjs-control:focus:before, +.video-js .vjs-control:hover:before, +.video-js .vjs-control:focus { + text-shadow: 0em 0em 1em white; +} + +.video-js .vjs-control-text { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} + +.vjs-no-flex .vjs-control { + display: table-cell; + vertical-align: middle; +} + +.video-js .vjs-custom-control-spacer { + display: none; +} + +.video-js .vjs-progress-control { + cursor: pointer; + flex: auto; + display: flex; + align-items: center; + min-width: 4em; + touch-action: none; +} + +.video-js .vjs-progress-control.disabled { + cursor: default; +} + +.vjs-live .vjs-progress-control { + display: none; +} + +.vjs-liveui .vjs-progress-control { + display: flex; + align-items: center; +} + +.vjs-no-flex .vjs-progress-control { + width: auto; +} + +.video-js .vjs-progress-holder { + flex: auto; + transition: all 0.2s; + height: 0.3em; +} + +.video-js .vjs-progress-control .vjs-progress-holder { + margin: 0 10px; +} + +.video-js .vjs-progress-control:hover .vjs-progress-holder { + font-size: 1.6666666667em; +} + +.video-js .vjs-progress-control:hover .vjs-progress-holder.disabled { + font-size: 1em; +} + +.video-js .vjs-progress-holder .vjs-play-progress, +.video-js .vjs-progress-holder .vjs-load-progress, +.video-js .vjs-progress-holder .vjs-load-progress div { + position: absolute; + display: block; + height: 100%; + margin: 0; + padding: 0; + width: 0; +} + +.video-js .vjs-play-progress { + background-color: #fff; +} +.video-js .vjs-play-progress:before { + font-size: 0.9em; + position: absolute; + right: -0.5em; + top: -0.3333333333em; + z-index: 1; +} + +.video-js .vjs-load-progress { + background: rgba(115, 133, 159, 0.5); +} + +.video-js .vjs-load-progress div { + background: rgba(115, 133, 159, 0.75); +} + +.video-js .vjs-time-tooltip { + background-color: #fff; + background-color: rgba(255, 255, 255, 0.8); + border-radius: 0.3em; + color: #000; + float: right; + font-family: Arial, Helvetica, sans-serif; + font-size: 1em; + padding: 6px 8px 8px 8px; + pointer-events: none; + position: absolute; + top: -3.4em; + visibility: hidden; + z-index: 1; +} + +.video-js .vjs-progress-holder:focus .vjs-time-tooltip { + display: none; +} + +.video-js .vjs-progress-control:hover .vjs-time-tooltip, +.video-js .vjs-progress-control:hover .vjs-progress-holder:focus .vjs-time-tooltip { + display: block; + font-size: 0.6em; + visibility: visible; +} + +.video-js .vjs-progress-control.disabled:hover .vjs-time-tooltip { + font-size: 1em; +} + +.video-js .vjs-progress-control .vjs-mouse-display { + display: none; + position: absolute; + width: 1px; + height: 100%; + background-color: #000; + z-index: 1; +} + +.vjs-no-flex .vjs-progress-control .vjs-mouse-display { + z-index: 0; +} + +.video-js .vjs-progress-control:hover .vjs-mouse-display { + display: block; +} + +.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display { + visibility: hidden; + opacity: 0; + transition: visibility 1s, opacity 1s; +} + +.video-js.vjs-user-inactive.vjs-no-flex .vjs-progress-control .vjs-mouse-display { + display: none; +} + +.vjs-mouse-display .vjs-time-tooltip { + color: #fff; + background-color: #000; + background-color: rgba(0, 0, 0, 0.8); +} + +.video-js .vjs-slider { + position: relative; + cursor: pointer; + padding: 0; + margin: 0 0.45em 0 0.45em; + /* iOS Safari */ + -webkit-touch-callout: none; + /* Safari */ + -webkit-user-select: none; + /* Konqueror HTML */ + /* Firefox */ + -moz-user-select: none; + /* Internet Explorer/Edge */ + -ms-user-select: none; + /* Non-prefixed version, currently supported by Chrome and Opera */ + user-select: none; + background-color: #73859f; + background-color: rgba(115, 133, 159, 0.5); +} + +.video-js .vjs-slider.disabled { + cursor: default; +} + +.video-js .vjs-slider:focus { + text-shadow: 0em 0em 1em white; + box-shadow: 0 0 1em #fff; +} + +.video-js .vjs-mute-control { + cursor: pointer; + flex: none; +} +.video-js .vjs-volume-control { + cursor: pointer; + margin-right: 1em; + display: flex; +} + +.video-js .vjs-volume-control.vjs-volume-horizontal { + width: 5em; +} + +.video-js .vjs-volume-panel .vjs-volume-control { + visibility: visible; + opacity: 0; + width: 1px; + height: 1px; + margin-left: -1px; +} + +.video-js .vjs-volume-panel { + transition: width 1s; +} +.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control, .video-js .vjs-volume-panel:active .vjs-volume-control, .video-js .vjs-volume-panel:focus .vjs-volume-control, .video-js .vjs-volume-panel .vjs-volume-control:active, .video-js .vjs-volume-panel.vjs-hover .vjs-mute-control ~ .vjs-volume-control, .video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active { + visibility: visible; + opacity: 1; + position: relative; + transition: visibility 0.1s, opacity 0.1s, height 0.1s, width 0.1s, left 0s, top 0s; +} +.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-horizontal, .video-js .vjs-volume-panel.vjs-hover .vjs-mute-control ~ .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-horizontal { + width: 5em; + height: 3em; + margin-right: 0; +} +.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control.vjs-volume-vertical, .video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-vertical, .video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-vertical, .video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-vertical, .video-js .vjs-volume-panel.vjs-hover .vjs-mute-control ~ .vjs-volume-control.vjs-volume-vertical, .video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-vertical { + left: -3.5em; + transition: left 0s; +} +.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover, .video-js .vjs-volume-panel.vjs-volume-panel-horizontal:active, .video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active { + width: 10em; + transition: width 0.1s; +} +.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-mute-toggle-only { + width: 4em; +} + +.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical { + height: 8em; + width: 3em; + left: -3000em; + transition: visibility 1s, opacity 1s, height 1s 1s, width 1s 1s, left 1s 1s, top 1s 1s; +} + +.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-horizontal { + transition: visibility 1s, opacity 1s, height 1s 1s, width 1s, left 1s 1s, top 1s 1s; +} + +.video-js.vjs-no-flex .vjs-volume-panel .vjs-volume-control.vjs-volume-horizontal { + width: 5em; + height: 3em; + visibility: visible; + opacity: 1; + position: relative; + transition: none; +} + +.video-js.vjs-no-flex .vjs-volume-control.vjs-volume-vertical, +.video-js.vjs-no-flex .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical { + position: absolute; + bottom: 3em; + left: 0.5em; +} + +.video-js .vjs-volume-panel { + display: flex; +} + +.video-js .vjs-volume-bar { + margin: 1.35em 0.45em; +} + +.vjs-volume-bar.vjs-slider-horizontal { + width: 5em; + height: 0.3em; +} + +.vjs-volume-bar.vjs-slider-vertical { + width: 0.3em; + height: 5em; + margin: 1.35em auto; +} + +.video-js .vjs-volume-level { + position: absolute; + bottom: 0; + left: 0; + background-color: #fff; +} +.video-js .vjs-volume-level:before { + position: absolute; + font-size: 0.9em; + z-index: 1; +} + +.vjs-slider-vertical .vjs-volume-level { + width: 0.3em; +} +.vjs-slider-vertical .vjs-volume-level:before { + top: -0.5em; + left: -0.3em; + z-index: 1; +} + +.vjs-slider-horizontal .vjs-volume-level { + height: 0.3em; +} +.vjs-slider-horizontal .vjs-volume-level:before { + top: -0.3em; + right: -0.5em; +} + +.video-js .vjs-volume-panel.vjs-volume-panel-vertical { + width: 4em; +} + +.vjs-volume-bar.vjs-slider-vertical .vjs-volume-level { + height: 100%; +} + +.vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level { + width: 100%; +} + +.video-js .vjs-volume-vertical { + width: 3em; + height: 8em; + bottom: 8em; + background-color: #2B333F; + background-color: rgba(43, 51, 63, 0.7); +} + +.video-js .vjs-volume-horizontal .vjs-menu { + left: -2em; +} + +.video-js .vjs-volume-tooltip { + background-color: #fff; + background-color: rgba(255, 255, 255, 0.8); + border-radius: 0.3em; + color: #000; + float: right; + font-family: Arial, Helvetica, sans-serif; + font-size: 1em; + padding: 6px 8px 8px 8px; + pointer-events: none; + position: absolute; + top: -3.4em; + visibility: hidden; + z-index: 1; +} + +.video-js .vjs-volume-control:hover .vjs-volume-tooltip, +.video-js .vjs-volume-control:hover .vjs-progress-holder:focus .vjs-volume-tooltip { + display: block; + font-size: 1em; + visibility: visible; +} + +.video-js .vjs-volume-vertical:hover .vjs-volume-tooltip, +.video-js .vjs-volume-vertical:hover .vjs-progress-holder:focus .vjs-volume-tooltip { + left: 1em; + top: -12px; +} + +.video-js .vjs-volume-control.disabled:hover .vjs-volume-tooltip { + font-size: 1em; +} + +.video-js .vjs-volume-control .vjs-mouse-display { + display: none; + position: absolute; + width: 100%; + height: 1px; + background-color: #000; + z-index: 1; +} + +.video-js .vjs-volume-horizontal .vjs-mouse-display { + width: 1px; + height: 100%; +} + +.vjs-no-flex .vjs-volume-control .vjs-mouse-display { + z-index: 0; +} + +.video-js .vjs-volume-control:hover .vjs-mouse-display { + display: block; +} + +.video-js.vjs-user-inactive .vjs-volume-control .vjs-mouse-display { + visibility: hidden; + opacity: 0; + transition: visibility 1s, opacity 1s; +} + +.video-js.vjs-user-inactive.vjs-no-flex .vjs-volume-control .vjs-mouse-display { + display: none; +} + +.vjs-mouse-display .vjs-volume-tooltip { + color: #fff; + background-color: #000; + background-color: rgba(0, 0, 0, 0.8); +} + +.vjs-poster { + display: inline-block; + vertical-align: middle; + background-repeat: no-repeat; + background-position: 50% 50%; + background-size: contain; + background-color: #000000; + cursor: pointer; + margin: 0; + padding: 0; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + height: 100%; +} + +.vjs-has-started .vjs-poster { + display: none; +} + +.vjs-audio.vjs-has-started .vjs-poster { + display: block; +} + +.vjs-using-native-controls .vjs-poster { + display: none; +} + +.video-js .vjs-live-control { + display: flex; + align-items: flex-start; + flex: auto; + font-size: 1em; + line-height: 3em; +} + +.vjs-no-flex .vjs-live-control { + display: table-cell; + width: auto; + text-align: left; +} + +.video-js:not(.vjs-live) .vjs-live-control, +.video-js.vjs-liveui .vjs-live-control { + display: none; +} + +.video-js .vjs-seek-to-live-control { + align-items: center; + cursor: pointer; + flex: none; + display: inline-flex; + height: 100%; + padding-left: 0.5em; + padding-right: 0.5em; + font-size: 1em; + line-height: 3em; + width: auto; + min-width: 4em; +} + +.vjs-no-flex .vjs-seek-to-live-control { + display: table-cell; + width: auto; + text-align: left; +} + +.video-js.vjs-live:not(.vjs-liveui) .vjs-seek-to-live-control, +.video-js:not(.vjs-live) .vjs-seek-to-live-control { + display: none; +} + +.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge { + cursor: auto; +} + +.vjs-seek-to-live-control .vjs-icon-placeholder { + margin-right: 0.5em; + color: #888; +} + +.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge .vjs-icon-placeholder { + color: red; +} + +.video-js .vjs-time-control { + flex: none; + font-size: 1em; + line-height: 3em; + min-width: 2em; + width: auto; + padding-left: 1em; + padding-right: 1em; +} + +.vjs-live .vjs-time-control { + display: none; +} + +.video-js .vjs-current-time, +.vjs-no-flex .vjs-current-time { + display: none; +} + +.video-js .vjs-duration, +.vjs-no-flex .vjs-duration { + display: none; +} + +.vjs-time-divider { + display: none; + line-height: 3em; +} + +.vjs-live .vjs-time-divider { + display: none; +} + +.video-js .vjs-play-control { + cursor: pointer; +} + +.video-js .vjs-play-control .vjs-icon-placeholder { + flex: none; +} + +.vjs-text-track-display { + position: absolute; + bottom: 3em; + left: 0; + right: 0; + top: 0; + pointer-events: none; +} + +.video-js.vjs-user-inactive.vjs-playing .vjs-text-track-display { + bottom: 1em; +} + +.video-js .vjs-text-track { + font-size: 1.4em; + text-align: center; + margin-bottom: 0.1em; +} + +.vjs-subtitles { + color: #fff; +} + +.vjs-captions { + color: #fc6; +} + +.vjs-tt-cue { + display: block; +} + +video::-webkit-media-text-track-display { + transform: translateY(-3em); +} + +.video-js.vjs-user-inactive.vjs-playing video::-webkit-media-text-track-display { + transform: translateY(-1.5em); +} + +.video-js .vjs-picture-in-picture-control { + cursor: pointer; + flex: none; +} +.video-js .vjs-fullscreen-control { + cursor: pointer; + flex: none; +} +.vjs-playback-rate > .vjs-menu-button, +.vjs-playback-rate .vjs-playback-rate-value { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.vjs-playback-rate .vjs-playback-rate-value { + pointer-events: none; + font-size: 1.5em; + line-height: 2; + text-align: center; +} + +.vjs-playback-rate .vjs-menu { + width: 4em; + left: 0em; +} + +.vjs-error .vjs-error-display .vjs-modal-dialog-content { + font-size: 1.4em; + text-align: center; +} + +.vjs-error .vjs-error-display:before { + color: #fff; + content: "X"; + font-family: Arial, Helvetica, sans-serif; + font-size: 4em; + left: 0; + line-height: 1; + margin-top: -0.5em; + position: absolute; + text-shadow: 0.05em 0.05em 0.1em #000; + text-align: center; + top: 50%; + vertical-align: middle; + width: 100%; +} + +.vjs-loading-spinner { + display: none; + position: absolute; + top: 50%; + left: 50%; + margin: -25px 0 0 -25px; + opacity: 0.85; + text-align: left; + border: 6px solid rgba(43, 51, 63, 0.7); + box-sizing: border-box; + background-clip: padding-box; + width: 50px; + height: 50px; + border-radius: 25px; + visibility: hidden; +} + +.vjs-seeking .vjs-loading-spinner, +.vjs-waiting .vjs-loading-spinner { + display: block; + -webkit-animation: vjs-spinner-show 0s linear 0.3s forwards; + animation: vjs-spinner-show 0s linear 0.3s forwards; +} + +.vjs-loading-spinner:before, +.vjs-loading-spinner:after { + content: ""; + position: absolute; + margin: -6px; + box-sizing: inherit; + width: inherit; + height: inherit; + border-radius: inherit; + opacity: 1; + border: inherit; + border-color: transparent; + border-top-color: white; +} + +.vjs-seeking .vjs-loading-spinner:before, +.vjs-seeking .vjs-loading-spinner:after, +.vjs-waiting .vjs-loading-spinner:before, +.vjs-waiting .vjs-loading-spinner:after { + -webkit-animation: vjs-spinner-spin 1.1s cubic-bezier(0.6, 0.2, 0, 0.8) infinite, vjs-spinner-fade 1.1s linear infinite; + animation: vjs-spinner-spin 1.1s cubic-bezier(0.6, 0.2, 0, 0.8) infinite, vjs-spinner-fade 1.1s linear infinite; +} + +.vjs-seeking .vjs-loading-spinner:before, +.vjs-waiting .vjs-loading-spinner:before { + border-top-color: white; +} + +.vjs-seeking .vjs-loading-spinner:after, +.vjs-waiting .vjs-loading-spinner:after { + border-top-color: white; + -webkit-animation-delay: 0.44s; + animation-delay: 0.44s; +} + +@keyframes vjs-spinner-show { + to { + visibility: visible; + } +} +@-webkit-keyframes vjs-spinner-show { + to { + visibility: visible; + } +} +@keyframes vjs-spinner-spin { + 100% { + transform: rotate(360deg); + } +} +@-webkit-keyframes vjs-spinner-spin { + 100% { + -webkit-transform: rotate(360deg); + } +} +@keyframes vjs-spinner-fade { + 0% { + border-top-color: #73859f; + } + 20% { + border-top-color: #73859f; + } + 35% { + border-top-color: white; + } + 60% { + border-top-color: #73859f; + } + 100% { + border-top-color: #73859f; + } +} +@-webkit-keyframes vjs-spinner-fade { + 0% { + border-top-color: #73859f; + } + 20% { + border-top-color: #73859f; + } + 35% { + border-top-color: white; + } + 60% { + border-top-color: #73859f; + } + 100% { + border-top-color: #73859f; + } +} +.vjs-chapters-button .vjs-menu ul { + width: 24em; +} + +.video-js .vjs-subs-caps-button + .vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder { + vertical-align: middle; + display: inline-block; + margin-bottom: -0.1em; +} + +.video-js .vjs-subs-caps-button + .vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before { + font-family: VideoJS; + content: ""; + font-size: 1.5em; + line-height: inherit; +} + +.video-js .vjs-audio-button + .vjs-menu .vjs-main-desc-menu-item .vjs-menu-item-text .vjs-icon-placeholder { + vertical-align: middle; + display: inline-block; + margin-bottom: -0.1em; +} + +.video-js .vjs-audio-button + .vjs-menu .vjs-main-desc-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before { + font-family: VideoJS; + content: " "; + font-size: 1.5em; + line-height: inherit; +} + +.video-js.vjs-layout-small .vjs-current-time, +.video-js.vjs-layout-small .vjs-time-divider, +.video-js.vjs-layout-small .vjs-duration, +.video-js.vjs-layout-small .vjs-remaining-time, +.video-js.vjs-layout-small .vjs-playback-rate, +.video-js.vjs-layout-small .vjs-chapters-button, +.video-js.vjs-layout-small .vjs-descriptions-button, +.video-js.vjs-layout-small .vjs-captions-button, +.video-js.vjs-layout-small .vjs-subtitles-button, +.video-js.vjs-layout-small .vjs-audio-button, +.video-js.vjs-layout-small .vjs-volume-control, .video-js.vjs-layout-x-small .vjs-current-time, +.video-js.vjs-layout-x-small .vjs-time-divider, +.video-js.vjs-layout-x-small .vjs-duration, +.video-js.vjs-layout-x-small .vjs-remaining-time, +.video-js.vjs-layout-x-small .vjs-playback-rate, +.video-js.vjs-layout-x-small .vjs-chapters-button, +.video-js.vjs-layout-x-small .vjs-descriptions-button, +.video-js.vjs-layout-x-small .vjs-captions-button, +.video-js.vjs-layout-x-small .vjs-subtitles-button, +.video-js.vjs-layout-x-small .vjs-audio-button, +.video-js.vjs-layout-x-small .vjs-volume-control, .video-js.vjs-layout-tiny .vjs-current-time, +.video-js.vjs-layout-tiny .vjs-time-divider, +.video-js.vjs-layout-tiny .vjs-duration, +.video-js.vjs-layout-tiny .vjs-remaining-time, +.video-js.vjs-layout-tiny .vjs-playback-rate, +.video-js.vjs-layout-tiny .vjs-chapters-button, +.video-js.vjs-layout-tiny .vjs-descriptions-button, +.video-js.vjs-layout-tiny .vjs-captions-button, +.video-js.vjs-layout-tiny .vjs-subtitles-button, +.video-js.vjs-layout-tiny .vjs-audio-button, +.video-js.vjs-layout-tiny .vjs-volume-control { + display: none !important; +} +.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal:hover, +.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal:active, +.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active, .video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal:hover, +.video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal:active, +.video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active, .video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal:hover, +.video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal:active, +.video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active { + width: auto; + width: initial; +} +.video-js.vjs-layout-x-small:not(.vjs-liveui) .vjs-subs-caps-button, .video-js.vjs-layout-x-small:not(.vjs-live) .vjs-subs-caps-button, .video-js.vjs-layout-tiny .vjs-subs-caps-button { + display: none; +} +.video-js.vjs-layout-x-small.vjs-liveui .vjs-custom-control-spacer, .video-js.vjs-layout-tiny .vjs-custom-control-spacer { + flex: auto; + display: block; +} +.video-js.vjs-layout-x-small.vjs-liveui.vjs-no-flex .vjs-custom-control-spacer, .video-js.vjs-layout-tiny.vjs-no-flex .vjs-custom-control-spacer { + width: auto; +} +.video-js.vjs-layout-x-small.vjs-liveui .vjs-progress-control, .video-js.vjs-layout-tiny .vjs-progress-control { + display: none; +} + +.vjs-modal-dialog.vjs-text-track-settings { + background-color: #2B333F; + background-color: rgba(43, 51, 63, 0.75); + color: #fff; + height: 70%; +} + +.vjs-text-track-settings .vjs-modal-dialog-content { + display: table; +} + +.vjs-text-track-settings .vjs-track-settings-colors, +.vjs-text-track-settings .vjs-track-settings-font, +.vjs-text-track-settings .vjs-track-settings-controls { + display: table-cell; +} + +.vjs-text-track-settings .vjs-track-settings-controls { + text-align: right; + vertical-align: bottom; +} + +@supports (display: grid) { + .vjs-text-track-settings .vjs-modal-dialog-content { + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: 1fr; + padding: 20px 24px 0px 24px; + } + + .vjs-track-settings-controls .vjs-default-button { + margin-bottom: 20px; + } + + .vjs-text-track-settings .vjs-track-settings-controls { + grid-column: 1/-1; + } + + .vjs-layout-small .vjs-text-track-settings .vjs-modal-dialog-content, +.vjs-layout-x-small .vjs-text-track-settings .vjs-modal-dialog-content, +.vjs-layout-tiny .vjs-text-track-settings .vjs-modal-dialog-content { + grid-template-columns: 1fr; + } +} +.vjs-track-setting > select { + margin-right: 1em; + margin-bottom: 0.5em; +} + +.vjs-text-track-settings fieldset { + margin: 5px; + padding: 3px; + border: none; +} + +.vjs-text-track-settings fieldset span { + display: inline-block; +} + +.vjs-text-track-settings fieldset span > select { + max-width: 7.3em; +} + +.vjs-text-track-settings legend { + color: #fff; + margin: 0 0 5px 0; +} + +.vjs-text-track-settings .vjs-label { + position: absolute; + clip: rect(1px 1px 1px 1px); + clip: rect(1px, 1px, 1px, 1px); + display: block; + margin: 0 0 5px 0; + padding: 0; + border: 0; + height: 1px; + width: 1px; + overflow: hidden; +} + +.vjs-track-settings-controls button:focus, +.vjs-track-settings-controls button:active { + outline-style: solid; + outline-width: medium; + background-image: linear-gradient(0deg, #fff 88%, #73859f 100%); +} + +.vjs-track-settings-controls button:hover { + color: rgba(43, 51, 63, 0.75); +} + +.vjs-track-settings-controls button { + background-color: #fff; + background-image: linear-gradient(-180deg, #fff 88%, #73859f 100%); + color: #2B333F; + cursor: pointer; + border-radius: 2px; +} + +.vjs-track-settings-controls .vjs-default-button { + margin-right: 1em; +} + +@media print { + .video-js > *:not(.vjs-tech):not(.vjs-poster) { + visibility: hidden; + } +} +.vjs-resize-manager { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border: none; + z-index: -1000; +} + +.js-focus-visible .video-js *:focus:not(.focus-visible) { + outline: none; +} + +.video-js *:focus:not(:focus-visible) { + outline: none; +} diff --git a/public/js/video.js b/public/js/video.js new file mode 100644 index 0000000..d9237ee --- /dev/null +++ b/public/js/video.js @@ -0,0 +1,64464 @@ +/** + * @license + * Video.js 7.14.3 + * Copyright Brightcove, Inc. + * Available under Apache License Version 2.0 + * + * + * Includes vtt.js + * Available under Apache License Version 2.0 + * + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.videojs = factory()); +}(this, (function () { 'use strict'; + + var version$5 = "7.14.3"; + + var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + + function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; + } + + var win; + + if (typeof window !== "undefined") { + win = window; + } else if (typeof commonjsGlobal !== "undefined") { + win = commonjsGlobal; + } else if (typeof self !== "undefined") { + win = self; + } else { + win = {}; + } + + var window_1 = win; + + var minDoc = {}; + + var topLevel = typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : {}; + var doccy; + + if (typeof document !== 'undefined') { + doccy = document; + } else { + doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4']; + + if (!doccy) { + doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc; + } + } + + var document_1 = doccy; + + /** + * @file fullscreen-api.js + * @module fullscreen-api + * @private + */ + /** + * Store the browser-specific methods for the fullscreen API. + * + * @type {Object} + * @see [Specification]{@link https://fullscreen.spec.whatwg.org} + * @see [Map Approach From Screenfull.js]{@link https://github.com/sindresorhus/screenfull.js} + */ + + var FullscreenApi = { + prefixed: true + }; // browser API methods + + var apiMap = [['requestFullscreen', 'exitFullscreen', 'fullscreenElement', 'fullscreenEnabled', 'fullscreenchange', 'fullscreenerror', 'fullscreen'], // WebKit + ['webkitRequestFullscreen', 'webkitExitFullscreen', 'webkitFullscreenElement', 'webkitFullscreenEnabled', 'webkitfullscreenchange', 'webkitfullscreenerror', '-webkit-full-screen'], // Mozilla + ['mozRequestFullScreen', 'mozCancelFullScreen', 'mozFullScreenElement', 'mozFullScreenEnabled', 'mozfullscreenchange', 'mozfullscreenerror', '-moz-full-screen'], // Microsoft + ['msRequestFullscreen', 'msExitFullscreen', 'msFullscreenElement', 'msFullscreenEnabled', 'MSFullscreenChange', 'MSFullscreenError', '-ms-fullscreen']]; + var specApi = apiMap[0]; + var browserApi; // determine the supported set of functions + + for (var i = 0; i < apiMap.length; i++) { + // check for exitFullscreen function + if (apiMap[i][1] in document_1) { + browserApi = apiMap[i]; + break; + } + } // map the browser API names to the spec API names + + + if (browserApi) { + for (var _i = 0; _i < browserApi.length; _i++) { + FullscreenApi[specApi[_i]] = browserApi[_i]; + } + + FullscreenApi.prefixed = browserApi[0] !== specApi[0]; + } + + /** + * @file create-logger.js + * @module create-logger + */ + + var history = []; + /** + * Log messages to the console and history based on the type of message + * + * @private + * @param {string} type + * The name of the console method to use. + * + * @param {Array} args + * The arguments to be passed to the matching console method. + */ + + var LogByTypeFactory = function LogByTypeFactory(name, log) { + return function (type, level, args) { + var lvl = log.levels[level]; + var lvlRegExp = new RegExp("^(" + lvl + ")$"); + + if (type !== 'log') { + // Add the type to the front of the message when it's not "log". + args.unshift(type.toUpperCase() + ':'); + } // Add console prefix after adding to history. + + + args.unshift(name + ':'); // Add a clone of the args at this point to history. + + if (history) { + history.push([].concat(args)); // only store 1000 history entries + + var splice = history.length - 1000; + history.splice(0, splice > 0 ? splice : 0); + } // If there's no console then don't try to output messages, but they will + // still be stored in history. + + + if (!window_1.console) { + return; + } // Was setting these once outside of this function, but containing them + // in the function makes it easier to test cases where console doesn't exist + // when the module is executed. + + + var fn = window_1.console[type]; + + if (!fn && type === 'debug') { + // Certain browsers don't have support for console.debug. For those, we + // should default to the closest comparable log. + fn = window_1.console.info || window_1.console.log; + } // Bail out if there's no console or if this type is not allowed by the + // current logging level. + + + if (!fn || !lvl || !lvlRegExp.test(type)) { + return; + } + + fn[Array.isArray(args) ? 'apply' : 'call'](window_1.console, args); + }; + }; + + function createLogger$1(name) { + // This is the private tracking variable for logging level. + var level = 'info'; // the curried logByType bound to the specific log and history + + var logByType; + /** + * Logs plain debug messages. Similar to `console.log`. + * + * Due to [limitations](https://github.com/jsdoc3/jsdoc/issues/955#issuecomment-313829149) + * of our JSDoc template, we cannot properly document this as both a function + * and a namespace, so its function signature is documented here. + * + * #### Arguments + * ##### *args + * Mixed[] + * + * Any combination of values that could be passed to `console.log()`. + * + * #### Return Value + * + * `undefined` + * + * @namespace + * @param {Mixed[]} args + * One or more messages or objects that should be logged. + */ + + var log = function log() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + logByType('log', level, args); + }; // This is the logByType helper that the logging methods below use + + + logByType = LogByTypeFactory(name, log); + /** + * Create a new sublogger which chains the old name to the new name. + * + * For example, doing `videojs.log.createLogger('player')` and then using that logger will log the following: + * ```js + * mylogger('foo'); + * // > VIDEOJS: player: foo + * ``` + * + * @param {string} name + * The name to add call the new logger + * @return {Object} + */ + + log.createLogger = function (subname) { + return createLogger$1(name + ': ' + subname); + }; + /** + * Enumeration of available logging levels, where the keys are the level names + * and the values are `|`-separated strings containing logging methods allowed + * in that logging level. These strings are used to create a regular expression + * matching the function name being called. + * + * Levels provided by Video.js are: + * + * - `off`: Matches no calls. Any value that can be cast to `false` will have + * this effect. The most restrictive. + * - `all`: Matches only Video.js-provided functions (`debug`, `log`, + * `log.warn`, and `log.error`). + * - `debug`: Matches `log.debug`, `log`, `log.warn`, and `log.error` calls. + * - `info` (default): Matches `log`, `log.warn`, and `log.error` calls. + * - `warn`: Matches `log.warn` and `log.error` calls. + * - `error`: Matches only `log.error` calls. + * + * @type {Object} + */ + + + log.levels = { + all: 'debug|log|warn|error', + off: '', + debug: 'debug|log|warn|error', + info: 'log|warn|error', + warn: 'warn|error', + error: 'error', + DEFAULT: level + }; + /** + * Get or set the current logging level. + * + * If a string matching a key from {@link module:log.levels} is provided, acts + * as a setter. + * + * @param {string} [lvl] + * Pass a valid level to set a new logging level. + * + * @return {string} + * The current logging level. + */ + + log.level = function (lvl) { + if (typeof lvl === 'string') { + if (!log.levels.hasOwnProperty(lvl)) { + throw new Error("\"" + lvl + "\" in not a valid log level"); + } + + level = lvl; + } + + return level; + }; + /** + * Returns an array containing everything that has been logged to the history. + * + * This array is a shallow clone of the internal history record. However, its + * contents are _not_ cloned; so, mutating objects inside this array will + * mutate them in history. + * + * @return {Array} + */ + + + log.history = function () { + return history ? [].concat(history) : []; + }; + /** + * Allows you to filter the history by the given logger name + * + * @param {string} fname + * The name to filter by + * + * @return {Array} + * The filtered list to return + */ + + + log.history.filter = function (fname) { + return (history || []).filter(function (historyItem) { + // if the first item in each historyItem includes `fname`, then it's a match + return new RegExp(".*" + fname + ".*").test(historyItem[0]); + }); + }; + /** + * Clears the internal history tracking, but does not prevent further history + * tracking. + */ + + + log.history.clear = function () { + if (history) { + history.length = 0; + } + }; + /** + * Disable history tracking if it is currently enabled. + */ + + + log.history.disable = function () { + if (history !== null) { + history.length = 0; + history = null; + } + }; + /** + * Enable history tracking if it is currently disabled. + */ + + + log.history.enable = function () { + if (history === null) { + history = []; + } + }; + /** + * Logs error messages. Similar to `console.error`. + * + * @param {Mixed[]} args + * One or more messages or objects that should be logged as an error + */ + + + log.error = function () { + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + + return logByType('error', level, args); + }; + /** + * Logs warning messages. Similar to `console.warn`. + * + * @param {Mixed[]} args + * One or more messages or objects that should be logged as a warning. + */ + + + log.warn = function () { + for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + args[_key3] = arguments[_key3]; + } + + return logByType('warn', level, args); + }; + /** + * Logs debug messages. Similar to `console.debug`, but may also act as a comparable + * log if `console.debug` is not available + * + * @param {Mixed[]} args + * One or more messages or objects that should be logged as debug. + */ + + + log.debug = function () { + for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + args[_key4] = arguments[_key4]; + } + + return logByType('debug', level, args); + }; + + return log; + } + + /** + * @file log.js + * @module log + */ + var log$1 = createLogger$1('VIDEOJS'); + var createLogger = log$1.createLogger; + + var _extends_1 = createCommonjsModule(function (module) { + function _extends() { + module.exports = _extends = Object.assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; + }; + + return _extends.apply(this, arguments); + } + + module.exports = _extends; + }); + + /** + * @file obj.js + * @module obj + */ + + /** + * @callback obj:EachCallback + * + * @param {Mixed} value + * The current key for the object that is being iterated over. + * + * @param {string} key + * The current key-value for object that is being iterated over + */ + + /** + * @callback obj:ReduceCallback + * + * @param {Mixed} accum + * The value that is accumulating over the reduce loop. + * + * @param {Mixed} value + * The current key for the object that is being iterated over. + * + * @param {string} key + * The current key-value for object that is being iterated over + * + * @return {Mixed} + * The new accumulated value. + */ + var toString$1 = Object.prototype.toString; + /** + * Get the keys of an Object + * + * @param {Object} + * The Object to get the keys from + * + * @return {string[]} + * An array of the keys from the object. Returns an empty array if the + * object passed in was invalid or had no keys. + * + * @private + */ + + var keys = function keys(object) { + return isObject$1(object) ? Object.keys(object) : []; + }; + /** + * Array-like iteration for objects. + * + * @param {Object} object + * The object to iterate over + * + * @param {obj:EachCallback} fn + * The callback function which is called for each key in the object. + */ + + + function each(object, fn) { + keys(object).forEach(function (key) { + return fn(object[key], key); + }); + } + /** + * Array-like reduce for objects. + * + * @param {Object} object + * The Object that you want to reduce. + * + * @param {Function} fn + * A callback function which is called for each key in the object. It + * receives the accumulated value and the per-iteration value and key + * as arguments. + * + * @param {Mixed} [initial = 0] + * Starting value + * + * @return {Mixed} + * The final accumulated value. + */ + + function reduce(object, fn, initial) { + if (initial === void 0) { + initial = 0; + } + + return keys(object).reduce(function (accum, key) { + return fn(accum, object[key], key); + }, initial); + } + /** + * Object.assign-style object shallow merge/extend. + * + * @param {Object} target + * @param {Object} ...sources + * @return {Object} + */ + + function assign(target) { + for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + sources[_key - 1] = arguments[_key]; + } + + if (Object.assign) { + return _extends_1.apply(void 0, [target].concat(sources)); + } + + sources.forEach(function (source) { + if (!source) { + return; + } + + each(source, function (value, key) { + target[key] = value; + }); + }); + return target; + } + /** + * Returns whether a value is an object of any kind - including DOM nodes, + * arrays, regular expressions, etc. Not functions, though. + * + * This avoids the gotcha where using `typeof` on a `null` value + * results in `'object'`. + * + * @param {Object} value + * @return {boolean} + */ + + function isObject$1(value) { + return !!value && typeof value === 'object'; + } + /** + * Returns whether an object appears to be a "plain" object - that is, a + * direct instance of `Object`. + * + * @param {Object} value + * @return {boolean} + */ + + function isPlain(value) { + return isObject$1(value) && toString$1.call(value) === '[object Object]' && value.constructor === Object; + } + + /** + * @file computed-style.js + * @module computed-style + */ + /** + * A safe getComputedStyle. + * + * This is needed because in Firefox, if the player is loaded in an iframe with + * `display:none`, then `getComputedStyle` returns `null`, so, we do a + * null-check to make sure that the player doesn't break in these cases. + * + * @function + * @param {Element} el + * The element you want the computed style of + * + * @param {string} prop + * The property name you want + * + * @see https://bugzilla.mozilla.org/show_bug.cgi?id=548397 + */ + + function computedStyle(el, prop) { + if (!el || !prop) { + return ''; + } + + if (typeof window_1.getComputedStyle === 'function') { + var computedStyleValue; + + try { + computedStyleValue = window_1.getComputedStyle(el); + } catch (e) { + return ''; + } + + return computedStyleValue ? computedStyleValue.getPropertyValue(prop) || computedStyleValue[prop] : ''; + } + + return ''; + } + + /** + * @file browser.js + * @module browser + */ + var USER_AGENT = window_1.navigator && window_1.navigator.userAgent || ''; + var webkitVersionMap = /AppleWebKit\/([\d.]+)/i.exec(USER_AGENT); + var appleWebkitVersion = webkitVersionMap ? parseFloat(webkitVersionMap.pop()) : null; + /** + * Whether or not this device is an iPod. + * + * @static + * @const + * @type {Boolean} + */ + + var IS_IPOD = /iPod/i.test(USER_AGENT); + /** + * The detected iOS version - or `null`. + * + * @static + * @const + * @type {string|null} + */ + + var IOS_VERSION = function () { + var match = USER_AGENT.match(/OS (\d+)_/i); + + if (match && match[1]) { + return match[1]; + } + + return null; + }(); + /** + * Whether or not this is an Android device. + * + * @static + * @const + * @type {Boolean} + */ + + var IS_ANDROID = /Android/i.test(USER_AGENT); + /** + * The detected Android version - or `null`. + * + * @static + * @const + * @type {number|string|null} + */ + + var ANDROID_VERSION = function () { + // This matches Android Major.Minor.Patch versions + // ANDROID_VERSION is Major.Minor as a Number, if Minor isn't available, then only Major is returned + var match = USER_AGENT.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i); + + if (!match) { + return null; + } + + var major = match[1] && parseFloat(match[1]); + var minor = match[2] && parseFloat(match[2]); + + if (major && minor) { + return parseFloat(match[1] + '.' + match[2]); + } else if (major) { + return major; + } + + return null; + }(); + /** + * Whether or not this is a native Android browser. + * + * @static + * @const + * @type {Boolean} + */ + + var IS_NATIVE_ANDROID = IS_ANDROID && ANDROID_VERSION < 5 && appleWebkitVersion < 537; + /** + * Whether or not this is Mozilla Firefox. + * + * @static + * @const + * @type {Boolean} + */ + + var IS_FIREFOX = /Firefox/i.test(USER_AGENT); + /** + * Whether or not this is Microsoft Edge. + * + * @static + * @const + * @type {Boolean} + */ + + var IS_EDGE = /Edg/i.test(USER_AGENT); + /** + * Whether or not this is Google Chrome. + * + * This will also be `true` for Chrome on iOS, which will have different support + * as it is actually Safari under the hood. + * + * @static + * @const + * @type {Boolean} + */ + + var IS_CHROME = !IS_EDGE && (/Chrome/i.test(USER_AGENT) || /CriOS/i.test(USER_AGENT)); + /** + * The detected Google Chrome version - or `null`. + * + * @static + * @const + * @type {number|null} + */ + + var CHROME_VERSION = function () { + var match = USER_AGENT.match(/(Chrome|CriOS)\/(\d+)/); + + if (match && match[2]) { + return parseFloat(match[2]); + } + + return null; + }(); + /** + * The detected Internet Explorer version - or `null`. + * + * @static + * @const + * @type {number|null} + */ + + var IE_VERSION = function () { + var result = /MSIE\s(\d+)\.\d/.exec(USER_AGENT); + var version = result && parseFloat(result[1]); + + if (!version && /Trident\/7.0/i.test(USER_AGENT) && /rv:11.0/.test(USER_AGENT)) { + // IE 11 has a different user agent string than other IE versions + version = 11.0; + } + + return version; + }(); + /** + * Whether or not this is desktop Safari. + * + * @static + * @const + * @type {Boolean} + */ + + var IS_SAFARI = /Safari/i.test(USER_AGENT) && !IS_CHROME && !IS_ANDROID && !IS_EDGE; + /** + * Whether or not this is a Windows machine. + * + * @static + * @const + * @type {Boolean} + */ + + var IS_WINDOWS = /Windows/i.test(USER_AGENT); + /** + * Whether or not this device is touch-enabled. + * + * @static + * @const + * @type {Boolean} + */ + + var TOUCH_ENABLED = Boolean(isReal() && ('ontouchstart' in window_1 || window_1.navigator.maxTouchPoints || window_1.DocumentTouch && window_1.document instanceof window_1.DocumentTouch)); + /** + * Whether or not this device is an iPad. + * + * @static + * @const + * @type {Boolean} + */ + + var IS_IPAD = /iPad/i.test(USER_AGENT) || IS_SAFARI && TOUCH_ENABLED && !/iPhone/i.test(USER_AGENT); + /** + * Whether or not this device is an iPhone. + * + * @static + * @const + * @type {Boolean} + */ + // The Facebook app's UIWebView identifies as both an iPhone and iPad, so + // to identify iPhones, we need to exclude iPads. + // http://artsy.github.io/blog/2012/10/18/the-perils-of-ios-user-agent-sniffing/ + + var IS_IPHONE = /iPhone/i.test(USER_AGENT) && !IS_IPAD; + /** + * Whether or not this is an iOS device. + * + * @static + * @const + * @type {Boolean} + */ + + var IS_IOS = IS_IPHONE || IS_IPAD || IS_IPOD; + /** + * Whether or not this is any flavor of Safari - including iOS. + * + * @static + * @const + * @type {Boolean} + */ + + var IS_ANY_SAFARI = (IS_SAFARI || IS_IOS) && !IS_CHROME; + + var browser = /*#__PURE__*/Object.freeze({ + __proto__: null, + IS_IPOD: IS_IPOD, + IOS_VERSION: IOS_VERSION, + IS_ANDROID: IS_ANDROID, + ANDROID_VERSION: ANDROID_VERSION, + IS_NATIVE_ANDROID: IS_NATIVE_ANDROID, + IS_FIREFOX: IS_FIREFOX, + IS_EDGE: IS_EDGE, + IS_CHROME: IS_CHROME, + CHROME_VERSION: CHROME_VERSION, + IE_VERSION: IE_VERSION, + IS_SAFARI: IS_SAFARI, + IS_WINDOWS: IS_WINDOWS, + TOUCH_ENABLED: TOUCH_ENABLED, + IS_IPAD: IS_IPAD, + IS_IPHONE: IS_IPHONE, + IS_IOS: IS_IOS, + IS_ANY_SAFARI: IS_ANY_SAFARI + }); + + /** + * @file dom.js + * @module dom + */ + /** + * Detect if a value is a string with any non-whitespace characters. + * + * @private + * @param {string} str + * The string to check + * + * @return {boolean} + * Will be `true` if the string is non-blank, `false` otherwise. + * + */ + + function isNonBlankString(str) { + // we use str.trim as it will trim any whitespace characters + // from the front or back of non-whitespace characters. aka + // Any string that contains non-whitespace characters will + // still contain them after `trim` but whitespace only strings + // will have a length of 0, failing this check. + return typeof str === 'string' && Boolean(str.trim()); + } + /** + * Throws an error if the passed string has whitespace. This is used by + * class methods to be relatively consistent with the classList API. + * + * @private + * @param {string} str + * The string to check for whitespace. + * + * @throws {Error} + * Throws an error if there is whitespace in the string. + */ + + + function throwIfWhitespace(str) { + // str.indexOf instead of regex because str.indexOf is faster performance wise. + if (str.indexOf(' ') >= 0) { + throw new Error('class has illegal whitespace characters'); + } + } + /** + * Produce a regular expression for matching a className within an elements className. + * + * @private + * @param {string} className + * The className to generate the RegExp for. + * + * @return {RegExp} + * The RegExp that will check for a specific `className` in an elements + * className. + */ + + + function classRegExp(className) { + return new RegExp('(^|\\s)' + className + '($|\\s)'); + } + /** + * Whether the current DOM interface appears to be real (i.e. not simulated). + * + * @return {boolean} + * Will be `true` if the DOM appears to be real, `false` otherwise. + */ + + + function isReal() { + // Both document and window will never be undefined thanks to `global`. + return document_1 === window_1.document; + } + /** + * Determines, via duck typing, whether or not a value is a DOM element. + * + * @param {Mixed} value + * The value to check. + * + * @return {boolean} + * Will be `true` if the value is a DOM element, `false` otherwise. + */ + + function isEl(value) { + return isObject$1(value) && value.nodeType === 1; + } + /** + * Determines if the current DOM is embedded in an iframe. + * + * @return {boolean} + * Will be `true` if the DOM is embedded in an iframe, `false` + * otherwise. + */ + + function isInFrame() { + // We need a try/catch here because Safari will throw errors when attempting + // to get either `parent` or `self` + try { + return window_1.parent !== window_1.self; + } catch (x) { + return true; + } + } + /** + * Creates functions to query the DOM using a given method. + * + * @private + * @param {string} method + * The method to create the query with. + * + * @return {Function} + * The query method + */ + + function createQuerier(method) { + return function (selector, context) { + if (!isNonBlankString(selector)) { + return document_1[method](null); + } + + if (isNonBlankString(context)) { + context = document_1.querySelector(context); + } + + var ctx = isEl(context) ? context : document_1; + return ctx[method] && ctx[method](selector); + }; + } + /** + * Creates an element and applies properties, attributes, and inserts content. + * + * @param {string} [tagName='div'] + * Name of tag to be created. + * + * @param {Object} [properties={}] + * Element properties to be applied. + * + * @param {Object} [attributes={}] + * Element attributes to be applied. + * + * @param {module:dom~ContentDescriptor} content + * A content descriptor object. + * + * @return {Element} + * The element that was created. + */ + + + function createEl(tagName, properties, attributes, content) { + if (tagName === void 0) { + tagName = 'div'; + } + + if (properties === void 0) { + properties = {}; + } + + if (attributes === void 0) { + attributes = {}; + } + + var el = document_1.createElement(tagName); + Object.getOwnPropertyNames(properties).forEach(function (propName) { + var val = properties[propName]; // See #2176 + // We originally were accepting both properties and attributes in the + // same object, but that doesn't work so well. + + if (propName.indexOf('aria-') !== -1 || propName === 'role' || propName === 'type') { + log$1.warn('Setting attributes in the second argument of createEl()\n' + 'has been deprecated. Use the third argument instead.\n' + ("createEl(type, properties, attributes). Attempting to set " + propName + " to " + val + ".")); + el.setAttribute(propName, val); // Handle textContent since it's not supported everywhere and we have a + // method for it. + } else if (propName === 'textContent') { + textContent(el, val); + } else if (el[propName] !== val || propName === 'tabIndex') { + el[propName] = val; + } + }); + Object.getOwnPropertyNames(attributes).forEach(function (attrName) { + el.setAttribute(attrName, attributes[attrName]); + }); + + if (content) { + appendContent(el, content); + } + + return el; + } + /** + * Injects text into an element, replacing any existing contents entirely. + * + * @param {Element} el + * The element to add text content into + * + * @param {string} text + * The text content to add. + * + * @return {Element} + * The element with added text content. + */ + + function textContent(el, text) { + if (typeof el.textContent === 'undefined') { + el.innerText = text; + } else { + el.textContent = text; + } + + return el; + } + /** + * Insert an element as the first child node of another + * + * @param {Element} child + * Element to insert + * + * @param {Element} parent + * Element to insert child into + */ + + function prependTo(child, parent) { + if (parent.firstChild) { + parent.insertBefore(child, parent.firstChild); + } else { + parent.appendChild(child); + } + } + /** + * Check if an element has a class name. + * + * @param {Element} element + * Element to check + * + * @param {string} classToCheck + * Class name to check for + * + * @return {boolean} + * Will be `true` if the element has a class, `false` otherwise. + * + * @throws {Error} + * Throws an error if `classToCheck` has white space. + */ + + function hasClass(element, classToCheck) { + throwIfWhitespace(classToCheck); + + if (element.classList) { + return element.classList.contains(classToCheck); + } + + return classRegExp(classToCheck).test(element.className); + } + /** + * Add a class name to an element. + * + * @param {Element} element + * Element to add class name to. + * + * @param {string} classToAdd + * Class name to add. + * + * @return {Element} + * The DOM element with the added class name. + */ + + function addClass(element, classToAdd) { + if (element.classList) { + element.classList.add(classToAdd); // Don't need to `throwIfWhitespace` here because `hasElClass` will do it + // in the case of classList not being supported. + } else if (!hasClass(element, classToAdd)) { + element.className = (element.className + ' ' + classToAdd).trim(); + } + + return element; + } + /** + * Remove a class name from an element. + * + * @param {Element} element + * Element to remove a class name from. + * + * @param {string} classToRemove + * Class name to remove + * + * @return {Element} + * The DOM element with class name removed. + */ + + function removeClass(element, classToRemove) { + // Protect in case the player gets disposed + if (!element) { + log$1.warn("removeClass was called with an element that doesn't exist"); + return null; + } + + if (element.classList) { + element.classList.remove(classToRemove); + } else { + throwIfWhitespace(classToRemove); + element.className = element.className.split(/\s+/).filter(function (c) { + return c !== classToRemove; + }).join(' '); + } + + return element; + } + /** + * The callback definition for toggleClass. + * + * @callback module:dom~PredicateCallback + * @param {Element} element + * The DOM element of the Component. + * + * @param {string} classToToggle + * The `className` that wants to be toggled + * + * @return {boolean|undefined} + * If `true` is returned, the `classToToggle` will be added to the + * `element`. If `false`, the `classToToggle` will be removed from + * the `element`. If `undefined`, the callback will be ignored. + */ + + /** + * Adds or removes a class name to/from an element depending on an optional + * condition or the presence/absence of the class name. + * + * @param {Element} element + * The element to toggle a class name on. + * + * @param {string} classToToggle + * The class that should be toggled. + * + * @param {boolean|module:dom~PredicateCallback} [predicate] + * See the return value for {@link module:dom~PredicateCallback} + * + * @return {Element} + * The element with a class that has been toggled. + */ + + function toggleClass(element, classToToggle, predicate) { + // This CANNOT use `classList` internally because IE11 does not support the + // second parameter to the `classList.toggle()` method! Which is fine because + // `classList` will be used by the add/remove functions. + var has = hasClass(element, classToToggle); + + if (typeof predicate === 'function') { + predicate = predicate(element, classToToggle); + } + + if (typeof predicate !== 'boolean') { + predicate = !has; + } // If the necessary class operation matches the current state of the + // element, no action is required. + + + if (predicate === has) { + return; + } + + if (predicate) { + addClass(element, classToToggle); + } else { + removeClass(element, classToToggle); + } + + return element; + } + /** + * Apply attributes to an HTML element. + * + * @param {Element} el + * Element to add attributes to. + * + * @param {Object} [attributes] + * Attributes to be applied. + */ + + function setAttributes(el, attributes) { + Object.getOwnPropertyNames(attributes).forEach(function (attrName) { + var attrValue = attributes[attrName]; + + if (attrValue === null || typeof attrValue === 'undefined' || attrValue === false) { + el.removeAttribute(attrName); + } else { + el.setAttribute(attrName, attrValue === true ? '' : attrValue); + } + }); + } + /** + * Get an element's attribute values, as defined on the HTML tag. + * + * Attributes are not the same as properties. They're defined on the tag + * or with setAttribute. + * + * @param {Element} tag + * Element from which to get tag attributes. + * + * @return {Object} + * All attributes of the element. Boolean attributes will be `true` or + * `false`, others will be strings. + */ + + function getAttributes(tag) { + var obj = {}; // known boolean attributes + // we can check for matching boolean properties, but not all browsers + // and not all tags know about these attributes, so, we still want to check them manually + + var knownBooleans = ',' + 'autoplay,controls,playsinline,loop,muted,default,defaultMuted' + ','; + + if (tag && tag.attributes && tag.attributes.length > 0) { + var attrs = tag.attributes; + + for (var i = attrs.length - 1; i >= 0; i--) { + var attrName = attrs[i].name; + var attrVal = attrs[i].value; // check for known booleans + // the matching element property will return a value for typeof + + if (typeof tag[attrName] === 'boolean' || knownBooleans.indexOf(',' + attrName + ',') !== -1) { + // the value of an included boolean attribute is typically an empty + // string ('') which would equal false if we just check for a false value. + // we also don't want support bad code like autoplay='false' + attrVal = attrVal !== null ? true : false; + } + + obj[attrName] = attrVal; + } + } + + return obj; + } + /** + * Get the value of an element's attribute. + * + * @param {Element} el + * A DOM element. + * + * @param {string} attribute + * Attribute to get the value of. + * + * @return {string} + * The value of the attribute. + */ + + function getAttribute(el, attribute) { + return el.getAttribute(attribute); + } + /** + * Set the value of an element's attribute. + * + * @param {Element} el + * A DOM element. + * + * @param {string} attribute + * Attribute to set. + * + * @param {string} value + * Value to set the attribute to. + */ + + function setAttribute(el, attribute, value) { + el.setAttribute(attribute, value); + } + /** + * Remove an element's attribute. + * + * @param {Element} el + * A DOM element. + * + * @param {string} attribute + * Attribute to remove. + */ + + function removeAttribute(el, attribute) { + el.removeAttribute(attribute); + } + /** + * Attempt to block the ability to select text. + */ + + function blockTextSelection() { + document_1.body.focus(); + + document_1.onselectstart = function () { + return false; + }; + } + /** + * Turn off text selection blocking. + */ + + function unblockTextSelection() { + document_1.onselectstart = function () { + return true; + }; + } + /** + * Identical to the native `getBoundingClientRect` function, but ensures that + * the method is supported at all (it is in all browsers we claim to support) + * and that the element is in the DOM before continuing. + * + * This wrapper function also shims properties which are not provided by some + * older browsers (namely, IE8). + * + * Additionally, some browsers do not support adding properties to a + * `ClientRect`/`DOMRect` object; so, we shallow-copy it with the standard + * properties (except `x` and `y` which are not widely supported). This helps + * avoid implementations where keys are non-enumerable. + * + * @param {Element} el + * Element whose `ClientRect` we want to calculate. + * + * @return {Object|undefined} + * Always returns a plain object - or `undefined` if it cannot. + */ + + function getBoundingClientRect(el) { + if (el && el.getBoundingClientRect && el.parentNode) { + var rect = el.getBoundingClientRect(); + var result = {}; + ['bottom', 'height', 'left', 'right', 'top', 'width'].forEach(function (k) { + if (rect[k] !== undefined) { + result[k] = rect[k]; + } + }); + + if (!result.height) { + result.height = parseFloat(computedStyle(el, 'height')); + } + + if (!result.width) { + result.width = parseFloat(computedStyle(el, 'width')); + } + + return result; + } + } + /** + * Represents the position of a DOM element on the page. + * + * @typedef {Object} module:dom~Position + * + * @property {number} left + * Pixels to the left. + * + * @property {number} top + * Pixels from the top. + */ + + /** + * Get the position of an element in the DOM. + * + * Uses `getBoundingClientRect` technique from John Resig. + * + * @see http://ejohn.org/blog/getboundingclientrect-is-awesome/ + * + * @param {Element} el + * Element from which to get offset. + * + * @return {module:dom~Position} + * The position of the element that was passed in. + */ + + function findPosition(el) { + if (!el || el && !el.offsetParent) { + return { + left: 0, + top: 0, + width: 0, + height: 0 + }; + } + + var width = el.offsetWidth; + var height = el.offsetHeight; + var left = 0; + var top = 0; + + while (el.offsetParent && el !== document_1[FullscreenApi.fullscreenElement]) { + left += el.offsetLeft; + top += el.offsetTop; + el = el.offsetParent; + } + + return { + left: left, + top: top, + width: width, + height: height + }; + } + /** + * Represents x and y coordinates for a DOM element or mouse pointer. + * + * @typedef {Object} module:dom~Coordinates + * + * @property {number} x + * x coordinate in pixels + * + * @property {number} y + * y coordinate in pixels + */ + + /** + * Get the pointer position within an element. + * + * The base on the coordinates are the bottom left of the element. + * + * @param {Element} el + * Element on which to get the pointer position on. + * + * @param {EventTarget~Event} event + * Event object. + * + * @return {module:dom~Coordinates} + * A coordinates object corresponding to the mouse position. + * + */ + + function getPointerPosition(el, event) { + var translated = { + x: 0, + y: 0 + }; + + if (IS_IOS) { + var item = el; + + while (item && item.nodeName.toLowerCase() !== 'html') { + var transform = computedStyle(item, 'transform'); + + if (/^matrix/.test(transform)) { + var values = transform.slice(7, -1).split(/,\s/).map(Number); + translated.x += values[4]; + translated.y += values[5]; + } else if (/^matrix3d/.test(transform)) { + var _values = transform.slice(9, -1).split(/,\s/).map(Number); + + translated.x += _values[12]; + translated.y += _values[13]; + } + + item = item.parentNode; + } + } + + var position = {}; + var boxTarget = findPosition(event.target); + var box = findPosition(el); + var boxW = box.width; + var boxH = box.height; + var offsetY = event.offsetY - (box.top - boxTarget.top); + var offsetX = event.offsetX - (box.left - boxTarget.left); + + if (event.changedTouches) { + offsetX = event.changedTouches[0].pageX - box.left; + offsetY = event.changedTouches[0].pageY + box.top; + + if (IS_IOS) { + offsetX -= translated.x; + offsetY -= translated.y; + } + } + + position.y = 1 - Math.max(0, Math.min(1, offsetY / boxH)); + position.x = Math.max(0, Math.min(1, offsetX / boxW)); + return position; + } + /** + * Determines, via duck typing, whether or not a value is a text node. + * + * @param {Mixed} value + * Check if this value is a text node. + * + * @return {boolean} + * Will be `true` if the value is a text node, `false` otherwise. + */ + + function isTextNode(value) { + return isObject$1(value) && value.nodeType === 3; + } + /** + * Empties the contents of an element. + * + * @param {Element} el + * The element to empty children from + * + * @return {Element} + * The element with no children + */ + + function emptyEl(el) { + while (el.firstChild) { + el.removeChild(el.firstChild); + } + + return el; + } + /** + * This is a mixed value that describes content to be injected into the DOM + * via some method. It can be of the following types: + * + * Type | Description + * -----------|------------- + * `string` | The value will be normalized into a text node. + * `Element` | The value will be accepted as-is. + * `TextNode` | The value will be accepted as-is. + * `Array` | A one-dimensional array of strings, elements, text nodes, or functions. These functions should return a string, element, or text node (any other return value, like an array, will be ignored). + * `Function` | A function, which is expected to return a string, element, text node, or array - any of the other possible values described above. This means that a content descriptor could be a function that returns an array of functions, but those second-level functions must return strings, elements, or text nodes. + * + * @typedef {string|Element|TextNode|Array|Function} module:dom~ContentDescriptor + */ + + /** + * Normalizes content for eventual insertion into the DOM. + * + * This allows a wide range of content definition methods, but helps protect + * from falling into the trap of simply writing to `innerHTML`, which could + * be an XSS concern. + * + * The content for an element can be passed in multiple types and + * combinations, whose behavior is as follows: + * + * @param {module:dom~ContentDescriptor} content + * A content descriptor value. + * + * @return {Array} + * All of the content that was passed in, normalized to an array of + * elements or text nodes. + */ + + function normalizeContent(content) { + // First, invoke content if it is a function. If it produces an array, + // that needs to happen before normalization. + if (typeof content === 'function') { + content = content(); + } // Next up, normalize to an array, so one or many items can be normalized, + // filtered, and returned. + + + return (Array.isArray(content) ? content : [content]).map(function (value) { + // First, invoke value if it is a function to produce a new value, + // which will be subsequently normalized to a Node of some kind. + if (typeof value === 'function') { + value = value(); + } + + if (isEl(value) || isTextNode(value)) { + return value; + } + + if (typeof value === 'string' && /\S/.test(value)) { + return document_1.createTextNode(value); + } + }).filter(function (value) { + return value; + }); + } + /** + * Normalizes and appends content to an element. + * + * @param {Element} el + * Element to append normalized content to. + * + * @param {module:dom~ContentDescriptor} content + * A content descriptor value. + * + * @return {Element} + * The element with appended normalized content. + */ + + function appendContent(el, content) { + normalizeContent(content).forEach(function (node) { + return el.appendChild(node); + }); + return el; + } + /** + * Normalizes and inserts content into an element; this is identical to + * `appendContent()`, except it empties the element first. + * + * @param {Element} el + * Element to insert normalized content into. + * + * @param {module:dom~ContentDescriptor} content + * A content descriptor value. + * + * @return {Element} + * The element with inserted normalized content. + */ + + function insertContent(el, content) { + return appendContent(emptyEl(el), content); + } + /** + * Check if an event was a single left click. + * + * @param {EventTarget~Event} event + * Event object. + * + * @return {boolean} + * Will be `true` if a single left click, `false` otherwise. + */ + + function isSingleLeftClick(event) { + // Note: if you create something draggable, be sure to + // call it on both `mousedown` and `mousemove` event, + // otherwise `mousedown` should be enough for a button + if (event.button === undefined && event.buttons === undefined) { + // Why do we need `buttons` ? + // Because, middle mouse sometimes have this: + // e.button === 0 and e.buttons === 4 + // Furthermore, we want to prevent combination click, something like + // HOLD middlemouse then left click, that would be + // e.button === 0, e.buttons === 5 + // just `button` is not gonna work + // Alright, then what this block does ? + // this is for chrome `simulate mobile devices` + // I want to support this as well + return true; + } + + if (event.button === 0 && event.buttons === undefined) { + // Touch screen, sometimes on some specific device, `buttons` + // doesn't have anything (safari on ios, blackberry...) + return true; + } // `mouseup` event on a single left click has + // `button` and `buttons` equal to 0 + + + if (event.type === 'mouseup' && event.button === 0 && event.buttons === 0) { + return true; + } + + if (event.button !== 0 || event.buttons !== 1) { + // This is the reason we have those if else block above + // if any special case we can catch and let it slide + // we do it above, when get to here, this definitely + // is-not-left-click + return false; + } + + return true; + } + /** + * Finds a single DOM element matching `selector` within the optional + * `context` of another DOM element (defaulting to `document`). + * + * @param {string} selector + * A valid CSS selector, which will be passed to `querySelector`. + * + * @param {Element|String} [context=document] + * A DOM element within which to query. Can also be a selector + * string in which case the first matching element will be used + * as context. If missing (or no element matches selector), falls + * back to `document`. + * + * @return {Element|null} + * The element that was found or null. + */ + + var $ = createQuerier('querySelector'); + /** + * Finds a all DOM elements matching `selector` within the optional + * `context` of another DOM element (defaulting to `document`). + * + * @param {string} selector + * A valid CSS selector, which will be passed to `querySelectorAll`. + * + * @param {Element|String} [context=document] + * A DOM element within which to query. Can also be a selector + * string in which case the first matching element will be used + * as context. If missing (or no element matches selector), falls + * back to `document`. + * + * @return {NodeList} + * A element list of elements that were found. Will be empty if none + * were found. + * + */ + + var $$ = createQuerier('querySelectorAll'); + + var Dom = /*#__PURE__*/Object.freeze({ + __proto__: null, + isReal: isReal, + isEl: isEl, + isInFrame: isInFrame, + createEl: createEl, + textContent: textContent, + prependTo: prependTo, + hasClass: hasClass, + addClass: addClass, + removeClass: removeClass, + toggleClass: toggleClass, + setAttributes: setAttributes, + getAttributes: getAttributes, + getAttribute: getAttribute, + setAttribute: setAttribute, + removeAttribute: removeAttribute, + blockTextSelection: blockTextSelection, + unblockTextSelection: unblockTextSelection, + getBoundingClientRect: getBoundingClientRect, + findPosition: findPosition, + getPointerPosition: getPointerPosition, + isTextNode: isTextNode, + emptyEl: emptyEl, + normalizeContent: normalizeContent, + appendContent: appendContent, + insertContent: insertContent, + isSingleLeftClick: isSingleLeftClick, + $: $, + $$: $$ + }); + + /** + * @file setup.js - Functions for setting up a player without + * user interaction based on the data-setup `attribute` of the video tag. + * + * @module setup + */ + var _windowLoaded = false; + var videojs$1; + /** + * Set up any tags that have a data-setup `attribute` when the player is started. + */ + + var autoSetup = function autoSetup() { + if (videojs$1.options.autoSetup === false) { + return; + } + + var vids = Array.prototype.slice.call(document_1.getElementsByTagName('video')); + var audios = Array.prototype.slice.call(document_1.getElementsByTagName('audio')); + var divs = Array.prototype.slice.call(document_1.getElementsByTagName('video-js')); + var mediaEls = vids.concat(audios, divs); // Check if any media elements exist + + if (mediaEls && mediaEls.length > 0) { + for (var i = 0, e = mediaEls.length; i < e; i++) { + var mediaEl = mediaEls[i]; // Check if element exists, has getAttribute func. + + if (mediaEl && mediaEl.getAttribute) { + // Make sure this player hasn't already been set up. + if (mediaEl.player === undefined) { + var options = mediaEl.getAttribute('data-setup'); // Check if data-setup attr exists. + // We only auto-setup if they've added the data-setup attr. + + if (options !== null) { + // Create new video.js instance. + videojs$1(mediaEl); + } + } // If getAttribute isn't defined, we need to wait for the DOM. + + } else { + autoSetupTimeout(1); + break; + } + } // No videos were found, so keep looping unless page is finished loading. + + } else if (!_windowLoaded) { + autoSetupTimeout(1); + } + }; + /** + * Wait until the page is loaded before running autoSetup. This will be called in + * autoSetup if `hasLoaded` returns false. + * + * @param {number} wait + * How long to wait in ms + * + * @param {module:videojs} [vjs] + * The videojs library function + */ + + + function autoSetupTimeout(wait, vjs) { + // Protect against breakage in non-browser environments + if (!isReal()) { + return; + } + + if (vjs) { + videojs$1 = vjs; + } + + window_1.setTimeout(autoSetup, wait); + } + /** + * Used to set the internal tracking of window loaded state to true. + * + * @private + */ + + + function setWindowLoaded() { + _windowLoaded = true; + window_1.removeEventListener('load', setWindowLoaded); + } + + if (isReal()) { + if (document_1.readyState === 'complete') { + setWindowLoaded(); + } else { + /** + * Listen for the load event on window, and set _windowLoaded to true. + * + * We use a standard event listener here to avoid incrementing the GUID + * before any players are created. + * + * @listens load + */ + window_1.addEventListener('load', setWindowLoaded); + } + } + + /** + * @file stylesheet.js + * @module stylesheet + */ + /** + * Create a DOM syle element given a className for it. + * + * @param {string} className + * The className to add to the created style element. + * + * @return {Element} + * The element that was created. + */ + + var createStyleElement = function createStyleElement(className) { + var style = document_1.createElement('style'); + style.className = className; + return style; + }; + /** + * Add text to a DOM element. + * + * @param {Element} el + * The Element to add text content to. + * + * @param {string} content + * The text to add to the element. + */ + + var setTextContent = function setTextContent(el, content) { + if (el.styleSheet) { + el.styleSheet.cssText = content; + } else { + el.textContent = content; + } + }; + + /** + * @file guid.js + * @module guid + */ + // Default value for GUIDs. This allows us to reset the GUID counter in tests. + // + // The initial GUID is 3 because some users have come to rely on the first + // default player ID ending up as `vjs_video_3`. + // + // See: https://github.com/videojs/video.js/pull/6216 + var _initialGuid = 3; + /** + * Unique ID for an element or function + * + * @type {Number} + */ + + var _guid = _initialGuid; + /** + * Get a unique auto-incrementing ID by number that has not been returned before. + * + * @return {number} + * A new unique ID. + */ + + function newGUID() { + return _guid++; + } + + /** + * @file dom-data.js + * @module dom-data + */ + var FakeWeakMap; + + if (!window_1.WeakMap) { + FakeWeakMap = /*#__PURE__*/function () { + function FakeWeakMap() { + this.vdata = 'vdata' + Math.floor(window_1.performance && window_1.performance.now() || Date.now()); + this.data = {}; + } + + var _proto = FakeWeakMap.prototype; + + _proto.set = function set(key, value) { + var access = key[this.vdata] || newGUID(); + + if (!key[this.vdata]) { + key[this.vdata] = access; + } + + this.data[access] = value; + return this; + }; + + _proto.get = function get(key) { + var access = key[this.vdata]; // we have data, return it + + if (access) { + return this.data[access]; + } // we don't have data, return nothing. + // return undefined explicitly as that's the contract for this method + + + log$1('We have no data for this element', key); + return undefined; + }; + + _proto.has = function has(key) { + var access = key[this.vdata]; + return access in this.data; + }; + + _proto["delete"] = function _delete(key) { + var access = key[this.vdata]; + + if (access) { + delete this.data[access]; + delete key[this.vdata]; + } + }; + + return FakeWeakMap; + }(); + } + /** + * Element Data Store. + * + * Allows for binding data to an element without putting it directly on the + * element. Ex. Event listeners are stored here. + * (also from jsninja.com, slightly modified and updated for closure compiler) + * + * @type {Object} + * @private + */ + + + var DomData = window_1.WeakMap ? new WeakMap() : new FakeWeakMap(); + + /** + * @file events.js. An Event System (John Resig - Secrets of a JS Ninja http://jsninja.com/) + * (Original book version wasn't completely usable, so fixed some things and made Closure Compiler compatible) + * This should work very similarly to jQuery's events, however it's based off the book version which isn't as + * robust as jquery's, so there's probably some differences. + * + * @file events.js + * @module events + */ + /** + * Clean up the listener cache and dispatchers + * + * @param {Element|Object} elem + * Element to clean up + * + * @param {string} type + * Type of event to clean up + */ + + function _cleanUpEvents(elem, type) { + if (!DomData.has(elem)) { + return; + } + + var data = DomData.get(elem); // Remove the events of a particular type if there are none left + + if (data.handlers[type].length === 0) { + delete data.handlers[type]; // data.handlers[type] = null; + // Setting to null was causing an error with data.handlers + // Remove the meta-handler from the element + + if (elem.removeEventListener) { + elem.removeEventListener(type, data.dispatcher, false); + } else if (elem.detachEvent) { + elem.detachEvent('on' + type, data.dispatcher); + } + } // Remove the events object if there are no types left + + + if (Object.getOwnPropertyNames(data.handlers).length <= 0) { + delete data.handlers; + delete data.dispatcher; + delete data.disabled; + } // Finally remove the element data if there is no data left + + + if (Object.getOwnPropertyNames(data).length === 0) { + DomData["delete"](elem); + } + } + /** + * Loops through an array of event types and calls the requested method for each type. + * + * @param {Function} fn + * The event method we want to use. + * + * @param {Element|Object} elem + * Element or object to bind listeners to + * + * @param {string} type + * Type of event to bind to. + * + * @param {EventTarget~EventListener} callback + * Event listener. + */ + + + function _handleMultipleEvents(fn, elem, types, callback) { + types.forEach(function (type) { + // Call the event method for each one of the types + fn(elem, type, callback); + }); + } + /** + * Fix a native event to have standard property values + * + * @param {Object} event + * Event object to fix. + * + * @return {Object} + * Fixed event object. + */ + + + function fixEvent(event) { + if (event.fixed_) { + return event; + } + + function returnTrue() { + return true; + } + + function returnFalse() { + return false; + } // Test if fixing up is needed + // Used to check if !event.stopPropagation instead of isPropagationStopped + // But native events return true for stopPropagation, but don't have + // other expected methods like isPropagationStopped. Seems to be a problem + // with the Javascript Ninja code. So we're just overriding all events now. + + + if (!event || !event.isPropagationStopped || !event.isImmediatePropagationStopped) { + var old = event || window_1.event; + event = {}; // Clone the old object so that we can modify the values event = {}; + // IE8 Doesn't like when you mess with native event properties + // Firefox returns false for event.hasOwnProperty('type') and other props + // which makes copying more difficult. + // TODO: Probably best to create a whitelist of event props + + for (var key in old) { + // Safari 6.0.3 warns you if you try to copy deprecated layerX/Y + // Chrome warns you if you try to copy deprecated keyboardEvent.keyLocation + // and webkitMovementX/Y + if (key !== 'layerX' && key !== 'layerY' && key !== 'keyLocation' && key !== 'webkitMovementX' && key !== 'webkitMovementY') { + // Chrome 32+ warns if you try to copy deprecated returnValue, but + // we still want to if preventDefault isn't supported (IE8). + if (!(key === 'returnValue' && old.preventDefault)) { + event[key] = old[key]; + } + } + } // The event occurred on this element + + + if (!event.target) { + event.target = event.srcElement || document_1; + } // Handle which other element the event is related to + + + if (!event.relatedTarget) { + event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; + } // Stop the default browser action + + + event.preventDefault = function () { + if (old.preventDefault) { + old.preventDefault(); + } + + event.returnValue = false; + old.returnValue = false; + event.defaultPrevented = true; + }; + + event.defaultPrevented = false; // Stop the event from bubbling + + event.stopPropagation = function () { + if (old.stopPropagation) { + old.stopPropagation(); + } + + event.cancelBubble = true; + old.cancelBubble = true; + event.isPropagationStopped = returnTrue; + }; + + event.isPropagationStopped = returnFalse; // Stop the event from bubbling and executing other handlers + + event.stopImmediatePropagation = function () { + if (old.stopImmediatePropagation) { + old.stopImmediatePropagation(); + } + + event.isImmediatePropagationStopped = returnTrue; + event.stopPropagation(); + }; + + event.isImmediatePropagationStopped = returnFalse; // Handle mouse position + + if (event.clientX !== null && event.clientX !== undefined) { + var doc = document_1.documentElement; + var body = document_1.body; + event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); + event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); + } // Handle key presses + + + event.which = event.charCode || event.keyCode; // Fix button for mouse clicks: + // 0 == left; 1 == middle; 2 == right + + if (event.button !== null && event.button !== undefined) { + // The following is disabled because it does not pass videojs-standard + // and... yikes. + + /* eslint-disable */ + event.button = event.button & 1 ? 0 : event.button & 4 ? 1 : event.button & 2 ? 2 : 0; + /* eslint-enable */ + } + } + + event.fixed_ = true; // Returns fixed-up instance + + return event; + } + /** + * Whether passive event listeners are supported + */ + + var _supportsPassive; + + var supportsPassive = function supportsPassive() { + if (typeof _supportsPassive !== 'boolean') { + _supportsPassive = false; + + try { + var opts = Object.defineProperty({}, 'passive', { + get: function get() { + _supportsPassive = true; + } + }); + window_1.addEventListener('test', null, opts); + window_1.removeEventListener('test', null, opts); + } catch (e) {// disregard + } + } + + return _supportsPassive; + }; + /** + * Touch events Chrome expects to be passive + */ + + + var passiveEvents = ['touchstart', 'touchmove']; + /** + * Add an event listener to element + * It stores the handler function in a separate cache object + * and adds a generic handler to the element's event, + * along with a unique id (guid) to the element. + * + * @param {Element|Object} elem + * Element or object to bind listeners to + * + * @param {string|string[]} type + * Type of event to bind to. + * + * @param {EventTarget~EventListener} fn + * Event listener. + */ + + function on(elem, type, fn) { + if (Array.isArray(type)) { + return _handleMultipleEvents(on, elem, type, fn); + } + + if (!DomData.has(elem)) { + DomData.set(elem, {}); + } + + var data = DomData.get(elem); // We need a place to store all our handler data + + if (!data.handlers) { + data.handlers = {}; + } + + if (!data.handlers[type]) { + data.handlers[type] = []; + } + + if (!fn.guid) { + fn.guid = newGUID(); + } + + data.handlers[type].push(fn); + + if (!data.dispatcher) { + data.disabled = false; + + data.dispatcher = function (event, hash) { + if (data.disabled) { + return; + } + + event = fixEvent(event); + var handlers = data.handlers[event.type]; + + if (handlers) { + // Copy handlers so if handlers are added/removed during the process it doesn't throw everything off. + var handlersCopy = handlers.slice(0); + + for (var m = 0, n = handlersCopy.length; m < n; m++) { + if (event.isImmediatePropagationStopped()) { + break; + } else { + try { + handlersCopy[m].call(elem, event, hash); + } catch (e) { + log$1.error(e); + } + } + } + } + }; + } + + if (data.handlers[type].length === 1) { + if (elem.addEventListener) { + var options = false; + + if (supportsPassive() && passiveEvents.indexOf(type) > -1) { + options = { + passive: true + }; + } + + elem.addEventListener(type, data.dispatcher, options); + } else if (elem.attachEvent) { + elem.attachEvent('on' + type, data.dispatcher); + } + } + } + /** + * Removes event listeners from an element + * + * @param {Element|Object} elem + * Object to remove listeners from. + * + * @param {string|string[]} [type] + * Type of listener to remove. Don't include to remove all events from element. + * + * @param {EventTarget~EventListener} [fn] + * Specific listener to remove. Don't include to remove listeners for an event + * type. + */ + + function off(elem, type, fn) { + // Don't want to add a cache object through getElData if not needed + if (!DomData.has(elem)) { + return; + } + + var data = DomData.get(elem); // If no events exist, nothing to unbind + + if (!data.handlers) { + return; + } + + if (Array.isArray(type)) { + return _handleMultipleEvents(off, elem, type, fn); + } // Utility function + + + var removeType = function removeType(el, t) { + data.handlers[t] = []; + + _cleanUpEvents(el, t); + }; // Are we removing all bound events? + + + if (type === undefined) { + for (var t in data.handlers) { + if (Object.prototype.hasOwnProperty.call(data.handlers || {}, t)) { + removeType(elem, t); + } + } + + return; + } + + var handlers = data.handlers[type]; // If no handlers exist, nothing to unbind + + if (!handlers) { + return; + } // If no listener was provided, remove all listeners for type + + + if (!fn) { + removeType(elem, type); + return; + } // We're only removing a single handler + + + if (fn.guid) { + for (var n = 0; n < handlers.length; n++) { + if (handlers[n].guid === fn.guid) { + handlers.splice(n--, 1); + } + } + } + + _cleanUpEvents(elem, type); + } + /** + * Trigger an event for an element + * + * @param {Element|Object} elem + * Element to trigger an event on + * + * @param {EventTarget~Event|string} event + * A string (the type) or an event object with a type attribute + * + * @param {Object} [hash] + * data hash to pass along with the event + * + * @return {boolean|undefined} + * Returns the opposite of `defaultPrevented` if default was + * prevented. Otherwise, returns `undefined` + */ + + function trigger(elem, event, hash) { + // Fetches element data and a reference to the parent (for bubbling). + // Don't want to add a data object to cache for every parent, + // so checking hasElData first. + var elemData = DomData.has(elem) ? DomData.get(elem) : {}; + var parent = elem.parentNode || elem.ownerDocument; // type = event.type || event, + // handler; + // If an event name was passed as a string, creates an event out of it + + if (typeof event === 'string') { + event = { + type: event, + target: elem + }; + } else if (!event.target) { + event.target = elem; + } // Normalizes the event properties. + + + event = fixEvent(event); // If the passed element has a dispatcher, executes the established handlers. + + if (elemData.dispatcher) { + elemData.dispatcher.call(elem, event, hash); + } // Unless explicitly stopped or the event does not bubble (e.g. media events) + // recursively calls this function to bubble the event up the DOM. + + + if (parent && !event.isPropagationStopped() && event.bubbles === true) { + trigger.call(null, parent, event, hash); // If at the top of the DOM, triggers the default action unless disabled. + } else if (!parent && !event.defaultPrevented && event.target && event.target[event.type]) { + if (!DomData.has(event.target)) { + DomData.set(event.target, {}); + } + + var targetData = DomData.get(event.target); // Checks if the target has a default action for this event. + + if (event.target[event.type]) { + // Temporarily disables event dispatching on the target as we have already executed the handler. + targetData.disabled = true; // Executes the default action. + + if (typeof event.target[event.type] === 'function') { + event.target[event.type](); + } // Re-enables event dispatching. + + + targetData.disabled = false; + } + } // Inform the triggerer if the default was prevented by returning false + + + return !event.defaultPrevented; + } + /** + * Trigger a listener only once for an event. + * + * @param {Element|Object} elem + * Element or object to bind to. + * + * @param {string|string[]} type + * Name/type of event + * + * @param {Event~EventListener} fn + * Event listener function + */ + + function one(elem, type, fn) { + if (Array.isArray(type)) { + return _handleMultipleEvents(one, elem, type, fn); + } + + var func = function func() { + off(elem, type, func); + fn.apply(this, arguments); + }; // copy the guid to the new function so it can removed using the original function's ID + + + func.guid = fn.guid = fn.guid || newGUID(); + on(elem, type, func); + } + /** + * Trigger a listener only once and then turn if off for all + * configured events + * + * @param {Element|Object} elem + * Element or object to bind to. + * + * @param {string|string[]} type + * Name/type of event + * + * @param {Event~EventListener} fn + * Event listener function + */ + + function any(elem, type, fn) { + var func = function func() { + off(elem, type, func); + fn.apply(this, arguments); + }; // copy the guid to the new function so it can removed using the original function's ID + + + func.guid = fn.guid = fn.guid || newGUID(); // multiple ons, but one off for everything + + on(elem, type, func); + } + + var Events = /*#__PURE__*/Object.freeze({ + __proto__: null, + fixEvent: fixEvent, + on: on, + off: off, + trigger: trigger, + one: one, + any: any + }); + + /** + * @file fn.js + * @module fn + */ + var UPDATE_REFRESH_INTERVAL = 30; + /** + * Bind (a.k.a proxy or context). A simple method for changing the context of + * a function. + * + * It also stores a unique id on the function so it can be easily removed from + * events. + * + * @function + * @param {Mixed} context + * The object to bind as scope. + * + * @param {Function} fn + * The function to be bound to a scope. + * + * @param {number} [uid] + * An optional unique ID for the function to be set + * + * @return {Function} + * The new function that will be bound into the context given + */ + + var bind = function bind(context, fn, uid) { + // Make sure the function has a unique ID + if (!fn.guid) { + fn.guid = newGUID(); + } // Create the new function that changes the context + + + var bound = fn.bind(context); // Allow for the ability to individualize this function + // Needed in the case where multiple objects might share the same prototype + // IF both items add an event listener with the same function, then you try to remove just one + // it will remove both because they both have the same guid. + // when using this, you need to use the bind method when you remove the listener as well. + // currently used in text tracks + + bound.guid = uid ? uid + '_' + fn.guid : fn.guid; + return bound; + }; + /** + * Wraps the given function, `fn`, with a new function that only invokes `fn` + * at most once per every `wait` milliseconds. + * + * @function + * @param {Function} fn + * The function to be throttled. + * + * @param {number} wait + * The number of milliseconds by which to throttle. + * + * @return {Function} + */ + + var throttle = function throttle(fn, wait) { + var last = window_1.performance.now(); + + var throttled = function throttled() { + var now = window_1.performance.now(); + + if (now - last >= wait) { + fn.apply(void 0, arguments); + last = now; + } + }; + + return throttled; + }; + /** + * Creates a debounced function that delays invoking `func` until after `wait` + * milliseconds have elapsed since the last time the debounced function was + * invoked. + * + * Inspired by lodash and underscore implementations. + * + * @function + * @param {Function} func + * The function to wrap with debounce behavior. + * + * @param {number} wait + * The number of milliseconds to wait after the last invocation. + * + * @param {boolean} [immediate] + * Whether or not to invoke the function immediately upon creation. + * + * @param {Object} [context=window] + * The "context" in which the debounced function should debounce. For + * example, if this function should be tied to a Video.js player, + * the player can be passed here. Alternatively, defaults to the + * global `window` object. + * + * @return {Function} + * A debounced function. + */ + + var debounce = function debounce(func, wait, immediate, context) { + if (context === void 0) { + context = window_1; + } + + var timeout; + + var cancel = function cancel() { + context.clearTimeout(timeout); + timeout = null; + }; + /* eslint-disable consistent-this */ + + + var debounced = function debounced() { + var self = this; + var args = arguments; + + var _later = function later() { + timeout = null; + _later = null; + + if (!immediate) { + func.apply(self, args); + } + }; + + if (!timeout && immediate) { + func.apply(self, args); + } + + context.clearTimeout(timeout); + timeout = context.setTimeout(_later, wait); + }; + /* eslint-enable consistent-this */ + + + debounced.cancel = cancel; + return debounced; + }; + + /** + * @file src/js/event-target.js + */ + /** + * `EventTarget` is a class that can have the same API as the DOM `EventTarget`. It + * adds shorthand functions that wrap around lengthy functions. For example: + * the `on` function is a wrapper around `addEventListener`. + * + * @see [EventTarget Spec]{@link https://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventTarget} + * @class EventTarget + */ + + var EventTarget$2 = function EventTarget() {}; + /** + * A Custom DOM event. + * + * @typedef {Object} EventTarget~Event + * @see [Properties]{@link https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent} + */ + + /** + * All event listeners should follow the following format. + * + * @callback EventTarget~EventListener + * @this {EventTarget} + * + * @param {EventTarget~Event} event + * the event that triggered this function + * + * @param {Object} [hash] + * hash of data sent during the event + */ + + /** + * An object containing event names as keys and booleans as values. + * + * > NOTE: If an event name is set to a true value here {@link EventTarget#trigger} + * will have extra functionality. See that function for more information. + * + * @property EventTarget.prototype.allowedEvents_ + * @private + */ + + + EventTarget$2.prototype.allowedEvents_ = {}; + /** + * Adds an `event listener` to an instance of an `EventTarget`. An `event listener` is a + * function that will get called when an event with a certain name gets triggered. + * + * @param {string|string[]} type + * An event name or an array of event names. + * + * @param {EventTarget~EventListener} fn + * The function to call with `EventTarget`s + */ + + EventTarget$2.prototype.on = function (type, fn) { + // Remove the addEventListener alias before calling Events.on + // so we don't get into an infinite type loop + var ael = this.addEventListener; + + this.addEventListener = function () {}; + + on(this, type, fn); + this.addEventListener = ael; + }; + /** + * An alias of {@link EventTarget#on}. Allows `EventTarget` to mimic + * the standard DOM API. + * + * @function + * @see {@link EventTarget#on} + */ + + + EventTarget$2.prototype.addEventListener = EventTarget$2.prototype.on; + /** + * Removes an `event listener` for a specific event from an instance of `EventTarget`. + * This makes it so that the `event listener` will no longer get called when the + * named event happens. + * + * @param {string|string[]} type + * An event name or an array of event names. + * + * @param {EventTarget~EventListener} fn + * The function to remove. + */ + + EventTarget$2.prototype.off = function (type, fn) { + off(this, type, fn); + }; + /** + * An alias of {@link EventTarget#off}. Allows `EventTarget` to mimic + * the standard DOM API. + * + * @function + * @see {@link EventTarget#off} + */ + + + EventTarget$2.prototype.removeEventListener = EventTarget$2.prototype.off; + /** + * This function will add an `event listener` that gets triggered only once. After the + * first trigger it will get removed. This is like adding an `event listener` + * with {@link EventTarget#on} that calls {@link EventTarget#off} on itself. + * + * @param {string|string[]} type + * An event name or an array of event names. + * + * @param {EventTarget~EventListener} fn + * The function to be called once for each event name. + */ + + EventTarget$2.prototype.one = function (type, fn) { + // Remove the addEventListener aliasing Events.on + // so we don't get into an infinite type loop + var ael = this.addEventListener; + + this.addEventListener = function () {}; + + one(this, type, fn); + this.addEventListener = ael; + }; + + EventTarget$2.prototype.any = function (type, fn) { + // Remove the addEventListener aliasing Events.on + // so we don't get into an infinite type loop + var ael = this.addEventListener; + + this.addEventListener = function () {}; + + any(this, type, fn); + this.addEventListener = ael; + }; + /** + * This function causes an event to happen. This will then cause any `event listeners` + * that are waiting for that event, to get called. If there are no `event listeners` + * for an event then nothing will happen. + * + * If the name of the `Event` that is being triggered is in `EventTarget.allowedEvents_`. + * Trigger will also call the `on` + `uppercaseEventName` function. + * + * Example: + * 'click' is in `EventTarget.allowedEvents_`, so, trigger will attempt to call + * `onClick` if it exists. + * + * @param {string|EventTarget~Event|Object} event + * The name of the event, an `Event`, or an object with a key of type set to + * an event name. + */ + + + EventTarget$2.prototype.trigger = function (event) { + var type = event.type || event; // deprecation + // In a future version we should default target to `this` + // similar to how we default the target to `elem` in + // `Events.trigger`. Right now the default `target` will be + // `document` due to the `Event.fixEvent` call. + + if (typeof event === 'string') { + event = { + type: type + }; + } + + event = fixEvent(event); + + if (this.allowedEvents_[type] && this['on' + type]) { + this['on' + type](event); + } + + trigger(this, event); + }; + /** + * An alias of {@link EventTarget#trigger}. Allows `EventTarget` to mimic + * the standard DOM API. + * + * @function + * @see {@link EventTarget#trigger} + */ + + + EventTarget$2.prototype.dispatchEvent = EventTarget$2.prototype.trigger; + var EVENT_MAP; + + EventTarget$2.prototype.queueTrigger = function (event) { + var _this = this; + + // only set up EVENT_MAP if it'll be used + if (!EVENT_MAP) { + EVENT_MAP = new Map(); + } + + var type = event.type || event; + var map = EVENT_MAP.get(this); + + if (!map) { + map = new Map(); + EVENT_MAP.set(this, map); + } + + var oldTimeout = map.get(type); + map["delete"](type); + window_1.clearTimeout(oldTimeout); + var timeout = window_1.setTimeout(function () { + // if we cleared out all timeouts for the current target, delete its map + if (map.size === 0) { + map = null; + EVENT_MAP["delete"](_this); + } + + _this.trigger(event); + }, 0); + map.set(type, timeout); + }; + + /** + * @file mixins/evented.js + * @module evented + */ + + var objName = function objName(obj) { + if (typeof obj.name === 'function') { + return obj.name(); + } + + if (typeof obj.name === 'string') { + return obj.name; + } + + if (obj.name_) { + return obj.name_; + } + + if (obj.constructor && obj.constructor.name) { + return obj.constructor.name; + } + + return typeof obj; + }; + /** + * Returns whether or not an object has had the evented mixin applied. + * + * @param {Object} object + * An object to test. + * + * @return {boolean} + * Whether or not the object appears to be evented. + */ + + + var isEvented = function isEvented(object) { + return object instanceof EventTarget$2 || !!object.eventBusEl_ && ['on', 'one', 'off', 'trigger'].every(function (k) { + return typeof object[k] === 'function'; + }); + }; + /** + * Adds a callback to run after the evented mixin applied. + * + * @param {Object} object + * An object to Add + * @param {Function} callback + * The callback to run. + */ + + + var addEventedCallback = function addEventedCallback(target, callback) { + if (isEvented(target)) { + callback(); + } else { + if (!target.eventedCallbacks) { + target.eventedCallbacks = []; + } + + target.eventedCallbacks.push(callback); + } + }; + /** + * Whether a value is a valid event type - non-empty string or array. + * + * @private + * @param {string|Array} type + * The type value to test. + * + * @return {boolean} + * Whether or not the type is a valid event type. + */ + + + var isValidEventType = function isValidEventType(type) { + return (// The regex here verifies that the `type` contains at least one non- + // whitespace character. + typeof type === 'string' && /\S/.test(type) || Array.isArray(type) && !!type.length + ); + }; + /** + * Validates a value to determine if it is a valid event target. Throws if not. + * + * @private + * @throws {Error} + * If the target does not appear to be a valid event target. + * + * @param {Object} target + * The object to test. + * + * @param {Object} obj + * The evented object we are validating for + * + * @param {string} fnName + * The name of the evented mixin function that called this. + */ + + + var validateTarget = function validateTarget(target, obj, fnName) { + if (!target || !target.nodeName && !isEvented(target)) { + throw new Error("Invalid target for " + objName(obj) + "#" + fnName + "; must be a DOM node or evented object."); + } + }; + /** + * Validates a value to determine if it is a valid event target. Throws if not. + * + * @private + * @throws {Error} + * If the type does not appear to be a valid event type. + * + * @param {string|Array} type + * The type to test. + * + * @param {Object} obj + * The evented object we are validating for + * + * @param {string} fnName + * The name of the evented mixin function that called this. + */ + + + var validateEventType = function validateEventType(type, obj, fnName) { + if (!isValidEventType(type)) { + throw new Error("Invalid event type for " + objName(obj) + "#" + fnName + "; must be a non-empty string or array."); + } + }; + /** + * Validates a value to determine if it is a valid listener. Throws if not. + * + * @private + * @throws {Error} + * If the listener is not a function. + * + * @param {Function} listener + * The listener to test. + * + * @param {Object} obj + * The evented object we are validating for + * + * @param {string} fnName + * The name of the evented mixin function that called this. + */ + + + var validateListener = function validateListener(listener, obj, fnName) { + if (typeof listener !== 'function') { + throw new Error("Invalid listener for " + objName(obj) + "#" + fnName + "; must be a function."); + } + }; + /** + * Takes an array of arguments given to `on()` or `one()`, validates them, and + * normalizes them into an object. + * + * @private + * @param {Object} self + * The evented object on which `on()` or `one()` was called. This + * object will be bound as the `this` value for the listener. + * + * @param {Array} args + * An array of arguments passed to `on()` or `one()`. + * + * @param {string} fnName + * The name of the evented mixin function that called this. + * + * @return {Object} + * An object containing useful values for `on()` or `one()` calls. + */ + + + var normalizeListenArgs = function normalizeListenArgs(self, args, fnName) { + // If the number of arguments is less than 3, the target is always the + // evented object itself. + var isTargetingSelf = args.length < 3 || args[0] === self || args[0] === self.eventBusEl_; + var target; + var type; + var listener; + + if (isTargetingSelf) { + target = self.eventBusEl_; // Deal with cases where we got 3 arguments, but we are still listening to + // the evented object itself. + + if (args.length >= 3) { + args.shift(); + } + + type = args[0]; + listener = args[1]; + } else { + target = args[0]; + type = args[1]; + listener = args[2]; + } + + validateTarget(target, self, fnName); + validateEventType(type, self, fnName); + validateListener(listener, self, fnName); + listener = bind(self, listener); + return { + isTargetingSelf: isTargetingSelf, + target: target, + type: type, + listener: listener + }; + }; + /** + * Adds the listener to the event type(s) on the target, normalizing for + * the type of target. + * + * @private + * @param {Element|Object} target + * A DOM node or evented object. + * + * @param {string} method + * The event binding method to use ("on" or "one"). + * + * @param {string|Array} type + * One or more event type(s). + * + * @param {Function} listener + * A listener function. + */ + + + var listen = function listen(target, method, type, listener) { + validateTarget(target, target, method); + + if (target.nodeName) { + Events[method](target, type, listener); + } else { + target[method](type, listener); + } + }; + /** + * Contains methods that provide event capabilities to an object which is passed + * to {@link module:evented|evented}. + * + * @mixin EventedMixin + */ + + + var EventedMixin = { + /** + * Add a listener to an event (or events) on this object or another evented + * object. + * + * @param {string|Array|Element|Object} targetOrType + * If this is a string or array, it represents the event type(s) + * that will trigger the listener. + * + * Another evented object can be passed here instead, which will + * cause the listener to listen for events on _that_ object. + * + * In either case, the listener's `this` value will be bound to + * this object. + * + * @param {string|Array|Function} typeOrListener + * If the first argument was a string or array, this should be the + * listener function. Otherwise, this is a string or array of event + * type(s). + * + * @param {Function} [listener] + * If the first argument was another evented object, this will be + * the listener function. + */ + on: function on() { + var _this = this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + var _normalizeListenArgs = normalizeListenArgs(this, args, 'on'), + isTargetingSelf = _normalizeListenArgs.isTargetingSelf, + target = _normalizeListenArgs.target, + type = _normalizeListenArgs.type, + listener = _normalizeListenArgs.listener; + + listen(target, 'on', type, listener); // If this object is listening to another evented object. + + if (!isTargetingSelf) { + // If this object is disposed, remove the listener. + var removeListenerOnDispose = function removeListenerOnDispose() { + return _this.off(target, type, listener); + }; // Use the same function ID as the listener so we can remove it later it + // using the ID of the original listener. + + + removeListenerOnDispose.guid = listener.guid; // Add a listener to the target's dispose event as well. This ensures + // that if the target is disposed BEFORE this object, we remove the + // removal listener that was just added. Otherwise, we create a memory leak. + + var removeRemoverOnTargetDispose = function removeRemoverOnTargetDispose() { + return _this.off('dispose', removeListenerOnDispose); + }; // Use the same function ID as the listener so we can remove it later + // it using the ID of the original listener. + + + removeRemoverOnTargetDispose.guid = listener.guid; + listen(this, 'on', 'dispose', removeListenerOnDispose); + listen(target, 'on', 'dispose', removeRemoverOnTargetDispose); + } + }, + + /** + * Add a listener to an event (or events) on this object or another evented + * object. The listener will be called once per event and then removed. + * + * @param {string|Array|Element|Object} targetOrType + * If this is a string or array, it represents the event type(s) + * that will trigger the listener. + * + * Another evented object can be passed here instead, which will + * cause the listener to listen for events on _that_ object. + * + * In either case, the listener's `this` value will be bound to + * this object. + * + * @param {string|Array|Function} typeOrListener + * If the first argument was a string or array, this should be the + * listener function. Otherwise, this is a string or array of event + * type(s). + * + * @param {Function} [listener] + * If the first argument was another evented object, this will be + * the listener function. + */ + one: function one() { + var _this2 = this; + + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + + var _normalizeListenArgs2 = normalizeListenArgs(this, args, 'one'), + isTargetingSelf = _normalizeListenArgs2.isTargetingSelf, + target = _normalizeListenArgs2.target, + type = _normalizeListenArgs2.type, + listener = _normalizeListenArgs2.listener; // Targeting this evented object. + + + if (isTargetingSelf) { + listen(target, 'one', type, listener); // Targeting another evented object. + } else { + // TODO: This wrapper is incorrect! It should only + // remove the wrapper for the event type that called it. + // Instead all listners are removed on the first trigger! + // see https://github.com/videojs/video.js/issues/5962 + var wrapper = function wrapper() { + _this2.off(target, type, wrapper); + + for (var _len3 = arguments.length, largs = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + largs[_key3] = arguments[_key3]; + } + + listener.apply(null, largs); + }; // Use the same function ID as the listener so we can remove it later + // it using the ID of the original listener. + + + wrapper.guid = listener.guid; + listen(target, 'one', type, wrapper); + } + }, + + /** + * Add a listener to an event (or events) on this object or another evented + * object. The listener will only be called once for the first event that is triggered + * then removed. + * + * @param {string|Array|Element|Object} targetOrType + * If this is a string or array, it represents the event type(s) + * that will trigger the listener. + * + * Another evented object can be passed here instead, which will + * cause the listener to listen for events on _that_ object. + * + * In either case, the listener's `this` value will be bound to + * this object. + * + * @param {string|Array|Function} typeOrListener + * If the first argument was a string or array, this should be the + * listener function. Otherwise, this is a string or array of event + * type(s). + * + * @param {Function} [listener] + * If the first argument was another evented object, this will be + * the listener function. + */ + any: function any() { + var _this3 = this; + + for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + args[_key4] = arguments[_key4]; + } + + var _normalizeListenArgs3 = normalizeListenArgs(this, args, 'any'), + isTargetingSelf = _normalizeListenArgs3.isTargetingSelf, + target = _normalizeListenArgs3.target, + type = _normalizeListenArgs3.type, + listener = _normalizeListenArgs3.listener; // Targeting this evented object. + + + if (isTargetingSelf) { + listen(target, 'any', type, listener); // Targeting another evented object. + } else { + var wrapper = function wrapper() { + _this3.off(target, type, wrapper); + + for (var _len5 = arguments.length, largs = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { + largs[_key5] = arguments[_key5]; + } + + listener.apply(null, largs); + }; // Use the same function ID as the listener so we can remove it later + // it using the ID of the original listener. + + + wrapper.guid = listener.guid; + listen(target, 'any', type, wrapper); + } + }, + + /** + * Removes listener(s) from event(s) on an evented object. + * + * @param {string|Array|Element|Object} [targetOrType] + * If this is a string or array, it represents the event type(s). + * + * Another evented object can be passed here instead, in which case + * ALL 3 arguments are _required_. + * + * @param {string|Array|Function} [typeOrListener] + * If the first argument was a string or array, this may be the + * listener function. Otherwise, this is a string or array of event + * type(s). + * + * @param {Function} [listener] + * If the first argument was another evented object, this will be + * the listener function; otherwise, _all_ listeners bound to the + * event type(s) will be removed. + */ + off: function off$1(targetOrType, typeOrListener, listener) { + // Targeting this evented object. + if (!targetOrType || isValidEventType(targetOrType)) { + off(this.eventBusEl_, targetOrType, typeOrListener); // Targeting another evented object. + } else { + var target = targetOrType; + var type = typeOrListener; // Fail fast and in a meaningful way! + + validateTarget(target, this, 'off'); + validateEventType(type, this, 'off'); + validateListener(listener, this, 'off'); // Ensure there's at least a guid, even if the function hasn't been used + + listener = bind(this, listener); // Remove the dispose listener on this evented object, which was given + // the same guid as the event listener in on(). + + this.off('dispose', listener); + + if (target.nodeName) { + off(target, type, listener); + off(target, 'dispose', listener); + } else if (isEvented(target)) { + target.off(type, listener); + target.off('dispose', listener); + } + } + }, + + /** + * Fire an event on this evented object, causing its listeners to be called. + * + * @param {string|Object} event + * An event type or an object with a type property. + * + * @param {Object} [hash] + * An additional object to pass along to listeners. + * + * @return {boolean} + * Whether or not the default behavior was prevented. + */ + trigger: function trigger$1(event, hash) { + validateTarget(this.eventBusEl_, this, 'trigger'); + var type = event && typeof event !== 'string' ? event.type : event; + + if (!isValidEventType(type)) { + var error = "Invalid event type for " + objName(this) + "#trigger; " + 'must be a non-empty string or object with a type key that has a non-empty value.'; + + if (event) { + (this.log || log$1).error(error); + } else { + throw new Error(error); + } + } + + return trigger(this.eventBusEl_, event, hash); + } + }; + /** + * Applies {@link module:evented~EventedMixin|EventedMixin} to a target object. + * + * @param {Object} target + * The object to which to add event methods. + * + * @param {Object} [options={}] + * Options for customizing the mixin behavior. + * + * @param {string} [options.eventBusKey] + * By default, adds a `eventBusEl_` DOM element to the target object, + * which is used as an event bus. If the target object already has a + * DOM element that should be used, pass its key here. + * + * @return {Object} + * The target object. + */ + + function evented(target, options) { + if (options === void 0) { + options = {}; + } + + var _options = options, + eventBusKey = _options.eventBusKey; // Set or create the eventBusEl_. + + if (eventBusKey) { + if (!target[eventBusKey].nodeName) { + throw new Error("The eventBusKey \"" + eventBusKey + "\" does not refer to an element."); + } + + target.eventBusEl_ = target[eventBusKey]; + } else { + target.eventBusEl_ = createEl('span', { + className: 'vjs-event-bus' + }); + } + + assign(target, EventedMixin); + + if (target.eventedCallbacks) { + target.eventedCallbacks.forEach(function (callback) { + callback(); + }); + } // When any evented object is disposed, it removes all its listeners. + + + target.on('dispose', function () { + target.off(); + window_1.setTimeout(function () { + target.eventBusEl_ = null; + }, 0); + }); + return target; + } + + /** + * @file mixins/stateful.js + * @module stateful + */ + /** + * Contains methods that provide statefulness to an object which is passed + * to {@link module:stateful}. + * + * @mixin StatefulMixin + */ + + var StatefulMixin = { + /** + * A hash containing arbitrary keys and values representing the state of + * the object. + * + * @type {Object} + */ + state: {}, + + /** + * Set the state of an object by mutating its + * {@link module:stateful~StatefulMixin.state|state} object in place. + * + * @fires module:stateful~StatefulMixin#statechanged + * @param {Object|Function} stateUpdates + * A new set of properties to shallow-merge into the plugin state. + * Can be a plain object or a function returning a plain object. + * + * @return {Object|undefined} + * An object containing changes that occurred. If no changes + * occurred, returns `undefined`. + */ + setState: function setState(stateUpdates) { + var _this = this; + + // Support providing the `stateUpdates` state as a function. + if (typeof stateUpdates === 'function') { + stateUpdates = stateUpdates(); + } + + var changes; + each(stateUpdates, function (value, key) { + // Record the change if the value is different from what's in the + // current state. + if (_this.state[key] !== value) { + changes = changes || {}; + changes[key] = { + from: _this.state[key], + to: value + }; + } + + _this.state[key] = value; + }); // Only trigger "statechange" if there were changes AND we have a trigger + // function. This allows us to not require that the target object be an + // evented object. + + if (changes && isEvented(this)) { + /** + * An event triggered on an object that is both + * {@link module:stateful|stateful} and {@link module:evented|evented} + * indicating that its state has changed. + * + * @event module:stateful~StatefulMixin#statechanged + * @type {Object} + * @property {Object} changes + * A hash containing the properties that were changed and + * the values they were changed `from` and `to`. + */ + this.trigger({ + changes: changes, + type: 'statechanged' + }); + } + + return changes; + } + }; + /** + * Applies {@link module:stateful~StatefulMixin|StatefulMixin} to a target + * object. + * + * If the target object is {@link module:evented|evented} and has a + * `handleStateChanged` method, that method will be automatically bound to the + * `statechanged` event on itself. + * + * @param {Object} target + * The object to be made stateful. + * + * @param {Object} [defaultState] + * A default set of properties to populate the newly-stateful object's + * `state` property. + * + * @return {Object} + * Returns the `target`. + */ + + function stateful(target, defaultState) { + assign(target, StatefulMixin); // This happens after the mixing-in because we need to replace the `state` + // added in that step. + + target.state = assign({}, target.state, defaultState); // Auto-bind the `handleStateChanged` method of the target object if it exists. + + if (typeof target.handleStateChanged === 'function' && isEvented(target)) { + target.on('statechanged', target.handleStateChanged); + } + + return target; + } + + /** + * @file string-cases.js + * @module to-lower-case + */ + + /** + * Lowercase the first letter of a string. + * + * @param {string} string + * String to be lowercased + * + * @return {string} + * The string with a lowercased first letter + */ + var toLowerCase = function toLowerCase(string) { + if (typeof string !== 'string') { + return string; + } + + return string.replace(/./, function (w) { + return w.toLowerCase(); + }); + }; + /** + * Uppercase the first letter of a string. + * + * @param {string} string + * String to be uppercased + * + * @return {string} + * The string with an uppercased first letter + */ + + var toTitleCase$1 = function toTitleCase(string) { + if (typeof string !== 'string') { + return string; + } + + return string.replace(/./, function (w) { + return w.toUpperCase(); + }); + }; + /** + * Compares the TitleCase versions of the two strings for equality. + * + * @param {string} str1 + * The first string to compare + * + * @param {string} str2 + * The second string to compare + * + * @return {boolean} + * Whether the TitleCase versions of the strings are equal + */ + + var titleCaseEquals = function titleCaseEquals(str1, str2) { + return toTitleCase$1(str1) === toTitleCase$1(str2); + }; + + /** + * @file merge-options.js + * @module merge-options + */ + /** + * Merge two objects recursively. + * + * Performs a deep merge like + * {@link https://lodash.com/docs/4.17.10#merge|lodash.merge}, but only merges + * plain objects (not arrays, elements, or anything else). + * + * Non-plain object values will be copied directly from the right-most + * argument. + * + * @static + * @param {Object[]} sources + * One or more objects to merge into a new object. + * + * @return {Object} + * A new object that is the merged result of all sources. + */ + + function mergeOptions$3() { + var result = {}; + + for (var _len = arguments.length, sources = new Array(_len), _key = 0; _key < _len; _key++) { + sources[_key] = arguments[_key]; + } + + sources.forEach(function (source) { + if (!source) { + return; + } + + each(source, function (value, key) { + if (!isPlain(value)) { + result[key] = value; + return; + } + + if (!isPlain(result[key])) { + result[key] = {}; + } + + result[key] = mergeOptions$3(result[key], value); + }); + }); + return result; + } + + var MapSham = /*#__PURE__*/function () { + function MapSham() { + this.map_ = {}; + } + + var _proto = MapSham.prototype; + + _proto.has = function has(key) { + return key in this.map_; + }; + + _proto["delete"] = function _delete(key) { + var has = this.has(key); + delete this.map_[key]; + return has; + }; + + _proto.set = function set(key, value) { + this.map_[key] = value; + return this; + }; + + _proto.forEach = function forEach(callback, thisArg) { + for (var key in this.map_) { + callback.call(thisArg, this.map_[key], key, this); + } + }; + + return MapSham; + }(); + + var Map$1 = window_1.Map ? window_1.Map : MapSham; + + var SetSham = /*#__PURE__*/function () { + function SetSham() { + this.set_ = {}; + } + + var _proto = SetSham.prototype; + + _proto.has = function has(key) { + return key in this.set_; + }; + + _proto["delete"] = function _delete(key) { + var has = this.has(key); + delete this.set_[key]; + return has; + }; + + _proto.add = function add(key) { + this.set_[key] = 1; + return this; + }; + + _proto.forEach = function forEach(callback, thisArg) { + for (var key in this.set_) { + callback.call(thisArg, key, key, this); + } + }; + + return SetSham; + }(); + + var Set = window_1.Set ? window_1.Set : SetSham; + + /** + * Player Component - Base class for all UI objects + * + * @file component.js + */ + /** + * Base class for all UI Components. + * Components are UI objects which represent both a javascript object and an element + * in the DOM. They can be children of other components, and can have + * children themselves. + * + * Components can also use methods from {@link EventTarget} + */ + + var Component$1 = /*#__PURE__*/function () { + /** + * A callback that is called when a component is ready. Does not have any + * paramters and any callback value will be ignored. + * + * @callback Component~ReadyCallback + * @this Component + */ + + /** + * Creates an instance of this class. + * + * @param {Player} player + * The `Player` that this class should be attached to. + * + * @param {Object} [options] + * The key/value store of player options. + * + * @param {Object[]} [options.children] + * An array of children objects to intialize this component with. Children objects have + * a name property that will be used if more than one component of the same type needs to be + * added. + * + * @param {Component~ReadyCallback} [ready] + * Function that gets called when the `Component` is ready. + */ + function Component(player, options, ready) { + // The component might be the player itself and we can't pass `this` to super + if (!player && this.play) { + this.player_ = player = this; // eslint-disable-line + } else { + this.player_ = player; + } + + this.isDisposed_ = false; // Hold the reference to the parent component via `addChild` method + + this.parentComponent_ = null; // Make a copy of prototype.options_ to protect against overriding defaults + + this.options_ = mergeOptions$3({}, this.options_); // Updated options with supplied options + + options = this.options_ = mergeOptions$3(this.options_, options); // Get ID from options or options element if one is supplied + + this.id_ = options.id || options.el && options.el.id; // If there was no ID from the options, generate one + + if (!this.id_) { + // Don't require the player ID function in the case of mock players + var id = player && player.id && player.id() || 'no_player'; + this.id_ = id + "_component_" + newGUID(); + } + + this.name_ = options.name || null; // Create element if one wasn't provided in options + + if (options.el) { + this.el_ = options.el; + } else if (options.createEl !== false) { + this.el_ = this.createEl(); + } // if evented is anything except false, we want to mixin in evented + + + if (options.evented !== false) { + // Make this an evented object and use `el_`, if available, as its event bus + evented(this, { + eventBusKey: this.el_ ? 'el_' : null + }); + this.handleLanguagechange = this.handleLanguagechange.bind(this); + this.on(this.player_, 'languagechange', this.handleLanguagechange); + } + + stateful(this, this.constructor.defaultState); + this.children_ = []; + this.childIndex_ = {}; + this.childNameIndex_ = {}; + this.setTimeoutIds_ = new Set(); + this.setIntervalIds_ = new Set(); + this.rafIds_ = new Set(); + this.namedRafs_ = new Map$1(); + this.clearingTimersOnDispose_ = false; // Add any child components in options + + if (options.initChildren !== false) { + this.initChildren(); + } // Don't want to trigger ready here or it will go before init is actually + // finished for all children that run this constructor + + + this.ready(ready); + + if (options.reportTouchActivity !== false) { + this.enableTouchActivity(); + } + } + /** + * Dispose of the `Component` and all child components. + * + * @fires Component#dispose + */ + + + var _proto = Component.prototype; + + _proto.dispose = function dispose() { + // Bail out if the component has already been disposed. + if (this.isDisposed_) { + return; + } + + if (this.readyQueue_) { + this.readyQueue_.length = 0; + } + /** + * Triggered when a `Component` is disposed. + * + * @event Component#dispose + * @type {EventTarget~Event} + * + * @property {boolean} [bubbles=false] + * set to false so that the dispose event does not + * bubble up + */ + + + this.trigger({ + type: 'dispose', + bubbles: false + }); + this.isDisposed_ = true; // Dispose all children. + + if (this.children_) { + for (var i = this.children_.length - 1; i >= 0; i--) { + if (this.children_[i].dispose) { + this.children_[i].dispose(); + } + } + } // Delete child references + + + this.children_ = null; + this.childIndex_ = null; + this.childNameIndex_ = null; + this.parentComponent_ = null; + + if (this.el_) { + // Remove element from DOM + if (this.el_.parentNode) { + this.el_.parentNode.removeChild(this.el_); + } + + if (DomData.has(this.el_)) { + DomData["delete"](this.el_); + } + + this.el_ = null; + } // remove reference to the player after disposing of the element + + + this.player_ = null; + } + /** + * Determine whether or not this component has been disposed. + * + * @return {boolean} + * If the component has been disposed, will be `true`. Otherwise, `false`. + */ + ; + + _proto.isDisposed = function isDisposed() { + return Boolean(this.isDisposed_); + } + /** + * Return the {@link Player} that the `Component` has attached to. + * + * @return {Player} + * The player that this `Component` has attached to. + */ + ; + + _proto.player = function player() { + return this.player_; + } + /** + * Deep merge of options objects with new options. + * > Note: When both `obj` and `options` contain properties whose values are objects. + * The two properties get merged using {@link module:mergeOptions} + * + * @param {Object} obj + * The object that contains new options. + * + * @return {Object} + * A new object of `this.options_` and `obj` merged together. + */ + ; + + _proto.options = function options(obj) { + if (!obj) { + return this.options_; + } + + this.options_ = mergeOptions$3(this.options_, obj); + return this.options_; + } + /** + * Get the `Component`s DOM element + * + * @return {Element} + * The DOM element for this `Component`. + */ + ; + + _proto.el = function el() { + return this.el_; + } + /** + * Create the `Component`s DOM element. + * + * @param {string} [tagName] + * Element's DOM node type. e.g. 'div' + * + * @param {Object} [properties] + * An object of properties that should be set. + * + * @param {Object} [attributes] + * An object of attributes that should be set. + * + * @return {Element} + * The element that gets created. + */ + ; + + _proto.createEl = function createEl$1(tagName, properties, attributes) { + return createEl(tagName, properties, attributes); + } + /** + * Localize a string given the string in english. + * + * If tokens are provided, it'll try and run a simple token replacement on the provided string. + * The tokens it looks for look like `{1}` with the index being 1-indexed into the tokens array. + * + * If a `defaultValue` is provided, it'll use that over `string`, + * if a value isn't found in provided language files. + * This is useful if you want to have a descriptive key for token replacement + * but have a succinct localized string and not require `en.json` to be included. + * + * Currently, it is used for the progress bar timing. + * ```js + * { + * "progress bar timing: currentTime={1} duration={2}": "{1} of {2}" + * } + * ``` + * It is then used like so: + * ```js + * this.localize('progress bar timing: currentTime={1} duration{2}', + * [this.player_.currentTime(), this.player_.duration()], + * '{1} of {2}'); + * ``` + * + * Which outputs something like: `01:23 of 24:56`. + * + * + * @param {string} string + * The string to localize and the key to lookup in the language files. + * @param {string[]} [tokens] + * If the current item has token replacements, provide the tokens here. + * @param {string} [defaultValue] + * Defaults to `string`. Can be a default value to use for token replacement + * if the lookup key is needed to be separate. + * + * @return {string} + * The localized string or if no localization exists the english string. + */ + ; + + _proto.localize = function localize(string, tokens, defaultValue) { + if (defaultValue === void 0) { + defaultValue = string; + } + + var code = this.player_.language && this.player_.language(); + var languages = this.player_.languages && this.player_.languages(); + var language = languages && languages[code]; + var primaryCode = code && code.split('-')[0]; + var primaryLang = languages && languages[primaryCode]; + var localizedString = defaultValue; + + if (language && language[string]) { + localizedString = language[string]; + } else if (primaryLang && primaryLang[string]) { + localizedString = primaryLang[string]; + } + + if (tokens) { + localizedString = localizedString.replace(/\{(\d+)\}/g, function (match, index) { + var value = tokens[index - 1]; + var ret = value; + + if (typeof value === 'undefined') { + ret = match; + } + + return ret; + }); + } + + return localizedString; + } + /** + * Handles language change for the player in components. Should be overriden by sub-components. + * + * @abstract + */ + ; + + _proto.handleLanguagechange = function handleLanguagechange() {} + /** + * Return the `Component`s DOM element. This is where children get inserted. + * This will usually be the the same as the element returned in {@link Component#el}. + * + * @return {Element} + * The content element for this `Component`. + */ + ; + + _proto.contentEl = function contentEl() { + return this.contentEl_ || this.el_; + } + /** + * Get this `Component`s ID + * + * @return {string} + * The id of this `Component` + */ + ; + + _proto.id = function id() { + return this.id_; + } + /** + * Get the `Component`s name. The name gets used to reference the `Component` + * and is set during registration. + * + * @return {string} + * The name of this `Component`. + */ + ; + + _proto.name = function name() { + return this.name_; + } + /** + * Get an array of all child components + * + * @return {Array} + * The children + */ + ; + + _proto.children = function children() { + return this.children_; + } + /** + * Returns the child `Component` with the given `id`. + * + * @param {string} id + * The id of the child `Component` to get. + * + * @return {Component|undefined} + * The child `Component` with the given `id` or undefined. + */ + ; + + _proto.getChildById = function getChildById(id) { + return this.childIndex_[id]; + } + /** + * Returns the child `Component` with the given `name`. + * + * @param {string} name + * The name of the child `Component` to get. + * + * @return {Component|undefined} + * The child `Component` with the given `name` or undefined. + */ + ; + + _proto.getChild = function getChild(name) { + if (!name) { + return; + } + + return this.childNameIndex_[name]; + } + /** + * Returns the descendant `Component` following the givent + * descendant `names`. For instance ['foo', 'bar', 'baz'] would + * try to get 'foo' on the current component, 'bar' on the 'foo' + * component and 'baz' on the 'bar' component and return undefined + * if any of those don't exist. + * + * @param {...string[]|...string} names + * The name of the child `Component` to get. + * + * @return {Component|undefined} + * The descendant `Component` following the given descendant + * `names` or undefined. + */ + ; + + _proto.getDescendant = function getDescendant() { + for (var _len = arguments.length, names = new Array(_len), _key = 0; _key < _len; _key++) { + names[_key] = arguments[_key]; + } + + // flatten array argument into the main array + names = names.reduce(function (acc, n) { + return acc.concat(n); + }, []); + var currentChild = this; + + for (var i = 0; i < names.length; i++) { + currentChild = currentChild.getChild(names[i]); + + if (!currentChild || !currentChild.getChild) { + return; + } + } + + return currentChild; + } + /** + * Add a child `Component` inside the current `Component`. + * + * + * @param {string|Component} child + * The name or instance of a child to add. + * + * @param {Object} [options={}] + * The key/value store of options that will get passed to children of + * the child. + * + * @param {number} [index=this.children_.length] + * The index to attempt to add a child into. + * + * @return {Component} + * The `Component` that gets added as a child. When using a string the + * `Component` will get created by this process. + */ + ; + + _proto.addChild = function addChild(child, options, index) { + if (options === void 0) { + options = {}; + } + + if (index === void 0) { + index = this.children_.length; + } + + var component; + var componentName; // If child is a string, create component with options + + if (typeof child === 'string') { + componentName = toTitleCase$1(child); + var componentClassName = options.componentClass || componentName; // Set name through options + + options.name = componentName; // Create a new object & element for this controls set + // If there's no .player_, this is a player + + var ComponentClass = Component.getComponent(componentClassName); + + if (!ComponentClass) { + throw new Error("Component " + componentClassName + " does not exist"); + } // data stored directly on the videojs object may be + // misidentified as a component to retain + // backwards-compatibility with 4.x. check to make sure the + // component class can be instantiated. + + + if (typeof ComponentClass !== 'function') { + return null; + } + + component = new ComponentClass(this.player_ || this, options); // child is a component instance + } else { + component = child; + } + + if (component.parentComponent_) { + component.parentComponent_.removeChild(component); + } + + this.children_.splice(index, 0, component); + component.parentComponent_ = this; + + if (typeof component.id === 'function') { + this.childIndex_[component.id()] = component; + } // If a name wasn't used to create the component, check if we can use the + // name function of the component + + + componentName = componentName || component.name && toTitleCase$1(component.name()); + + if (componentName) { + this.childNameIndex_[componentName] = component; + this.childNameIndex_[toLowerCase(componentName)] = component; + } // Add the UI object's element to the container div (box) + // Having an element is not required + + + if (typeof component.el === 'function' && component.el()) { + // If inserting before a component, insert before that component's element + var refNode = null; + + if (this.children_[index + 1]) { + // Most children are components, but the video tech is an HTML element + if (this.children_[index + 1].el_) { + refNode = this.children_[index + 1].el_; + } else if (isEl(this.children_[index + 1])) { + refNode = this.children_[index + 1]; + } + } + + this.contentEl().insertBefore(component.el(), refNode); + } // Return so it can stored on parent object if desired. + + + return component; + } + /** + * Remove a child `Component` from this `Component`s list of children. Also removes + * the child `Component`s element from this `Component`s element. + * + * @param {Component} component + * The child `Component` to remove. + */ + ; + + _proto.removeChild = function removeChild(component) { + if (typeof component === 'string') { + component = this.getChild(component); + } + + if (!component || !this.children_) { + return; + } + + var childFound = false; + + for (var i = this.children_.length - 1; i >= 0; i--) { + if (this.children_[i] === component) { + childFound = true; + this.children_.splice(i, 1); + break; + } + } + + if (!childFound) { + return; + } + + component.parentComponent_ = null; + this.childIndex_[component.id()] = null; + this.childNameIndex_[toTitleCase$1(component.name())] = null; + this.childNameIndex_[toLowerCase(component.name())] = null; + var compEl = component.el(); + + if (compEl && compEl.parentNode === this.contentEl()) { + this.contentEl().removeChild(component.el()); + } + } + /** + * Add and initialize default child `Component`s based upon options. + */ + ; + + _proto.initChildren = function initChildren() { + var _this = this; + + var children = this.options_.children; + + if (children) { + // `this` is `parent` + var parentOptions = this.options_; + + var handleAdd = function handleAdd(child) { + var name = child.name; + var opts = child.opts; // Allow options for children to be set at the parent options + // e.g. videojs(id, { controlBar: false }); + // instead of videojs(id, { children: { controlBar: false }); + + if (parentOptions[name] !== undefined) { + opts = parentOptions[name]; + } // Allow for disabling default components + // e.g. options['children']['posterImage'] = false + + + if (opts === false) { + return; + } // Allow options to be passed as a simple boolean if no configuration + // is necessary. + + + if (opts === true) { + opts = {}; + } // We also want to pass the original player options + // to each component as well so they don't need to + // reach back into the player for options later. + + + opts.playerOptions = _this.options_.playerOptions; // Create and add the child component. + // Add a direct reference to the child by name on the parent instance. + // If two of the same component are used, different names should be supplied + // for each + + var newChild = _this.addChild(name, opts); + + if (newChild) { + _this[name] = newChild; + } + }; // Allow for an array of children details to passed in the options + + + var workingChildren; + var Tech = Component.getComponent('Tech'); + + if (Array.isArray(children)) { + workingChildren = children; + } else { + workingChildren = Object.keys(children); + } + + workingChildren // children that are in this.options_ but also in workingChildren would + // give us extra children we do not want. So, we want to filter them out. + .concat(Object.keys(this.options_).filter(function (child) { + return !workingChildren.some(function (wchild) { + if (typeof wchild === 'string') { + return child === wchild; + } + + return child === wchild.name; + }); + })).map(function (child) { + var name; + var opts; + + if (typeof child === 'string') { + name = child; + opts = children[name] || _this.options_[name] || {}; + } else { + name = child.name; + opts = child; + } + + return { + name: name, + opts: opts + }; + }).filter(function (child) { + // we have to make sure that child.name isn't in the techOrder since + // techs are registerd as Components but can't aren't compatible + // See https://github.com/videojs/video.js/issues/2772 + var c = Component.getComponent(child.opts.componentClass || toTitleCase$1(child.name)); + return c && !Tech.isTech(c); + }).forEach(handleAdd); + } + } + /** + * Builds the default DOM class name. Should be overriden by sub-components. + * + * @return {string} + * The DOM class name for this object. + * + * @abstract + */ + ; + + _proto.buildCSSClass = function buildCSSClass() { + // Child classes can include a function that does: + // return 'CLASS NAME' + this._super(); + return ''; + } + /** + * Bind a listener to the component's ready state. + * Different from event listeners in that if the ready event has already happened + * it will trigger the function immediately. + * + * @return {Component} + * Returns itself; method can be chained. + */ + ; + + _proto.ready = function ready(fn, sync) { + if (sync === void 0) { + sync = false; + } + + if (!fn) { + return; + } + + if (!this.isReady_) { + this.readyQueue_ = this.readyQueue_ || []; + this.readyQueue_.push(fn); + return; + } + + if (sync) { + fn.call(this); + } else { + // Call the function asynchronously by default for consistency + this.setTimeout(fn, 1); + } + } + /** + * Trigger all the ready listeners for this `Component`. + * + * @fires Component#ready + */ + ; + + _proto.triggerReady = function triggerReady() { + this.isReady_ = true; // Ensure ready is triggered asynchronously + + this.setTimeout(function () { + var readyQueue = this.readyQueue_; // Reset Ready Queue + + this.readyQueue_ = []; + + if (readyQueue && readyQueue.length > 0) { + readyQueue.forEach(function (fn) { + fn.call(this); + }, this); + } // Allow for using event listeners also + + /** + * Triggered when a `Component` is ready. + * + * @event Component#ready + * @type {EventTarget~Event} + */ + + + this.trigger('ready'); + }, 1); + } + /** + * Find a single DOM element matching a `selector`. This can be within the `Component`s + * `contentEl()` or another custom context. + * + * @param {string} selector + * A valid CSS selector, which will be passed to `querySelector`. + * + * @param {Element|string} [context=this.contentEl()] + * A DOM element within which to query. Can also be a selector string in + * which case the first matching element will get used as context. If + * missing `this.contentEl()` gets used. If `this.contentEl()` returns + * nothing it falls back to `document`. + * + * @return {Element|null} + * the dom element that was found, or null + * + * @see [Information on CSS Selectors](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_Started/Selectors) + */ + ; + + _proto.$ = function $$1(selector, context) { + return $(selector, context || this.contentEl()); + } + /** + * Finds all DOM element matching a `selector`. This can be within the `Component`s + * `contentEl()` or another custom context. + * + * @param {string} selector + * A valid CSS selector, which will be passed to `querySelectorAll`. + * + * @param {Element|string} [context=this.contentEl()] + * A DOM element within which to query. Can also be a selector string in + * which case the first matching element will get used as context. If + * missing `this.contentEl()` gets used. If `this.contentEl()` returns + * nothing it falls back to `document`. + * + * @return {NodeList} + * a list of dom elements that were found + * + * @see [Information on CSS Selectors](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_Started/Selectors) + */ + ; + + _proto.$$ = function $$$1(selector, context) { + return $$(selector, context || this.contentEl()); + } + /** + * Check if a component's element has a CSS class name. + * + * @param {string} classToCheck + * CSS class name to check. + * + * @return {boolean} + * - True if the `Component` has the class. + * - False if the `Component` does not have the class` + */ + ; + + _proto.hasClass = function hasClass$1(classToCheck) { + return hasClass(this.el_, classToCheck); + } + /** + * Add a CSS class name to the `Component`s element. + * + * @param {string} classToAdd + * CSS class name to add + */ + ; + + _proto.addClass = function addClass$1(classToAdd) { + addClass(this.el_, classToAdd); + } + /** + * Remove a CSS class name from the `Component`s element. + * + * @param {string} classToRemove + * CSS class name to remove + */ + ; + + _proto.removeClass = function removeClass$1(classToRemove) { + removeClass(this.el_, classToRemove); + } + /** + * Add or remove a CSS class name from the component's element. + * - `classToToggle` gets added when {@link Component#hasClass} would return false. + * - `classToToggle` gets removed when {@link Component#hasClass} would return true. + * + * @param {string} classToToggle + * The class to add or remove based on (@link Component#hasClass} + * + * @param {boolean|Dom~predicate} [predicate] + * An {@link Dom~predicate} function or a boolean + */ + ; + + _proto.toggleClass = function toggleClass$1(classToToggle, predicate) { + toggleClass(this.el_, classToToggle, predicate); + } + /** + * Show the `Component`s element if it is hidden by removing the + * 'vjs-hidden' class name from it. + */ + ; + + _proto.show = function show() { + this.removeClass('vjs-hidden'); + } + /** + * Hide the `Component`s element if it is currently showing by adding the + * 'vjs-hidden` class name to it. + */ + ; + + _proto.hide = function hide() { + this.addClass('vjs-hidden'); + } + /** + * Lock a `Component`s element in its visible state by adding the 'vjs-lock-showing' + * class name to it. Used during fadeIn/fadeOut. + * + * @private + */ + ; + + _proto.lockShowing = function lockShowing() { + this.addClass('vjs-lock-showing'); + } + /** + * Unlock a `Component`s element from its visible state by removing the 'vjs-lock-showing' + * class name from it. Used during fadeIn/fadeOut. + * + * @private + */ + ; + + _proto.unlockShowing = function unlockShowing() { + this.removeClass('vjs-lock-showing'); + } + /** + * Get the value of an attribute on the `Component`s element. + * + * @param {string} attribute + * Name of the attribute to get the value from. + * + * @return {string|null} + * - The value of the attribute that was asked for. + * - Can be an empty string on some browsers if the attribute does not exist + * or has no value + * - Most browsers will return null if the attibute does not exist or has + * no value. + * + * @see [DOM API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttribute} + */ + ; + + _proto.getAttribute = function getAttribute$1(attribute) { + return getAttribute(this.el_, attribute); + } + /** + * Set the value of an attribute on the `Component`'s element + * + * @param {string} attribute + * Name of the attribute to set. + * + * @param {string} value + * Value to set the attribute to. + * + * @see [DOM API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Element/setAttribute} + */ + ; + + _proto.setAttribute = function setAttribute$1(attribute, value) { + setAttribute(this.el_, attribute, value); + } + /** + * Remove an attribute from the `Component`s element. + * + * @param {string} attribute + * Name of the attribute to remove. + * + * @see [DOM API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Element/removeAttribute} + */ + ; + + _proto.removeAttribute = function removeAttribute$1(attribute) { + removeAttribute(this.el_, attribute); + } + /** + * Get or set the width of the component based upon the CSS styles. + * See {@link Component#dimension} for more detailed information. + * + * @param {number|string} [num] + * The width that you want to set postfixed with '%', 'px' or nothing. + * + * @param {boolean} [skipListeners] + * Skip the componentresize event trigger + * + * @return {number|string} + * The width when getting, zero if there is no width. Can be a string + * postpixed with '%' or 'px'. + */ + ; + + _proto.width = function width(num, skipListeners) { + return this.dimension('width', num, skipListeners); + } + /** + * Get or set the height of the component based upon the CSS styles. + * See {@link Component#dimension} for more detailed information. + * + * @param {number|string} [num] + * The height that you want to set postfixed with '%', 'px' or nothing. + * + * @param {boolean} [skipListeners] + * Skip the componentresize event trigger + * + * @return {number|string} + * The width when getting, zero if there is no width. Can be a string + * postpixed with '%' or 'px'. + */ + ; + + _proto.height = function height(num, skipListeners) { + return this.dimension('height', num, skipListeners); + } + /** + * Set both the width and height of the `Component` element at the same time. + * + * @param {number|string} width + * Width to set the `Component`s element to. + * + * @param {number|string} height + * Height to set the `Component`s element to. + */ + ; + + _proto.dimensions = function dimensions(width, height) { + // Skip componentresize listeners on width for optimization + this.width(width, true); + this.height(height); + } + /** + * Get or set width or height of the `Component` element. This is the shared code + * for the {@link Component#width} and {@link Component#height}. + * + * Things to know: + * - If the width or height in an number this will return the number postfixed with 'px'. + * - If the width/height is a percent this will return the percent postfixed with '%' + * - Hidden elements have a width of 0 with `window.getComputedStyle`. This function + * defaults to the `Component`s `style.width` and falls back to `window.getComputedStyle`. + * See [this]{@link http://www.foliotek.com/devblog/getting-the-width-of-a-hidden-element-with-jquery-using-width/} + * for more information + * - If you want the computed style of the component, use {@link Component#currentWidth} + * and {@link {Component#currentHeight} + * + * @fires Component#componentresize + * + * @param {string} widthOrHeight + 8 'width' or 'height' + * + * @param {number|string} [num] + 8 New dimension + * + * @param {boolean} [skipListeners] + * Skip componentresize event trigger + * + * @return {number} + * The dimension when getting or 0 if unset + */ + ; + + _proto.dimension = function dimension(widthOrHeight, num, skipListeners) { + if (num !== undefined) { + // Set to zero if null or literally NaN (NaN !== NaN) + if (num === null || num !== num) { + num = 0; + } // Check if using css width/height (% or px) and adjust + + + if (('' + num).indexOf('%') !== -1 || ('' + num).indexOf('px') !== -1) { + this.el_.style[widthOrHeight] = num; + } else if (num === 'auto') { + this.el_.style[widthOrHeight] = ''; + } else { + this.el_.style[widthOrHeight] = num + 'px'; + } // skipListeners allows us to avoid triggering the resize event when setting both width and height + + + if (!skipListeners) { + /** + * Triggered when a component is resized. + * + * @event Component#componentresize + * @type {EventTarget~Event} + */ + this.trigger('componentresize'); + } + + return; + } // Not setting a value, so getting it + // Make sure element exists + + + if (!this.el_) { + return 0; + } // Get dimension value from style + + + var val = this.el_.style[widthOrHeight]; + var pxIndex = val.indexOf('px'); + + if (pxIndex !== -1) { + // Return the pixel value with no 'px' + return parseInt(val.slice(0, pxIndex), 10); + } // No px so using % or no style was set, so falling back to offsetWidth/height + // If component has display:none, offset will return 0 + // TODO: handle display:none and no dimension style using px + + + return parseInt(this.el_['offset' + toTitleCase$1(widthOrHeight)], 10); + } + /** + * Get the computed width or the height of the component's element. + * + * Uses `window.getComputedStyle`. + * + * @param {string} widthOrHeight + * A string containing 'width' or 'height'. Whichever one you want to get. + * + * @return {number} + * The dimension that gets asked for or 0 if nothing was set + * for that dimension. + */ + ; + + _proto.currentDimension = function currentDimension(widthOrHeight) { + var computedWidthOrHeight = 0; + + if (widthOrHeight !== 'width' && widthOrHeight !== 'height') { + throw new Error('currentDimension only accepts width or height value'); + } + + computedWidthOrHeight = computedStyle(this.el_, widthOrHeight); // remove 'px' from variable and parse as integer + + computedWidthOrHeight = parseFloat(computedWidthOrHeight); // if the computed value is still 0, it's possible that the browser is lying + // and we want to check the offset values. + // This code also runs wherever getComputedStyle doesn't exist. + + if (computedWidthOrHeight === 0 || isNaN(computedWidthOrHeight)) { + var rule = "offset" + toTitleCase$1(widthOrHeight); + computedWidthOrHeight = this.el_[rule]; + } + + return computedWidthOrHeight; + } + /** + * An object that contains width and height values of the `Component`s + * computed style. Uses `window.getComputedStyle`. + * + * @typedef {Object} Component~DimensionObject + * + * @property {number} width + * The width of the `Component`s computed style. + * + * @property {number} height + * The height of the `Component`s computed style. + */ + + /** + * Get an object that contains computed width and height values of the + * component's element. + * + * Uses `window.getComputedStyle`. + * + * @return {Component~DimensionObject} + * The computed dimensions of the component's element. + */ + ; + + _proto.currentDimensions = function currentDimensions() { + return { + width: this.currentDimension('width'), + height: this.currentDimension('height') + }; + } + /** + * Get the computed width of the component's element. + * + * Uses `window.getComputedStyle`. + * + * @return {number} + * The computed width of the component's element. + */ + ; + + _proto.currentWidth = function currentWidth() { + return this.currentDimension('width'); + } + /** + * Get the computed height of the component's element. + * + * Uses `window.getComputedStyle`. + * + * @return {number} + * The computed height of the component's element. + */ + ; + + _proto.currentHeight = function currentHeight() { + return this.currentDimension('height'); + } + /** + * Set the focus to this component + */ + ; + + _proto.focus = function focus() { + this.el_.focus(); + } + /** + * Remove the focus from this component + */ + ; + + _proto.blur = function blur() { + this.el_.blur(); + } + /** + * When this Component receives a `keydown` event which it does not process, + * it passes the event to the Player for handling. + * + * @param {EventTarget~Event} event + * The `keydown` event that caused this function to be called. + */ + ; + + _proto.handleKeyDown = function handleKeyDown(event) { + if (this.player_) { + // We only stop propagation here because we want unhandled events to fall + // back to the browser. + event.stopPropagation(); + this.player_.handleKeyDown(event); + } + } + /** + * Many components used to have a `handleKeyPress` method, which was poorly + * named because it listened to a `keydown` event. This method name now + * delegates to `handleKeyDown`. This means anyone calling `handleKeyPress` + * will not see their method calls stop working. + * + * @param {EventTarget~Event} event + * The event that caused this function to be called. + */ + ; + + _proto.handleKeyPress = function handleKeyPress(event) { + this.handleKeyDown(event); + } + /** + * Emit a 'tap' events when touch event support gets detected. This gets used to + * support toggling the controls through a tap on the video. They get enabled + * because every sub-component would have extra overhead otherwise. + * + * @private + * @fires Component#tap + * @listens Component#touchstart + * @listens Component#touchmove + * @listens Component#touchleave + * @listens Component#touchcancel + * @listens Component#touchend + */ + ; + + _proto.emitTapEvents = function emitTapEvents() { + // Track the start time so we can determine how long the touch lasted + var touchStart = 0; + var firstTouch = null; // Maximum movement allowed during a touch event to still be considered a tap + // Other popular libs use anywhere from 2 (hammer.js) to 15, + // so 10 seems like a nice, round number. + + var tapMovementThreshold = 10; // The maximum length a touch can be while still being considered a tap + + var touchTimeThreshold = 200; + var couldBeTap; + this.on('touchstart', function (event) { + // If more than one finger, don't consider treating this as a click + if (event.touches.length === 1) { + // Copy pageX/pageY from the object + firstTouch = { + pageX: event.touches[0].pageX, + pageY: event.touches[0].pageY + }; // Record start time so we can detect a tap vs. "touch and hold" + + touchStart = window_1.performance.now(); // Reset couldBeTap tracking + + couldBeTap = true; + } + }); + this.on('touchmove', function (event) { + // If more than one finger, don't consider treating this as a click + if (event.touches.length > 1) { + couldBeTap = false; + } else if (firstTouch) { + // Some devices will throw touchmoves for all but the slightest of taps. + // So, if we moved only a small distance, this could still be a tap + var xdiff = event.touches[0].pageX - firstTouch.pageX; + var ydiff = event.touches[0].pageY - firstTouch.pageY; + var touchDistance = Math.sqrt(xdiff * xdiff + ydiff * ydiff); + + if (touchDistance > tapMovementThreshold) { + couldBeTap = false; + } + } + }); + + var noTap = function noTap() { + couldBeTap = false; + }; // TODO: Listen to the original target. http://youtu.be/DujfpXOKUp8?t=13m8s + + + this.on('touchleave', noTap); + this.on('touchcancel', noTap); // When the touch ends, measure how long it took and trigger the appropriate + // event + + this.on('touchend', function (event) { + firstTouch = null; // Proceed only if the touchmove/leave/cancel event didn't happen + + if (couldBeTap === true) { + // Measure how long the touch lasted + var touchTime = window_1.performance.now() - touchStart; // Make sure the touch was less than the threshold to be considered a tap + + if (touchTime < touchTimeThreshold) { + // Don't let browser turn this into a click + event.preventDefault(); + /** + * Triggered when a `Component` is tapped. + * + * @event Component#tap + * @type {EventTarget~Event} + */ + + this.trigger('tap'); // It may be good to copy the touchend event object and change the + // type to tap, if the other event properties aren't exact after + // Events.fixEvent runs (e.g. event.target) + } + } + }); + } + /** + * This function reports user activity whenever touch events happen. This can get + * turned off by any sub-components that wants touch events to act another way. + * + * Report user touch activity when touch events occur. User activity gets used to + * determine when controls should show/hide. It is simple when it comes to mouse + * events, because any mouse event should show the controls. So we capture mouse + * events that bubble up to the player and report activity when that happens. + * With touch events it isn't as easy as `touchstart` and `touchend` toggle player + * controls. So touch events can't help us at the player level either. + * + * User activity gets checked asynchronously. So what could happen is a tap event + * on the video turns the controls off. Then the `touchend` event bubbles up to + * the player. Which, if it reported user activity, would turn the controls right + * back on. We also don't want to completely block touch events from bubbling up. + * Furthermore a `touchmove` event and anything other than a tap, should not turn + * controls back on. + * + * @listens Component#touchstart + * @listens Component#touchmove + * @listens Component#touchend + * @listens Component#touchcancel + */ + ; + + _proto.enableTouchActivity = function enableTouchActivity() { + // Don't continue if the root player doesn't support reporting user activity + if (!this.player() || !this.player().reportUserActivity) { + return; + } // listener for reporting that the user is active + + + var report = bind(this.player(), this.player().reportUserActivity); + var touchHolding; + this.on('touchstart', function () { + report(); // For as long as the they are touching the device or have their mouse down, + // we consider them active even if they're not moving their finger or mouse. + // So we want to continue to update that they are active + + this.clearInterval(touchHolding); // report at the same interval as activityCheck + + touchHolding = this.setInterval(report, 250); + }); + + var touchEnd = function touchEnd(event) { + report(); // stop the interval that maintains activity if the touch is holding + + this.clearInterval(touchHolding); + }; + + this.on('touchmove', report); + this.on('touchend', touchEnd); + this.on('touchcancel', touchEnd); + } + /** + * A callback that has no parameters and is bound into `Component`s context. + * + * @callback Component~GenericCallback + * @this Component + */ + + /** + * Creates a function that runs after an `x` millisecond timeout. This function is a + * wrapper around `window.setTimeout`. There are a few reasons to use this one + * instead though: + * 1. It gets cleared via {@link Component#clearTimeout} when + * {@link Component#dispose} gets called. + * 2. The function callback will gets turned into a {@link Component~GenericCallback} + * + * > Note: You can't use `window.clearTimeout` on the id returned by this function. This + * will cause its dispose listener not to get cleaned up! Please use + * {@link Component#clearTimeout} or {@link Component#dispose} instead. + * + * @param {Component~GenericCallback} fn + * The function that will be run after `timeout`. + * + * @param {number} timeout + * Timeout in milliseconds to delay before executing the specified function. + * + * @return {number} + * Returns a timeout ID that gets used to identify the timeout. It can also + * get used in {@link Component#clearTimeout} to clear the timeout that + * was set. + * + * @listens Component#dispose + * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout} + */ + ; + + _proto.setTimeout = function setTimeout(fn, timeout) { + var _this2 = this; + + // declare as variables so they are properly available in timeout function + // eslint-disable-next-line + var timeoutId; + fn = bind(this, fn); + this.clearTimersOnDispose_(); + timeoutId = window_1.setTimeout(function () { + if (_this2.setTimeoutIds_.has(timeoutId)) { + _this2.setTimeoutIds_["delete"](timeoutId); + } + + fn(); + }, timeout); + this.setTimeoutIds_.add(timeoutId); + return timeoutId; + } + /** + * Clears a timeout that gets created via `window.setTimeout` or + * {@link Component#setTimeout}. If you set a timeout via {@link Component#setTimeout} + * use this function instead of `window.clearTimout`. If you don't your dispose + * listener will not get cleaned up until {@link Component#dispose}! + * + * @param {number} timeoutId + * The id of the timeout to clear. The return value of + * {@link Component#setTimeout} or `window.setTimeout`. + * + * @return {number} + * Returns the timeout id that was cleared. + * + * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/clearTimeout} + */ + ; + + _proto.clearTimeout = function clearTimeout(timeoutId) { + if (this.setTimeoutIds_.has(timeoutId)) { + this.setTimeoutIds_["delete"](timeoutId); + window_1.clearTimeout(timeoutId); + } + + return timeoutId; + } + /** + * Creates a function that gets run every `x` milliseconds. This function is a wrapper + * around `window.setInterval`. There are a few reasons to use this one instead though. + * 1. It gets cleared via {@link Component#clearInterval} when + * {@link Component#dispose} gets called. + * 2. The function callback will be a {@link Component~GenericCallback} + * + * @param {Component~GenericCallback} fn + * The function to run every `x` seconds. + * + * @param {number} interval + * Execute the specified function every `x` milliseconds. + * + * @return {number} + * Returns an id that can be used to identify the interval. It can also be be used in + * {@link Component#clearInterval} to clear the interval. + * + * @listens Component#dispose + * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setInterval} + */ + ; + + _proto.setInterval = function setInterval(fn, interval) { + fn = bind(this, fn); + this.clearTimersOnDispose_(); + var intervalId = window_1.setInterval(fn, interval); + this.setIntervalIds_.add(intervalId); + return intervalId; + } + /** + * Clears an interval that gets created via `window.setInterval` or + * {@link Component#setInterval}. If you set an inteval via {@link Component#setInterval} + * use this function instead of `window.clearInterval`. If you don't your dispose + * listener will not get cleaned up until {@link Component#dispose}! + * + * @param {number} intervalId + * The id of the interval to clear. The return value of + * {@link Component#setInterval} or `window.setInterval`. + * + * @return {number} + * Returns the interval id that was cleared. + * + * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/clearInterval} + */ + ; + + _proto.clearInterval = function clearInterval(intervalId) { + if (this.setIntervalIds_.has(intervalId)) { + this.setIntervalIds_["delete"](intervalId); + window_1.clearInterval(intervalId); + } + + return intervalId; + } + /** + * Queues up a callback to be passed to requestAnimationFrame (rAF), but + * with a few extra bonuses: + * + * - Supports browsers that do not support rAF by falling back to + * {@link Component#setTimeout}. + * + * - The callback is turned into a {@link Component~GenericCallback} (i.e. + * bound to the component). + * + * - Automatic cancellation of the rAF callback is handled if the component + * is disposed before it is called. + * + * @param {Component~GenericCallback} fn + * A function that will be bound to this component and executed just + * before the browser's next repaint. + * + * @return {number} + * Returns an rAF ID that gets used to identify the timeout. It can + * also be used in {@link Component#cancelAnimationFrame} to cancel + * the animation frame callback. + * + * @listens Component#dispose + * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame} + */ + ; + + _proto.requestAnimationFrame = function requestAnimationFrame(fn) { + var _this3 = this; + + // Fall back to using a timer. + if (!this.supportsRaf_) { + return this.setTimeout(fn, 1000 / 60); + } + + this.clearTimersOnDispose_(); // declare as variables so they are properly available in rAF function + // eslint-disable-next-line + + var id; + fn = bind(this, fn); + id = window_1.requestAnimationFrame(function () { + if (_this3.rafIds_.has(id)) { + _this3.rafIds_["delete"](id); + } + + fn(); + }); + this.rafIds_.add(id); + return id; + } + /** + * Request an animation frame, but only one named animation + * frame will be queued. Another will never be added until + * the previous one finishes. + * + * @param {string} name + * The name to give this requestAnimationFrame + * + * @param {Component~GenericCallback} fn + * A function that will be bound to this component and executed just + * before the browser's next repaint. + */ + ; + + _proto.requestNamedAnimationFrame = function requestNamedAnimationFrame(name, fn) { + var _this4 = this; + + if (this.namedRafs_.has(name)) { + return; + } + + this.clearTimersOnDispose_(); + fn = bind(this, fn); + var id = this.requestAnimationFrame(function () { + fn(); + + if (_this4.namedRafs_.has(name)) { + _this4.namedRafs_["delete"](name); + } + }); + this.namedRafs_.set(name, id); + return name; + } + /** + * Cancels a current named animation frame if it exists. + * + * @param {string} name + * The name of the requestAnimationFrame to cancel. + */ + ; + + _proto.cancelNamedAnimationFrame = function cancelNamedAnimationFrame(name) { + if (!this.namedRafs_.has(name)) { + return; + } + + this.cancelAnimationFrame(this.namedRafs_.get(name)); + this.namedRafs_["delete"](name); + } + /** + * Cancels a queued callback passed to {@link Component#requestAnimationFrame} + * (rAF). + * + * If you queue an rAF callback via {@link Component#requestAnimationFrame}, + * use this function instead of `window.cancelAnimationFrame`. If you don't, + * your dispose listener will not get cleaned up until {@link Component#dispose}! + * + * @param {number} id + * The rAF ID to clear. The return value of {@link Component#requestAnimationFrame}. + * + * @return {number} + * Returns the rAF ID that was cleared. + * + * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/window/cancelAnimationFrame} + */ + ; + + _proto.cancelAnimationFrame = function cancelAnimationFrame(id) { + // Fall back to using a timer. + if (!this.supportsRaf_) { + return this.clearTimeout(id); + } + + if (this.rafIds_.has(id)) { + this.rafIds_["delete"](id); + window_1.cancelAnimationFrame(id); + } + + return id; + } + /** + * A function to setup `requestAnimationFrame`, `setTimeout`, + * and `setInterval`, clearing on dispose. + * + * > Previously each timer added and removed dispose listeners on it's own. + * For better performance it was decided to batch them all, and use `Set`s + * to track outstanding timer ids. + * + * @private + */ + ; + + _proto.clearTimersOnDispose_ = function clearTimersOnDispose_() { + var _this5 = this; + + if (this.clearingTimersOnDispose_) { + return; + } + + this.clearingTimersOnDispose_ = true; + this.one('dispose', function () { + [['namedRafs_', 'cancelNamedAnimationFrame'], ['rafIds_', 'cancelAnimationFrame'], ['setTimeoutIds_', 'clearTimeout'], ['setIntervalIds_', 'clearInterval']].forEach(function (_ref) { + var idName = _ref[0], + cancelName = _ref[1]; + + // for a `Set` key will actually be the value again + // so forEach((val, val) =>` but for maps we want to use + // the key. + _this5[idName].forEach(function (val, key) { + return _this5[cancelName](key); + }); + }); + _this5.clearingTimersOnDispose_ = false; + }); + } + /** + * Register a `Component` with `videojs` given the name and the component. + * + * > NOTE: {@link Tech}s should not be registered as a `Component`. {@link Tech}s + * should be registered using {@link Tech.registerTech} or + * {@link videojs:videojs.registerTech}. + * + * > NOTE: This function can also be seen on videojs as + * {@link videojs:videojs.registerComponent}. + * + * @param {string} name + * The name of the `Component` to register. + * + * @param {Component} ComponentToRegister + * The `Component` class to register. + * + * @return {Component} + * The `Component` that was registered. + */ + ; + + Component.registerComponent = function registerComponent(name, ComponentToRegister) { + if (typeof name !== 'string' || !name) { + throw new Error("Illegal component name, \"" + name + "\"; must be a non-empty string."); + } + + var Tech = Component.getComponent('Tech'); // We need to make sure this check is only done if Tech has been registered. + + var isTech = Tech && Tech.isTech(ComponentToRegister); + var isComp = Component === ComponentToRegister || Component.prototype.isPrototypeOf(ComponentToRegister.prototype); + + if (isTech || !isComp) { + var reason; + + if (isTech) { + reason = 'techs must be registered using Tech.registerTech()'; + } else { + reason = 'must be a Component subclass'; + } + + throw new Error("Illegal component, \"" + name + "\"; " + reason + "."); + } + + name = toTitleCase$1(name); + + if (!Component.components_) { + Component.components_ = {}; + } + + var Player = Component.getComponent('Player'); + + if (name === 'Player' && Player && Player.players) { + var players = Player.players; + var playerNames = Object.keys(players); // If we have players that were disposed, then their name will still be + // in Players.players. So, we must loop through and verify that the value + // for each item is not null. This allows registration of the Player component + // after all players have been disposed or before any were created. + + if (players && playerNames.length > 0 && playerNames.map(function (pname) { + return players[pname]; + }).every(Boolean)) { + throw new Error('Can not register Player component after player has been created.'); + } + } + + Component.components_[name] = ComponentToRegister; + Component.components_[toLowerCase(name)] = ComponentToRegister; + return ComponentToRegister; + } + /** + * Get a `Component` based on the name it was registered with. + * + * @param {string} name + * The Name of the component to get. + * + * @return {Component} + * The `Component` that got registered under the given name. + * + * @deprecated In `videojs` 6 this will not return `Component`s that were not + * registered using {@link Component.registerComponent}. Currently we + * check the global `videojs` object for a `Component` name and + * return that if it exists. + */ + ; + + Component.getComponent = function getComponent(name) { + if (!name || !Component.components_) { + return; + } + + return Component.components_[name]; + }; + + return Component; + }(); + /** + * Whether or not this component supports `requestAnimationFrame`. + * + * This is exposed primarily for testing purposes. + * + * @private + * @type {Boolean} + */ + + + Component$1.prototype.supportsRaf_ = typeof window_1.requestAnimationFrame === 'function' && typeof window_1.cancelAnimationFrame === 'function'; + Component$1.registerComponent('Component', Component$1); + + function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return self; + } + + var assertThisInitialized = _assertThisInitialized; + + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; + } + + var inheritsLoose = _inheritsLoose; + + /** + * @file time-ranges.js + * @module time-ranges + */ + + /** + * Returns the time for the specified index at the start or end + * of a TimeRange object. + * + * @typedef {Function} TimeRangeIndex + * + * @param {number} [index=0] + * The range number to return the time for. + * + * @return {number} + * The time offset at the specified index. + * + * @deprecated The index argument must be provided. + * In the future, leaving it out will throw an error. + */ + + /** + * An object that contains ranges of time. + * + * @typedef {Object} TimeRange + * + * @property {number} length + * The number of time ranges represented by this object. + * + * @property {module:time-ranges~TimeRangeIndex} start + * Returns the time offset at which a specified time range begins. + * + * @property {module:time-ranges~TimeRangeIndex} end + * Returns the time offset at which a specified time range ends. + * + * @see https://developer.mozilla.org/en-US/docs/Web/API/TimeRanges + */ + + /** + * Check if any of the time ranges are over the maximum index. + * + * @private + * @param {string} fnName + * The function name to use for logging + * + * @param {number} index + * The index to check + * + * @param {number} maxIndex + * The maximum possible index + * + * @throws {Error} if the timeRanges provided are over the maxIndex + */ + function rangeCheck(fnName, index, maxIndex) { + if (typeof index !== 'number' || index < 0 || index > maxIndex) { + throw new Error("Failed to execute '" + fnName + "' on 'TimeRanges': The index provided (" + index + ") is non-numeric or out of bounds (0-" + maxIndex + ")."); + } + } + /** + * Get the time for the specified index at the start or end + * of a TimeRange object. + * + * @private + * @param {string} fnName + * The function name to use for logging + * + * @param {string} valueIndex + * The property that should be used to get the time. should be + * 'start' or 'end' + * + * @param {Array} ranges + * An array of time ranges + * + * @param {Array} [rangeIndex=0] + * The index to start the search at + * + * @return {number} + * The time that offset at the specified index. + * + * @deprecated rangeIndex must be set to a value, in the future this will throw an error. + * @throws {Error} if rangeIndex is more than the length of ranges + */ + + + function getRange(fnName, valueIndex, ranges, rangeIndex) { + rangeCheck(fnName, rangeIndex, ranges.length - 1); + return ranges[rangeIndex][valueIndex]; + } + /** + * Create a time range object given ranges of time. + * + * @private + * @param {Array} [ranges] + * An array of time ranges. + */ + + + function createTimeRangesObj(ranges) { + if (ranges === undefined || ranges.length === 0) { + return { + length: 0, + start: function start() { + throw new Error('This TimeRanges object is empty'); + }, + end: function end() { + throw new Error('This TimeRanges object is empty'); + } + }; + } + + return { + length: ranges.length, + start: getRange.bind(null, 'start', 0, ranges), + end: getRange.bind(null, 'end', 1, ranges) + }; + } + /** + * Create a `TimeRange` object which mimics an + * {@link https://developer.mozilla.org/en-US/docs/Web/API/TimeRanges|HTML5 TimeRanges instance}. + * + * @param {number|Array[]} start + * The start of a single range (a number) or an array of ranges (an + * array of arrays of two numbers each). + * + * @param {number} end + * The end of a single range. Cannot be used with the array form of + * the `start` argument. + */ + + + function createTimeRanges(start, end) { + if (Array.isArray(start)) { + return createTimeRangesObj(start); + } else if (start === undefined || end === undefined) { + return createTimeRangesObj(); + } + + return createTimeRangesObj([[start, end]]); + } + + /** + * @file buffer.js + * @module buffer + */ + /** + * Compute the percentage of the media that has been buffered. + * + * @param {TimeRange} buffered + * The current `TimeRange` object representing buffered time ranges + * + * @param {number} duration + * Total duration of the media + * + * @return {number} + * Percent buffered of the total duration in decimal form. + */ + + function bufferedPercent(buffered, duration) { + var bufferedDuration = 0; + var start; + var end; + + if (!duration) { + return 0; + } + + if (!buffered || !buffered.length) { + buffered = createTimeRanges(0, 0); + } + + for (var i = 0; i < buffered.length; i++) { + start = buffered.start(i); + end = buffered.end(i); // buffered end can be bigger than duration by a very small fraction + + if (end > duration) { + end = duration; + } + + bufferedDuration += end - start; + } + + return bufferedDuration / duration; + } + + /** + * @file media-error.js + */ + /** + * A Custom `MediaError` class which mimics the standard HTML5 `MediaError` class. + * + * @param {number|string|Object|MediaError} value + * This can be of multiple types: + * - number: should be a standard error code + * - string: an error message (the code will be 0) + * - Object: arbitrary properties + * - `MediaError` (native): used to populate a video.js `MediaError` object + * - `MediaError` (video.js): will return itself if it's already a + * video.js `MediaError` object. + * + * @see [MediaError Spec]{@link https://dev.w3.org/html5/spec-author-view/video.html#mediaerror} + * @see [Encrypted MediaError Spec]{@link https://www.w3.org/TR/2013/WD-encrypted-media-20130510/#error-codes} + * + * @class MediaError + */ + + function MediaError(value) { + // Allow redundant calls to this constructor to avoid having `instanceof` + // checks peppered around the code. + if (value instanceof MediaError) { + return value; + } + + if (typeof value === 'number') { + this.code = value; + } else if (typeof value === 'string') { + // default code is zero, so this is a custom error + this.message = value; + } else if (isObject$1(value)) { + // We assign the `code` property manually because native `MediaError` objects + // do not expose it as an own/enumerable property of the object. + if (typeof value.code === 'number') { + this.code = value.code; + } + + assign(this, value); + } + + if (!this.message) { + this.message = MediaError.defaultMessages[this.code] || ''; + } + } + /** + * The error code that refers two one of the defined `MediaError` types + * + * @type {Number} + */ + + + MediaError.prototype.code = 0; + /** + * An optional message that to show with the error. Message is not part of the HTML5 + * video spec but allows for more informative custom errors. + * + * @type {String} + */ + + MediaError.prototype.message = ''; + /** + * An optional status code that can be set by plugins to allow even more detail about + * the error. For example a plugin might provide a specific HTTP status code and an + * error message for that code. Then when the plugin gets that error this class will + * know how to display an error message for it. This allows a custom message to show + * up on the `Player` error overlay. + * + * @type {Array} + */ + + MediaError.prototype.status = null; + /** + * Errors indexed by the W3C standard. The order **CANNOT CHANGE**! See the + * specification listed under {@link MediaError} for more information. + * + * @enum {array} + * @readonly + * @property {string} 0 - MEDIA_ERR_CUSTOM + * @property {string} 1 - MEDIA_ERR_ABORTED + * @property {string} 2 - MEDIA_ERR_NETWORK + * @property {string} 3 - MEDIA_ERR_DECODE + * @property {string} 4 - MEDIA_ERR_SRC_NOT_SUPPORTED + * @property {string} 5 - MEDIA_ERR_ENCRYPTED + */ + + MediaError.errorTypes = ['MEDIA_ERR_CUSTOM', 'MEDIA_ERR_ABORTED', 'MEDIA_ERR_NETWORK', 'MEDIA_ERR_DECODE', 'MEDIA_ERR_SRC_NOT_SUPPORTED', 'MEDIA_ERR_ENCRYPTED']; + /** + * The default `MediaError` messages based on the {@link MediaError.errorTypes}. + * + * @type {Array} + * @constant + */ + + MediaError.defaultMessages = { + 1: 'You aborted the media playback', + 2: 'A network error caused the media download to fail part-way.', + 3: 'The media playback was aborted due to a corruption problem or because the media used features your browser did not support.', + 4: 'The media could not be loaded, either because the server or network failed or because the format is not supported.', + 5: 'The media is encrypted and we do not have the keys to decrypt it.' + }; // Add types as properties on MediaError + // e.g. MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4; + + for (var errNum = 0; errNum < MediaError.errorTypes.length; errNum++) { + MediaError[MediaError.errorTypes[errNum]] = errNum; // values should be accessible on both the class and instance + + MediaError.prototype[MediaError.errorTypes[errNum]] = errNum; + } // jsdocs for instance/static members added above + + var tuple = SafeParseTuple; + + function SafeParseTuple(obj, reviver) { + var json; + var error = null; + + try { + json = JSON.parse(obj, reviver); + } catch (err) { + error = err; + } + + return [error, json]; + } + + /** + * Returns whether an object is `Promise`-like (i.e. has a `then` method). + * + * @param {Object} value + * An object that may or may not be `Promise`-like. + * + * @return {boolean} + * Whether or not the object is `Promise`-like. + */ + function isPromise(value) { + return value !== undefined && value !== null && typeof value.then === 'function'; + } + /** + * Silence a Promise-like object. + * + * This is useful for avoiding non-harmful, but potentially confusing "uncaught + * play promise" rejection error messages. + * + * @param {Object} value + * An object that may or may not be `Promise`-like. + */ + + function silencePromise(value) { + if (isPromise(value)) { + value.then(null, function (e) {}); + } + } + + /** + * @file text-track-list-converter.js Utilities for capturing text track state and + * re-creating tracks based on a capture. + * + * @module text-track-list-converter + */ + + /** + * Examine a single {@link TextTrack} and return a JSON-compatible javascript object that + * represents the {@link TextTrack}'s state. + * + * @param {TextTrack} track + * The text track to query. + * + * @return {Object} + * A serializable javascript representation of the TextTrack. + * @private + */ + var trackToJson_ = function trackToJson_(track) { + var ret = ['kind', 'label', 'language', 'id', 'inBandMetadataTrackDispatchType', 'mode', 'src'].reduce(function (acc, prop, i) { + if (track[prop]) { + acc[prop] = track[prop]; + } + + return acc; + }, { + cues: track.cues && Array.prototype.map.call(track.cues, function (cue) { + return { + startTime: cue.startTime, + endTime: cue.endTime, + text: cue.text, + id: cue.id + }; + }) + }); + return ret; + }; + /** + * Examine a {@link Tech} and return a JSON-compatible javascript array that represents the + * state of all {@link TextTrack}s currently configured. The return array is compatible with + * {@link text-track-list-converter:jsonToTextTracks}. + * + * @param {Tech} tech + * The tech object to query + * + * @return {Array} + * A serializable javascript representation of the {@link Tech}s + * {@link TextTrackList}. + */ + + + var textTracksToJson = function textTracksToJson(tech) { + var trackEls = tech.$$('track'); + var trackObjs = Array.prototype.map.call(trackEls, function (t) { + return t.track; + }); + var tracks = Array.prototype.map.call(trackEls, function (trackEl) { + var json = trackToJson_(trackEl.track); + + if (trackEl.src) { + json.src = trackEl.src; + } + + return json; + }); + return tracks.concat(Array.prototype.filter.call(tech.textTracks(), function (track) { + return trackObjs.indexOf(track) === -1; + }).map(trackToJson_)); + }; + /** + * Create a set of remote {@link TextTrack}s on a {@link Tech} based on an array of javascript + * object {@link TextTrack} representations. + * + * @param {Array} json + * An array of `TextTrack` representation objects, like those that would be + * produced by `textTracksToJson`. + * + * @param {Tech} tech + * The `Tech` to create the `TextTrack`s on. + */ + + + var jsonToTextTracks = function jsonToTextTracks(json, tech) { + json.forEach(function (track) { + var addedTrack = tech.addRemoteTextTrack(track).track; + + if (!track.src && track.cues) { + track.cues.forEach(function (cue) { + return addedTrack.addCue(cue); + }); + } + }); + return tech.textTracks(); + }; + + var textTrackConverter = { + textTracksToJson: textTracksToJson, + jsonToTextTracks: jsonToTextTracks, + trackToJson_: trackToJson_ + }; + + var keycode = createCommonjsModule(function (module, exports) { + // Source: http://jsfiddle.net/vWx8V/ + // http://stackoverflow.com/questions/5603195/full-list-of-javascript-keycodes + + /** + * Conenience method returns corresponding value for given keyName or keyCode. + * + * @param {Mixed} keyCode {Number} or keyName {String} + * @return {Mixed} + * @api public + */ + function keyCode(searchInput) { + // Keyboard Events + if (searchInput && 'object' === typeof searchInput) { + var hasKeyCode = searchInput.which || searchInput.keyCode || searchInput.charCode; + if (hasKeyCode) searchInput = hasKeyCode; + } // Numbers + + + if ('number' === typeof searchInput) return names[searchInput]; // Everything else (cast to string) + + var search = String(searchInput); // check codes + + var foundNamedKey = codes[search.toLowerCase()]; + if (foundNamedKey) return foundNamedKey; // check aliases + + var foundNamedKey = aliases[search.toLowerCase()]; + if (foundNamedKey) return foundNamedKey; // weird character? + + if (search.length === 1) return search.charCodeAt(0); + return undefined; + } + /** + * Compares a keyboard event with a given keyCode or keyName. + * + * @param {Event} event Keyboard event that should be tested + * @param {Mixed} keyCode {Number} or keyName {String} + * @return {Boolean} + * @api public + */ + + + keyCode.isEventKey = function isEventKey(event, nameOrCode) { + if (event && 'object' === typeof event) { + var keyCode = event.which || event.keyCode || event.charCode; + + if (keyCode === null || keyCode === undefined) { + return false; + } + + if (typeof nameOrCode === 'string') { + // check codes + var foundNamedKey = codes[nameOrCode.toLowerCase()]; + + if (foundNamedKey) { + return foundNamedKey === keyCode; + } // check aliases + + + var foundNamedKey = aliases[nameOrCode.toLowerCase()]; + + if (foundNamedKey) { + return foundNamedKey === keyCode; + } + } else if (typeof nameOrCode === 'number') { + return nameOrCode === keyCode; + } + + return false; + } + }; + + exports = module.exports = keyCode; + /** + * Get by name + * + * exports.code['enter'] // => 13 + */ + + var codes = exports.code = exports.codes = { + 'backspace': 8, + 'tab': 9, + 'enter': 13, + 'shift': 16, + 'ctrl': 17, + 'alt': 18, + 'pause/break': 19, + 'caps lock': 20, + 'esc': 27, + 'space': 32, + 'page up': 33, + 'page down': 34, + 'end': 35, + 'home': 36, + 'left': 37, + 'up': 38, + 'right': 39, + 'down': 40, + 'insert': 45, + 'delete': 46, + 'command': 91, + 'left command': 91, + 'right command': 93, + 'numpad *': 106, + 'numpad +': 107, + 'numpad -': 109, + 'numpad .': 110, + 'numpad /': 111, + 'num lock': 144, + 'scroll lock': 145, + 'my computer': 182, + 'my calculator': 183, + ';': 186, + '=': 187, + ',': 188, + '-': 189, + '.': 190, + '/': 191, + '`': 192, + '[': 219, + '\\': 220, + ']': 221, + "'": 222 + }; // Helper aliases + + var aliases = exports.aliases = { + 'windows': 91, + '⇧': 16, + '⌥': 18, + '⌃': 17, + '⌘': 91, + 'ctl': 17, + 'control': 17, + 'option': 18, + 'pause': 19, + 'break': 19, + 'caps': 20, + 'return': 13, + 'escape': 27, + 'spc': 32, + 'spacebar': 32, + 'pgup': 33, + 'pgdn': 34, + 'ins': 45, + 'del': 46, + 'cmd': 91 + }; + /*! + * Programatically add the following + */ + // lower case chars + + for (i = 97; i < 123; i++) { + codes[String.fromCharCode(i)] = i - 32; + } // numbers + + + for (var i = 48; i < 58; i++) { + codes[i - 48] = i; + } // function keys + + + for (i = 1; i < 13; i++) { + codes['f' + i] = i + 111; + } // numpad keys + + + for (i = 0; i < 10; i++) { + codes['numpad ' + i] = i + 96; + } + /** + * Get by code + * + * exports.name[13] // => 'Enter' + */ + + + var names = exports.names = exports.title = {}; // title for backward compat + // Create reverse mapping + + for (i in codes) { + names[codes[i]] = i; + } // Add aliases + + + for (var alias in aliases) { + codes[alias] = aliases[alias]; + } + }); + keycode.code; + keycode.codes; + keycode.aliases; + keycode.names; + keycode.title; + + var MODAL_CLASS_NAME = 'vjs-modal-dialog'; + /** + * The `ModalDialog` displays over the video and its controls, which blocks + * interaction with the player until it is closed. + * + * Modal dialogs include a "Close" button and will close when that button + * is activated - or when ESC is pressed anywhere. + * + * @extends Component + */ + + var ModalDialog = /*#__PURE__*/function (_Component) { + inheritsLoose(ModalDialog, _Component); + + /** + * Create an instance of this class. + * + * @param {Player} player + * The `Player` that this class should be attached to. + * + * @param {Object} [options] + * The key/value store of player options. + * + * @param {Mixed} [options.content=undefined] + * Provide customized content for this modal. + * + * @param {string} [options.description] + * A text description for the modal, primarily for accessibility. + * + * @param {boolean} [options.fillAlways=false] + * Normally, modals are automatically filled only the first time + * they open. This tells the modal to refresh its content + * every time it opens. + * + * @param {string} [options.label] + * A text label for the modal, primarily for accessibility. + * + * @param {boolean} [options.pauseOnOpen=true] + * If `true`, playback will will be paused if playing when + * the modal opens, and resumed when it closes. + * + * @param {boolean} [options.temporary=true] + * If `true`, the modal can only be opened once; it will be + * disposed as soon as it's closed. + * + * @param {boolean} [options.uncloseable=false] + * If `true`, the user will not be able to close the modal + * through the UI in the normal ways. Programmatic closing is + * still possible. + */ + function ModalDialog(player, options) { + var _this; + + _this = _Component.call(this, player, options) || this; + + _this.handleKeyDown_ = function (e) { + return _this.handleKeyDown(e); + }; + + _this.close_ = function (e) { + return _this.close(e); + }; + + _this.opened_ = _this.hasBeenOpened_ = _this.hasBeenFilled_ = false; + + _this.closeable(!_this.options_.uncloseable); + + _this.content(_this.options_.content); // Make sure the contentEl is defined AFTER any children are initialized + // because we only want the contents of the modal in the contentEl + // (not the UI elements like the close button). + + + _this.contentEl_ = createEl('div', { + className: MODAL_CLASS_NAME + "-content" + }, { + role: 'document' + }); + _this.descEl_ = createEl('p', { + className: MODAL_CLASS_NAME + "-description vjs-control-text", + id: _this.el().getAttribute('aria-describedby') + }); + textContent(_this.descEl_, _this.description()); + + _this.el_.appendChild(_this.descEl_); + + _this.el_.appendChild(_this.contentEl_); + + return _this; + } + /** + * Create the `ModalDialog`'s DOM element + * + * @return {Element} + * The DOM element that gets created. + */ + + + var _proto = ModalDialog.prototype; + + _proto.createEl = function createEl() { + return _Component.prototype.createEl.call(this, 'div', { + className: this.buildCSSClass(), + tabIndex: -1 + }, { + 'aria-describedby': this.id() + "_description", + 'aria-hidden': 'true', + 'aria-label': this.label(), + 'role': 'dialog' + }); + }; + + _proto.dispose = function dispose() { + this.contentEl_ = null; + this.descEl_ = null; + this.previouslyActiveEl_ = null; + + _Component.prototype.dispose.call(this); + } + /** + * Builds the default DOM `className`. + * + * @return {string} + * The DOM `className` for this object. + */ + ; + + _proto.buildCSSClass = function buildCSSClass() { + return MODAL_CLASS_NAME + " vjs-hidden " + _Component.prototype.buildCSSClass.call(this); + } + /** + * Returns the label string for this modal. Primarily used for accessibility. + * + * @return {string} + * the localized or raw label of this modal. + */ + ; + + _proto.label = function label() { + return this.localize(this.options_.label || 'Modal Window'); + } + /** + * Returns the description string for this modal. Primarily used for + * accessibility. + * + * @return {string} + * The localized or raw description of this modal. + */ + ; + + _proto.description = function description() { + var desc = this.options_.description || this.localize('This is a modal window.'); // Append a universal closeability message if the modal is closeable. + + if (this.closeable()) { + desc += ' ' + this.localize('This modal can be closed by pressing the Escape key or activating the close button.'); + } + + return desc; + } + /** + * Opens the modal. + * + * @fires ModalDialog#beforemodalopen + * @fires ModalDialog#modalopen + */ + ; + + _proto.open = function open() { + if (!this.opened_) { + var player = this.player(); + /** + * Fired just before a `ModalDialog` is opened. + * + * @event ModalDialog#beforemodalopen + * @type {EventTarget~Event} + */ + + this.trigger('beforemodalopen'); + this.opened_ = true; // Fill content if the modal has never opened before and + // never been filled. + + if (this.options_.fillAlways || !this.hasBeenOpened_ && !this.hasBeenFilled_) { + this.fill(); + } // If the player was playing, pause it and take note of its previously + // playing state. + + + this.wasPlaying_ = !player.paused(); + + if (this.options_.pauseOnOpen && this.wasPlaying_) { + player.pause(); + } + + this.on('keydown', this.handleKeyDown_); // Hide controls and note if they were enabled. + + this.hadControls_ = player.controls(); + player.controls(false); + this.show(); + this.conditionalFocus_(); + this.el().setAttribute('aria-hidden', 'false'); + /** + * Fired just after a `ModalDialog` is opened. + * + * @event ModalDialog#modalopen + * @type {EventTarget~Event} + */ + + this.trigger('modalopen'); + this.hasBeenOpened_ = true; + } + } + /** + * If the `ModalDialog` is currently open or closed. + * + * @param {boolean} [value] + * If given, it will open (`true`) or close (`false`) the modal. + * + * @return {boolean} + * the current open state of the modaldialog + */ + ; + + _proto.opened = function opened(value) { + if (typeof value === 'boolean') { + this[value ? 'open' : 'close'](); + } + + return this.opened_; + } + /** + * Closes the modal, does nothing if the `ModalDialog` is + * not open. + * + * @fires ModalDialog#beforemodalclose + * @fires ModalDialog#modalclose + */ + ; + + _proto.close = function close() { + if (!this.opened_) { + return; + } + + var player = this.player(); + /** + * Fired just before a `ModalDialog` is closed. + * + * @event ModalDialog#beforemodalclose + * @type {EventTarget~Event} + */ + + this.trigger('beforemodalclose'); + this.opened_ = false; + + if (this.wasPlaying_ && this.options_.pauseOnOpen) { + player.play(); + } + + this.off('keydown', this.handleKeyDown_); + + if (this.hadControls_) { + player.controls(true); + } + + this.hide(); + this.el().setAttribute('aria-hidden', 'true'); + /** + * Fired just after a `ModalDialog` is closed. + * + * @event ModalDialog#modalclose + * @type {EventTarget~Event} + */ + + this.trigger('modalclose'); + this.conditionalBlur_(); + + if (this.options_.temporary) { + this.dispose(); + } + } + /** + * Check to see if the `ModalDialog` is closeable via the UI. + * + * @param {boolean} [value] + * If given as a boolean, it will set the `closeable` option. + * + * @return {boolean} + * Returns the final value of the closable option. + */ + ; + + _proto.closeable = function closeable(value) { + if (typeof value === 'boolean') { + var closeable = this.closeable_ = !!value; + var close = this.getChild('closeButton'); // If this is being made closeable and has no close button, add one. + + if (closeable && !close) { + // The close button should be a child of the modal - not its + // content element, so temporarily change the content element. + var temp = this.contentEl_; + this.contentEl_ = this.el_; + close = this.addChild('closeButton', { + controlText: 'Close Modal Dialog' + }); + this.contentEl_ = temp; + this.on(close, 'close', this.close_); + } // If this is being made uncloseable and has a close button, remove it. + + + if (!closeable && close) { + this.off(close, 'close', this.close_); + this.removeChild(close); + close.dispose(); + } + } + + return this.closeable_; + } + /** + * Fill the modal's content element with the modal's "content" option. + * The content element will be emptied before this change takes place. + */ + ; + + _proto.fill = function fill() { + this.fillWith(this.content()); + } + /** + * Fill the modal's content element with arbitrary content. + * The content element will be emptied before this change takes place. + * + * @fires ModalDialog#beforemodalfill + * @fires ModalDialog#modalfill + * + * @param {Mixed} [content] + * The same rules apply to this as apply to the `content` option. + */ + ; + + _proto.fillWith = function fillWith(content) { + var contentEl = this.contentEl(); + var parentEl = contentEl.parentNode; + var nextSiblingEl = contentEl.nextSibling; + /** + * Fired just before a `ModalDialog` is filled with content. + * + * @event ModalDialog#beforemodalfill + * @type {EventTarget~Event} + */ + + this.trigger('beforemodalfill'); + this.hasBeenFilled_ = true; // Detach the content element from the DOM before performing + // manipulation to avoid modifying the live DOM multiple times. + + parentEl.removeChild(contentEl); + this.empty(); + insertContent(contentEl, content); + /** + * Fired just after a `ModalDialog` is filled with content. + * + * @event ModalDialog#modalfill + * @type {EventTarget~Event} + */ + + this.trigger('modalfill'); // Re-inject the re-filled content element. + + if (nextSiblingEl) { + parentEl.insertBefore(contentEl, nextSiblingEl); + } else { + parentEl.appendChild(contentEl); + } // make sure that the close button is last in the dialog DOM + + + var closeButton = this.getChild('closeButton'); + + if (closeButton) { + parentEl.appendChild(closeButton.el_); + } + } + /** + * Empties the content element. This happens anytime the modal is filled. + * + * @fires ModalDialog#beforemodalempty + * @fires ModalDialog#modalempty + */ + ; + + _proto.empty = function empty() { + /** + * Fired just before a `ModalDialog` is emptied. + * + * @event ModalDialog#beforemodalempty + * @type {EventTarget~Event} + */ + this.trigger('beforemodalempty'); + emptyEl(this.contentEl()); + /** + * Fired just after a `ModalDialog` is emptied. + * + * @event ModalDialog#modalempty + * @type {EventTarget~Event} + */ + + this.trigger('modalempty'); + } + /** + * Gets or sets the modal content, which gets normalized before being + * rendered into the DOM. + * + * This does not update the DOM or fill the modal, but it is called during + * that process. + * + * @param {Mixed} [value] + * If defined, sets the internal content value to be used on the + * next call(s) to `fill`. This value is normalized before being + * inserted. To "clear" the internal content value, pass `null`. + * + * @return {Mixed} + * The current content of the modal dialog + */ + ; + + _proto.content = function content(value) { + if (typeof value !== 'undefined') { + this.content_ = value; + } + + return this.content_; + } + /** + * conditionally focus the modal dialog if focus was previously on the player. + * + * @private + */ + ; + + _proto.conditionalFocus_ = function conditionalFocus_() { + var activeEl = document_1.activeElement; + var playerEl = this.player_.el_; + this.previouslyActiveEl_ = null; + + if (playerEl.contains(activeEl) || playerEl === activeEl) { + this.previouslyActiveEl_ = activeEl; + this.focus(); + } + } + /** + * conditionally blur the element and refocus the last focused element + * + * @private + */ + ; + + _proto.conditionalBlur_ = function conditionalBlur_() { + if (this.previouslyActiveEl_) { + this.previouslyActiveEl_.focus(); + this.previouslyActiveEl_ = null; + } + } + /** + * Keydown handler. Attached when modal is focused. + * + * @listens keydown + */ + ; + + _proto.handleKeyDown = function handleKeyDown(event) { + // Do not allow keydowns to reach out of the modal dialog. + event.stopPropagation(); + + if (keycode.isEventKey(event, 'Escape') && this.closeable()) { + event.preventDefault(); + this.close(); + return; + } // exit early if it isn't a tab key + + + if (!keycode.isEventKey(event, 'Tab')) { + return; + } + + var focusableEls = this.focusableEls_(); + var activeEl = this.el_.querySelector(':focus'); + var focusIndex; + + for (var i = 0; i < focusableEls.length; i++) { + if (activeEl === focusableEls[i]) { + focusIndex = i; + break; + } + } + + if (document_1.activeElement === this.el_) { + focusIndex = 0; + } + + if (event.shiftKey && focusIndex === 0) { + focusableEls[focusableEls.length - 1].focus(); + event.preventDefault(); + } else if (!event.shiftKey && focusIndex === focusableEls.length - 1) { + focusableEls[0].focus(); + event.preventDefault(); + } + } + /** + * get all focusable elements + * + * @private + */ + ; + + _proto.focusableEls_ = function focusableEls_() { + var allChildren = this.el_.querySelectorAll('*'); + return Array.prototype.filter.call(allChildren, function (child) { + return (child instanceof window_1.HTMLAnchorElement || child instanceof window_1.HTMLAreaElement) && child.hasAttribute('href') || (child instanceof window_1.HTMLInputElement || child instanceof window_1.HTMLSelectElement || child instanceof window_1.HTMLTextAreaElement || child instanceof window_1.HTMLButtonElement) && !child.hasAttribute('disabled') || child instanceof window_1.HTMLIFrameElement || child instanceof window_1.HTMLObjectElement || child instanceof window_1.HTMLEmbedElement || child.hasAttribute('tabindex') && child.getAttribute('tabindex') !== -1 || child.hasAttribute('contenteditable'); + }); + }; + + return ModalDialog; + }(Component$1); + /** + * Default options for `ModalDialog` default options. + * + * @type {Object} + * @private + */ + + + ModalDialog.prototype.options_ = { + pauseOnOpen: true, + temporary: true + }; + Component$1.registerComponent('ModalDialog', ModalDialog); + + /** + * Common functionaliy between {@link TextTrackList}, {@link AudioTrackList}, and + * {@link VideoTrackList} + * + * @extends EventTarget + */ + + var TrackList = /*#__PURE__*/function (_EventTarget) { + inheritsLoose(TrackList, _EventTarget); + + /** + * Create an instance of this class + * + * @param {Track[]} tracks + * A list of tracks to initialize the list with. + * + * @abstract + */ + function TrackList(tracks) { + var _this; + + if (tracks === void 0) { + tracks = []; + } + + _this = _EventTarget.call(this) || this; + _this.tracks_ = []; + /** + * @memberof TrackList + * @member {number} length + * The current number of `Track`s in the this Trackist. + * @instance + */ + + Object.defineProperty(assertThisInitialized(_this), 'length', { + get: function get() { + return this.tracks_.length; + } + }); + + for (var i = 0; i < tracks.length; i++) { + _this.addTrack(tracks[i]); + } + + return _this; + } + /** + * Add a {@link Track} to the `TrackList` + * + * @param {Track} track + * The audio, video, or text track to add to the list. + * + * @fires TrackList#addtrack + */ + + + var _proto = TrackList.prototype; + + _proto.addTrack = function addTrack(track) { + var _this2 = this; + + var index = this.tracks_.length; + + if (!('' + index in this)) { + Object.defineProperty(this, index, { + get: function get() { + return this.tracks_[index]; + } + }); + } // Do not add duplicate tracks + + + if (this.tracks_.indexOf(track) === -1) { + this.tracks_.push(track); + /** + * Triggered when a track is added to a track list. + * + * @event TrackList#addtrack + * @type {EventTarget~Event} + * @property {Track} track + * A reference to track that was added. + */ + + this.trigger({ + track: track, + type: 'addtrack', + target: this + }); + } + /** + * Triggered when a track label is changed. + * + * @event TrackList#addtrack + * @type {EventTarget~Event} + * @property {Track} track + * A reference to track that was added. + */ + + + track.labelchange_ = function () { + _this2.trigger({ + track: track, + type: 'labelchange', + target: _this2 + }); + }; + + if (isEvented(track)) { + track.addEventListener('labelchange', track.labelchange_); + } + } + /** + * Remove a {@link Track} from the `TrackList` + * + * @param {Track} rtrack + * The audio, video, or text track to remove from the list. + * + * @fires TrackList#removetrack + */ + ; + + _proto.removeTrack = function removeTrack(rtrack) { + var track; + + for (var i = 0, l = this.length; i < l; i++) { + if (this[i] === rtrack) { + track = this[i]; + + if (track.off) { + track.off(); + } + + this.tracks_.splice(i, 1); + break; + } + } + + if (!track) { + return; + } + /** + * Triggered when a track is removed from track list. + * + * @event TrackList#removetrack + * @type {EventTarget~Event} + * @property {Track} track + * A reference to track that was removed. + */ + + + this.trigger({ + track: track, + type: 'removetrack', + target: this + }); + } + /** + * Get a Track from the TrackList by a tracks id + * + * @param {string} id - the id of the track to get + * @method getTrackById + * @return {Track} + * @private + */ + ; + + _proto.getTrackById = function getTrackById(id) { + var result = null; + + for (var i = 0, l = this.length; i < l; i++) { + var track = this[i]; + + if (track.id === id) { + result = track; + break; + } + } + + return result; + }; + + return TrackList; + }(EventTarget$2); + /** + * Triggered when a different track is selected/enabled. + * + * @event TrackList#change + * @type {EventTarget~Event} + */ + + /** + * Events that can be called with on + eventName. See {@link EventHandler}. + * + * @property {Object} TrackList#allowedEvents_ + * @private + */ + + + TrackList.prototype.allowedEvents_ = { + change: 'change', + addtrack: 'addtrack', + removetrack: 'removetrack', + labelchange: 'labelchange' + }; // emulate attribute EventHandler support to allow for feature detection + + for (var event in TrackList.prototype.allowedEvents_) { + TrackList.prototype['on' + event] = null; + } + + /** + * Anywhere we call this function we diverge from the spec + * as we only support one enabled audiotrack at a time + * + * @param {AudioTrackList} list + * list to work on + * + * @param {AudioTrack} track + * The track to skip + * + * @private + */ + + var disableOthers$1 = function disableOthers(list, track) { + for (var i = 0; i < list.length; i++) { + if (!Object.keys(list[i]).length || track.id === list[i].id) { + continue; + } // another audio track is enabled, disable it + + + list[i].enabled = false; + } + }; + /** + * The current list of {@link AudioTrack} for a media file. + * + * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#audiotracklist} + * @extends TrackList + */ + + + var AudioTrackList = /*#__PURE__*/function (_TrackList) { + inheritsLoose(AudioTrackList, _TrackList); + + /** + * Create an instance of this class. + * + * @param {AudioTrack[]} [tracks=[]] + * A list of `AudioTrack` to instantiate the list with. + */ + function AudioTrackList(tracks) { + var _this; + + if (tracks === void 0) { + tracks = []; + } + + // make sure only 1 track is enabled + // sorted from last index to first index + for (var i = tracks.length - 1; i >= 0; i--) { + if (tracks[i].enabled) { + disableOthers$1(tracks, tracks[i]); + break; + } + } + + _this = _TrackList.call(this, tracks) || this; + _this.changing_ = false; + return _this; + } + /** + * Add an {@link AudioTrack} to the `AudioTrackList`. + * + * @param {AudioTrack} track + * The AudioTrack to add to the list + * + * @fires TrackList#addtrack + */ + + + var _proto = AudioTrackList.prototype; + + _proto.addTrack = function addTrack(track) { + var _this2 = this; + + if (track.enabled) { + disableOthers$1(this, track); + } + + _TrackList.prototype.addTrack.call(this, track); // native tracks don't have this + + + if (!track.addEventListener) { + return; + } + + track.enabledChange_ = function () { + // when we are disabling other tracks (since we don't support + // more than one track at a time) we will set changing_ + // to true so that we don't trigger additional change events + if (_this2.changing_) { + return; + } + + _this2.changing_ = true; + disableOthers$1(_this2, track); + _this2.changing_ = false; + + _this2.trigger('change'); + }; + /** + * @listens AudioTrack#enabledchange + * @fires TrackList#change + */ + + + track.addEventListener('enabledchange', track.enabledChange_); + }; + + _proto.removeTrack = function removeTrack(rtrack) { + _TrackList.prototype.removeTrack.call(this, rtrack); + + if (rtrack.removeEventListener && rtrack.enabledChange_) { + rtrack.removeEventListener('enabledchange', rtrack.enabledChange_); + rtrack.enabledChange_ = null; + } + }; + + return AudioTrackList; + }(TrackList); + + /** + * Un-select all other {@link VideoTrack}s that are selected. + * + * @param {VideoTrackList} list + * list to work on + * + * @param {VideoTrack} track + * The track to skip + * + * @private + */ + + var disableOthers = function disableOthers(list, track) { + for (var i = 0; i < list.length; i++) { + if (!Object.keys(list[i]).length || track.id === list[i].id) { + continue; + } // another video track is enabled, disable it + + + list[i].selected = false; + } + }; + /** + * The current list of {@link VideoTrack} for a video. + * + * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#videotracklist} + * @extends TrackList + */ + + + var VideoTrackList = /*#__PURE__*/function (_TrackList) { + inheritsLoose(VideoTrackList, _TrackList); + + /** + * Create an instance of this class. + * + * @param {VideoTrack[]} [tracks=[]] + * A list of `VideoTrack` to instantiate the list with. + */ + function VideoTrackList(tracks) { + var _this; + + if (tracks === void 0) { + tracks = []; + } + + // make sure only 1 track is enabled + // sorted from last index to first index + for (var i = tracks.length - 1; i >= 0; i--) { + if (tracks[i].selected) { + disableOthers(tracks, tracks[i]); + break; + } + } + + _this = _TrackList.call(this, tracks) || this; + _this.changing_ = false; + /** + * @member {number} VideoTrackList#selectedIndex + * The current index of the selected {@link VideoTrack`}. + */ + + Object.defineProperty(assertThisInitialized(_this), 'selectedIndex', { + get: function get() { + for (var _i = 0; _i < this.length; _i++) { + if (this[_i].selected) { + return _i; + } + } + + return -1; + }, + set: function set() {} + }); + return _this; + } + /** + * Add a {@link VideoTrack} to the `VideoTrackList`. + * + * @param {VideoTrack} track + * The VideoTrack to add to the list + * + * @fires TrackList#addtrack + */ + + + var _proto = VideoTrackList.prototype; + + _proto.addTrack = function addTrack(track) { + var _this2 = this; + + if (track.selected) { + disableOthers(this, track); + } + + _TrackList.prototype.addTrack.call(this, track); // native tracks don't have this + + + if (!track.addEventListener) { + return; + } + + track.selectedChange_ = function () { + if (_this2.changing_) { + return; + } + + _this2.changing_ = true; + disableOthers(_this2, track); + _this2.changing_ = false; + + _this2.trigger('change'); + }; + /** + * @listens VideoTrack#selectedchange + * @fires TrackList#change + */ + + + track.addEventListener('selectedchange', track.selectedChange_); + }; + + _proto.removeTrack = function removeTrack(rtrack) { + _TrackList.prototype.removeTrack.call(this, rtrack); + + if (rtrack.removeEventListener && rtrack.selectedChange_) { + rtrack.removeEventListener('selectedchange', rtrack.selectedChange_); + rtrack.selectedChange_ = null; + } + }; + + return VideoTrackList; + }(TrackList); + + /** + * The current list of {@link TextTrack} for a media file. + * + * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#texttracklist} + * @extends TrackList + */ + + var TextTrackList = /*#__PURE__*/function (_TrackList) { + inheritsLoose(TextTrackList, _TrackList); + + function TextTrackList() { + return _TrackList.apply(this, arguments) || this; + } + + var _proto = TextTrackList.prototype; + + /** + * Add a {@link TextTrack} to the `TextTrackList` + * + * @param {TextTrack} track + * The text track to add to the list. + * + * @fires TrackList#addtrack + */ + _proto.addTrack = function addTrack(track) { + var _this = this; + + _TrackList.prototype.addTrack.call(this, track); + + if (!this.queueChange_) { + this.queueChange_ = function () { + return _this.queueTrigger('change'); + }; + } + + if (!this.triggerSelectedlanguagechange) { + this.triggerSelectedlanguagechange_ = function () { + return _this.trigger('selectedlanguagechange'); + }; + } + /** + * @listens TextTrack#modechange + * @fires TrackList#change + */ + + + track.addEventListener('modechange', this.queueChange_); + var nonLanguageTextTrackKind = ['metadata', 'chapters']; + + if (nonLanguageTextTrackKind.indexOf(track.kind) === -1) { + track.addEventListener('modechange', this.triggerSelectedlanguagechange_); + } + }; + + _proto.removeTrack = function removeTrack(rtrack) { + _TrackList.prototype.removeTrack.call(this, rtrack); // manually remove the event handlers we added + + + if (rtrack.removeEventListener) { + if (this.queueChange_) { + rtrack.removeEventListener('modechange', this.queueChange_); + } + + if (this.selectedlanguagechange_) { + rtrack.removeEventListener('modechange', this.triggerSelectedlanguagechange_); + } + } + }; + + return TextTrackList; + }(TrackList); + + /** + * @file html-track-element-list.js + */ + + /** + * The current list of {@link HtmlTrackElement}s. + */ + var HtmlTrackElementList = /*#__PURE__*/function () { + /** + * Create an instance of this class. + * + * @param {HtmlTrackElement[]} [tracks=[]] + * A list of `HtmlTrackElement` to instantiate the list with. + */ + function HtmlTrackElementList(trackElements) { + if (trackElements === void 0) { + trackElements = []; + } + + this.trackElements_ = []; + /** + * @memberof HtmlTrackElementList + * @member {number} length + * The current number of `Track`s in the this Trackist. + * @instance + */ + + Object.defineProperty(this, 'length', { + get: function get() { + return this.trackElements_.length; + } + }); + + for (var i = 0, length = trackElements.length; i < length; i++) { + this.addTrackElement_(trackElements[i]); + } + } + /** + * Add an {@link HtmlTrackElement} to the `HtmlTrackElementList` + * + * @param {HtmlTrackElement} trackElement + * The track element to add to the list. + * + * @private + */ + + + var _proto = HtmlTrackElementList.prototype; + + _proto.addTrackElement_ = function addTrackElement_(trackElement) { + var index = this.trackElements_.length; + + if (!('' + index in this)) { + Object.defineProperty(this, index, { + get: function get() { + return this.trackElements_[index]; + } + }); + } // Do not add duplicate elements + + + if (this.trackElements_.indexOf(trackElement) === -1) { + this.trackElements_.push(trackElement); + } + } + /** + * Get an {@link HtmlTrackElement} from the `HtmlTrackElementList` given an + * {@link TextTrack}. + * + * @param {TextTrack} track + * The track associated with a track element. + * + * @return {HtmlTrackElement|undefined} + * The track element that was found or undefined. + * + * @private + */ + ; + + _proto.getTrackElementByTrack_ = function getTrackElementByTrack_(track) { + var trackElement_; + + for (var i = 0, length = this.trackElements_.length; i < length; i++) { + if (track === this.trackElements_[i].track) { + trackElement_ = this.trackElements_[i]; + break; + } + } + + return trackElement_; + } + /** + * Remove a {@link HtmlTrackElement} from the `HtmlTrackElementList` + * + * @param {HtmlTrackElement} trackElement + * The track element to remove from the list. + * + * @private + */ + ; + + _proto.removeTrackElement_ = function removeTrackElement_(trackElement) { + for (var i = 0, length = this.trackElements_.length; i < length; i++) { + if (trackElement === this.trackElements_[i]) { + if (this.trackElements_[i].track && typeof this.trackElements_[i].track.off === 'function') { + this.trackElements_[i].track.off(); + } + + if (typeof this.trackElements_[i].off === 'function') { + this.trackElements_[i].off(); + } + + this.trackElements_.splice(i, 1); + break; + } + } + }; + + return HtmlTrackElementList; + }(); + + /** + * @file text-track-cue-list.js + */ + + /** + * @typedef {Object} TextTrackCueList~TextTrackCue + * + * @property {string} id + * The unique id for this text track cue + * + * @property {number} startTime + * The start time for this text track cue + * + * @property {number} endTime + * The end time for this text track cue + * + * @property {boolean} pauseOnExit + * Pause when the end time is reached if true. + * + * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackcue} + */ + + /** + * A List of TextTrackCues. + * + * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackcuelist} + */ + var TextTrackCueList = /*#__PURE__*/function () { + /** + * Create an instance of this class.. + * + * @param {Array} cues + * A list of cues to be initialized with + */ + function TextTrackCueList(cues) { + TextTrackCueList.prototype.setCues_.call(this, cues); + /** + * @memberof TextTrackCueList + * @member {number} length + * The current number of `TextTrackCue`s in the TextTrackCueList. + * @instance + */ + + Object.defineProperty(this, 'length', { + get: function get() { + return this.length_; + } + }); + } + /** + * A setter for cues in this list. Creates getters + * an an index for the cues. + * + * @param {Array} cues + * An array of cues to set + * + * @private + */ + + + var _proto = TextTrackCueList.prototype; + + _proto.setCues_ = function setCues_(cues) { + var oldLength = this.length || 0; + var i = 0; + var l = cues.length; + this.cues_ = cues; + this.length_ = cues.length; + + var defineProp = function defineProp(index) { + if (!('' + index in this)) { + Object.defineProperty(this, '' + index, { + get: function get() { + return this.cues_[index]; + } + }); + } + }; + + if (oldLength < l) { + i = oldLength; + + for (; i < l; i++) { + defineProp.call(this, i); + } + } + } + /** + * Get a `TextTrackCue` that is currently in the `TextTrackCueList` by id. + * + * @param {string} id + * The id of the cue that should be searched for. + * + * @return {TextTrackCueList~TextTrackCue|null} + * A single cue or null if none was found. + */ + ; + + _proto.getCueById = function getCueById(id) { + var result = null; + + for (var i = 0, l = this.length; i < l; i++) { + var cue = this[i]; + + if (cue.id === id) { + result = cue; + break; + } + } + + return result; + }; + + return TextTrackCueList; + }(); + + /** + * @file track-kinds.js + */ + + /** + * All possible `VideoTrackKind`s + * + * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-videotrack-kind + * @typedef VideoTrack~Kind + * @enum + */ + var VideoTrackKind = { + alternative: 'alternative', + captions: 'captions', + main: 'main', + sign: 'sign', + subtitles: 'subtitles', + commentary: 'commentary' + }; + /** + * All possible `AudioTrackKind`s + * + * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-audiotrack-kind + * @typedef AudioTrack~Kind + * @enum + */ + + var AudioTrackKind = { + 'alternative': 'alternative', + 'descriptions': 'descriptions', + 'main': 'main', + 'main-desc': 'main-desc', + 'translation': 'translation', + 'commentary': 'commentary' + }; + /** + * All possible `TextTrackKind`s + * + * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-texttrack-kind + * @typedef TextTrack~Kind + * @enum + */ + + var TextTrackKind = { + subtitles: 'subtitles', + captions: 'captions', + descriptions: 'descriptions', + chapters: 'chapters', + metadata: 'metadata' + }; + /** + * All possible `TextTrackMode`s + * + * @see https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackmode + * @typedef TextTrack~Mode + * @enum + */ + + var TextTrackMode = { + disabled: 'disabled', + hidden: 'hidden', + showing: 'showing' + }; + + /** + * A Track class that contains all of the common functionality for {@link AudioTrack}, + * {@link VideoTrack}, and {@link TextTrack}. + * + * > Note: This class should not be used directly + * + * @see {@link https://html.spec.whatwg.org/multipage/embedded-content.html} + * @extends EventTarget + * @abstract + */ + + var Track = /*#__PURE__*/function (_EventTarget) { + inheritsLoose(Track, _EventTarget); + + /** + * Create an instance of this class. + * + * @param {Object} [options={}] + * Object of option names and values + * + * @param {string} [options.kind=''] + * A valid kind for the track type you are creating. + * + * @param {string} [options.id='vjs_track_' + Guid.newGUID()] + * A unique id for this AudioTrack. + * + * @param {string} [options.label=''] + * The menu label for this track. + * + * @param {string} [options.language=''] + * A valid two character language code. + * + * @abstract + */ + function Track(options) { + var _this; + + if (options === void 0) { + options = {}; + } + + _this = _EventTarget.call(this) || this; + var trackProps = { + id: options.id || 'vjs_track_' + newGUID(), + kind: options.kind || '', + language: options.language || '' + }; + var label = options.label || ''; + /** + * @memberof Track + * @member {string} id + * The id of this track. Cannot be changed after creation. + * @instance + * + * @readonly + */ + + /** + * @memberof Track + * @member {string} kind + * The kind of track that this is. Cannot be changed after creation. + * @instance + * + * @readonly + */ + + /** + * @memberof Track + * @member {string} language + * The two letter language code for this track. Cannot be changed after + * creation. + * @instance + * + * @readonly + */ + + var _loop = function _loop(key) { + Object.defineProperty(assertThisInitialized(_this), key, { + get: function get() { + return trackProps[key]; + }, + set: function set() {} + }); + }; + + for (var key in trackProps) { + _loop(key); + } + /** + * @memberof Track + * @member {string} label + * The label of this track. Cannot be changed after creation. + * @instance + * + * @fires Track#labelchange + */ + + + Object.defineProperty(assertThisInitialized(_this), 'label', { + get: function get() { + return label; + }, + set: function set(newLabel) { + if (newLabel !== label) { + label = newLabel; + /** + * An event that fires when label changes on this track. + * + * > Note: This is not part of the spec! + * + * @event Track#labelchange + * @type {EventTarget~Event} + */ + + this.trigger('labelchange'); + } + } + }); + return _this; + } + + return Track; + }(EventTarget$2); + + /** + * @file url.js + * @module url + */ + /** + * @typedef {Object} url:URLObject + * + * @property {string} protocol + * The protocol of the url that was parsed. + * + * @property {string} hostname + * The hostname of the url that was parsed. + * + * @property {string} port + * The port of the url that was parsed. + * + * @property {string} pathname + * The pathname of the url that was parsed. + * + * @property {string} search + * The search query of the url that was parsed. + * + * @property {string} hash + * The hash of the url that was parsed. + * + * @property {string} host + * The host of the url that was parsed. + */ + + /** + * Resolve and parse the elements of a URL. + * + * @function + * @param {String} url + * The url to parse + * + * @return {url:URLObject} + * An object of url details + */ + + var parseUrl = function parseUrl(url) { + // This entire method can be replace with URL once we are able to drop IE11 + var props = ['protocol', 'hostname', 'port', 'pathname', 'search', 'hash', 'host']; // add the url to an anchor and let the browser parse the URL + + var a = document_1.createElement('a'); + a.href = url; // Copy the specific URL properties to a new object + // This is also needed for IE because the anchor loses its + // properties when it's removed from the dom + + var details = {}; + + for (var i = 0; i < props.length; i++) { + details[props[i]] = a[props[i]]; + } // IE adds the port to the host property unlike everyone else. If + // a port identifier is added for standard ports, strip it. + + + if (details.protocol === 'http:') { + details.host = details.host.replace(/:80$/, ''); + } + + if (details.protocol === 'https:') { + details.host = details.host.replace(/:443$/, ''); + } + + if (!details.protocol) { + details.protocol = window_1.location.protocol; + } + /* istanbul ignore if */ + + + if (!details.host) { + details.host = window_1.location.host; + } + + return details; + }; + /** + * Get absolute version of relative URL. Used to tell Flash the correct URL. + * + * @function + * @param {string} url + * URL to make absolute + * + * @return {string} + * Absolute URL + * + * @see http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue + */ + + var getAbsoluteURL = function getAbsoluteURL(url) { + // Check if absolute URL + if (!url.match(/^https?:\/\//)) { + // Convert to absolute URL. Flash hosted off-site needs an absolute URL. + // add the url to an anchor and let the browser parse the URL + var a = document_1.createElement('a'); + a.href = url; + url = a.href; + } + + return url; + }; + /** + * Returns the extension of the passed file name. It will return an empty string + * if passed an invalid path. + * + * @function + * @param {string} path + * The fileName path like '/path/to/file.mp4' + * + * @return {string} + * The extension in lower case or an empty string if no + * extension could be found. + */ + + var getFileExtension = function getFileExtension(path) { + if (typeof path === 'string') { + var splitPathRe = /^(\/?)([\s\S]*?)((?:\.{1,2}|[^\/]+?)(\.([^\.\/\?]+)))(?:[\/]*|[\?].*)$/; + var pathParts = splitPathRe.exec(path); + + if (pathParts) { + return pathParts.pop().toLowerCase(); + } + } + + return ''; + }; + /** + * Returns whether the url passed is a cross domain request or not. + * + * @function + * @param {string} url + * The url to check. + * + * @param {Object} [winLoc] + * the domain to check the url against, defaults to window.location + * + * @param {string} [winLoc.protocol] + * The window location protocol defaults to window.location.protocol + * + * @param {string} [winLoc.host] + * The window location host defaults to window.location.host + * + * @return {boolean} + * Whether it is a cross domain request or not. + */ + + var isCrossOrigin = function isCrossOrigin(url, winLoc) { + if (winLoc === void 0) { + winLoc = window_1.location; + } + + var urlInfo = parseUrl(url); // IE8 protocol relative urls will return ':' for protocol + + var srcProtocol = urlInfo.protocol === ':' ? winLoc.protocol : urlInfo.protocol; // Check if url is for another domain/origin + // IE8 doesn't know location.origin, so we won't rely on it here + + var crossOrigin = srcProtocol + urlInfo.host !== winLoc.protocol + winLoc.host; + return crossOrigin; + }; + + var Url = /*#__PURE__*/Object.freeze({ + __proto__: null, + parseUrl: parseUrl, + getAbsoluteURL: getAbsoluteURL, + getFileExtension: getFileExtension, + isCrossOrigin: isCrossOrigin + }); + + var isFunction_1 = isFunction; + var toString = Object.prototype.toString; + + function isFunction(fn) { + if (!fn) { + return false; + } + + var string = toString.call(fn); + return string === '[object Function]' || typeof fn === 'function' && string !== '[object RegExp]' || typeof window !== 'undefined' && ( // IE8 and below + fn === window.setTimeout || fn === window.alert || fn === window.confirm || fn === window.prompt); + } + + /** + * @license + * slighly modified parse-headers 2.0.2 + * Copyright (c) 2014 David Björklund + * Available under the MIT license + * + */ + + + var parseHeaders = function parseHeaders(headers) { + var result = {}; + + if (!headers) { + return result; + } + + headers.trim().split('\n').forEach(function (row) { + var index = row.indexOf(':'); + var key = row.slice(0, index).trim().toLowerCase(); + var value = row.slice(index + 1).trim(); + + if (typeof result[key] === 'undefined') { + result[key] = value; + } else if (Array.isArray(result[key])) { + result[key].push(value); + } else { + result[key] = [result[key], value]; + } + }); + return result; + }; + + var xhr = createXHR; // Allow use of default import syntax in TypeScript + + var default_1 = createXHR; + createXHR.XMLHttpRequest = window_1.XMLHttpRequest || noop$1; + createXHR.XDomainRequest = "withCredentials" in new createXHR.XMLHttpRequest() ? createXHR.XMLHttpRequest : window_1.XDomainRequest; + forEachArray(["get", "put", "post", "patch", "head", "delete"], function (method) { + createXHR[method === "delete" ? "del" : method] = function (uri, options, callback) { + options = initParams(uri, options, callback); + options.method = method.toUpperCase(); + return _createXHR(options); + }; + }); + + function forEachArray(array, iterator) { + for (var i = 0; i < array.length; i++) { + iterator(array[i]); + } + } + + function isEmpty(obj) { + for (var i in obj) { + if (obj.hasOwnProperty(i)) return false; + } + + return true; + } + + function initParams(uri, options, callback) { + var params = uri; + + if (isFunction_1(options)) { + callback = options; + + if (typeof uri === "string") { + params = { + uri: uri + }; + } + } else { + params = _extends_1({}, options, { + uri: uri + }); + } + + params.callback = callback; + return params; + } + + function createXHR(uri, options, callback) { + options = initParams(uri, options, callback); + return _createXHR(options); + } + + function _createXHR(options) { + if (typeof options.callback === "undefined") { + throw new Error("callback argument missing"); + } + + var called = false; + + var callback = function cbOnce(err, response, body) { + if (!called) { + called = true; + options.callback(err, response, body); + } + }; + + function readystatechange() { + if (xhr.readyState === 4) { + setTimeout(loadFunc, 0); + } + } + + function getBody() { + // Chrome with requestType=blob throws errors arround when even testing access to responseText + var body = undefined; + + if (xhr.response) { + body = xhr.response; + } else { + body = xhr.responseText || getXml(xhr); + } + + if (isJson) { + try { + body = JSON.parse(body); + } catch (e) {} + } + + return body; + } + + function errorFunc(evt) { + clearTimeout(timeoutTimer); + + if (!(evt instanceof Error)) { + evt = new Error("" + (evt || "Unknown XMLHttpRequest Error")); + } + + evt.statusCode = 0; + return callback(evt, failureResponse); + } // will load the data & process the response in a special response object + + + function loadFunc() { + if (aborted) return; + var status; + clearTimeout(timeoutTimer); + + if (options.useXDR && xhr.status === undefined) { + //IE8 CORS GET successful response doesn't have a status field, but body is fine + status = 200; + } else { + status = xhr.status === 1223 ? 204 : xhr.status; + } + + var response = failureResponse; + var err = null; + + if (status !== 0) { + response = { + body: getBody(), + statusCode: status, + method: method, + headers: {}, + url: uri, + rawRequest: xhr + }; + + if (xhr.getAllResponseHeaders) { + //remember xhr can in fact be XDR for CORS in IE + response.headers = parseHeaders(xhr.getAllResponseHeaders()); + } + } else { + err = new Error("Internal XMLHttpRequest Error"); + } + + return callback(err, response, response.body); + } + + var xhr = options.xhr || null; + + if (!xhr) { + if (options.cors || options.useXDR) { + xhr = new createXHR.XDomainRequest(); + } else { + xhr = new createXHR.XMLHttpRequest(); + } + } + + var key; + var aborted; + var uri = xhr.url = options.uri || options.url; + var method = xhr.method = options.method || "GET"; + var body = options.body || options.data; + var headers = xhr.headers = options.headers || {}; + var sync = !!options.sync; + var isJson = false; + var timeoutTimer; + var failureResponse = { + body: undefined, + headers: {}, + statusCode: 0, + method: method, + url: uri, + rawRequest: xhr + }; + + if ("json" in options && options.json !== false) { + isJson = true; + headers["accept"] || headers["Accept"] || (headers["Accept"] = "application/json"); //Don't override existing accept header declared by user + + if (method !== "GET" && method !== "HEAD") { + headers["content-type"] || headers["Content-Type"] || (headers["Content-Type"] = "application/json"); //Don't override existing accept header declared by user + + body = JSON.stringify(options.json === true ? body : options.json); + } + } + + xhr.onreadystatechange = readystatechange; + xhr.onload = loadFunc; + xhr.onerror = errorFunc; // IE9 must have onprogress be set to a unique function. + + xhr.onprogress = function () {// IE must die + }; + + xhr.onabort = function () { + aborted = true; + }; + + xhr.ontimeout = errorFunc; + xhr.open(method, uri, !sync, options.username, options.password); //has to be after open + + if (!sync) { + xhr.withCredentials = !!options.withCredentials; + } // Cannot set timeout with sync request + // not setting timeout on the xhr object, because of old webkits etc. not handling that correctly + // both npm's request and jquery 1.x use this kind of timeout, so this is being consistent + + + if (!sync && options.timeout > 0) { + timeoutTimer = setTimeout(function () { + if (aborted) return; + aborted = true; //IE9 may still call readystatechange + + xhr.abort("timeout"); + var e = new Error("XMLHttpRequest timeout"); + e.code = "ETIMEDOUT"; + errorFunc(e); + }, options.timeout); + } + + if (xhr.setRequestHeader) { + for (key in headers) { + if (headers.hasOwnProperty(key)) { + xhr.setRequestHeader(key, headers[key]); + } + } + } else if (options.headers && !isEmpty(options.headers)) { + throw new Error("Headers cannot be set on an XDomainRequest object"); + } + + if ("responseType" in options) { + xhr.responseType = options.responseType; + } + + if ("beforeSend" in options && typeof options.beforeSend === "function") { + options.beforeSend(xhr); + } // Microsoft Edge browser sends "undefined" when send is called with undefined value. + // XMLHttpRequest spec says to pass null as body to indicate no body + // See https://github.com/naugtur/xhr/issues/100. + + + xhr.send(body || null); + return xhr; + } + + function getXml(xhr) { + // xhr.responseXML will throw Exception "InvalidStateError" or "DOMException" + // See https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseXML. + try { + if (xhr.responseType === "document") { + return xhr.responseXML; + } + + var firefoxBugTakenEffect = xhr.responseXML && xhr.responseXML.documentElement.nodeName === "parsererror"; + + if (xhr.responseType === "" && !firefoxBugTakenEffect) { + return xhr.responseXML; + } + } catch (e) {} + + return null; + } + + function noop$1() {} + xhr["default"] = default_1; + + /** + * Takes a webvtt file contents and parses it into cues + * + * @param {string} srcContent + * webVTT file contents + * + * @param {TextTrack} track + * TextTrack to add cues to. Cues come from the srcContent. + * + * @private + */ + + var parseCues = function parseCues(srcContent, track) { + var parser = new window_1.WebVTT.Parser(window_1, window_1.vttjs, window_1.WebVTT.StringDecoder()); + var errors = []; + + parser.oncue = function (cue) { + track.addCue(cue); + }; + + parser.onparsingerror = function (error) { + errors.push(error); + }; + + parser.onflush = function () { + track.trigger({ + type: 'loadeddata', + target: track + }); + }; + + parser.parse(srcContent); + + if (errors.length > 0) { + if (window_1.console && window_1.console.groupCollapsed) { + window_1.console.groupCollapsed("Text Track parsing errors for " + track.src); + } + + errors.forEach(function (error) { + return log$1.error(error); + }); + + if (window_1.console && window_1.console.groupEnd) { + window_1.console.groupEnd(); + } + } + + parser.flush(); + }; + /** + * Load a `TextTrack` from a specified url. + * + * @param {string} src + * Url to load track from. + * + * @param {TextTrack} track + * Track to add cues to. Comes from the content at the end of `url`. + * + * @private + */ + + + var loadTrack = function loadTrack(src, track) { + var opts = { + uri: src + }; + var crossOrigin = isCrossOrigin(src); + + if (crossOrigin) { + opts.cors = crossOrigin; + } + + var withCredentials = track.tech_.crossOrigin() === 'use-credentials'; + + if (withCredentials) { + opts.withCredentials = withCredentials; + } + + xhr(opts, bind(this, function (err, response, responseBody) { + if (err) { + return log$1.error(err, response); + } + + track.loaded_ = true; // Make sure that vttjs has loaded, otherwise, wait till it finished loading + // NOTE: this is only used for the alt/video.novtt.js build + + if (typeof window_1.WebVTT !== 'function') { + if (track.tech_) { + // to prevent use before define eslint error, we define loadHandler + // as a let here + track.tech_.any(['vttjsloaded', 'vttjserror'], function (event) { + if (event.type === 'vttjserror') { + log$1.error("vttjs failed to load, stopping trying to process " + track.src); + return; + } + + return parseCues(responseBody, track); + }); + } + } else { + parseCues(responseBody, track); + } + })); + }; + /** + * A representation of a single `TextTrack`. + * + * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#texttrack} + * @extends Track + */ + + + var TextTrack = /*#__PURE__*/function (_Track) { + inheritsLoose(TextTrack, _Track); + + /** + * Create an instance of this class. + * + * @param {Object} options={} + * Object of option names and values + * + * @param {Tech} options.tech + * A reference to the tech that owns this TextTrack. + * + * @param {TextTrack~Kind} [options.kind='subtitles'] + * A valid text track kind. + * + * @param {TextTrack~Mode} [options.mode='disabled'] + * A valid text track mode. + * + * @param {string} [options.id='vjs_track_' + Guid.newGUID()] + * A unique id for this TextTrack. + * + * @param {string} [options.label=''] + * The menu label for this track. + * + * @param {string} [options.language=''] + * A valid two character language code. + * + * @param {string} [options.srclang=''] + * A valid two character language code. An alternative, but deprioritized + * version of `options.language` + * + * @param {string} [options.src] + * A url to TextTrack cues. + * + * @param {boolean} [options.default] + * If this track should default to on or off. + */ + function TextTrack(options) { + var _this; + + if (options === void 0) { + options = {}; + } + + if (!options.tech) { + throw new Error('A tech was not provided.'); + } + + var settings = mergeOptions$3(options, { + kind: TextTrackKind[options.kind] || 'subtitles', + language: options.language || options.srclang || '' + }); + var mode = TextTrackMode[settings.mode] || 'disabled'; + var default_ = settings["default"]; + + if (settings.kind === 'metadata' || settings.kind === 'chapters') { + mode = 'hidden'; + } + + _this = _Track.call(this, settings) || this; + _this.tech_ = settings.tech; + _this.cues_ = []; + _this.activeCues_ = []; + _this.preload_ = _this.tech_.preloadTextTracks !== false; + var cues = new TextTrackCueList(_this.cues_); + var activeCues = new TextTrackCueList(_this.activeCues_); + var changed = false; + var timeupdateHandler = bind(assertThisInitialized(_this), function () { + if (!this.tech_.isReady_ || this.tech_.isDisposed()) { + return; + } // Accessing this.activeCues for the side-effects of updating itself + // due to its nature as a getter function. Do not remove or cues will + // stop updating! + // Use the setter to prevent deletion from uglify (pure_getters rule) + + + this.activeCues = this.activeCues; + + if (changed) { + this.trigger('cuechange'); + changed = false; + } + }); + + var disposeHandler = function disposeHandler() { + _this.tech_.off('timeupdate', timeupdateHandler); + }; + + _this.tech_.one('dispose', disposeHandler); + + if (mode !== 'disabled') { + _this.tech_.on('timeupdate', timeupdateHandler); + } + + Object.defineProperties(assertThisInitialized(_this), { + /** + * @memberof TextTrack + * @member {boolean} default + * If this track was set to be on or off by default. Cannot be changed after + * creation. + * @instance + * + * @readonly + */ + "default": { + get: function get() { + return default_; + }, + set: function set() {} + }, + + /** + * @memberof TextTrack + * @member {string} mode + * Set the mode of this TextTrack to a valid {@link TextTrack~Mode}. Will + * not be set if setting to an invalid mode. + * @instance + * + * @fires TextTrack#modechange + */ + mode: { + get: function get() { + return mode; + }, + set: function set(newMode) { + if (!TextTrackMode[newMode]) { + return; + } + + if (mode === newMode) { + return; + } + + mode = newMode; + + if (!this.preload_ && mode !== 'disabled' && this.cues.length === 0) { + // On-demand load. + loadTrack(this.src, this); + } + + this.tech_.off('timeupdate', timeupdateHandler); + + if (mode !== 'disabled') { + this.tech_.on('timeupdate', timeupdateHandler); + } + /** + * An event that fires when mode changes on this track. This allows + * the TextTrackList that holds this track to act accordingly. + * + * > Note: This is not part of the spec! + * + * @event TextTrack#modechange + * @type {EventTarget~Event} + */ + + + this.trigger('modechange'); + } + }, + + /** + * @memberof TextTrack + * @member {TextTrackCueList} cues + * The text track cue list for this TextTrack. + * @instance + */ + cues: { + get: function get() { + if (!this.loaded_) { + return null; + } + + return cues; + }, + set: function set() {} + }, + + /** + * @memberof TextTrack + * @member {TextTrackCueList} activeCues + * The list text track cues that are currently active for this TextTrack. + * @instance + */ + activeCues: { + get: function get() { + if (!this.loaded_) { + return null; + } // nothing to do + + + if (this.cues.length === 0) { + return activeCues; + } + + var ct = this.tech_.currentTime(); + var active = []; + + for (var i = 0, l = this.cues.length; i < l; i++) { + var cue = this.cues[i]; + + if (cue.startTime <= ct && cue.endTime >= ct) { + active.push(cue); + } else if (cue.startTime === cue.endTime && cue.startTime <= ct && cue.startTime + 0.5 >= ct) { + active.push(cue); + } + } + + changed = false; + + if (active.length !== this.activeCues_.length) { + changed = true; + } else { + for (var _i = 0; _i < active.length; _i++) { + if (this.activeCues_.indexOf(active[_i]) === -1) { + changed = true; + } + } + } + + this.activeCues_ = active; + activeCues.setCues_(this.activeCues_); + return activeCues; + }, + // /!\ Keep this setter empty (see the timeupdate handler above) + set: function set() {} + } + }); + + if (settings.src) { + _this.src = settings.src; + + if (!_this.preload_) { + // Tracks will load on-demand. + // Act like we're loaded for other purposes. + _this.loaded_ = true; + } + + if (_this.preload_ || settings.kind !== 'subtitles' && settings.kind !== 'captions') { + loadTrack(_this.src, assertThisInitialized(_this)); + } + } else { + _this.loaded_ = true; + } + + return _this; + } + /** + * Add a cue to the internal list of cues. + * + * @param {TextTrack~Cue} cue + * The cue to add to our internal list + */ + + + var _proto = TextTrack.prototype; + + _proto.addCue = function addCue(originalCue) { + var cue = originalCue; + + if (window_1.vttjs && !(originalCue instanceof window_1.vttjs.VTTCue)) { + cue = new window_1.vttjs.VTTCue(originalCue.startTime, originalCue.endTime, originalCue.text); + + for (var prop in originalCue) { + if (!(prop in cue)) { + cue[prop] = originalCue[prop]; + } + } // make sure that `id` is copied over + + + cue.id = originalCue.id; + cue.originalCue_ = originalCue; + } + + var tracks = this.tech_.textTracks(); + + for (var i = 0; i < tracks.length; i++) { + if (tracks[i] !== this) { + tracks[i].removeCue(cue); + } + } + + this.cues_.push(cue); + this.cues.setCues_(this.cues_); + } + /** + * Remove a cue from our internal list + * + * @param {TextTrack~Cue} removeCue + * The cue to remove from our internal list + */ + ; + + _proto.removeCue = function removeCue(_removeCue) { + var i = this.cues_.length; + + while (i--) { + var cue = this.cues_[i]; + + if (cue === _removeCue || cue.originalCue_ && cue.originalCue_ === _removeCue) { + this.cues_.splice(i, 1); + this.cues.setCues_(this.cues_); + break; + } + } + }; + + return TextTrack; + }(Track); + /** + * cuechange - One or more cues in the track have become active or stopped being active. + */ + + + TextTrack.prototype.allowedEvents_ = { + cuechange: 'cuechange' + }; + + /** + * A representation of a single `AudioTrack`. If it is part of an {@link AudioTrackList} + * only one `AudioTrack` in the list will be enabled at a time. + * + * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#audiotrack} + * @extends Track + */ + + var AudioTrack = /*#__PURE__*/function (_Track) { + inheritsLoose(AudioTrack, _Track); + + /** + * Create an instance of this class. + * + * @param {Object} [options={}] + * Object of option names and values + * + * @param {AudioTrack~Kind} [options.kind=''] + * A valid audio track kind + * + * @param {string} [options.id='vjs_track_' + Guid.newGUID()] + * A unique id for this AudioTrack. + * + * @param {string} [options.label=''] + * The menu label for this track. + * + * @param {string} [options.language=''] + * A valid two character language code. + * + * @param {boolean} [options.enabled] + * If this track is the one that is currently playing. If this track is part of + * an {@link AudioTrackList}, only one {@link AudioTrack} will be enabled. + */ + function AudioTrack(options) { + var _this; + + if (options === void 0) { + options = {}; + } + + var settings = mergeOptions$3(options, { + kind: AudioTrackKind[options.kind] || '' + }); + _this = _Track.call(this, settings) || this; + var enabled = false; + /** + * @memberof AudioTrack + * @member {boolean} enabled + * If this `AudioTrack` is enabled or not. When setting this will + * fire {@link AudioTrack#enabledchange} if the state of enabled is changed. + * @instance + * + * @fires VideoTrack#selectedchange + */ + + Object.defineProperty(assertThisInitialized(_this), 'enabled', { + get: function get() { + return enabled; + }, + set: function set(newEnabled) { + // an invalid or unchanged value + if (typeof newEnabled !== 'boolean' || newEnabled === enabled) { + return; + } + + enabled = newEnabled; + /** + * An event that fires when enabled changes on this track. This allows + * the AudioTrackList that holds this track to act accordingly. + * + * > Note: This is not part of the spec! Native tracks will do + * this internally without an event. + * + * @event AudioTrack#enabledchange + * @type {EventTarget~Event} + */ + + this.trigger('enabledchange'); + } + }); // if the user sets this track to selected then + // set selected to that true value otherwise + // we keep it false + + if (settings.enabled) { + _this.enabled = settings.enabled; + } + + _this.loaded_ = true; + return _this; + } + + return AudioTrack; + }(Track); + + /** + * A representation of a single `VideoTrack`. + * + * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#videotrack} + * @extends Track + */ + + var VideoTrack = /*#__PURE__*/function (_Track) { + inheritsLoose(VideoTrack, _Track); + + /** + * Create an instance of this class. + * + * @param {Object} [options={}] + * Object of option names and values + * + * @param {string} [options.kind=''] + * A valid {@link VideoTrack~Kind} + * + * @param {string} [options.id='vjs_track_' + Guid.newGUID()] + * A unique id for this AudioTrack. + * + * @param {string} [options.label=''] + * The menu label for this track. + * + * @param {string} [options.language=''] + * A valid two character language code. + * + * @param {boolean} [options.selected] + * If this track is the one that is currently playing. + */ + function VideoTrack(options) { + var _this; + + if (options === void 0) { + options = {}; + } + + var settings = mergeOptions$3(options, { + kind: VideoTrackKind[options.kind] || '' + }); + _this = _Track.call(this, settings) || this; + var selected = false; + /** + * @memberof VideoTrack + * @member {boolean} selected + * If this `VideoTrack` is selected or not. When setting this will + * fire {@link VideoTrack#selectedchange} if the state of selected changed. + * @instance + * + * @fires VideoTrack#selectedchange + */ + + Object.defineProperty(assertThisInitialized(_this), 'selected', { + get: function get() { + return selected; + }, + set: function set(newSelected) { + // an invalid or unchanged value + if (typeof newSelected !== 'boolean' || newSelected === selected) { + return; + } + + selected = newSelected; + /** + * An event that fires when selected changes on this track. This allows + * the VideoTrackList that holds this track to act accordingly. + * + * > Note: This is not part of the spec! Native tracks will do + * this internally without an event. + * + * @event VideoTrack#selectedchange + * @type {EventTarget~Event} + */ + + this.trigger('selectedchange'); + } + }); // if the user sets this track to selected then + // set selected to that true value otherwise + // we keep it false + + if (settings.selected) { + _this.selected = settings.selected; + } + + return _this; + } + + return VideoTrack; + }(Track); + + /** + * @memberof HTMLTrackElement + * @typedef {HTMLTrackElement~ReadyState} + * @enum {number} + */ + + var NONE = 0; + var LOADING = 1; + var LOADED = 2; + var ERROR = 3; + /** + * A single track represented in the DOM. + * + * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#htmltrackelement} + * @extends EventTarget + */ + + var HTMLTrackElement = /*#__PURE__*/function (_EventTarget) { + inheritsLoose(HTMLTrackElement, _EventTarget); + + /** + * Create an instance of this class. + * + * @param {Object} options={} + * Object of option names and values + * + * @param {Tech} options.tech + * A reference to the tech that owns this HTMLTrackElement. + * + * @param {TextTrack~Kind} [options.kind='subtitles'] + * A valid text track kind. + * + * @param {TextTrack~Mode} [options.mode='disabled'] + * A valid text track mode. + * + * @param {string} [options.id='vjs_track_' + Guid.newGUID()] + * A unique id for this TextTrack. + * + * @param {string} [options.label=''] + * The menu label for this track. + * + * @param {string} [options.language=''] + * A valid two character language code. + * + * @param {string} [options.srclang=''] + * A valid two character language code. An alternative, but deprioritized + * vesion of `options.language` + * + * @param {string} [options.src] + * A url to TextTrack cues. + * + * @param {boolean} [options.default] + * If this track should default to on or off. + */ + function HTMLTrackElement(options) { + var _this; + + if (options === void 0) { + options = {}; + } + + _this = _EventTarget.call(this) || this; + var readyState; + var track = new TextTrack(options); + _this.kind = track.kind; + _this.src = track.src; + _this.srclang = track.language; + _this.label = track.label; + _this["default"] = track["default"]; + Object.defineProperties(assertThisInitialized(_this), { + /** + * @memberof HTMLTrackElement + * @member {HTMLTrackElement~ReadyState} readyState + * The current ready state of the track element. + * @instance + */ + readyState: { + get: function get() { + return readyState; + } + }, + + /** + * @memberof HTMLTrackElement + * @member {TextTrack} track + * The underlying TextTrack object. + * @instance + * + */ + track: { + get: function get() { + return track; + } + } + }); + readyState = NONE; + /** + * @listens TextTrack#loadeddata + * @fires HTMLTrackElement#load + */ + + track.addEventListener('loadeddata', function () { + readyState = LOADED; + + _this.trigger({ + type: 'load', + target: assertThisInitialized(_this) + }); + }); + return _this; + } + + return HTMLTrackElement; + }(EventTarget$2); + + HTMLTrackElement.prototype.allowedEvents_ = { + load: 'load' + }; + HTMLTrackElement.NONE = NONE; + HTMLTrackElement.LOADING = LOADING; + HTMLTrackElement.LOADED = LOADED; + HTMLTrackElement.ERROR = ERROR; + + /* + * This file contains all track properties that are used in + * player.js, tech.js, html5.js and possibly other techs in the future. + */ + + var NORMAL = { + audio: { + ListClass: AudioTrackList, + TrackClass: AudioTrack, + capitalName: 'Audio' + }, + video: { + ListClass: VideoTrackList, + TrackClass: VideoTrack, + capitalName: 'Video' + }, + text: { + ListClass: TextTrackList, + TrackClass: TextTrack, + capitalName: 'Text' + } + }; + Object.keys(NORMAL).forEach(function (type) { + NORMAL[type].getterName = type + "Tracks"; + NORMAL[type].privateName = type + "Tracks_"; + }); + var REMOTE = { + remoteText: { + ListClass: TextTrackList, + TrackClass: TextTrack, + capitalName: 'RemoteText', + getterName: 'remoteTextTracks', + privateName: 'remoteTextTracks_' + }, + remoteTextEl: { + ListClass: HtmlTrackElementList, + TrackClass: HTMLTrackElement, + capitalName: 'RemoteTextTrackEls', + getterName: 'remoteTextTrackEls', + privateName: 'remoteTextTrackEls_' + } + }; + + var ALL = _extends_1({}, NORMAL, REMOTE); + + REMOTE.names = Object.keys(REMOTE); + NORMAL.names = Object.keys(NORMAL); + ALL.names = [].concat(REMOTE.names).concat(NORMAL.names); + + /** + * Copyright 2013 vtt.js Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ + + /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ + + var _objCreate = Object.create || function () { + function F() {} + + return function (o) { + if (arguments.length !== 1) { + throw new Error('Object.create shim only accepts one parameter.'); + } + + F.prototype = o; + return new F(); + }; + }(); // Creates a new ParserError object from an errorData object. The errorData + // object should have default code and message properties. The default message + // property can be overriden by passing in a message parameter. + // See ParsingError.Errors below for acceptable errors. + + + function ParsingError(errorData, message) { + this.name = "ParsingError"; + this.code = errorData.code; + this.message = message || errorData.message; + } + + ParsingError.prototype = _objCreate(Error.prototype); + ParsingError.prototype.constructor = ParsingError; // ParsingError metadata for acceptable ParsingErrors. + + ParsingError.Errors = { + BadSignature: { + code: 0, + message: "Malformed WebVTT signature." + }, + BadTimeStamp: { + code: 1, + message: "Malformed time stamp." + } + }; // Try to parse input as a time stamp. + + function parseTimeStamp(input) { + function computeSeconds(h, m, s, f) { + return (h | 0) * 3600 + (m | 0) * 60 + (s | 0) + (f | 0) / 1000; + } + + var m = input.match(/^(\d+):(\d{1,2})(:\d{1,2})?\.(\d{3})/); + + if (!m) { + return null; + } + + if (m[3]) { + // Timestamp takes the form of [hours]:[minutes]:[seconds].[milliseconds] + return computeSeconds(m[1], m[2], m[3].replace(":", ""), m[4]); + } else if (m[1] > 59) { + // Timestamp takes the form of [hours]:[minutes].[milliseconds] + // First position is hours as it's over 59. + return computeSeconds(m[1], m[2], 0, m[4]); + } else { + // Timestamp takes the form of [minutes]:[seconds].[milliseconds] + return computeSeconds(0, m[1], m[2], m[4]); + } + } // A settings object holds key/value pairs and will ignore anything but the first + // assignment to a specific key. + + + function Settings() { + this.values = _objCreate(null); + } + + Settings.prototype = { + // Only accept the first assignment to any key. + set: function set(k, v) { + if (!this.get(k) && v !== "") { + this.values[k] = v; + } + }, + // Return the value for a key, or a default value. + // If 'defaultKey' is passed then 'dflt' is assumed to be an object with + // a number of possible default values as properties where 'defaultKey' is + // the key of the property that will be chosen; otherwise it's assumed to be + // a single value. + get: function get(k, dflt, defaultKey) { + if (defaultKey) { + return this.has(k) ? this.values[k] : dflt[defaultKey]; + } + + return this.has(k) ? this.values[k] : dflt; + }, + // Check whether we have a value for a key. + has: function has(k) { + return k in this.values; + }, + // Accept a setting if its one of the given alternatives. + alt: function alt(k, v, a) { + for (var n = 0; n < a.length; ++n) { + if (v === a[n]) { + this.set(k, v); + break; + } + } + }, + // Accept a setting if its a valid (signed) integer. + integer: function integer(k, v) { + if (/^-?\d+$/.test(v)) { + // integer + this.set(k, parseInt(v, 10)); + } + }, + // Accept a setting if its a valid percentage. + percent: function percent(k, v) { + + if (v.match(/^([\d]{1,3})(\.[\d]*)?%$/)) { + v = parseFloat(v); + + if (v >= 0 && v <= 100) { + this.set(k, v); + return true; + } + } + + return false; + } + }; // Helper function to parse input into groups separated by 'groupDelim', and + // interprete each group as a key/value pair separated by 'keyValueDelim'. + + function parseOptions(input, callback, keyValueDelim, groupDelim) { + var groups = groupDelim ? input.split(groupDelim) : [input]; + + for (var i in groups) { + if (typeof groups[i] !== "string") { + continue; + } + + var kv = groups[i].split(keyValueDelim); + + if (kv.length !== 2) { + continue; + } + + var k = kv[0]; + var v = kv[1]; + callback(k, v); + } + } + + function parseCue(input, cue, regionList) { + // Remember the original input if we need to throw an error. + var oInput = input; // 4.1 WebVTT timestamp + + function consumeTimeStamp() { + var ts = parseTimeStamp(input); + + if (ts === null) { + throw new ParsingError(ParsingError.Errors.BadTimeStamp, "Malformed timestamp: " + oInput); + } // Remove time stamp from input. + + + input = input.replace(/^[^\sa-zA-Z-]+/, ""); + return ts; + } // 4.4.2 WebVTT cue settings + + + function consumeCueSettings(input, cue) { + var settings = new Settings(); + parseOptions(input, function (k, v) { + switch (k) { + case "region": + // Find the last region we parsed with the same region id. + for (var i = regionList.length - 1; i >= 0; i--) { + if (regionList[i].id === v) { + settings.set(k, regionList[i].region); + break; + } + } + + break; + + case "vertical": + settings.alt(k, v, ["rl", "lr"]); + break; + + case "line": + var vals = v.split(","), + vals0 = vals[0]; + settings.integer(k, vals0); + settings.percent(k, vals0) ? settings.set("snapToLines", false) : null; + settings.alt(k, vals0, ["auto"]); + + if (vals.length === 2) { + settings.alt("lineAlign", vals[1], ["start", "center", "end"]); + } + + break; + + case "position": + vals = v.split(","); + settings.percent(k, vals[0]); + + if (vals.length === 2) { + settings.alt("positionAlign", vals[1], ["start", "center", "end"]); + } + + break; + + case "size": + settings.percent(k, v); + break; + + case "align": + settings.alt(k, v, ["start", "center", "end", "left", "right"]); + break; + } + }, /:/, /\s/); // Apply default values for any missing fields. + + cue.region = settings.get("region", null); + cue.vertical = settings.get("vertical", ""); + + try { + cue.line = settings.get("line", "auto"); + } catch (e) {} + + cue.lineAlign = settings.get("lineAlign", "start"); + cue.snapToLines = settings.get("snapToLines", true); + cue.size = settings.get("size", 100); // Safari still uses the old middle value and won't accept center + + try { + cue.align = settings.get("align", "center"); + } catch (e) { + cue.align = settings.get("align", "middle"); + } + + try { + cue.position = settings.get("position", "auto"); + } catch (e) { + cue.position = settings.get("position", { + start: 0, + left: 0, + center: 50, + middle: 50, + end: 100, + right: 100 + }, cue.align); + } + + cue.positionAlign = settings.get("positionAlign", { + start: "start", + left: "start", + center: "center", + middle: "center", + end: "end", + right: "end" + }, cue.align); + } + + function skipWhitespace() { + input = input.replace(/^\s+/, ""); + } // 4.1 WebVTT cue timings. + + + skipWhitespace(); + cue.startTime = consumeTimeStamp(); // (1) collect cue start time + + skipWhitespace(); + + if (input.substr(0, 3) !== "-->") { + // (3) next characters must match "-->" + throw new ParsingError(ParsingError.Errors.BadTimeStamp, "Malformed time stamp (time stamps must be separated by '-->'): " + oInput); + } + + input = input.substr(3); + skipWhitespace(); + cue.endTime = consumeTimeStamp(); // (5) collect cue end time + // 4.1 WebVTT cue settings list. + + skipWhitespace(); + consumeCueSettings(input, cue); + } // When evaluating this file as part of a Webpack bundle for server + // side rendering, `document` is an empty object. + + + var TEXTAREA_ELEMENT = document_1.createElement && document_1.createElement("textarea"); + var TAG_NAME = { + c: "span", + i: "i", + b: "b", + u: "u", + ruby: "ruby", + rt: "rt", + v: "span", + lang: "span" + }; // 5.1 default text color + // 5.2 default text background color is equivalent to text color with bg_ prefix + + var DEFAULT_COLOR_CLASS = { + white: 'rgba(255,255,255,1)', + lime: 'rgba(0,255,0,1)', + cyan: 'rgba(0,255,255,1)', + red: 'rgba(255,0,0,1)', + yellow: 'rgba(255,255,0,1)', + magenta: 'rgba(255,0,255,1)', + blue: 'rgba(0,0,255,1)', + black: 'rgba(0,0,0,1)' + }; + var TAG_ANNOTATION = { + v: "title", + lang: "lang" + }; + var NEEDS_PARENT = { + rt: "ruby" + }; // Parse content into a document fragment. + + function parseContent(window, input) { + function nextToken() { + // Check for end-of-string. + if (!input) { + return null; + } // Consume 'n' characters from the input. + + + function consume(result) { + input = input.substr(result.length); + return result; + } + + var m = input.match(/^([^<]*)(<[^>]*>?)?/); // If there is some text before the next tag, return it, otherwise return + // the tag. + + return consume(m[1] ? m[1] : m[2]); + } + + function unescape(s) { + TEXTAREA_ELEMENT.innerHTML = s; + s = TEXTAREA_ELEMENT.textContent; + TEXTAREA_ELEMENT.textContent = ""; + return s; + } + + function shouldAdd(current, element) { + return !NEEDS_PARENT[element.localName] || NEEDS_PARENT[element.localName] === current.localName; + } // Create an element for this tag. + + + function createElement(type, annotation) { + var tagName = TAG_NAME[type]; + + if (!tagName) { + return null; + } + + var element = window.document.createElement(tagName); + var name = TAG_ANNOTATION[type]; + + if (name && annotation) { + element[name] = annotation.trim(); + } + + return element; + } + + var rootDiv = window.document.createElement("div"), + current = rootDiv, + t, + tagStack = []; + + while ((t = nextToken()) !== null) { + if (t[0] === '<') { + if (t[1] === "/") { + // If the closing tag matches, move back up to the parent node. + if (tagStack.length && tagStack[tagStack.length - 1] === t.substr(2).replace(">", "")) { + tagStack.pop(); + current = current.parentNode; + } // Otherwise just ignore the end tag. + + + continue; + } + + var ts = parseTimeStamp(t.substr(1, t.length - 2)); + var node; + + if (ts) { + // Timestamps are lead nodes as well. + node = window.document.createProcessingInstruction("timestamp", ts); + current.appendChild(node); + continue; + } + + var m = t.match(/^<([^.\s/0-9>]+)(\.[^\s\\>]+)?([^>\\]+)?(\\?)>?$/); // If we can't parse the tag, skip to the next tag. + + if (!m) { + continue; + } // Try to construct an element, and ignore the tag if we couldn't. + + + node = createElement(m[1], m[3]); + + if (!node) { + continue; + } // Determine if the tag should be added based on the context of where it + // is placed in the cuetext. + + + if (!shouldAdd(current, node)) { + continue; + } // Set the class list (as a list of classes, separated by space). + + + if (m[2]) { + var classes = m[2].split('.'); + classes.forEach(function (cl) { + var bgColor = /^bg_/.test(cl); // slice out `bg_` if it's a background color + + var colorName = bgColor ? cl.slice(3) : cl; + + if (DEFAULT_COLOR_CLASS.hasOwnProperty(colorName)) { + var propName = bgColor ? 'background-color' : 'color'; + var propValue = DEFAULT_COLOR_CLASS[colorName]; + node.style[propName] = propValue; + } + }); + node.className = classes.join(' '); + } // Append the node to the current node, and enter the scope of the new + // node. + + + tagStack.push(m[1]); + current.appendChild(node); + current = node; + continue; + } // Text nodes are leaf nodes. + + + current.appendChild(window.document.createTextNode(unescape(t))); + } + + return rootDiv; + } // This is a list of all the Unicode characters that have a strong + // right-to-left category. What this means is that these characters are + // written right-to-left for sure. It was generated by pulling all the strong + // right-to-left characters out of the Unicode data table. That table can + // found at: http://www.unicode.org/Public/UNIDATA/UnicodeData.txt + + + var strongRTLRanges = [[0x5be, 0x5be], [0x5c0, 0x5c0], [0x5c3, 0x5c3], [0x5c6, 0x5c6], [0x5d0, 0x5ea], [0x5f0, 0x5f4], [0x608, 0x608], [0x60b, 0x60b], [0x60d, 0x60d], [0x61b, 0x61b], [0x61e, 0x64a], [0x66d, 0x66f], [0x671, 0x6d5], [0x6e5, 0x6e6], [0x6ee, 0x6ef], [0x6fa, 0x70d], [0x70f, 0x710], [0x712, 0x72f], [0x74d, 0x7a5], [0x7b1, 0x7b1], [0x7c0, 0x7ea], [0x7f4, 0x7f5], [0x7fa, 0x7fa], [0x800, 0x815], [0x81a, 0x81a], [0x824, 0x824], [0x828, 0x828], [0x830, 0x83e], [0x840, 0x858], [0x85e, 0x85e], [0x8a0, 0x8a0], [0x8a2, 0x8ac], [0x200f, 0x200f], [0xfb1d, 0xfb1d], [0xfb1f, 0xfb28], [0xfb2a, 0xfb36], [0xfb38, 0xfb3c], [0xfb3e, 0xfb3e], [0xfb40, 0xfb41], [0xfb43, 0xfb44], [0xfb46, 0xfbc1], [0xfbd3, 0xfd3d], [0xfd50, 0xfd8f], [0xfd92, 0xfdc7], [0xfdf0, 0xfdfc], [0xfe70, 0xfe74], [0xfe76, 0xfefc], [0x10800, 0x10805], [0x10808, 0x10808], [0x1080a, 0x10835], [0x10837, 0x10838], [0x1083c, 0x1083c], [0x1083f, 0x10855], [0x10857, 0x1085f], [0x10900, 0x1091b], [0x10920, 0x10939], [0x1093f, 0x1093f], [0x10980, 0x109b7], [0x109be, 0x109bf], [0x10a00, 0x10a00], [0x10a10, 0x10a13], [0x10a15, 0x10a17], [0x10a19, 0x10a33], [0x10a40, 0x10a47], [0x10a50, 0x10a58], [0x10a60, 0x10a7f], [0x10b00, 0x10b35], [0x10b40, 0x10b55], [0x10b58, 0x10b72], [0x10b78, 0x10b7f], [0x10c00, 0x10c48], [0x1ee00, 0x1ee03], [0x1ee05, 0x1ee1f], [0x1ee21, 0x1ee22], [0x1ee24, 0x1ee24], [0x1ee27, 0x1ee27], [0x1ee29, 0x1ee32], [0x1ee34, 0x1ee37], [0x1ee39, 0x1ee39], [0x1ee3b, 0x1ee3b], [0x1ee42, 0x1ee42], [0x1ee47, 0x1ee47], [0x1ee49, 0x1ee49], [0x1ee4b, 0x1ee4b], [0x1ee4d, 0x1ee4f], [0x1ee51, 0x1ee52], [0x1ee54, 0x1ee54], [0x1ee57, 0x1ee57], [0x1ee59, 0x1ee59], [0x1ee5b, 0x1ee5b], [0x1ee5d, 0x1ee5d], [0x1ee5f, 0x1ee5f], [0x1ee61, 0x1ee62], [0x1ee64, 0x1ee64], [0x1ee67, 0x1ee6a], [0x1ee6c, 0x1ee72], [0x1ee74, 0x1ee77], [0x1ee79, 0x1ee7c], [0x1ee7e, 0x1ee7e], [0x1ee80, 0x1ee89], [0x1ee8b, 0x1ee9b], [0x1eea1, 0x1eea3], [0x1eea5, 0x1eea9], [0x1eeab, 0x1eebb], [0x10fffd, 0x10fffd]]; + + function isStrongRTLChar(charCode) { + for (var i = 0; i < strongRTLRanges.length; i++) { + var currentRange = strongRTLRanges[i]; + + if (charCode >= currentRange[0] && charCode <= currentRange[1]) { + return true; + } + } + + return false; + } + + function determineBidi(cueDiv) { + var nodeStack = [], + text = "", + charCode; + + if (!cueDiv || !cueDiv.childNodes) { + return "ltr"; + } + + function pushNodes(nodeStack, node) { + for (var i = node.childNodes.length - 1; i >= 0; i--) { + nodeStack.push(node.childNodes[i]); + } + } + + function nextTextNode(nodeStack) { + if (!nodeStack || !nodeStack.length) { + return null; + } + + var node = nodeStack.pop(), + text = node.textContent || node.innerText; + + if (text) { + // TODO: This should match all unicode type B characters (paragraph + // separator characters). See issue #115. + var m = text.match(/^.*(\n|\r)/); + + if (m) { + nodeStack.length = 0; + return m[0]; + } + + return text; + } + + if (node.tagName === "ruby") { + return nextTextNode(nodeStack); + } + + if (node.childNodes) { + pushNodes(nodeStack, node); + return nextTextNode(nodeStack); + } + } + + pushNodes(nodeStack, cueDiv); + + while (text = nextTextNode(nodeStack)) { + for (var i = 0; i < text.length; i++) { + charCode = text.charCodeAt(i); + + if (isStrongRTLChar(charCode)) { + return "rtl"; + } + } + } + + return "ltr"; + } + + function computeLinePos(cue) { + if (typeof cue.line === "number" && (cue.snapToLines || cue.line >= 0 && cue.line <= 100)) { + return cue.line; + } + + if (!cue.track || !cue.track.textTrackList || !cue.track.textTrackList.mediaElement) { + return -1; + } + + var track = cue.track, + trackList = track.textTrackList, + count = 0; + + for (var i = 0; i < trackList.length && trackList[i] !== track; i++) { + if (trackList[i].mode === "showing") { + count++; + } + } + + return ++count * -1; + } + + function StyleBox() {} // Apply styles to a div. If there is no div passed then it defaults to the + // div on 'this'. + + + StyleBox.prototype.applyStyles = function (styles, div) { + div = div || this.div; + + for (var prop in styles) { + if (styles.hasOwnProperty(prop)) { + div.style[prop] = styles[prop]; + } + } + }; + + StyleBox.prototype.formatStyle = function (val, unit) { + return val === 0 ? 0 : val + unit; + }; // Constructs the computed display state of the cue (a div). Places the div + // into the overlay which should be a block level element (usually a div). + + + function CueStyleBox(window, cue, styleOptions) { + StyleBox.call(this); + this.cue = cue; // Parse our cue's text into a DOM tree rooted at 'cueDiv'. This div will + // have inline positioning and will function as the cue background box. + + this.cueDiv = parseContent(window, cue.text); + var styles = { + color: "rgba(255, 255, 255, 1)", + backgroundColor: "rgba(0, 0, 0, 0.8)", + position: "relative", + left: 0, + right: 0, + top: 0, + bottom: 0, + display: "inline", + writingMode: cue.vertical === "" ? "horizontal-tb" : cue.vertical === "lr" ? "vertical-lr" : "vertical-rl", + unicodeBidi: "plaintext" + }; + this.applyStyles(styles, this.cueDiv); // Create an absolutely positioned div that will be used to position the cue + // div. Note, all WebVTT cue-setting alignments are equivalent to the CSS + // mirrors of them except middle instead of center on Safari. + + this.div = window.document.createElement("div"); + styles = { + direction: determineBidi(this.cueDiv), + writingMode: cue.vertical === "" ? "horizontal-tb" : cue.vertical === "lr" ? "vertical-lr" : "vertical-rl", + unicodeBidi: "plaintext", + textAlign: cue.align === "middle" ? "center" : cue.align, + font: styleOptions.font, + whiteSpace: "pre-line", + position: "absolute" + }; + this.applyStyles(styles); + this.div.appendChild(this.cueDiv); // Calculate the distance from the reference edge of the viewport to the text + // position of the cue box. The reference edge will be resolved later when + // the box orientation styles are applied. + + var textPos = 0; + + switch (cue.positionAlign) { + case "start": + textPos = cue.position; + break; + + case "center": + textPos = cue.position - cue.size / 2; + break; + + case "end": + textPos = cue.position - cue.size; + break; + } // Horizontal box orientation; textPos is the distance from the left edge of the + // area to the left edge of the box and cue.size is the distance extending to + // the right from there. + + + if (cue.vertical === "") { + this.applyStyles({ + left: this.formatStyle(textPos, "%"), + width: this.formatStyle(cue.size, "%") + }); // Vertical box orientation; textPos is the distance from the top edge of the + // area to the top edge of the box and cue.size is the height extending + // downwards from there. + } else { + this.applyStyles({ + top: this.formatStyle(textPos, "%"), + height: this.formatStyle(cue.size, "%") + }); + } + + this.move = function (box) { + this.applyStyles({ + top: this.formatStyle(box.top, "px"), + bottom: this.formatStyle(box.bottom, "px"), + left: this.formatStyle(box.left, "px"), + right: this.formatStyle(box.right, "px"), + height: this.formatStyle(box.height, "px"), + width: this.formatStyle(box.width, "px") + }); + }; + } + + CueStyleBox.prototype = _objCreate(StyleBox.prototype); + CueStyleBox.prototype.constructor = CueStyleBox; // Represents the co-ordinates of an Element in a way that we can easily + // compute things with such as if it overlaps or intersects with another Element. + // Can initialize it with either a StyleBox or another BoxPosition. + + function BoxPosition(obj) { + // Either a BoxPosition was passed in and we need to copy it, or a StyleBox + // was passed in and we need to copy the results of 'getBoundingClientRect' + // as the object returned is readonly. All co-ordinate values are in reference + // to the viewport origin (top left). + var lh, height, width, top; + + if (obj.div) { + height = obj.div.offsetHeight; + width = obj.div.offsetWidth; + top = obj.div.offsetTop; + var rects = (rects = obj.div.childNodes) && (rects = rects[0]) && rects.getClientRects && rects.getClientRects(); + obj = obj.div.getBoundingClientRect(); // In certain cases the outter div will be slightly larger then the sum of + // the inner div's lines. This could be due to bold text, etc, on some platforms. + // In this case we should get the average line height and use that. This will + // result in the desired behaviour. + + lh = rects ? Math.max(rects[0] && rects[0].height || 0, obj.height / rects.length) : 0; + } + + this.left = obj.left; + this.right = obj.right; + this.top = obj.top || top; + this.height = obj.height || height; + this.bottom = obj.bottom || top + (obj.height || height); + this.width = obj.width || width; + this.lineHeight = lh !== undefined ? lh : obj.lineHeight; + } // Move the box along a particular axis. Optionally pass in an amount to move + // the box. If no amount is passed then the default is the line height of the + // box. + + + BoxPosition.prototype.move = function (axis, toMove) { + toMove = toMove !== undefined ? toMove : this.lineHeight; + + switch (axis) { + case "+x": + this.left += toMove; + this.right += toMove; + break; + + case "-x": + this.left -= toMove; + this.right -= toMove; + break; + + case "+y": + this.top += toMove; + this.bottom += toMove; + break; + + case "-y": + this.top -= toMove; + this.bottom -= toMove; + break; + } + }; // Check if this box overlaps another box, b2. + + + BoxPosition.prototype.overlaps = function (b2) { + return this.left < b2.right && this.right > b2.left && this.top < b2.bottom && this.bottom > b2.top; + }; // Check if this box overlaps any other boxes in boxes. + + + BoxPosition.prototype.overlapsAny = function (boxes) { + for (var i = 0; i < boxes.length; i++) { + if (this.overlaps(boxes[i])) { + return true; + } + } + + return false; + }; // Check if this box is within another box. + + + BoxPosition.prototype.within = function (container) { + return this.top >= container.top && this.bottom <= container.bottom && this.left >= container.left && this.right <= container.right; + }; // Check if this box is entirely within the container or it is overlapping + // on the edge opposite of the axis direction passed. For example, if "+x" is + // passed and the box is overlapping on the left edge of the container, then + // return true. + + + BoxPosition.prototype.overlapsOppositeAxis = function (container, axis) { + switch (axis) { + case "+x": + return this.left < container.left; + + case "-x": + return this.right > container.right; + + case "+y": + return this.top < container.top; + + case "-y": + return this.bottom > container.bottom; + } + }; // Find the percentage of the area that this box is overlapping with another + // box. + + + BoxPosition.prototype.intersectPercentage = function (b2) { + var x = Math.max(0, Math.min(this.right, b2.right) - Math.max(this.left, b2.left)), + y = Math.max(0, Math.min(this.bottom, b2.bottom) - Math.max(this.top, b2.top)), + intersectArea = x * y; + return intersectArea / (this.height * this.width); + }; // Convert the positions from this box to CSS compatible positions using + // the reference container's positions. This has to be done because this + // box's positions are in reference to the viewport origin, whereas, CSS + // values are in referecne to their respective edges. + + + BoxPosition.prototype.toCSSCompatValues = function (reference) { + return { + top: this.top - reference.top, + bottom: reference.bottom - this.bottom, + left: this.left - reference.left, + right: reference.right - this.right, + height: this.height, + width: this.width + }; + }; // Get an object that represents the box's position without anything extra. + // Can pass a StyleBox, HTMLElement, or another BoxPositon. + + + BoxPosition.getSimpleBoxPosition = function (obj) { + var height = obj.div ? obj.div.offsetHeight : obj.tagName ? obj.offsetHeight : 0; + var width = obj.div ? obj.div.offsetWidth : obj.tagName ? obj.offsetWidth : 0; + var top = obj.div ? obj.div.offsetTop : obj.tagName ? obj.offsetTop : 0; + obj = obj.div ? obj.div.getBoundingClientRect() : obj.tagName ? obj.getBoundingClientRect() : obj; + var ret = { + left: obj.left, + right: obj.right, + top: obj.top || top, + height: obj.height || height, + bottom: obj.bottom || top + (obj.height || height), + width: obj.width || width + }; + return ret; + }; // Move a StyleBox to its specified, or next best, position. The containerBox + // is the box that contains the StyleBox, such as a div. boxPositions are + // a list of other boxes that the styleBox can't overlap with. + + + function moveBoxToLinePosition(window, styleBox, containerBox, boxPositions) { + // Find the best position for a cue box, b, on the video. The axis parameter + // is a list of axis, the order of which, it will move the box along. For example: + // Passing ["+x", "-x"] will move the box first along the x axis in the positive + // direction. If it doesn't find a good position for it there it will then move + // it along the x axis in the negative direction. + function findBestPosition(b, axis) { + var bestPosition, + specifiedPosition = new BoxPosition(b), + percentage = 1; // Highest possible so the first thing we get is better. + + for (var i = 0; i < axis.length; i++) { + while (b.overlapsOppositeAxis(containerBox, axis[i]) || b.within(containerBox) && b.overlapsAny(boxPositions)) { + b.move(axis[i]); + } // We found a spot where we aren't overlapping anything. This is our + // best position. + + + if (b.within(containerBox)) { + return b; + } + + var p = b.intersectPercentage(containerBox); // If we're outside the container box less then we were on our last try + // then remember this position as the best position. + + if (percentage > p) { + bestPosition = new BoxPosition(b); + percentage = p; + } // Reset the box position to the specified position. + + + b = new BoxPosition(specifiedPosition); + } + + return bestPosition || specifiedPosition; + } + + var boxPosition = new BoxPosition(styleBox), + cue = styleBox.cue, + linePos = computeLinePos(cue), + axis = []; // If we have a line number to align the cue to. + + if (cue.snapToLines) { + var size; + + switch (cue.vertical) { + case "": + axis = ["+y", "-y"]; + size = "height"; + break; + + case "rl": + axis = ["+x", "-x"]; + size = "width"; + break; + + case "lr": + axis = ["-x", "+x"]; + size = "width"; + break; + } + + var step = boxPosition.lineHeight, + position = step * Math.round(linePos), + maxPosition = containerBox[size] + step, + initialAxis = axis[0]; // If the specified intial position is greater then the max position then + // clamp the box to the amount of steps it would take for the box to + // reach the max position. + + if (Math.abs(position) > maxPosition) { + position = position < 0 ? -1 : 1; + position *= Math.ceil(maxPosition / step) * step; + } // If computed line position returns negative then line numbers are + // relative to the bottom of the video instead of the top. Therefore, we + // need to increase our initial position by the length or width of the + // video, depending on the writing direction, and reverse our axis directions. + + + if (linePos < 0) { + position += cue.vertical === "" ? containerBox.height : containerBox.width; + axis = axis.reverse(); + } // Move the box to the specified position. This may not be its best + // position. + + + boxPosition.move(initialAxis, position); + } else { + // If we have a percentage line value for the cue. + var calculatedPercentage = boxPosition.lineHeight / containerBox.height * 100; + + switch (cue.lineAlign) { + case "center": + linePos -= calculatedPercentage / 2; + break; + + case "end": + linePos -= calculatedPercentage; + break; + } // Apply initial line position to the cue box. + + + switch (cue.vertical) { + case "": + styleBox.applyStyles({ + top: styleBox.formatStyle(linePos, "%") + }); + break; + + case "rl": + styleBox.applyStyles({ + left: styleBox.formatStyle(linePos, "%") + }); + break; + + case "lr": + styleBox.applyStyles({ + right: styleBox.formatStyle(linePos, "%") + }); + break; + } + + axis = ["+y", "-x", "+x", "-y"]; // Get the box position again after we've applied the specified positioning + // to it. + + boxPosition = new BoxPosition(styleBox); + } + + var bestPosition = findBestPosition(boxPosition, axis); + styleBox.move(bestPosition.toCSSCompatValues(containerBox)); + } + + function WebVTT$1() {// Nothing + } // Helper to allow strings to be decoded instead of the default binary utf8 data. + + + WebVTT$1.StringDecoder = function () { + return { + decode: function decode(data) { + if (!data) { + return ""; + } + + if (typeof data !== "string") { + throw new Error("Error - expected string data."); + } + + return decodeURIComponent(encodeURIComponent(data)); + } + }; + }; + + WebVTT$1.convertCueToDOMTree = function (window, cuetext) { + if (!window || !cuetext) { + return null; + } + + return parseContent(window, cuetext); + }; + + var FONT_SIZE_PERCENT = 0.05; + var FONT_STYLE = "sans-serif"; + var CUE_BACKGROUND_PADDING = "1.5%"; // Runs the processing model over the cues and regions passed to it. + // @param overlay A block level element (usually a div) that the computed cues + // and regions will be placed into. + + WebVTT$1.processCues = function (window, cues, overlay) { + if (!window || !cues || !overlay) { + return null; + } // Remove all previous children. + + + while (overlay.firstChild) { + overlay.removeChild(overlay.firstChild); + } + + var paddedOverlay = window.document.createElement("div"); + paddedOverlay.style.position = "absolute"; + paddedOverlay.style.left = "0"; + paddedOverlay.style.right = "0"; + paddedOverlay.style.top = "0"; + paddedOverlay.style.bottom = "0"; + paddedOverlay.style.margin = CUE_BACKGROUND_PADDING; + overlay.appendChild(paddedOverlay); // Determine if we need to compute the display states of the cues. This could + // be the case if a cue's state has been changed since the last computation or + // if it has not been computed yet. + + function shouldCompute(cues) { + for (var i = 0; i < cues.length; i++) { + if (cues[i].hasBeenReset || !cues[i].displayState) { + return true; + } + } + + return false; + } // We don't need to recompute the cues' display states. Just reuse them. + + + if (!shouldCompute(cues)) { + for (var i = 0; i < cues.length; i++) { + paddedOverlay.appendChild(cues[i].displayState); + } + + return; + } + + var boxPositions = [], + containerBox = BoxPosition.getSimpleBoxPosition(paddedOverlay), + fontSize = Math.round(containerBox.height * FONT_SIZE_PERCENT * 100) / 100; + var styleOptions = { + font: fontSize + "px " + FONT_STYLE + }; + + (function () { + var styleBox, cue; + + for (var i = 0; i < cues.length; i++) { + cue = cues[i]; // Compute the intial position and styles of the cue div. + + styleBox = new CueStyleBox(window, cue, styleOptions); + paddedOverlay.appendChild(styleBox.div); // Move the cue div to it's correct line position. + + moveBoxToLinePosition(window, styleBox, containerBox, boxPositions); // Remember the computed div so that we don't have to recompute it later + // if we don't have too. + + cue.displayState = styleBox.div; + boxPositions.push(BoxPosition.getSimpleBoxPosition(styleBox)); + } + })(); + }; + + WebVTT$1.Parser = function (window, vttjs, decoder) { + if (!decoder) { + decoder = vttjs; + vttjs = {}; + } + + if (!vttjs) { + vttjs = {}; + } + + this.window = window; + this.vttjs = vttjs; + this.state = "INITIAL"; + this.buffer = ""; + this.decoder = decoder || new TextDecoder("utf8"); + this.regionList = []; + }; + + WebVTT$1.Parser.prototype = { + // If the error is a ParsingError then report it to the consumer if + // possible. If it's not a ParsingError then throw it like normal. + reportOrThrowError: function reportOrThrowError(e) { + if (e instanceof ParsingError) { + this.onparsingerror && this.onparsingerror(e); + } else { + throw e; + } + }, + parse: function parse(data) { + var self = this; // If there is no data then we won't decode it, but will just try to parse + // whatever is in buffer already. This may occur in circumstances, for + // example when flush() is called. + + if (data) { + // Try to decode the data that we received. + self.buffer += self.decoder.decode(data, { + stream: true + }); + } + + function collectNextLine() { + var buffer = self.buffer; + var pos = 0; + + while (pos < buffer.length && buffer[pos] !== '\r' && buffer[pos] !== '\n') { + ++pos; + } + + var line = buffer.substr(0, pos); // Advance the buffer early in case we fail below. + + if (buffer[pos] === '\r') { + ++pos; + } + + if (buffer[pos] === '\n') { + ++pos; + } + + self.buffer = buffer.substr(pos); + return line; + } // 3.4 WebVTT region and WebVTT region settings syntax + + + function parseRegion(input) { + var settings = new Settings(); + parseOptions(input, function (k, v) { + switch (k) { + case "id": + settings.set(k, v); + break; + + case "width": + settings.percent(k, v); + break; + + case "lines": + settings.integer(k, v); + break; + + case "regionanchor": + case "viewportanchor": + var xy = v.split(','); + + if (xy.length !== 2) { + break; + } // We have to make sure both x and y parse, so use a temporary + // settings object here. + + + var anchor = new Settings(); + anchor.percent("x", xy[0]); + anchor.percent("y", xy[1]); + + if (!anchor.has("x") || !anchor.has("y")) { + break; + } + + settings.set(k + "X", anchor.get("x")); + settings.set(k + "Y", anchor.get("y")); + break; + + case "scroll": + settings.alt(k, v, ["up"]); + break; + } + }, /=/, /\s/); // Create the region, using default values for any values that were not + // specified. + + if (settings.has("id")) { + var region = new (self.vttjs.VTTRegion || self.window.VTTRegion)(); + region.width = settings.get("width", 100); + region.lines = settings.get("lines", 3); + region.regionAnchorX = settings.get("regionanchorX", 0); + region.regionAnchorY = settings.get("regionanchorY", 100); + region.viewportAnchorX = settings.get("viewportanchorX", 0); + region.viewportAnchorY = settings.get("viewportanchorY", 100); + region.scroll = settings.get("scroll", ""); // Register the region. + + self.onregion && self.onregion(region); // Remember the VTTRegion for later in case we parse any VTTCues that + // reference it. + + self.regionList.push({ + id: settings.get("id"), + region: region + }); + } + } // draft-pantos-http-live-streaming-20 + // https://tools.ietf.org/html/draft-pantos-http-live-streaming-20#section-3.5 + // 3.5 WebVTT + + + function parseTimestampMap(input) { + var settings = new Settings(); + parseOptions(input, function (k, v) { + switch (k) { + case "MPEGT": + settings.integer(k + 'S', v); + break; + + case "LOCA": + settings.set(k + 'L', parseTimeStamp(v)); + break; + } + }, /[^\d]:/, /,/); + self.ontimestampmap && self.ontimestampmap({ + "MPEGTS": settings.get("MPEGTS"), + "LOCAL": settings.get("LOCAL") + }); + } // 3.2 WebVTT metadata header syntax + + + function parseHeader(input) { + if (input.match(/X-TIMESTAMP-MAP/)) { + // This line contains HLS X-TIMESTAMP-MAP metadata + parseOptions(input, function (k, v) { + switch (k) { + case "X-TIMESTAMP-MAP": + parseTimestampMap(v); + break; + } + }, /=/); + } else { + parseOptions(input, function (k, v) { + switch (k) { + case "Region": + // 3.3 WebVTT region metadata header syntax + parseRegion(v); + break; + } + }, /:/); + } + } // 5.1 WebVTT file parsing. + + + try { + var line; + + if (self.state === "INITIAL") { + // We can't start parsing until we have the first line. + if (!/\r\n|\n/.test(self.buffer)) { + return this; + } + + line = collectNextLine(); + var m = line.match(/^WEBVTT([ \t].*)?$/); + + if (!m || !m[0]) { + throw new ParsingError(ParsingError.Errors.BadSignature); + } + + self.state = "HEADER"; + } + + var alreadyCollectedLine = false; + + while (self.buffer) { + // We can't parse a line until we have the full line. + if (!/\r\n|\n/.test(self.buffer)) { + return this; + } + + if (!alreadyCollectedLine) { + line = collectNextLine(); + } else { + alreadyCollectedLine = false; + } + + switch (self.state) { + case "HEADER": + // 13-18 - Allow a header (metadata) under the WEBVTT line. + if (/:/.test(line)) { + parseHeader(line); + } else if (!line) { + // An empty line terminates the header and starts the body (cues). + self.state = "ID"; + } + + continue; + + case "NOTE": + // Ignore NOTE blocks. + if (!line) { + self.state = "ID"; + } + + continue; + + case "ID": + // Check for the start of NOTE blocks. + if (/^NOTE($|[ \t])/.test(line)) { + self.state = "NOTE"; + break; + } // 19-29 - Allow any number of line terminators, then initialize new cue values. + + + if (!line) { + continue; + } + + self.cue = new (self.vttjs.VTTCue || self.window.VTTCue)(0, 0, ""); // Safari still uses the old middle value and won't accept center + + try { + self.cue.align = "center"; + } catch (e) { + self.cue.align = "middle"; + } + + self.state = "CUE"; // 30-39 - Check if self line contains an optional identifier or timing data. + + if (line.indexOf("-->") === -1) { + self.cue.id = line; + continue; + } + + // Process line as start of a cue. + + /*falls through*/ + + case "CUE": + // 40 - Collect cue timings and settings. + try { + parseCue(line, self.cue, self.regionList); + } catch (e) { + self.reportOrThrowError(e); // In case of an error ignore rest of the cue. + + self.cue = null; + self.state = "BADCUE"; + continue; + } + + self.state = "CUETEXT"; + continue; + + case "CUETEXT": + var hasSubstring = line.indexOf("-->") !== -1; // 34 - If we have an empty line then report the cue. + // 35 - If we have the special substring '-->' then report the cue, + // but do not collect the line as we need to process the current + // one as a new cue. + + if (!line || hasSubstring && (alreadyCollectedLine = true)) { + // We are done parsing self cue. + self.oncue && self.oncue(self.cue); + self.cue = null; + self.state = "ID"; + continue; + } + + if (self.cue.text) { + self.cue.text += "\n"; + } + + self.cue.text += line.replace(/\u2028/g, '\n').replace(/u2029/g, '\n'); + continue; + + case "BADCUE": + // BADCUE + // 54-62 - Collect and discard the remaining cue. + if (!line) { + self.state = "ID"; + } + + continue; + } + } + } catch (e) { + self.reportOrThrowError(e); // If we are currently parsing a cue, report what we have. + + if (self.state === "CUETEXT" && self.cue && self.oncue) { + self.oncue(self.cue); + } + + self.cue = null; // Enter BADWEBVTT state if header was not parsed correctly otherwise + // another exception occurred so enter BADCUE state. + + self.state = self.state === "INITIAL" ? "BADWEBVTT" : "BADCUE"; + } + + return this; + }, + flush: function flush() { + var self = this; + + try { + // Finish decoding the stream. + self.buffer += self.decoder.decode(); // Synthesize the end of the current cue or region. + + if (self.cue || self.state === "HEADER") { + self.buffer += "\n\n"; + self.parse(); + } // If we've flushed, parsed, and we're still on the INITIAL state then + // that means we don't have enough of the stream to parse the first + // line. + + + if (self.state === "INITIAL") { + throw new ParsingError(ParsingError.Errors.BadSignature); + } + } catch (e) { + self.reportOrThrowError(e); + } + + self.onflush && self.onflush(); + return this; + } + }; + var vtt = WebVTT$1; + + /** + * Copyright 2013 vtt.js Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + var autoKeyword = "auto"; + var directionSetting = { + "": 1, + "lr": 1, + "rl": 1 + }; + var alignSetting = { + "start": 1, + "center": 1, + "end": 1, + "left": 1, + "right": 1, + "auto": 1, + "line-left": 1, + "line-right": 1 + }; + + function findDirectionSetting(value) { + if (typeof value !== "string") { + return false; + } + + var dir = directionSetting[value.toLowerCase()]; + return dir ? value.toLowerCase() : false; + } + + function findAlignSetting(value) { + if (typeof value !== "string") { + return false; + } + + var align = alignSetting[value.toLowerCase()]; + return align ? value.toLowerCase() : false; + } + + function VTTCue(startTime, endTime, text) { + /** + * Shim implementation specific properties. These properties are not in + * the spec. + */ + // Lets us know when the VTTCue's data has changed in such a way that we need + // to recompute its display state. This lets us compute its display state + // lazily. + this.hasBeenReset = false; + /** + * VTTCue and TextTrackCue properties + * http://dev.w3.org/html5/webvtt/#vttcue-interface + */ + + var _id = ""; + var _pauseOnExit = false; + var _startTime = startTime; + var _endTime = endTime; + var _text = text; + var _region = null; + var _vertical = ""; + var _snapToLines = true; + var _line = "auto"; + var _lineAlign = "start"; + var _position = "auto"; + var _positionAlign = "auto"; + var _size = 100; + var _align = "center"; + Object.defineProperties(this, { + "id": { + enumerable: true, + get: function get() { + return _id; + }, + set: function set(value) { + _id = "" + value; + } + }, + "pauseOnExit": { + enumerable: true, + get: function get() { + return _pauseOnExit; + }, + set: function set(value) { + _pauseOnExit = !!value; + } + }, + "startTime": { + enumerable: true, + get: function get() { + return _startTime; + }, + set: function set(value) { + if (typeof value !== "number") { + throw new TypeError("Start time must be set to a number."); + } + + _startTime = value; + this.hasBeenReset = true; + } + }, + "endTime": { + enumerable: true, + get: function get() { + return _endTime; + }, + set: function set(value) { + if (typeof value !== "number") { + throw new TypeError("End time must be set to a number."); + } + + _endTime = value; + this.hasBeenReset = true; + } + }, + "text": { + enumerable: true, + get: function get() { + return _text; + }, + set: function set(value) { + _text = "" + value; + this.hasBeenReset = true; + } + }, + "region": { + enumerable: true, + get: function get() { + return _region; + }, + set: function set(value) { + _region = value; + this.hasBeenReset = true; + } + }, + "vertical": { + enumerable: true, + get: function get() { + return _vertical; + }, + set: function set(value) { + var setting = findDirectionSetting(value); // Have to check for false because the setting an be an empty string. + + if (setting === false) { + throw new SyntaxError("Vertical: an invalid or illegal direction string was specified."); + } + + _vertical = setting; + this.hasBeenReset = true; + } + }, + "snapToLines": { + enumerable: true, + get: function get() { + return _snapToLines; + }, + set: function set(value) { + _snapToLines = !!value; + this.hasBeenReset = true; + } + }, + "line": { + enumerable: true, + get: function get() { + return _line; + }, + set: function set(value) { + if (typeof value !== "number" && value !== autoKeyword) { + throw new SyntaxError("Line: an invalid number or illegal string was specified."); + } + + _line = value; + this.hasBeenReset = true; + } + }, + "lineAlign": { + enumerable: true, + get: function get() { + return _lineAlign; + }, + set: function set(value) { + var setting = findAlignSetting(value); + + if (!setting) { + console.warn("lineAlign: an invalid or illegal string was specified."); + } else { + _lineAlign = setting; + this.hasBeenReset = true; + } + } + }, + "position": { + enumerable: true, + get: function get() { + return _position; + }, + set: function set(value) { + if (value < 0 || value > 100) { + throw new Error("Position must be between 0 and 100."); + } + + _position = value; + this.hasBeenReset = true; + } + }, + "positionAlign": { + enumerable: true, + get: function get() { + return _positionAlign; + }, + set: function set(value) { + var setting = findAlignSetting(value); + + if (!setting) { + console.warn("positionAlign: an invalid or illegal string was specified."); + } else { + _positionAlign = setting; + this.hasBeenReset = true; + } + } + }, + "size": { + enumerable: true, + get: function get() { + return _size; + }, + set: function set(value) { + if (value < 0 || value > 100) { + throw new Error("Size must be between 0 and 100."); + } + + _size = value; + this.hasBeenReset = true; + } + }, + "align": { + enumerable: true, + get: function get() { + return _align; + }, + set: function set(value) { + var setting = findAlignSetting(value); + + if (!setting) { + throw new SyntaxError("align: an invalid or illegal alignment string was specified."); + } + + _align = setting; + this.hasBeenReset = true; + } + } + }); + /** + * Other spec defined properties + */ + // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#text-track-cue-display-state + + this.displayState = undefined; + } + /** + * VTTCue methods + */ + + + VTTCue.prototype.getCueAsHTML = function () { + // Assume WebVTT.convertCueToDOMTree is on the global. + return WebVTT.convertCueToDOMTree(window, this.text); + }; + + var vttcue = VTTCue; + + /** + * Copyright 2013 vtt.js Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + var scrollSetting = { + "": true, + "up": true + }; + + function findScrollSetting(value) { + if (typeof value !== "string") { + return false; + } + + var scroll = scrollSetting[value.toLowerCase()]; + return scroll ? value.toLowerCase() : false; + } + + function isValidPercentValue(value) { + return typeof value === "number" && value >= 0 && value <= 100; + } // VTTRegion shim http://dev.w3.org/html5/webvtt/#vttregion-interface + + + function VTTRegion() { + var _width = 100; + var _lines = 3; + var _regionAnchorX = 0; + var _regionAnchorY = 100; + var _viewportAnchorX = 0; + var _viewportAnchorY = 100; + var _scroll = ""; + Object.defineProperties(this, { + "width": { + enumerable: true, + get: function get() { + return _width; + }, + set: function set(value) { + if (!isValidPercentValue(value)) { + throw new Error("Width must be between 0 and 100."); + } + + _width = value; + } + }, + "lines": { + enumerable: true, + get: function get() { + return _lines; + }, + set: function set(value) { + if (typeof value !== "number") { + throw new TypeError("Lines must be set to a number."); + } + + _lines = value; + } + }, + "regionAnchorY": { + enumerable: true, + get: function get() { + return _regionAnchorY; + }, + set: function set(value) { + if (!isValidPercentValue(value)) { + throw new Error("RegionAnchorX must be between 0 and 100."); + } + + _regionAnchorY = value; + } + }, + "regionAnchorX": { + enumerable: true, + get: function get() { + return _regionAnchorX; + }, + set: function set(value) { + if (!isValidPercentValue(value)) { + throw new Error("RegionAnchorY must be between 0 and 100."); + } + + _regionAnchorX = value; + } + }, + "viewportAnchorY": { + enumerable: true, + get: function get() { + return _viewportAnchorY; + }, + set: function set(value) { + if (!isValidPercentValue(value)) { + throw new Error("ViewportAnchorY must be between 0 and 100."); + } + + _viewportAnchorY = value; + } + }, + "viewportAnchorX": { + enumerable: true, + get: function get() { + return _viewportAnchorX; + }, + set: function set(value) { + if (!isValidPercentValue(value)) { + throw new Error("ViewportAnchorX must be between 0 and 100."); + } + + _viewportAnchorX = value; + } + }, + "scroll": { + enumerable: true, + get: function get() { + return _scroll; + }, + set: function set(value) { + var setting = findScrollSetting(value); // Have to check for false as an empty string is a legal value. + + if (setting === false) { + console.warn("Scroll: an invalid or illegal string was specified."); + } else { + _scroll = setting; + } + } + } + }); + } + + var vttregion = VTTRegion; + + var browserIndex = createCommonjsModule(function (module) { + /** + * Copyright 2013 vtt.js Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + // Default exports for Node. Export the extended versions of VTTCue and + // VTTRegion in Node since we likely want the capability to convert back and + // forth between JSON. If we don't then it's not that big of a deal since we're + // off browser. + var vttjs = module.exports = { + WebVTT: vtt, + VTTCue: vttcue, + VTTRegion: vttregion + }; + window_1.vttjs = vttjs; + window_1.WebVTT = vttjs.WebVTT; + var cueShim = vttjs.VTTCue; + var regionShim = vttjs.VTTRegion; + var nativeVTTCue = window_1.VTTCue; + var nativeVTTRegion = window_1.VTTRegion; + + vttjs.shim = function () { + window_1.VTTCue = cueShim; + window_1.VTTRegion = regionShim; + }; + + vttjs.restore = function () { + window_1.VTTCue = nativeVTTCue; + window_1.VTTRegion = nativeVTTRegion; + }; + + if (!window_1.VTTCue) { + vttjs.shim(); + } + }); + browserIndex.WebVTT; + browserIndex.VTTCue; + browserIndex.VTTRegion; + + /** + * An Object containing a structure like: `{src: 'url', type: 'mimetype'}` or string + * that just contains the src url alone. + * * `var SourceObject = {src: 'http://ex.com/video.mp4', type: 'video/mp4'};` + * `var SourceString = 'http://example.com/some-video.mp4';` + * + * @typedef {Object|string} Tech~SourceObject + * + * @property {string} src + * The url to the source + * + * @property {string} type + * The mime type of the source + */ + + /** + * A function used by {@link Tech} to create a new {@link TextTrack}. + * + * @private + * + * @param {Tech} self + * An instance of the Tech class. + * + * @param {string} kind + * `TextTrack` kind (subtitles, captions, descriptions, chapters, or metadata) + * + * @param {string} [label] + * Label to identify the text track + * + * @param {string} [language] + * Two letter language abbreviation + * + * @param {Object} [options={}] + * An object with additional text track options + * + * @return {TextTrack} + * The text track that was created. + */ + + function createTrackHelper(self, kind, label, language, options) { + if (options === void 0) { + options = {}; + } + + var tracks = self.textTracks(); + options.kind = kind; + + if (label) { + options.label = label; + } + + if (language) { + options.language = language; + } + + options.tech = self; + var track = new ALL.text.TrackClass(options); + tracks.addTrack(track); + return track; + } + /** + * This is the base class for media playback technology controllers, such as + * {@link HTML5} + * + * @extends Component + */ + + + var Tech = /*#__PURE__*/function (_Component) { + inheritsLoose(Tech, _Component); + + /** + * Create an instance of this Tech. + * + * @param {Object} [options] + * The key/value store of player options. + * + * @param {Component~ReadyCallback} ready + * Callback function to call when the `HTML5` Tech is ready. + */ + function Tech(options, ready) { + var _this; + + if (options === void 0) { + options = {}; + } + + if (ready === void 0) { + ready = function ready() {}; + } + + // we don't want the tech to report user activity automatically. + // This is done manually in addControlsListeners + options.reportTouchActivity = false; + _this = _Component.call(this, null, options, ready) || this; + + _this.onDurationChange_ = function (e) { + return _this.onDurationChange(e); + }; + + _this.trackProgress_ = function (e) { + return _this.trackProgress(e); + }; + + _this.trackCurrentTime_ = function (e) { + return _this.trackCurrentTime(e); + }; + + _this.stopTrackingCurrentTime_ = function (e) { + return _this.stopTrackingCurrentTime(e); + }; + + _this.disposeSourceHandler_ = function (e) { + return _this.disposeSourceHandler(e); + }; // keep track of whether the current source has played at all to + // implement a very limited played() + + + _this.hasStarted_ = false; + + _this.on('playing', function () { + this.hasStarted_ = true; + }); + + _this.on('loadstart', function () { + this.hasStarted_ = false; + }); + + ALL.names.forEach(function (name) { + var props = ALL[name]; + + if (options && options[props.getterName]) { + _this[props.privateName] = options[props.getterName]; + } + }); // Manually track progress in cases where the browser/tech doesn't report it. + + if (!_this.featuresProgressEvents) { + _this.manualProgressOn(); + } // Manually track timeupdates in cases where the browser/tech doesn't report it. + + + if (!_this.featuresTimeupdateEvents) { + _this.manualTimeUpdatesOn(); + } + + ['Text', 'Audio', 'Video'].forEach(function (track) { + if (options["native" + track + "Tracks"] === false) { + _this["featuresNative" + track + "Tracks"] = false; + } + }); + + if (options.nativeCaptions === false || options.nativeTextTracks === false) { + _this.featuresNativeTextTracks = false; + } else if (options.nativeCaptions === true || options.nativeTextTracks === true) { + _this.featuresNativeTextTracks = true; + } + + if (!_this.featuresNativeTextTracks) { + _this.emulateTextTracks(); + } + + _this.preloadTextTracks = options.preloadTextTracks !== false; + _this.autoRemoteTextTracks_ = new ALL.text.ListClass(); + + _this.initTrackListeners(); // Turn on component tap events only if not using native controls + + + if (!options.nativeControlsForTouch) { + _this.emitTapEvents(); + } + + if (_this.constructor) { + _this.name_ = _this.constructor.name || 'Unknown Tech'; + } + + return _this; + } + /** + * A special function to trigger source set in a way that will allow player + * to re-trigger if the player or tech are not ready yet. + * + * @fires Tech#sourceset + * @param {string} src The source string at the time of the source changing. + */ + + + var _proto = Tech.prototype; + + _proto.triggerSourceset = function triggerSourceset(src) { + var _this2 = this; + + if (!this.isReady_) { + // on initial ready we have to trigger source set + // 1ms after ready so that player can watch for it. + this.one('ready', function () { + return _this2.setTimeout(function () { + return _this2.triggerSourceset(src); + }, 1); + }); + } + /** + * Fired when the source is set on the tech causing the media element + * to reload. + * + * @see {@link Player#event:sourceset} + * @event Tech#sourceset + * @type {EventTarget~Event} + */ + + + this.trigger({ + src: src, + type: 'sourceset' + }); + } + /* Fallbacks for unsupported event types + ================================================================================ */ + + /** + * Polyfill the `progress` event for browsers that don't support it natively. + * + * @see {@link Tech#trackProgress} + */ + ; + + _proto.manualProgressOn = function manualProgressOn() { + this.on('durationchange', this.onDurationChange_); + this.manualProgress = true; // Trigger progress watching when a source begins loading + + this.one('ready', this.trackProgress_); + } + /** + * Turn off the polyfill for `progress` events that was created in + * {@link Tech#manualProgressOn} + */ + ; + + _proto.manualProgressOff = function manualProgressOff() { + this.manualProgress = false; + this.stopTrackingProgress(); + this.off('durationchange', this.onDurationChange_); + } + /** + * This is used to trigger a `progress` event when the buffered percent changes. It + * sets an interval function that will be called every 500 milliseconds to check if the + * buffer end percent has changed. + * + * > This function is called by {@link Tech#manualProgressOn} + * + * @param {EventTarget~Event} event + * The `ready` event that caused this to run. + * + * @listens Tech#ready + * @fires Tech#progress + */ + ; + + _proto.trackProgress = function trackProgress(event) { + this.stopTrackingProgress(); + this.progressInterval = this.setInterval(bind(this, function () { + // Don't trigger unless buffered amount is greater than last time + var numBufferedPercent = this.bufferedPercent(); + + if (this.bufferedPercent_ !== numBufferedPercent) { + /** + * See {@link Player#progress} + * + * @event Tech#progress + * @type {EventTarget~Event} + */ + this.trigger('progress'); + } + + this.bufferedPercent_ = numBufferedPercent; + + if (numBufferedPercent === 1) { + this.stopTrackingProgress(); + } + }), 500); + } + /** + * Update our internal duration on a `durationchange` event by calling + * {@link Tech#duration}. + * + * @param {EventTarget~Event} event + * The `durationchange` event that caused this to run. + * + * @listens Tech#durationchange + */ + ; + + _proto.onDurationChange = function onDurationChange(event) { + this.duration_ = this.duration(); + } + /** + * Get and create a `TimeRange` object for buffering. + * + * @return {TimeRange} + * The time range object that was created. + */ + ; + + _proto.buffered = function buffered() { + return createTimeRanges(0, 0); + } + /** + * Get the percentage of the current video that is currently buffered. + * + * @return {number} + * A number from 0 to 1 that represents the decimal percentage of the + * video that is buffered. + * + */ + ; + + _proto.bufferedPercent = function bufferedPercent$1() { + return bufferedPercent(this.buffered(), this.duration_); + } + /** + * Turn off the polyfill for `progress` events that was created in + * {@link Tech#manualProgressOn} + * Stop manually tracking progress events by clearing the interval that was set in + * {@link Tech#trackProgress}. + */ + ; + + _proto.stopTrackingProgress = function stopTrackingProgress() { + this.clearInterval(this.progressInterval); + } + /** + * Polyfill the `timeupdate` event for browsers that don't support it. + * + * @see {@link Tech#trackCurrentTime} + */ + ; + + _proto.manualTimeUpdatesOn = function manualTimeUpdatesOn() { + this.manualTimeUpdates = true; + this.on('play', this.trackCurrentTime_); + this.on('pause', this.stopTrackingCurrentTime_); + } + /** + * Turn off the polyfill for `timeupdate` events that was created in + * {@link Tech#manualTimeUpdatesOn} + */ + ; + + _proto.manualTimeUpdatesOff = function manualTimeUpdatesOff() { + this.manualTimeUpdates = false; + this.stopTrackingCurrentTime(); + this.off('play', this.trackCurrentTime_); + this.off('pause', this.stopTrackingCurrentTime_); + } + /** + * Sets up an interval function to track current time and trigger `timeupdate` every + * 250 milliseconds. + * + * @listens Tech#play + * @triggers Tech#timeupdate + */ + ; + + _proto.trackCurrentTime = function trackCurrentTime() { + if (this.currentTimeInterval) { + this.stopTrackingCurrentTime(); + } + + this.currentTimeInterval = this.setInterval(function () { + /** + * Triggered at an interval of 250ms to indicated that time is passing in the video. + * + * @event Tech#timeupdate + * @type {EventTarget~Event} + */ + this.trigger({ + type: 'timeupdate', + target: this, + manuallyTriggered: true + }); // 42 = 24 fps // 250 is what Webkit uses // FF uses 15 + }, 250); + } + /** + * Stop the interval function created in {@link Tech#trackCurrentTime} so that the + * `timeupdate` event is no longer triggered. + * + * @listens {Tech#pause} + */ + ; + + _proto.stopTrackingCurrentTime = function stopTrackingCurrentTime() { + this.clearInterval(this.currentTimeInterval); // #1002 - if the video ends right before the next timeupdate would happen, + // the progress bar won't make it all the way to the end + + this.trigger({ + type: 'timeupdate', + target: this, + manuallyTriggered: true + }); + } + /** + * Turn off all event polyfills, clear the `Tech`s {@link AudioTrackList}, + * {@link VideoTrackList}, and {@link TextTrackList}, and dispose of this Tech. + * + * @fires Component#dispose + */ + ; + + _proto.dispose = function dispose() { + // clear out all tracks because we can't reuse them between techs + this.clearTracks(NORMAL.names); // Turn off any manual progress or timeupdate tracking + + if (this.manualProgress) { + this.manualProgressOff(); + } + + if (this.manualTimeUpdates) { + this.manualTimeUpdatesOff(); + } + + _Component.prototype.dispose.call(this); + } + /** + * Clear out a single `TrackList` or an array of `TrackLists` given their names. + * + * > Note: Techs without source handlers should call this between sources for `video` + * & `audio` tracks. You don't want to use them between tracks! + * + * @param {string[]|string} types + * TrackList names to clear, valid names are `video`, `audio`, and + * `text`. + */ + ; + + _proto.clearTracks = function clearTracks(types) { + var _this3 = this; + + types = [].concat(types); // clear out all tracks because we can't reuse them between techs + + types.forEach(function (type) { + var list = _this3[type + "Tracks"]() || []; + var i = list.length; + + while (i--) { + var track = list[i]; + + if (type === 'text') { + _this3.removeRemoteTextTrack(track); + } + + list.removeTrack(track); + } + }); + } + /** + * Remove any TextTracks added via addRemoteTextTrack that are + * flagged for automatic garbage collection + */ + ; + + _proto.cleanupAutoTextTracks = function cleanupAutoTextTracks() { + var list = this.autoRemoteTextTracks_ || []; + var i = list.length; + + while (i--) { + var track = list[i]; + this.removeRemoteTextTrack(track); + } + } + /** + * Reset the tech, which will removes all sources and reset the internal readyState. + * + * @abstract + */ + ; + + _proto.reset = function reset() {} + /** + * Get the value of `crossOrigin` from the tech. + * + * @abstract + * + * @see {Html5#crossOrigin} + */ + ; + + _proto.crossOrigin = function crossOrigin() {} + /** + * Set the value of `crossOrigin` on the tech. + * + * @abstract + * + * @param {string} crossOrigin the crossOrigin value + * @see {Html5#setCrossOrigin} + */ + ; + + _proto.setCrossOrigin = function setCrossOrigin() {} + /** + * Get or set an error on the Tech. + * + * @param {MediaError} [err] + * Error to set on the Tech + * + * @return {MediaError|null} + * The current error object on the tech, or null if there isn't one. + */ + ; + + _proto.error = function error(err) { + if (err !== undefined) { + this.error_ = new MediaError(err); + this.trigger('error'); + } + + return this.error_; + } + /** + * Returns the `TimeRange`s that have been played through for the current source. + * + * > NOTE: This implementation is incomplete. It does not track the played `TimeRange`. + * It only checks whether the source has played at all or not. + * + * @return {TimeRange} + * - A single time range if this video has played + * - An empty set of ranges if not. + */ + ; + + _proto.played = function played() { + if (this.hasStarted_) { + return createTimeRanges(0, 0); + } + + return createTimeRanges(); + } + /** + * Start playback + * + * @abstract + * + * @see {Html5#play} + */ + ; + + _proto.play = function play() {} + /** + * Set whether we are scrubbing or not + * + * @abstract + * + * @see {Html5#setScrubbing} + */ + ; + + _proto.setScrubbing = function setScrubbing() {} + /** + * Get whether we are scrubbing or not + * + * @abstract + * + * @see {Html5#scrubbing} + */ + ; + + _proto.scrubbing = function scrubbing() {} + /** + * Causes a manual time update to occur if {@link Tech#manualTimeUpdatesOn} was + * previously called. + * + * @fires Tech#timeupdate + */ + ; + + _proto.setCurrentTime = function setCurrentTime() { + // improve the accuracy of manual timeupdates + if (this.manualTimeUpdates) { + /** + * A manual `timeupdate` event. + * + * @event Tech#timeupdate + * @type {EventTarget~Event} + */ + this.trigger({ + type: 'timeupdate', + target: this, + manuallyTriggered: true + }); + } + } + /** + * Turn on listeners for {@link VideoTrackList}, {@link {AudioTrackList}, and + * {@link TextTrackList} events. + * + * This adds {@link EventTarget~EventListeners} for `addtrack`, and `removetrack`. + * + * @fires Tech#audiotrackchange + * @fires Tech#videotrackchange + * @fires Tech#texttrackchange + */ + ; + + _proto.initTrackListeners = function initTrackListeners() { + var _this4 = this; + + /** + * Triggered when tracks are added or removed on the Tech {@link AudioTrackList} + * + * @event Tech#audiotrackchange + * @type {EventTarget~Event} + */ + + /** + * Triggered when tracks are added or removed on the Tech {@link VideoTrackList} + * + * @event Tech#videotrackchange + * @type {EventTarget~Event} + */ + + /** + * Triggered when tracks are added or removed on the Tech {@link TextTrackList} + * + * @event Tech#texttrackchange + * @type {EventTarget~Event} + */ + NORMAL.names.forEach(function (name) { + var props = NORMAL[name]; + + var trackListChanges = function trackListChanges() { + _this4.trigger(name + "trackchange"); + }; + + var tracks = _this4[props.getterName](); + + tracks.addEventListener('removetrack', trackListChanges); + tracks.addEventListener('addtrack', trackListChanges); + + _this4.on('dispose', function () { + tracks.removeEventListener('removetrack', trackListChanges); + tracks.removeEventListener('addtrack', trackListChanges); + }); + }); + } + /** + * Emulate TextTracks using vtt.js if necessary + * + * @fires Tech#vttjsloaded + * @fires Tech#vttjserror + */ + ; + + _proto.addWebVttScript_ = function addWebVttScript_() { + var _this5 = this; + + if (window_1.WebVTT) { + return; + } // Initially, Tech.el_ is a child of a dummy-div wait until the Component system + // signals that the Tech is ready at which point Tech.el_ is part of the DOM + // before inserting the WebVTT script + + + if (document_1.body.contains(this.el())) { + // load via require if available and vtt.js script location was not passed in + // as an option. novtt builds will turn the above require call into an empty object + // which will cause this if check to always fail. + if (!this.options_['vtt.js'] && isPlain(browserIndex) && Object.keys(browserIndex).length > 0) { + this.trigger('vttjsloaded'); + return; + } // load vtt.js via the script location option or the cdn of no location was + // passed in + + + var script = document_1.createElement('script'); + script.src = this.options_['vtt.js'] || 'https://vjs.zencdn.net/vttjs/0.14.1/vtt.min.js'; + + script.onload = function () { + /** + * Fired when vtt.js is loaded. + * + * @event Tech#vttjsloaded + * @type {EventTarget~Event} + */ + _this5.trigger('vttjsloaded'); + }; + + script.onerror = function () { + /** + * Fired when vtt.js was not loaded due to an error + * + * @event Tech#vttjsloaded + * @type {EventTarget~Event} + */ + _this5.trigger('vttjserror'); + }; + + this.on('dispose', function () { + script.onload = null; + script.onerror = null; + }); // but have not loaded yet and we set it to true before the inject so that + // we don't overwrite the injected window.WebVTT if it loads right away + + window_1.WebVTT = true; + this.el().parentNode.appendChild(script); + } else { + this.ready(this.addWebVttScript_); + } + } + /** + * Emulate texttracks + * + */ + ; + + _proto.emulateTextTracks = function emulateTextTracks() { + var _this6 = this; + + var tracks = this.textTracks(); + var remoteTracks = this.remoteTextTracks(); + + var handleAddTrack = function handleAddTrack(e) { + return tracks.addTrack(e.track); + }; + + var handleRemoveTrack = function handleRemoveTrack(e) { + return tracks.removeTrack(e.track); + }; + + remoteTracks.on('addtrack', handleAddTrack); + remoteTracks.on('removetrack', handleRemoveTrack); + this.addWebVttScript_(); + + var updateDisplay = function updateDisplay() { + return _this6.trigger('texttrackchange'); + }; + + var textTracksChanges = function textTracksChanges() { + updateDisplay(); + + for (var i = 0; i < tracks.length; i++) { + var track = tracks[i]; + track.removeEventListener('cuechange', updateDisplay); + + if (track.mode === 'showing') { + track.addEventListener('cuechange', updateDisplay); + } + } + }; + + textTracksChanges(); + tracks.addEventListener('change', textTracksChanges); + tracks.addEventListener('addtrack', textTracksChanges); + tracks.addEventListener('removetrack', textTracksChanges); + this.on('dispose', function () { + remoteTracks.off('addtrack', handleAddTrack); + remoteTracks.off('removetrack', handleRemoveTrack); + tracks.removeEventListener('change', textTracksChanges); + tracks.removeEventListener('addtrack', textTracksChanges); + tracks.removeEventListener('removetrack', textTracksChanges); + + for (var i = 0; i < tracks.length; i++) { + var track = tracks[i]; + track.removeEventListener('cuechange', updateDisplay); + } + }); + } + /** + * Create and returns a remote {@link TextTrack} object. + * + * @param {string} kind + * `TextTrack` kind (subtitles, captions, descriptions, chapters, or metadata) + * + * @param {string} [label] + * Label to identify the text track + * + * @param {string} [language] + * Two letter language abbreviation + * + * @return {TextTrack} + * The TextTrack that gets created. + */ + ; + + _proto.addTextTrack = function addTextTrack(kind, label, language) { + if (!kind) { + throw new Error('TextTrack kind is required but was not provided'); + } + + return createTrackHelper(this, kind, label, language); + } + /** + * Create an emulated TextTrack for use by addRemoteTextTrack + * + * This is intended to be overridden by classes that inherit from + * Tech in order to create native or custom TextTracks. + * + * @param {Object} options + * The object should contain the options to initialize the TextTrack with. + * + * @param {string} [options.kind] + * `TextTrack` kind (subtitles, captions, descriptions, chapters, or metadata). + * + * @param {string} [options.label]. + * Label to identify the text track + * + * @param {string} [options.language] + * Two letter language abbreviation. + * + * @return {HTMLTrackElement} + * The track element that gets created. + */ + ; + + _proto.createRemoteTextTrack = function createRemoteTextTrack(options) { + var track = mergeOptions$3(options, { + tech: this + }); + return new REMOTE.remoteTextEl.TrackClass(track); + } + /** + * Creates a remote text track object and returns an html track element. + * + * > Note: This can be an emulated {@link HTMLTrackElement} or a native one. + * + * @param {Object} options + * See {@link Tech#createRemoteTextTrack} for more detailed properties. + * + * @param {boolean} [manualCleanup=true] + * - When false: the TextTrack will be automatically removed from the video + * element whenever the source changes + * - When True: The TextTrack will have to be cleaned up manually + * + * @return {HTMLTrackElement} + * An Html Track Element. + * + * @deprecated The default functionality for this function will be equivalent + * to "manualCleanup=false" in the future. The manualCleanup parameter will + * also be removed. + */ + ; + + _proto.addRemoteTextTrack = function addRemoteTextTrack(options, manualCleanup) { + var _this7 = this; + + if (options === void 0) { + options = {}; + } + + var htmlTrackElement = this.createRemoteTextTrack(options); + + if (manualCleanup !== true && manualCleanup !== false) { + // deprecation warning + log$1.warn('Calling addRemoteTextTrack without explicitly setting the "manualCleanup" parameter to `true` is deprecated and default to `false` in future version of video.js'); + manualCleanup = true; + } // store HTMLTrackElement and TextTrack to remote list + + + this.remoteTextTrackEls().addTrackElement_(htmlTrackElement); + this.remoteTextTracks().addTrack(htmlTrackElement.track); + + if (manualCleanup !== true) { + // create the TextTrackList if it doesn't exist + this.ready(function () { + return _this7.autoRemoteTextTracks_.addTrack(htmlTrackElement.track); + }); + } + + return htmlTrackElement; + } + /** + * Remove a remote text track from the remote `TextTrackList`. + * + * @param {TextTrack} track + * `TextTrack` to remove from the `TextTrackList` + */ + ; + + _proto.removeRemoteTextTrack = function removeRemoteTextTrack(track) { + var trackElement = this.remoteTextTrackEls().getTrackElementByTrack_(track); // remove HTMLTrackElement and TextTrack from remote list + + this.remoteTextTrackEls().removeTrackElement_(trackElement); + this.remoteTextTracks().removeTrack(track); + this.autoRemoteTextTracks_.removeTrack(track); + } + /** + * Gets available media playback quality metrics as specified by the W3C's Media + * Playback Quality API. + * + * @see [Spec]{@link https://wicg.github.io/media-playback-quality} + * + * @return {Object} + * An object with supported media playback quality metrics + * + * @abstract + */ + ; + + _proto.getVideoPlaybackQuality = function getVideoPlaybackQuality() { + return {}; + } + /** + * Attempt to create a floating video window always on top of other windows + * so that users may continue consuming media while they interact with other + * content sites, or applications on their device. + * + * @see [Spec]{@link https://wicg.github.io/picture-in-picture} + * + * @return {Promise|undefined} + * A promise with a Picture-in-Picture window if the browser supports + * Promises (or one was passed in as an option). It returns undefined + * otherwise. + * + * @abstract + */ + ; + + _proto.requestPictureInPicture = function requestPictureInPicture() { + var PromiseClass = this.options_.Promise || window_1.Promise; + + if (PromiseClass) { + return PromiseClass.reject(); + } + } + /** + * A method to check for the value of the 'disablePictureInPicture'