Browse Source

`fix 播放器`

wenhongquan 1 year ago
parent
commit
1025f35fa8
56 changed files with 1231 additions and 565 deletions
  1. 0 0
      public/aliplayer-min.js
  2. 0 21
      public/html/ie.html
  3. 2 2
      public/html/index.html
  4. BIN
      public/img/bigplay.png
  5. BIN
      public/img/cc.png
  6. BIN
      public/img/dragcursor.png
  7. BIN
      public/img/fullscreen.png
  8. BIN
      public/img/setting.png
  9. BIN
      public/img/smallpause.png
  10. BIN
      public/img/volume.png
  11. 29 25
      public/index.html
  12. 0 0
      public/jess/audio/decoder-pro-audio-player.js
  13. BIN
      public/jess/audio/decoder-pro-audio.wasm
  14. 0 0
      public/jess/audio/jessibuca-pro-audio-player-demo.js
  15. 0 0
      public/jess/js/decoder-pro-audio-player.js
  16. 0 0
      public/jess/js/decoder-pro-audio.js
  17. BIN
      public/jess/js/decoder-pro-audio.wasm
  18. 0 0
      public/jess/js/decoder-pro-hard-not-wasm.js
  19. 0 0
      public/jess/js/decoder-pro-hard.js
  20. 7 0
      public/jess/js/decoder-pro-mt-worker.js
  21. BIN
      public/jess/js/decoder-pro-mt-worker.wasm
  22. 0 0
      public/jess/js/decoder-pro-mt-worker.worker.js
  23. 0 0
      public/jess/js/decoder-pro-mt.js
  24. 7 0
      public/jess/js/decoder-pro-simd-mt-worker.js
  25. BIN
      public/jess/js/decoder-pro-simd-mt-worker.wasm
  26. 0 0
      public/jess/js/decoder-pro-simd-mt-worker.worker.js
  27. 0 0
      public/jess/js/decoder-pro-simd-mt.js
  28. 0 0
      public/jess/js/decoder-pro-simd.js
  29. BIN
      public/jess/js/decoder-pro-simd.wasm
  30. 0 0
      public/jess/js/decoder-pro.js
  31. BIN
      public/jess/js/decoder-pro.wasm
  32. 0 0
      public/jess/js/jessibuca-pro-audio-player-demo.js
  33. 0 0
      public/jess/js/jessibuca-pro-demo.js
  34. BIN
      public/jess/js/jessibuca-pro-face-detector-decoder.wasm
  35. 0 0
      public/jess/js/jessibuca-pro-face-detector-demo.js
  36. BIN
      public/jess/js/jessibuca-pro-image-detector-decoder.wasm
  37. 0 0
      public/jess/js/jessibuca-pro-image-detector-demo.js
  38. 0 0
      public/jess/js/jessibuca-pro-mp4-recorder-decoder.js
  39. BIN
      public/jess/js/jessibuca-pro-mp4-recorder-decoder.wasm
  40. 0 0
      public/jess/js/jessibuca-pro-mp4-recorder-demo.js
  41. 0 0
      public/jess/js/jessibuca-pro-multi-demo.js
  42. BIN
      public/jess/js/jessibuca-pro-object-detector-decoder.wasm
  43. 0 0
      public/jess/js/jessibuca-pro-object-detector-demo.js
  44. BIN
      public/jess/js/jessibuca-pro-occlusion-detector-decoder.wasm
  45. 0 0
      public/jess/js/jessibuca-pro-occlusion-detector-demo.js
  46. 0 0
      public/jess/js/jessibuca-pro-recorder-demo.js
  47. 0 0
      public/jess/js/jessibuca-pro-talk-demo.js
  48. 7 7
      public/webLive.html
  49. 323 0
      src/components/AliVideo/aliplayer copy.vue1
  50. 137 242
      src/components/AliVideo/aliplayer.vue
  51. 24 10
      src/components/AliVideo/index.vue
  52. 118 124
      src/router/index.js
  53. 49 0
      src/views/qdtl/testvideo.vue
  54. 4 4
      src/views/qdtl/video/video.vue
  55. 128 116
      vue.config.js
  56. 396 14
      yarn.lock

File diff suppressed because it is too large
+ 0 - 0
public/aliplayer-min.js


File diff suppressed because it is too large
+ 0 - 21
public/html/ie.html


+ 2 - 2
public/html/index.html

@@ -1,4 +1,4 @@
-<!DOCTYPE html>
+
 <html lang="en">
 
 <head>
@@ -21,4 +21,4 @@
 </body>
 
 
-</html>
+</html>

BIN
public/img/bigplay.png


BIN
public/img/cc.png


BIN
public/img/dragcursor.png


BIN
public/img/fullscreen.png


BIN
public/img/setting.png


BIN
public/img/smallpause.png


BIN
public/img/volume.png


+ 29 - 25
public/index.html

@@ -1,4 +1,4 @@
-<!DOCTYPE html>
+
 <html>
 
 <head>
@@ -13,31 +13,31 @@
     <!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
     <style>
         html,
-        body, 
+        body,
         #app {
             height: 100%;
             margin: 0px;
             padding: 0px;
             font-size: 10px;
         }
-        
+
         .chromeframe {
             margin: 0.2em 0;
             background: #ccc;
             color: #000;
             padding: 0.2em 0;
         }
-        
+
         #loader-wrapper {
             position: fixed;
             top: 0;
             left: 0;
-            
+
             width: 100%;
             height: 100%;
             z-index: 999999;
         }
-        
+
         #loader {
             display: block;
             position: relative;
@@ -56,7 +56,7 @@
             animation: spin 2s linear infinite;
             z-index: 1001;
         }
-        
+
         #loader:before {
             content: "";
             position: absolute;
@@ -73,7 +73,7 @@
             -ms-animation: spin 3s linear infinite;
             animation: spin 3s linear infinite;
         }
-        
+
         #loader:after {
             content: "";
             position: absolute;
@@ -90,7 +90,7 @@
             -webkit-animation: spin 1.5s linear infinite;
             animation: spin 1.5s linear infinite;
         }
-        
+
         @-webkit-keyframes spin {
             0% {
                 -webkit-transform: rotate(0deg);
@@ -103,7 +103,7 @@
                 transform: rotate(360deg);
             }
         }
-        
+
         @keyframes spin {
             0% {
                 -webkit-transform: rotate(0deg);
@@ -116,7 +116,7 @@
                 transform: rotate(360deg);
             }
         }
-        
+
         #loader-wrapper .loader-section {
             position: fixed;
             top: 0;
@@ -128,15 +128,15 @@
             -ms-transform: translateX(0);
             transform: translateX(0);
         }
-        
+
         #loader-wrapper .loader-section.section-left {
             left: 0;
         }
-        
+
         #loader-wrapper .loader-section.section-right {
             right: 0;
         }
-        
+
         .loaded #loader-wrapper .loader-section.section-left {
             -webkit-transform: translateX(-100%);
             -ms-transform: translateX(-100%);
@@ -144,7 +144,7 @@
             -webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
             transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
         }
-        
+
         .loaded #loader-wrapper .loader-section.section-right {
             -webkit-transform: translateX(100%);
             -ms-transform: translateX(100%);
@@ -152,13 +152,13 @@
             -webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
             transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
         }
-        
+
         .loaded #loader {
             opacity: 0;
             -webkit-transition: all 0.3s ease-out;
             transition: all 0.3s ease-out;
         }
-        
+
         .loaded #loader-wrapper {
             visibility: hidden;
             -webkit-transform: translateY(-100%);
@@ -167,15 +167,15 @@
             -webkit-transition: all 0.3s 1s ease-out;
             transition: all 0.3s 1s ease-out;
         }
-        
+
         .no-js #loader-wrapper {
             display: none;
         }
-        
+
         .no-js h1 {
             color: #222222;
         }
-        
+
         #loader-wrapper .load_title {
             font-family: 'Open Sans';
             color: #FFF;
@@ -188,7 +188,7 @@
             opacity: 1;
             line-height: 30px;
         }
-        
+
         #loader-wrapper .load_title span {
             font-weight: normal;
             font-style: italic;
@@ -202,7 +202,7 @@
     <script src="./html/jquery-1.12.4.min.js"></script>
     <script src="./html/jsencrypt.min.js"></script>
     <!-- 用于RSA加密 -->
-    <script src="./html/jsWebControl-1.0.0.min.js"></script>
+    <!-- <script src="./html/jsWebControl-1.0.0.min.js"></script> -->
     <script type="text/javascript" src="ckplayer3.0x/hls.js/hls.min.js"></script>
     <link type="text/css" rel="stylesheet" href="./ckplayer3.0x/css/ckplayer.css" />
     <script type="text/javascript" src="./ckplayer3.0x/js/ckplayer.js" charset="utf-8" data-name="ckplayer"></script>
@@ -213,7 +213,11 @@
     <script src="<%= BASE_URL %>js/liveplayer-lib.min.js"></script>
     <!-- 用于前端与插件交互 -->
 
-    <script type="text/javascript">
+     <script src="./jess/js/jessibuca-pro-demo.js"></script>
+    <!-- <script src="./SkeyeWebPlayer/SkeyeWebPlayer.js"></script> -->
+
+
+    <!-- <script type="text/javascript">
         var b_width = 1000;
         var b_height = 400;
 
@@ -531,7 +535,7 @@
             if (r != null) return unescape(r[2]);
             return null;
         }
-    </script>
+    </script> -->
 </head>
 
 <body>
@@ -545,4 +549,4 @@
     </div>
 </body>
 
-</html>
+</html>

File diff suppressed because it is too large
+ 0 - 0
public/jess/audio/decoder-pro-audio-player.js


BIN
public/jess/audio/decoder-pro-audio.wasm


File diff suppressed because it is too large
+ 0 - 0
public/jess/audio/jessibuca-pro-audio-player-demo.js


File diff suppressed because it is too large
+ 0 - 0
public/jess/js/decoder-pro-audio-player.js


File diff suppressed because it is too large
+ 0 - 0
public/jess/js/decoder-pro-audio.js


BIN
public/jess/js/decoder-pro-audio.wasm


File diff suppressed because it is too large
+ 0 - 0
public/jess/js/decoder-pro-hard-not-wasm.js


File diff suppressed because it is too large
+ 0 - 0
public/jess/js/decoder-pro-hard.js


File diff suppressed because it is too large
+ 7 - 0
public/jess/js/decoder-pro-mt-worker.js


BIN
public/jess/js/decoder-pro-mt-worker.wasm


File diff suppressed because it is too large
+ 0 - 0
public/jess/js/decoder-pro-mt-worker.worker.js


File diff suppressed because it is too large
+ 0 - 0
public/jess/js/decoder-pro-mt.js


File diff suppressed because it is too large
+ 7 - 0
public/jess/js/decoder-pro-simd-mt-worker.js


BIN
public/jess/js/decoder-pro-simd-mt-worker.wasm


File diff suppressed because it is too large
+ 0 - 0
public/jess/js/decoder-pro-simd-mt-worker.worker.js


File diff suppressed because it is too large
+ 0 - 0
public/jess/js/decoder-pro-simd-mt.js


File diff suppressed because it is too large
+ 0 - 0
public/jess/js/decoder-pro-simd.js


BIN
public/jess/js/decoder-pro-simd.wasm


File diff suppressed because it is too large
+ 0 - 0
public/jess/js/decoder-pro.js


BIN
public/jess/js/decoder-pro.wasm


File diff suppressed because it is too large
+ 0 - 0
public/jess/js/jessibuca-pro-audio-player-demo.js


File diff suppressed because it is too large
+ 0 - 0
public/jess/js/jessibuca-pro-demo.js


BIN
public/jess/js/jessibuca-pro-face-detector-decoder.wasm


File diff suppressed because it is too large
+ 0 - 0
public/jess/js/jessibuca-pro-face-detector-demo.js


BIN
public/jess/js/jessibuca-pro-image-detector-decoder.wasm


File diff suppressed because it is too large
+ 0 - 0
public/jess/js/jessibuca-pro-image-detector-demo.js


File diff suppressed because it is too large
+ 0 - 0
public/jess/js/jessibuca-pro-mp4-recorder-decoder.js


BIN
public/jess/js/jessibuca-pro-mp4-recorder-decoder.wasm


File diff suppressed because it is too large
+ 0 - 0
public/jess/js/jessibuca-pro-mp4-recorder-demo.js


File diff suppressed because it is too large
+ 0 - 0
public/jess/js/jessibuca-pro-multi-demo.js


BIN
public/jess/js/jessibuca-pro-object-detector-decoder.wasm


File diff suppressed because it is too large
+ 0 - 0
public/jess/js/jessibuca-pro-object-detector-demo.js


BIN
public/jess/js/jessibuca-pro-occlusion-detector-decoder.wasm


File diff suppressed because it is too large
+ 0 - 0
public/jess/js/jessibuca-pro-occlusion-detector-demo.js


File diff suppressed because it is too large
+ 0 - 0
public/jess/js/jessibuca-pro-recorder-demo.js


File diff suppressed because it is too large
+ 0 - 0
public/jess/js/jessibuca-pro-talk-demo.js


+ 7 - 7
public/webLive.html

@@ -1,4 +1,4 @@
-<!doctype html>
+
 <html lang="en">
 
 <head>
@@ -12,7 +12,7 @@
             margin: 0;
             padding: 0
         }
-        
+
         button {
             display: block;
             width: 120px;
@@ -24,13 +24,13 @@
             cursor: pointer;
             margin-left: 73px;
         }
-        
+
         .wrap {
             width: 80%;
             max-width: 600px;
             margin: 0 auto;
         }
-        
+
         .icon {
             display: inline-block;
             width: 20px;
@@ -44,14 +44,14 @@
             position: relative;
             transition: background-color 0.3s ease;
         }
-        
+
         .tip {
             display: block;
             text-align: right;
             font-size: 12px;
             color: #999;
         }
-        
+
         @media only screen and (max-width: 768px) {
             html,
             body {
@@ -264,4 +264,4 @@
     </script>
 </body>
 
-</html>
+</html>

+ 323 - 0
src/components/AliVideo/aliplayer copy.vue1

@@ -0,0 +1,323 @@
+<template>
+    <div class='prism-player' :id='playerId' :style='playStyle'></div>
+  </template>
+
+  <script>
+    //查具体属性文档 https://help.aliyun.com/document_detail/125572.html?spm=a2c4g.11186623.6.1179.131d10e43Evs78
+    export default {
+      name: 'Aliplayer',
+      props: {
+        playStyle: {
+          type: String,
+          default: ''
+        },
+        aliplayerSdkPath: {
+          // Aliplayer 代码的路径
+          type: String,
+          default: window.location.protocol+"//"+window.location.host+'/aliplayer-min.js'
+        },
+        autoplay: {
+          //播放器是否自动播放,在移动端autoplay属性会失效
+          type: Boolean,
+          default: true
+        },
+        isLive: {
+          type: Boolean,
+          default: true
+        },
+        playsinline: {
+          type: Boolean,
+          default: false
+        },
+        width: {
+          type: String,
+          default: '100%'
+        },
+        height: {
+          type: String,
+          default: '100%'
+        },
+        controlBarVisibility: {
+          // 控制面板的实现,默认值为:hover。取值:
+          // click:点击。
+          // hover:停留。
+          // always:一直。
+          type: String,
+          default: 'always'
+        },
+        useH5Prism: {
+          type: Boolean,
+          default: false
+        },
+        useFlashPrism: {
+          type: Boolean,
+          default: false
+        },
+        vid: {
+          //媒体转码服务的媒体Id
+          type: String,
+          default: ''
+        },
+        playauth: {
+          //播放权证
+          type: String,
+          default: ''
+        },
+        source: {
+          //视频播放地址url
+          type: String,
+          default: ''
+        },
+        cover: {
+          //播放器默认封面图片,请填写正确的图片url地址。需要autoplay值为false时,才生效
+          type: String,
+          default: ''
+        },
+        format: {
+          //指定播放地址格式
+          type: String,
+          default: 'flv'
+        },
+        x5_video_position: {
+          type: String,
+          default: 'top'
+        },
+        x5_type: {
+          type: String,
+          default: 'h5'
+        },
+        x5_fullscreen: {
+          type: Boolean,
+          default: false
+        },
+        x5_orientation: {
+          type: Number,
+          default: 2
+        },
+        autoPlayDelay: {
+          type: Number,
+          default: 3
+        },
+        autoPlayDelayDisplayText: {
+          type: String,
+          default:"疯狂加载中"
+        }
+      },
+      data () {
+        return {
+          playerId: "aliplayer_" +
+          Math.random().toString(36).substr(2),
+          scriptTagStatus: 0,
+          instance: null,
+        }
+      },
+      created () {
+        if (window.Aliplayer !== undefined) {
+          // 如果全局对象存在,说明编辑器代码已经初始化完成,直接加载编辑器
+          this.scriptTagStatus = 2
+          this.initAliplayer()
+        } else {
+          // 如果全局对象不存在,说明编辑器代码还没有加载完成,需要加载编辑器代码
+          this.insertScriptTag()
+        }
+      },
+      mounted () {
+        if (window.Aliplayer !== undefined) {
+          // 如果全局对象存在,说明编辑器代码已经初始化完成,直接加载编辑器
+          this.scriptTagStatus = 2
+          this.initAliplayer()
+        } else {
+          // 如果全局对象不存在,说明编辑器代码还没有加载完成,需要加载编辑器代码
+          this.insertScriptTag()
+        }
+      },
+      methods: {
+        insertScriptTag () {
+          const _this = this
+          let playerScriptTag = document.getElementById('playerScriptTag')
+          // 如果这个tag不存在,则生成相关代码tag以加载代码
+          if (playerScriptTag === null) {
+            playerScriptTag = document.createElement('script')
+            playerScriptTag.type = 'text/javascript'
+            playerScriptTag.src = this.aliplayerSdkPath
+            playerScriptTag.id = 'playerScriptTag'
+            let s = document.getElementsByTagName('head')[0]
+            s.appendChild(playerScriptTag)
+          }
+          if (playerScriptTag.loaded) {
+            _this.scriptTagStatus++
+          } else {
+            playerScriptTag.addEventListener('load', () => {
+              _this.scriptTagStatus++
+              playerScriptTag.loaded = true
+              _this.initAliplayer()
+            })
+          }
+          _this.initAliplayer()
+        },
+        initAliplayer () {
+          const _this = this
+          try {
+            if (_this.scriptTagStatus === 2 && _this.instance === null) {
+            // Vue 异步执行 DOM 更新,这样一来代码执行到这里的时候可能 template 里面的 script 标签还没真正创建
+            // 所以,我们只能在 nextTick 里面初始化 Aliplayer
+            _this.$nextTick(() => {
+              _this.instance = window.Aliplayer({
+                id: _this.playerId,
+                autoplay: _this.autoplay,
+                isLive: _this.isLive,
+                playsinline: _this.playsinline,
+                format: _this.format,
+                width: _this.width,
+                height: _this.height,
+                controlBarVisibility: _this.controlBarVisibility,
+                useH5Prism: _this.useH5Prism,
+                useFlashPrism: _this.useFlashPrism,
+                vid: _this.vid,
+                playauth: _this.playauth,
+                source: _this.source,
+                cover: _this.cover,
+                x5_video_position: _this.x5_video_position,
+                x5_type: _this.x5_type,
+                x5_fullscreen: _this.x5_fullscreen,
+                x5_orientation: _this.x5_orientation,
+                autoPlayDelay: _this.autoPlayDelay,
+                rtsLoadDataTimeout:10000,
+                autoPlayDelayDisplayText: _this.autoPlayDelayDisplayText
+              })
+              // 绑定事件,当 AliPlayer 初始化完成后,将编辑器实例通过自定义的 ready 事件交出去
+              _this.instance.on('ready', () => {
+                this.$emit('ready', _this.instance)
+              })
+              _this.instance.on('play', () => {
+                this.$emit('play', _this.instance)
+              })
+              _this.instance.on('pause', () => {
+                this.$emit('pause', _this.instance)
+              })
+              _this.instance.on('ended', () => {
+                this.$emit('ended', _this.instance)
+              })
+              _this.instance.on('liveStreamStop', () => {
+                this.$emit('liveStreamStop', _this.instance)
+              })
+              _this.instance.on('m3u8Retry', () => {
+                this.$emit('m3u8Retry', _this.instance)
+              })
+              _this.instance.on('hideBar', () => {
+                this.$emit('hideBar', _this.instance)
+              })
+              _this.instance.on('waiting', () => {
+                this.$emit('waiting', _this.instance)
+              })
+              _this.instance.on('snapshoted', () => {
+                this.$emit('snapshoted', _this.instance)
+              })
+            })
+          }
+
+          } catch (e) { }
+          // scriptTagStatus 为 2 的时候,说明两个必需引入的 js 文件都已经被引入,且加载完成
+
+        },
+        /**
+         * 播放视频
+         */
+        play: function () {
+          this.instance.play()
+        },
+        /**
+         * 暂停视频
+         */
+        pause: function () {
+          this.instance.pause()
+        },
+        /**
+         * 重播视频
+         */
+        replay: function () {
+          this.instance.replay()
+        },
+        /**
+         * 跳转到某个时刻进行播放
+         * @argument time 的单位为秒
+         */
+        seek: function (time) {
+          this.instance.seek(time)
+        },
+        /**
+         * 获取当前时间 单位秒
+         */
+        getCurrentTime: function () {
+          return this.instance.getCurrentTime()
+        },
+        /**
+         *获取视频总时长,返回的单位为秒
+         * @returns 返回的单位为秒
+         */
+        getDuration: function () {
+          return this.instance.getDuration()
+        },
+        /**
+         获取当前的音量,返回值为0-1的实数ios和部分android会失效
+         */
+        getVolume: function () {
+          return this.instance.getVolume()
+        },
+        /**
+         设置音量,vol为0-1的实数,ios和部分android会失效
+         */
+        setVolume: function (vol) {
+          this.instance.setVolume(vol)
+        },
+        /**
+         *直接播放视频url,time为可选值(单位秒)目前只支持同种格式(mp4/flv/m3u8)之间切换暂不支持直播rtmp流切换
+         *@argument url 视频地址
+         *@argument time 跳转到多少秒
+         */
+        loadByUrl: function (url) {
+          this.instance.loadByUrl(url)
+        },
+        /**
+         * 直播流中断时触发。M3U8、FLV、RTMP在重试5次未成功后触发。提示上层流中断或需要重新加载视频。
+         */
+        liveStreamStop:function() {
+          this.instance.liveStreamStop()
+        },
+        /**
+         * M3U8直播流中断后重试事件,每次断流只触发一次。
+         */
+        m3u8Retry:function() {
+          this.instance.m3u8Retry()
+        },
+        /**
+         * 设置播放速度
+         *@argument speed 速度
+         */
+        setSpeed: function (speed) {
+          this.instance.setSpeed(speed)
+        },
+        /**
+         * 设置播放器大小w,h可分别为400px像素或60%百分比chrome浏览器下flash播放器分别不能小于397x297
+         *@argument w 播放器宽度
+         *@argument h 播放器高度
+         */
+        setPlayerSize: function (w, h) {
+          this.instance.setPlayerSize(w, h)
+        },
+        /**
+         * 目前只支持HTML5界面上的重载功能,暂不支持直播rtmp流切换m3u8)之间切换,暂不支持直播rtmp流切换
+         *@argument vid 视频id
+         *@argument playauth 播放凭证
+         */
+        reloaduserPlayInfoAndVidRequestMts: function (vid, playauth) {
+          this.instance.reloaduserPlayInfoAndVidRequestMts(vid, playauth)
+        },
+
+      }
+    }
+  </script>
+
+  <style>
+    @import url('/aliplayer-min.css');
+  </style>

+ 137 - 242
src/components/AliVideo/aliplayer.vue

@@ -1,317 +1,212 @@
 <template>
-    <div class='prism-player' :id='playerId' :style='playStyle'></div>
-  </template>
-  
-  <script>
-    //查具体属性文档 https://help.aliyun.com/document_detail/125572.html?spm=a2c4g.11186623.6.1179.131d10e43Evs78
-    export default {
-      name: 'Aliplayer',
-      props: {
+    <div class='prism-player' :id='id' :class="id">
+    </div>
+</template>
+
+<script>
+export default {
+    name: 'Aliplayer',
+    props: {
         playStyle: {
-          type: String,
-          default: ''
-        },
-        aliplayerSdkPath: {
-          // Aliplayer 代码的路径
-          type: String,
-          default: '//g.alicdn.com/de/prismplayer/2.9.3/aliplayer-min.js'
-        },
-        autoplay: {
-          //播放器是否自动播放,在移动端autoplay属性会失效
-          type: Boolean,
-          default: true
-        },
-        isLive: {
-          type: Boolean,
-          default: true
-        },
-        playsinline: {
-          type: Boolean,
-          default: false
-        },
-        width: {
-          type: String,
-          default: '100%'
-        },
-        height: {
-          type: String,
-          default: '100%'
-        },
-        controlBarVisibility: {
-          // 控制面板的实现,默认值为:hover。取值:
-          // click:点击。
-          // hover:停留。
-          // always:一直。
-          type: String,
-          default: 'always'
-        },
-        useH5Prism: {
-          type: Boolean,
-          default: false
-        },
-        useFlashPrism: {
-          type: Boolean,
-          default: false
-        },
-        vid: {
-          //媒体转码服务的媒体Id
-          type: String,
-          default: ''
-        },
-        playauth: {
-          //播放权证
-          type: String,
-          default: ''
+            type: String,
+            default: ''
         },
         source: {
-          //视频播放地址url
-          type: String,
-          default: ''
-        },
-        cover: {
-          //播放器默认封面图片,请填写正确的图片url地址。需要autoplay值为false时,才生效
-          type: String,
-          default: ''
-        },
-        format: {
-          //指定播放地址格式
-          type: String,
-          default: ''
+            type: String,
+            default: ''
         },
-        x5_video_position: {
-          type: String,
-          default: 'top'
-        },
-        x5_type: {
-          type: String,
-          default: 'h5'
-        },
-        x5_fullscreen: {
-          type: Boolean,
-          default: false
-        },
-        x5_orientation: {
-          type: Number,
-          default: 2
-        },
-        autoPlayDelay: {
-          type: Number,
-          default: 0
-        },
-        autoPlayDelayDisplayText: {
-          type: String
+        id: {
+           type: String,
+            default: ''
         }
-      },
-      data () {
+
+    },
+    data() {
         return {
-          playerId: "aliplayer_" +
-          Math.random().toString(36).substr(2),
-          scriptTagStatus: 0,
-          instance: null,
+            playerId: "",
+            scriptTagStatus: 0,
+            instance: null,
         }
+  },
+    mounted() {
+    // this.$nextTick(() => {
+    //   this.initPlayer()
+      // })
+      this.playerId = "aliplayer_" +
+        Math.random().toString(36).substr(2);
+
+  },
+
+
+    methods: {
+        insertScriptTag() {
+            const _this = this
+            // _this.initAliplayer()
       },
-      created () {
-        if (window.Aliplayer !== undefined) {
-          // 如果全局对象存在,说明编辑器代码已经初始化完成,直接加载编辑器
-          this.scriptTagStatus = 2
-          this.initAliplayer()
-        } else {
-          // 如果全局对象不存在,说明编辑器代码还没有加载完成,需要加载编辑器代码
-          this.insertScriptTag()
-        }
-      },
-      mounted () {
-        if (window.Aliplayer !== undefined) {
-          // 如果全局对象存在,说明编辑器代码已经初始化完成,直接加载编辑器
-          this.scriptTagStatus = 2
-          this.initAliplayer()
-        } else {
-          // 如果全局对象不存在,说明编辑器代码还没有加载完成,需要加载编辑器代码
-          this.insertScriptTag()
-        }
-      },
-      methods: {
-        insertScriptTag () {
-          const _this = this
-          let playerScriptTag = document.getElementById('playerScriptTag')
-          // 如果这个tag不存在,则生成相关代码tag以加载代码
-          if (playerScriptTag === null) {
-            playerScriptTag = document.createElement('script')
-            playerScriptTag.type = 'text/javascript'
-            playerScriptTag.src = this.aliplayerSdkPath
-            playerScriptTag.id = 'playerScriptTag'
-            let s = document.getElementsByTagName('head')[0]
-            s.appendChild(playerScriptTag)
-          }
-          if (playerScriptTag.loaded) {
-            _this.scriptTagStatus++
-          } else {
-            playerScriptTag.addEventListener('load', () => {
-              _this.scriptTagStatus++
-              playerScriptTag.loaded = true
-              _this.initAliplayer()
-            })
-          }
-          _this.initAliplayer()
-        },
-        initAliplayer () {
-          const _this = this
-          // scriptTagStatus 为 2 的时候,说明两个必需引入的 js 文件都已经被引入,且加载完成
-          if (_this.scriptTagStatus === 2 && _this.instance === null) {
-            // Vue 异步执行 DOM 更新,这样一来代码执行到这里的时候可能 template 里面的 script 标签还没真正创建
-            // 所以,我们只能在 nextTick 里面初始化 Aliplayer
-            _this.$nextTick(() => {
-              _this.instance = window.Aliplayer({
-                id: _this.playerId,
-                autoplay: _this.autoplay,
-                isLive: _this.isLive,
-                playsinline: _this.playsinline,
-                format: _this.format,
-                width: _this.width,
-                height: _this.height,
-                controlBarVisibility: _this.controlBarVisibility,
-                useH5Prism: _this.useH5Prism,
-                useFlashPrism: _this.useFlashPrism,
-                vid: _this.vid,
-                playauth: _this.playauth,
-                source: _this.source,
-                cover: _this.cover,
-                x5_video_position: _this.x5_video_position,
-                x5_type: _this.x5_type,
-                x5_fullscreen: _this.x5_fullscreen,
-                x5_orientation: _this.x5_orientation,
-                autoPlayDelay: _this.autoPlayDelay,
-                autoPlayDelayDisplayText: _this.autoPlayDelayDisplayText
-              })
-              // 绑定事件,当 AliPlayer 初始化完成后,将编辑器实例通过自定义的 ready 事件交出去
-              _this.instance.on('ready', () => {
-                this.$emit('ready', _this.instance)
-              })
-              _this.instance.on('play', () => {
-                this.$emit('play', _this.instance)
-              })
-              _this.instance.on('pause', () => {
-                this.$emit('pause', _this.instance)
-              })
-              _this.instance.on('ended', () => {
-                this.$emit('ended', _this.instance)
-              })
-              _this.instance.on('liveStreamStop', () => {
-                this.$emit('liveStreamStop', _this.instance)
-              })
-              _this.instance.on('m3u8Retry', () => {
-                this.$emit('m3u8Retry', _this.instance)
-              })
-              _this.instance.on('hideBar', () => {
-                this.$emit('hideBar', _this.instance)
-              })
-              _this.instance.on('waiting', () => {
-                this.$emit('waiting', _this.instance)
-              })
-              _this.instance.on('snapshoted', () => {
-                this.$emit('snapshoted', _this.instance)
-              })
-            })
-          }
-        },
+      initPlayer(url = '') {
+        if(url==''||url==undefined) return
+        setTimeout(() => {
+          console.log(this.id)
+
+           this.instance = new JessibucaPro({
+
+            container: document.getElementById(this.id),
+            videoBuffer: 0.1, // 缓存时长
+            videoBufferDelay: 0.2, //
+            decoder: '/jess/js/decoder-pro.js',
+            isResize: false,
+            text: "",
+            loadingText: "加载中",
+            debug: false,
+            debugLevel: "info",
+            useMSE: false,
+            useSIMD: true,
+            useWCS: true,
+            showBandwidth: true, // 显示网速
+            showPerformance: false, // 显示性能
+            operateBtns: {
+                fullscreen: true,
+                screenshot: true,
+                play: true,
+                audio: false,
+                ptz: false,
+                quality: false,
+                performance: true,
+            },
+            timeout: 10000,
+            heartTimeoutReplayUseLastFrameShow: true,
+            audioEngine: "worklet",
+            qualityConfig: [ '高清'],
+            forceNoOffscreen: true,
+            isNotMute: false,
+            heartTimeout: 10,
+            ptzClickType: 'mouseDownAndUp',
+            ptzZoomShow:true,
+            ptzMoreArrowShow: true,
+            ptzApertureShow: true,
+            ptzFocusShow: true,
+            useCanvasRender: 'video',
+            useWebGPU: false,
+            controlHtml:''
+            // audioEngine:"worklet",
+            // isFlv: true
+           },);
+
+            this.instance.play(url);
+         },1000)
+
+      // debugger
+    },
+      initAliplayer(url) {
+
+        if (url == undefined) return;
+
+        this.initPlayer(url);
+
+
+       },
         /**
          * 播放视频
          */
-        play: function () {
-          this.instance.play()
+        play: function() {
+            this.instance.play()
         },
         /**
          * 暂停视频
          */
-        pause: function () {
-          this.instance.pause()
+        pause: function() {
+            this.instance.pause()
         },
         /**
          * 重播视频
          */
-        replay: function () {
-          this.instance.replay()
+        replay: function() {
+            this.instance.replay()
         },
         /**
          * 跳转到某个时刻进行播放
          * @argument time 的单位为秒
          */
-        seek: function (time) {
-          this.instance.seek(time)
+        seek: function(time) {
+            this.instance.seek(time)
         },
         /**
          * 获取当前时间 单位秒
          */
-        getCurrentTime: function () {
-          return this.instance.getCurrentTime()
+        getCurrentTime: function() {
+            return this.instance.getCurrentTime()
         },
         /**
          *获取视频总时长,返回的单位为秒
          * @returns 返回的单位为秒
          */
-        getDuration: function () {
-          return this.instance.getDuration()
+        getDuration: function() {
+            return this.instance.getDuration()
         },
         /**
          获取当前的音量,返回值为0-1的实数ios和部分android会失效
          */
-        getVolume: function () {
-          return this.instance.getVolume()
+        getVolume: function() {
+            return this.instance.getVolume()
         },
         /**
          设置音量,vol为0-1的实数,ios和部分android会失效
          */
-        setVolume: function (vol) {
-          this.instance.setVolume(vol)
+        setVolume: function(vol) {
+            this.instance.setVolume(vol)
         },
         /**
          *直接播放视频url,time为可选值(单位秒)目前只支持同种格式(mp4/flv/m3u8)之间切换暂不支持直播rtmp流切换
          *@argument url 视频地址
          *@argument time 跳转到多少秒
          */
-        loadByUrl: function (url) {
-          this.instance.loadByUrl(url)
+        loadByUrl: function(url) {
+            this.instance.loadByUrl(url)
         },
         /**
          * 直播流中断时触发。M3U8、FLV、RTMP在重试5次未成功后触发。提示上层流中断或需要重新加载视频。
          */
-        liveStreamStop:function() {
-          this.instance.liveStreamStop()
+        liveStreamStop: function() {
+            this.instance.liveStreamStop()
         },
         /**
          * M3U8直播流中断后重试事件,每次断流只触发一次。
          */
-        m3u8Retry:function() {
-          this.instance.m3u8Retry()
+        m3u8Retry: function() {
+            this.instance.m3u8Retry()
         },
         /**
          * 设置播放速度
          *@argument speed 速度
          */
-        setSpeed: function (speed) {
-          this.instance.setSpeed(speed)
+        setSpeed: function(speed) {
+            this.instance.setSpeed(speed)
         },
         /**
          * 设置播放器大小w,h可分别为400px像素或60%百分比chrome浏览器下flash播放器分别不能小于397x297
          *@argument w 播放器宽度
          *@argument h 播放器高度
          */
-        setPlayerSize: function (w, h) {
-          this.instance.setPlayerSize(w, h)
+        setPlayerSize: function(w, h) {
+            this.instance.setPlayerSize(w, h)
         },
         /**
          * 目前只支持HTML5界面上的重载功能,暂不支持直播rtmp流切换m3u8)之间切换,暂不支持直播rtmp流切换
          *@argument vid 视频id
          *@argument playauth 播放凭证
          */
-        reloaduserPlayInfoAndVidRequestMts: function (vid, playauth) {
-          this.instance.reloaduserPlayInfoAndVidRequestMts(vid, playauth)
+        reloaduserPlayInfoAndVidRequestMts: function(vid, playauth) {
+            this.instance.reloaduserPlayInfoAndVidRequestMts(vid, playauth)
         },
-  
-      }
+
     }
-  </script>
-  
-  <style>
-    @import url(//g.alicdn.com/de/prismplayer/2.9.3/skins/default/aliplayer-min.css);
-  </style>
+}
+</script>
+
+<style>
+.prism-player {
+    width: 100%;
+    height: 100%;
+    background: black;
+}
+</style>

+ 24 - 10
src/components/AliVideo/index.vue

@@ -1,6 +1,6 @@
 <template>
     <div>
-        <ali-player ref="player" @play="play($event)" @pause="pause($event)" @liveStreamStop="liveStreamStop($event)"
+        <ali-player :ref="`player${id}`" :id="id" @play="play($event)" @pause="pause($event)" @liveStreamStop="liveStreamStop($event)"
             :autoplay="true" :isLive="isLive" :rePlay="false" showBuffer="true" showBarTime="5000" format="m3u8"
             :source="source" v-if="iShow">
         </ali-player>
@@ -27,7 +27,10 @@ export default {
                 url: "http://2.90.220.252:9017/artemis-web/debug",
             }
         }
-    },
+  },
+  mounted() {
+    this.id= Math.random().toString(36).substr(2);
+  },
     components: {
         "ali-player": aliplayer
     },
@@ -40,9 +43,9 @@ export default {
             if (this.source == '') {
                 this.source = source
             } else {
-                this.$nextTick(() => {
-                    this.$refs.player.play()
-                })
+                // this.$nextTick(() => {
+                //     this.$refs.player.play()
+                // })
             }
         },
         //播放
@@ -74,9 +77,15 @@ export default {
         },
         setVideoData(url) {
             this.source = url;
-            this.iShow = false;
-            setTimeout(() => {
-                this.iShow = true;
+          this.iShow = false;
+          this.$refs[`player${this.id}`].initAliplayer(url);
+
+          setTimeout(() => {
+            try {
+              this.iShow = true;
+            } catch (e) { }
+
+
             }, 100);
             //    this.iShow = true;
         },
@@ -84,7 +93,8 @@ export default {
             this.videoCode = data.cameraIndexCode;
             this.getUrl();
         },
-        getUrl(){
+      getUrl() {
+          try {
             this.hlsParams.params =
                 '{"httpMethod":"POST","path":"/api/video/v1/cameras/previewURLs","headers":{},"query":{},"parameter":{},"body":{"streamType":0,"protocol":"hls","transmode":0,"expand":"transcode=0","cameraIndexCode": "' +
                 this.videoCode +
@@ -92,9 +102,13 @@ export default {
             httpRequest(this.hlsParams).then((res) => {
                 console.log(res.data)
                 var url = JSON.parse(res.data).data.url;
-                url = url.replace('http://2.90.220.252:83', 'https://qd.liaochengde.com:9001');
+                url = url.replace('http://2.90.220.252:83/', window.location.protocol+"//"+window.location.host+"/");
                 this.setVideoData(url)
             })
+          } catch (error) {
+
+          }
+
         }
     }
 };

+ 118 - 124
src/router/index.js

@@ -29,130 +29,124 @@ import Layout from '@/layout'
  */
 
 // 公共路由
-export const constantRoutes = [{
-        path: "/redirect",
-        component: Layout,
-        hidden: true,
-        children: [{
-            path: "/redirect/:path(.*)",
-            component: () =>
-                import ("@/views/redirect"),
-        }, ],
-    },
-    {
-        path: "/login",
-        component: () =>
-            import ("@/views/login"),
-        hidden: true,
-    },
-    {
-        path: "/register",
-        component: () =>
-            import ("@/views/register"),
-        hidden: true,
-    },
-    {
-        path: "/404",
-        component: () =>
-            import ("@/views/error/404"),
-        hidden: true,
-    },
-    {
-        path: "/401",
-        component: () =>
-            import ("@/views/error/401"),
-        hidden: true,
-    },
-    {
-        path: "",
-        component: Layout,
-        redirect: "index",
-        children: [{
-            path: "index",
-            component: () =>
-                import ("@/views/qdtl/area"),
-            name: "Index",
-        }, ],
-    },
-    {
-        path: "/big",
-        component: () =>
-            import ("@/views/bigscreen"),
-        hidden: true,
-    },
-    {
-        path: "/drone",
-        component: () =>
-            import ("@/views/drone"),
-        hidden: true,
-    },
-    {
-        path: "/introduction",
-        component: () =>
-            import ("@/views/introduction"),
-        hidden: true,
-    },
-    {
-        path: "/governance",
-        component: () =>
-            import ("@/views/governance"),
-        hidden: true,
-    },
-    {
-        path: "/new",
-        component: () =>
-            import ("@/views/new"),
-        hidden: true,
-    },
-    {
-        path: "/trouble",
-        component: () =>
-            import ("@/views/trouble"),
-        hidden: true,
-    },
-    {
-        path: "/safe",
-        component: () =>
-            import ("@/views/safe"),
-        hidden: true,
-    },
-    {
-        path: "/keepWatch",
-        component: () =>
-            import ("@/views/keepWatch/index.vue"),
-        hidden: true,
-    },
-    {
-        path: "/video",
-        component: () =>
-            import ("@/views/qdtl/video/video.vue"),
-        hidden: true,
-    },
-    {
-        path: "/public",
-        component: () =>
-            import ("@/views/public"),
-        hidden: true,
-    },
-    {
-        path: "/electri",
-        component: () =>
-            import ("@/views/electri"),
-        hidden: true,
-    },
-    {
-        path: "/user",
-        component: Layout,
-        hidden: true,
-        redirect: "noredirect",
-        children: [{
-            path: "profile",
-            component: () =>
-                import ("@/views/system/user/profile/index"),
-            name: "Profile",
-            meta: { title: "个人中心", icon: "user" },
-        }, ],
-    },
+export const constantRoutes = [
+  {
+    path: "/redirect",
+    component: Layout,
+    hidden: true,
+    children: [
+      {
+        path: "/redirect/:path(.*)",
+        component: () => import("@/views/redirect"),
+      },
+    ],
+  },
+  {
+    path: "/login",
+    component: () => import("@/views/login"),
+    hidden: true,
+  },
+  {
+    path: "/register",
+    component: () => import("@/views/register"),
+    hidden: true,
+  },
+  {
+    path: "/404",
+    component: () => import("@/views/error/404"),
+    hidden: true,
+  },
+  {
+    path: "/401",
+    component: () => import("@/views/error/401"),
+    hidden: true,
+  },
+  {
+    path: "/test",
+    component: () => import("@/views/qdtl/testvideo.vue"),
+    hidden: true,
+  },
+  {
+    path: "",
+    component: Layout,
+    redirect: "index",
+    children: [
+      {
+        path: "index",
+        component: () => import("@/views/qdtl/area"),
+        name: "Index",
+      },
+    ],
+  },
+  {
+    path: "/big",
+    component: () => import("@/views/bigscreen"),
+    hidden: true,
+  },
+  {
+    path: "/drone",
+    component: () => import("@/views/drone"),
+    hidden: true,
+  },
+  {
+    path: "/introduction",
+    component: () => import("@/views/introduction"),
+    hidden: true,
+  },
+  {
+    path: "/governance",
+    component: () => import("@/views/governance"),
+    hidden: true,
+  },
+  {
+    path: "/new",
+    component: () => import("@/views/new"),
+    hidden: true,
+  },
+  {
+    path: "/trouble",
+    component: () => import("@/views/trouble"),
+    hidden: true,
+  },
+  {
+    path: "/safe",
+    component: () => import("@/views/safe"),
+    hidden: true,
+  },
+  {
+    path: "/keepWatch",
+    component: () => import("@/views/keepWatch/index.vue"),
+    hidden: true,
+  },
+  {
+    path: "/video",
+    component: () => import("@/views/qdtl/video/video.vue"),
+    hidden: true,
+  },
+  {
+    path: "/public",
+    component: () => import("@/views/public"),
+    hidden: true,
+  },
+  {
+    path: "/electri",
+    component: () => import("@/views/electri"),
+    hidden: true,
+  },
+  {
+    path: "/user",
+    component: Layout,
+    hidden: true,
+    redirect: "noredirect",
+    children: [
+      {
+        path: "profile",
+        component: () => import("@/views/system/user/profile/index"),
+        name: "Profile",
+        meta: { title: "个人中心", icon: "user" },
+      },
+    ],
+  },
 ];
 
 // 动态路由,基于用户权限动态去加载

+ 49 - 0
src/views/qdtl/testvideo.vue

@@ -0,0 +1,49 @@
+<template>
+  <div style="width: 80vw;height:80vh;margin-left: 10vw;padding-top: 10vw;">
+     <aliplayer ref="dplay"></aliplayer>
+  </div>
+</template>
+
+<script lang="ts">
+import aliplayer from '@/components/AliVideo/aliplayer.vue'
+import { httpRequest } from "@/api/data/http";
+
+export default {
+  name: "test",
+  components: {
+    "aliplayer":aliplayer
+  },
+  data() {
+    return {
+       videoCode:"32068110581314000074",
+       hlsParams: {
+                url: "http://2.90.220.252:9017/artemis-web/debug",
+      },
+       videourl:"",
+
+    }
+  },
+  mounted() {
+      this.hlsParams.params =
+                '{"httpMethod":"POST","path":"/api/video/v1/cameras/previewURLs","headers":{},"query":{},"parameter":{},"body":{"streamType":0,"protocol":"hls","transmode":0,"expand":"transcode=0","cameraIndexCode": "' +
+                this.videoCode +
+                '"},"contentType":"application/json;charset=UTF-8","mock":false,"appKey":"27794545","appSecret":"5Xi27Gl7JrbHHF1MpdaB"}';
+            httpRequest(this.hlsParams).then((res) => {
+                console.log(res.data)
+                var url = JSON.parse(res.data).data.url;
+                url = url.replace('http://2.90.220.252:83/', "/");
+              // this.setVideoData(url)
+              this.videourl = url;
+
+              this.$refs.dplay.initAliplayer(url)
+            })
+  },
+
+
+}
+
+</script>
+
+<style>
+
+</style>

+ 4 - 4
src/views/qdtl/video/video.vue

@@ -37,7 +37,7 @@
           <!-- <aliplayer ref="videoObj" style="width: 80vw;height: 80vh;"></aliplayer> -->
           <!-- </div> -->
           <div style="width: 75vw;height: 80vh;margin-left: 0.5vw;margin-top: 0.5vh;position: relative;">
-            <!-- <LivePlayer v-if="displayList[0]" :videoUrl="videoList[0]" fluent autoplay live stretch :timeout=3 
+            <!-- <LivePlayer v-if="displayList[0]" :videoUrl="videoList[0]" fluent autoplay live stretch :timeout=3
               style="width:100%;height:100%;">
             </LivePlayer> -->
             <aliplayer ref="videoObj" style="width: 75vw;height: 80vh;"></aliplayer>
@@ -50,7 +50,7 @@
           <!-- </div> -->
           <div v-for="item in 4"style="width: 37vw;margin-left: 1vw;margin-top: 2vh;position: relative;">
             <aliplayer :ref="'videoObj'+item" style="width: 37vw;height: 40vh;"></aliplayer>
-            <!-- <LivePlayer v-if="displayList[item - 1]" :videoUrl="videoList[item - 1]" fluent autoplay live stretch :timeout=3 
+            <!-- <LivePlayer v-if="displayList[item - 1]" :videoUrl="videoList[item - 1]" fluent autoplay live stretch :timeout=3
               style="width: 37vw;">
             </LivePlayer> -->
           </div>
@@ -61,7 +61,7 @@
         <div style="width: 100%;display: flex;flex-direction: row;flex-wrap: wrap;" v-if="form.type == '九宫格'">
           <div v-for="item in 9"style="width: 26vw;margin-left: 1vw;margin-top: 2vh;position: relative;">
             <aliplayer :ref="'videoObj'+item" style="width: 26vw;height: 26vh;"></aliplayer>
-            <!-- <LivePlayer v-if="displayList[item - 1]" :videoUrl="videoList[item - 1]" fluent autoplay live stretch :timeout=3 
+            <!-- <LivePlayer v-if="displayList[item - 1]" :videoUrl="videoList[item - 1]" fluent autoplay live stretch :timeout=3
               style="width: 37vw;">
             </LivePlayer> -->
           </div>
@@ -393,7 +393,7 @@ export default {
         httpRequest(this.hlsParams).then((data) => {
           var videoData = JSON.parse(data.data);
           var url = videoData.data.url
-          url = url.replace('http://2.90.220.252:83', 'https://qd.liaochengde.com:9001');
+          url = url.replace('http://2.90.220.252:83/', "/");
           console.log(url)
           // url = 'https://yunqivedio.alicdn.com/2017yq/v2/0x0/96d79d3f5400514a6883869399708e11/96d79d3f5400514a6883869399708e11.m3u8'
           // console.log(window.location.host+window.location.port)

+ 128 - 116
vue.config.js

@@ -18,125 +18,137 @@ const port = process.env.port || process.env.npm_config_port || 80 // 端口
 //官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions
 // 这里只列一部分,具体配置参考文档
 module.exports = {
-    // 部署生产环境和开发环境下的URL。
-    // 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上
-    // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
-    publicPath: process.env.NODE_ENV === "production" ? "/" : "/",
-    // 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist)
-    outputDir: "dist",
-    // 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下)
-    assetsDir: "static",
-    // 是否开启eslint保存检测,有效值:ture | false | 'error'
-    lintOnSave: process.env.NODE_ENV === "development",
-    // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。
-    productionSourceMap: false,
-    // webpack-dev-server 相关配置
-    devServer: {
-        host: "0.0.0.0",
-        port: port,
-        open: true,
-        proxy: {
-            // detail: https://cli.vuejs.org/config/#devserver-proxy
-            [process.env.VUE_APP_BASE_API]: {
-                target: `http://58.221.168.61:9000/api`,
-                // target: `http://localhost:8080/`,
-                changeOrigin: true,
-                pathRewrite: {
-                    ["^" + process.env.VUE_APP_BASE_API]: "",
-                },
-            },
+  // 部署生产环境和开发环境下的URL。
+  // 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上
+  // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
+  publicPath: process.env.NODE_ENV === "production" ? "/" : "/",
+  // 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist)
+  outputDir: "dist",
+  // 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下)
+  assetsDir: "static",
+  // 是否开启eslint保存检测,有效值:ture | false | 'error'
+  lintOnSave: process.env.NODE_ENV === "development",
+  // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。
+  productionSourceMap: false,
+  // webpack-dev-server 相关配置
+  devServer: {
+    host: "0.0.0.0",
+    port: port,
+    open: true,
+    proxy: {
+      // detail: https://cli.vuejs.org/config/#devserver-proxy
+      [process.env.VUE_APP_BASE_API]: {
+        target: `http://58.221.168.61:9000/api`,
+        // target: `http://localhost:8080/`,
+        changeOrigin: true,
+        pathRewrite: {
+          ["^" + process.env.VUE_APP_BASE_API]: "",
         },
-        disableHostCheck: true,
-    },
-    css: {
-        loaderOptions: {
-            sass: {
-                sassOptions: { outputStyle: "expanded" },
-            },
+      },
+      "/openUrl": {
+        target: `http://58.221.168.61:9000/openUrl`,
+        // target: `http://localhost:8080/`,
+        changeOrigin: true,
+        pathRewrite: {
+          ["^/openUrl"]: "",
         },
+      },
     },
-    configureWebpack: {
-        name: name,
-        resolve: {
-            alias: {
-                "@": resolve("src"),
-            },
-        },
-        plugins: [
-            new CopyWebpackPlugin([{
-                    from: "node_modules/@liveqing/liveplayer/dist/component/crossdomain.xml",
-                },
-                {
-                    from: "node_modules/@liveqing/liveplayer/dist/component/liveplayer-lib.min.js",
-                    to: "js/",
-                },
-                {
-                    from: "node_modules/@liveqing/liveplayer/dist/component/liveplayer.swf",
-                },
-            ]),
-            // http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使用gzip解压缩静态文件
-            new CompressionPlugin({
-                test: /\.(js|css|html)?$/i, // 压缩文件格式
-                filename: "[path].gz[query]", // 压缩后的文件名
-                algorithm: "gzip", // 使用gzip压缩
-                minRatio: 0.8, // 压缩率小于1才会压缩
-            }),
-        ],
+    disableHostCheck: true,
+  },
+  css: {
+    loaderOptions: {
+      sass: {
+        sassOptions: { outputStyle: "expanded" },
+      },
     },
-    chainWebpack(config) {
-        config.plugins.delete("preload"); // TODO: need test
-        config.plugins.delete("prefetch"); // TODO: need test
+  },
+  configureWebpack: {
+    name: name,
+    resolve: {
+      alias: {
+        "@": resolve("src"),
+      },
+    },
+    plugins: [
+      new CopyWebpackPlugin([
+        {
+          from: "node_modules/@liveqing/liveplayer/dist/component/crossdomain.xml",
+        },
+        {
+          from: "node_modules/@liveqing/liveplayer/dist/component/liveplayer-lib.min.js",
+          to: "js/",
+        },
+        {
+          from: "node_modules/@liveqing/liveplayer/dist/component/liveplayer.swf",
+        },
+      ]),
+      // http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使用gzip解压缩静态文件
+      new CompressionPlugin({
+        test: /\.(js|css|html)?$/i, // 压缩文件格式
+        filename: "[path].gz[query]", // 压缩后的文件名
+        algorithm: "gzip", // 使用gzip压缩
+        minRatio: 0.8, // 压缩率小于1才会压缩
+      }),
+    ],
+  },
+  chainWebpack(config) {
+    config.plugins.delete("preload"); // TODO: need test
+    config.plugins.delete("prefetch"); // TODO: need test
 
-        // set svg-sprite-loader
-        config.module.rule("svg").exclude.add(resolve("src/assets/icons")).end();
-        config.module
-            .rule("icons")
-            .test(/\.svg$/)
-            .include.add(resolve("src/assets/icons"))
-            .end()
-            .use("svg-sprite-loader")
-            .loader("svg-sprite-loader")
-            .options({
-                symbolId: "icon-[name]",
-            })
-            .end();
+    // set svg-sprite-loader
+    config.module.rule("svg").exclude.add(resolve("src/assets/icons")).end();
+    config.module
+      .rule("icons")
+      .test(/\.svg$/)
+      .include.add(resolve("src/assets/icons"))
+      .end()
+      .use("svg-sprite-loader")
+      .loader("svg-sprite-loader")
+      .options({
+        symbolId: "icon-[name]",
+      })
+      .end();
 
-        config.when(process.env.NODE_ENV !== "development", (config) => {
-            config
-                .plugin("ScriptExtHtmlWebpackPlugin")
-                .after("html")
-                .use("script-ext-html-webpack-plugin", [{
-                    // `runtime` must same as runtimeChunk name. default is `runtime`
-                    inline: /runtime\..*\.js$/,
-                }, ])
-                .end();
-            config.optimization.splitChunks({
-                chunks: "all",
-                cacheGroups: {
-                    libs: {
-                        name: "chunk-libs",
-                        test: /[\\/]node_modules[\\/]/,
-                        priority: 10,
-                        chunks: "initial", // only package third parties that are initially dependent
-                    },
-                    elementUI: {
-                        name: "chunk-elementUI", // split elementUI into a single package
-                        priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
-                        test: /[\\/]node_modules[\\/]_?element-ui(.*)/, // in order to adapt to cnpm
-                    },
-                    commons: {
-                        name: "chunk-commons",
-                        test: resolve("src/components"), // can customize your rules
-                        minChunks: 3, //  minimum common number
-                        priority: 5,
-                        reuseExistingChunk: true,
-                    },
-                },
-            });
-            config.optimization.runtimeChunk("single"), {
-                from: path.resolve(__dirname, "./public/robots.txt"), //防爬虫文件
-                to: "./", //到根目录下
-            };
-        });
-    },
-};
+    config.when(process.env.NODE_ENV !== "development", (config) => {
+      config
+        .plugin("ScriptExtHtmlWebpackPlugin")
+        .after("html")
+        .use("script-ext-html-webpack-plugin", [
+          {
+            // `runtime` must same as runtimeChunk name. default is `runtime`
+            inline: /runtime\..*\.js$/,
+          },
+        ])
+        .end();
+      config.optimization.splitChunks({
+        chunks: "all",
+        cacheGroups: {
+          libs: {
+            name: "chunk-libs",
+            test: /[\\/]node_modules[\\/]/,
+            priority: 10,
+            chunks: "initial", // only package third parties that are initially dependent
+          },
+          elementUI: {
+            name: "chunk-elementUI", // split elementUI into a single package
+            priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
+            test: /[\\/]node_modules[\\/]_?element-ui(.*)/, // in order to adapt to cnpm
+          },
+          commons: {
+            name: "chunk-commons",
+            test: resolve("src/components"), // can customize your rules
+            minChunks: 3, //  minimum common number
+            priority: 5,
+            reuseExistingChunk: true,
+          },
+        },
+      });
+      config.optimization.runtimeChunk("single"),
+        {
+          from: path.resolve(__dirname, "./public/robots.txt"), //防爬虫文件
+          to: "./", //到根目录下
+        };
+    });
+  },
+};

+ 396 - 14
yarn.lock

@@ -899,6 +899,13 @@
   dependencies:
     regenerator-runtime "^0.13.4"
 
+"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.5.5":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.24.1.tgz#431f9a794d173b53720e69a6464abc6f0e2a5c57"
+  integrity sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==
+  dependencies:
+    regenerator-runtime "^0.14.0"
+
 "@babel/template@^7.0.0", "@babel/template@^7.16.7":
   version "7.16.7"
   resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155"
@@ -1012,6 +1019,11 @@
     "@jridgewell/resolve-uri" "^3.0.3"
     "@jridgewell/sourcemap-codec" "^1.4.10"
 
+"@liveqing/liveplayer@^2.7.10":
+  version "2.7.21"
+  resolved "https://registry.npmmirror.com/@liveqing/liveplayer/-/liveplayer-2.7.21.tgz#268ccf70508f2c1fbecba66ea7625c99ad4dd9f4"
+  integrity sha512-hcmDU+ce2LDZgxulpXBXn9/dFz3o4CSZtWMTUq3zbEu1+R/V0+tJr0vfFvrQgGuDzCRjav40gLyZkRJLLU3ApQ==
+
 "@mapbox/jsonlint-lines-primitives@~2.0.2":
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz#ce56e539f83552b58d10d672ea4d6fc9adc7b234"
@@ -1142,6 +1154,47 @@
   resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df"
   integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==
 
+"@videojs/http-streaming@3.10.0":
+  version "3.10.0"
+  resolved "https://registry.npmmirror.com/@videojs/http-streaming/-/http-streaming-3.10.0.tgz#b20eaf7246cc014f2715c967a9cdc4240b6e7e61"
+  integrity sha512-Lf1rmhTalV4Gw0bJqHmH4lfk/FlepUDs9smuMtorblAYnqDlE2tbUOb7sBXVYoXGdbWbdTW8jH2cnS+6HWYJ4Q==
+  dependencies:
+    "@babel/runtime" "^7.12.5"
+    "@videojs/vhs-utils" "4.0.0"
+    aes-decrypter "4.0.1"
+    global "^4.4.0"
+    m3u8-parser "^7.1.0"
+    mpd-parser "^1.3.0"
+    mux.js "7.0.2"
+    video.js "^7 || ^8"
+
+"@videojs/vhs-utils@4.0.0", "@videojs/vhs-utils@^4.0.0":
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/@videojs/vhs-utils/-/vhs-utils-4.0.0.tgz#4d4dbf5d61a9fbd2da114b84ec747c3a483bc60d"
+  integrity sha512-xJp7Yd4jMLwje2vHCUmi8MOUU76nxiwII3z4Eg3Ucb+6rrkFVGosrXlMgGnaLjq724j3wzNElRZ71D/CKrTtxg==
+  dependencies:
+    "@babel/runtime" "^7.12.5"
+    global "^4.4.0"
+    url-toolkit "^2.2.1"
+
+"@videojs/vhs-utils@^3.0.5":
+  version "3.0.5"
+  resolved "https://registry.npmmirror.com/@videojs/vhs-utils/-/vhs-utils-3.0.5.tgz#665ba70d78258ba1ab977364e2fe9f4d4799c46c"
+  integrity sha512-PKVgdo8/GReqdx512F+ombhS+Bzogiofy1LgAj4tN8PfdBx3HSS7V5WfJotKTqtOWGwVfSWsrYN/t09/DSryrw==
+  dependencies:
+    "@babel/runtime" "^7.12.5"
+    global "^4.4.0"
+    url-toolkit "^2.2.1"
+
+"@videojs/xhr@2.6.0":
+  version "2.6.0"
+  resolved "https://registry.npmmirror.com/@videojs/xhr/-/xhr-2.6.0.tgz#cd897e0ad54faf497961bcce3fa16dc15a26bb80"
+  integrity sha512-7J361GiN1tXpm+gd0xz2QWr3xNWBE+rytvo8J3KuggFaLg+U37gZQ2BuPLcnkfGffy2e+ozY70RHC8jt7zjA6Q==
+  dependencies:
+    "@babel/runtime" "^7.5.5"
+    global "~4.4.0"
+    is-function "^1.0.1"
+
 "@vue/babel-helper-vue-jsx-merge-props@^1.2.1":
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz#31624a7a505fb14da1d58023725a4c5f270e6a81"
@@ -1553,6 +1606,11 @@
     "@webassemblyjs/wast-parser" "1.9.0"
     "@xtuc/long" "4.2.2"
 
+"@xmldom/xmldom@^0.8.3":
+  version "0.8.10"
+  resolved "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99"
+  integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==
+
 "@xtuc/ieee754@^1.2.0":
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
@@ -1601,6 +1659,23 @@ address@^1.1.2:
   resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6"
   integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==
 
+aes-decrypter@1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/aes-decrypter/-/aes-decrypter-1.0.3.tgz#9c06b8a5435a5ad09db933f8a014afcf184cc34e"
+  integrity sha512-rsx8pfx7wJsn+ziYbpJ8XA5c93hKAtBCrfydxJqJCMT+qfjipd/B5wC2xHtBcoxyvlqJcpeAo3K55t0lXOn9yQ==
+  dependencies:
+    pkcs7 "^0.2.3"
+
+aes-decrypter@4.0.1, aes-decrypter@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/aes-decrypter/-/aes-decrypter-4.0.1.tgz#c1a81d0bde0e96fed0674488d2a31a6d7ab9b7a7"
+  integrity sha512-H1nh/P9VZXUf17AA5NQfJML88CFjVBDuGkp5zDHa7oEhYN9TTpNLJknRY1ie0iSKWlDf6JRnJKaZVDSQdPy6Cg==
+  dependencies:
+    "@babel/runtime" "^7.12.5"
+    "@videojs/vhs-utils" "^3.0.5"
+    global "^4.4.0"
+    pkcs7 "^1.0.4"
+
 aggregate-error@^3.0.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
@@ -1937,7 +2012,7 @@ babel-plugin-polyfill-regenerator@^0.3.0:
   dependencies:
     "@babel/helper-define-polyfill-provider" "^0.3.1"
 
-babel-runtime@6.x:
+babel-runtime@6.x, babel-runtime@^6.9.2:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
   integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
@@ -2858,6 +2933,13 @@ cookie@0.4.2:
   resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432"
   integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==
 
+copy-anything@^2.0.1:
+  version "2.0.6"
+  resolved "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480"
+  integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==
+  dependencies:
+    is-what "^3.14.1"
+
 copy-concurrently@^1.0.0:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
@@ -2875,9 +2957,9 @@ copy-descriptor@^0.1.0:
   resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
   integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
 
-copy-webpack-plugin@^5.1.1:
+copy-webpack-plugin@^5.0.3, copy-webpack-plugin@^5.1.1:
   version "5.1.2"
-  resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz#8a889e1dcafa6c91c6cd4be1ad158f1d3823bae2"
+  resolved "https://registry.npmmirror.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz#8a889e1dcafa6c91c6cd4be1ad158f1d3823bae2"
   integrity sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==
   dependencies:
     cacache "^12.0.3"
@@ -3437,6 +3519,11 @@ dom-serializer@^1.0.1:
     domhandler "^4.2.0"
     entities "^2.0.0"
 
+dom-walk@^0.1.0:
+  version "0.1.2"
+  resolved "https://registry.npmmirror.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84"
+  integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==
+
 domain-browser@^1.1.1:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
@@ -3653,7 +3740,7 @@ entities@^2.0.0:
   resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
   integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
 
-errno@^0.1.3, errno@~0.1.7:
+errno@^0.1.1, errno@^0.1.3, errno@~0.1.7:
   version "0.1.8"
   resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
   integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
@@ -3709,6 +3796,11 @@ es-to-primitive@^1.2.1:
     is-date-object "^1.0.1"
     is-symbol "^1.0.2"
 
+es5-shim@^4.5.1:
+  version "4.6.7"
+  resolved "https://registry.npmmirror.com/es5-shim/-/es5-shim-4.6.7.tgz#bc67ae0fc3dd520636e0a1601cc73b450ad3e955"
+  integrity sha512-jg21/dmlrNQI7JyyA2w7n+yifSxBng0ZralnSfVZjoCawgNTCnS+yBCyVM9DL5itm7SUnDGgv7hcq2XCZX4iRQ==
+
 escalade@^3.1.1:
   version "3.1.1"
   resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
@@ -4488,6 +4580,22 @@ glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4:
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
+global@4.3.2, global@~4.3.0:
+  version "4.3.2"
+  resolved "https://registry.npmmirror.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
+  integrity sha512-/4AybdwIDU4HkCUbJkZdWpe4P6vuw/CUtu+0I1YlLIPe7OlUO7KNJ+q/rO70CW2/NW6Jc6I62++Hzsf5Alu6rQ==
+  dependencies:
+    min-document "^2.19.0"
+    process "~0.5.1"
+
+global@4.4.0, global@^4.3.0, global@^4.3.1, global@^4.4.0, global@~4.4.0:
+  version "4.4.0"
+  resolved "https://registry.npmmirror.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406"
+  integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==
+  dependencies:
+    min-document "^2.19.0"
+    process "^0.11.10"
+
 globals@^11.1.0:
   version "11.12.0"
   resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
@@ -4909,10 +5017,10 @@ ignore@^4.0.3, ignore@^4.0.6:
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
   integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
 
-image-size@^0.5.1:
+image-size@^0.5.1, image-size@~0.5.0:
   version "0.5.5"
-  resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"
-  integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=
+  resolved "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"
+  integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==
 
 import-cwd@^2.0.0:
   version "2.1.0"
@@ -4967,6 +5075,11 @@ indexes-of@^1.0.1:
   resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
   integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
 
+individual@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/individual/-/individual-2.0.0.tgz#833b097dad23294e76117a98fb38e0d9ad61bb97"
+  integrity sha512-pWt8hBCqJsUWI/HtcfWod7+N9SgAqyPEaF7JQjwzjn5vGrpg6aQ5qeAFQ7dx//UH4J1O+7xqew+gCeeFt6xN/g==
+
 infer-owner@^1.0.3, infer-owner@^1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
@@ -5234,6 +5347,11 @@ is-fullwidth-code-point@^3.0.0:
   resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
   integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
 
+is-function@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08"
+  integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==
+
 is-glob@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
@@ -5382,6 +5500,11 @@ is-weakref@^1.0.1:
   dependencies:
     call-bind "^1.0.2"
 
+is-what@^3.14.1:
+  version "3.14.1"
+  resolved "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1"
+  integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==
+
 is-windows@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
@@ -5444,6 +5567,11 @@ js-base64@^2.1.9:
   resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4"
   integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==
 
+js-base64@^3.7.2:
+  version "3.7.5"
+  resolved "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.5.tgz#21e24cf6b886f76d6f5f165bfcd69cc55b9e3fca"
+  integrity sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==
+
 js-beautify@1.13.0:
   version "1.13.0"
   resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.13.0.tgz#a056d5d3acfd4918549aae3ab039f9f3c51eebb2"
@@ -5576,6 +5704,11 @@ jsprim@^1.2.2:
     json-schema "0.4.0"
     verror "1.10.0"
 
+keycode@2.2.0:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/keycode/-/keycode-2.2.0.tgz#3d0af56dc7b8b8e5cba8d0a97f107204eec22b04"
+  integrity sha512-ps3I9jAdNtRpJrbBvQjpzyFbss/skHqzS+eu4RxKLaEAtFqkjZaB6TZMSivPbLxf4K7VI4SjR0P5mRCX5+Q25A==
+
 killable@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892"
@@ -5630,6 +5763,31 @@ lerc@^3.0.0:
   resolved "https://registry.yarnpkg.com/lerc/-/lerc-3.0.0.tgz#36f36fbd4ba46f0abf4833799fff2e7d6865f5cb"
   integrity sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww==
 
+less-loader@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/less-loader/-/less-loader-5.0.0.tgz#498dde3a6c6c4f887458ee9ed3f086a12ad1b466"
+  integrity sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==
+  dependencies:
+    clone "^2.1.1"
+    loader-utils "^1.1.0"
+    pify "^4.0.1"
+
+less@^3.13.1:
+  version "3.13.1"
+  resolved "https://registry.npmmirror.com/less/-/less-3.13.1.tgz#0ebc91d2a0e9c0c6735b83d496b0ab0583077909"
+  integrity sha512-SwA1aQXGUvp+P5XdZslUOhhLnClSLIjWvJhmd+Vgib5BFIr9lMNlQwmwUNOjXThF/A0x+MCYYPeWEfeWiLRnTw==
+  dependencies:
+    copy-anything "^2.0.1"
+    tslib "^1.10.0"
+  optionalDependencies:
+    errno "^0.1.1"
+    graceful-fs "^4.1.2"
+    image-size "~0.5.0"
+    make-dir "^2.1.0"
+    mime "^1.4.1"
+    native-request "^1.0.5"
+    source-map "~0.6.0"
+
 levn@^0.4.1:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
@@ -5841,7 +5999,21 @@ lru-cache@^6.0.0:
   dependencies:
     yallist "^4.0.0"
 
-make-dir@^2.0.0:
+m3u8-parser@2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/m3u8-parser/-/m3u8-parser-2.1.0.tgz#c8170329ec1cd515d0d58bb8b762da9896cb0368"
+  integrity sha512-WbEpQ2FUaNGbJ0YanSeyj9D9ruu4FUvz+ZvebIzI2bSME+PUwcPXO1kKXZkjcPUAFruDikoOI5fWQNIA6JCCOQ==
+
+m3u8-parser@^7.1.0:
+  version "7.1.0"
+  resolved "https://registry.npmmirror.com/m3u8-parser/-/m3u8-parser-7.1.0.tgz#fa92ee22fc798150397c297152c879fe09f066c6"
+  integrity sha512-7N+pk79EH4oLKPEYdgRXgAsKDyA/VCo0qCHlUwacttQA0WqsjZQYmNfywMvjlY9MpEBVZEt0jKFd73Kv15EBYQ==
+  dependencies:
+    "@babel/runtime" "^7.12.5"
+    "@videojs/vhs-utils" "^3.0.5"
+    global "^4.4.0"
+
+make-dir@^2.0.0, make-dir@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
   integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
@@ -6036,7 +6208,7 @@ mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24,
   dependencies:
     mime-db "1.51.0"
 
-mime@1.6.0:
+mime@1.6.0, mime@^1.4.1:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
   integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
@@ -6056,6 +6228,13 @@ mimic-fn@^2.1.0:
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
   integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
 
+min-document@^2.19.0:
+  version "2.19.0"
+  resolved "https://registry.npmmirror.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
+  integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==
+  dependencies:
+    dom-walk "^0.1.0"
+
 mini-css-extract-plugin@^0.9.0:
   version "0.9.0"
   resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e"
@@ -6182,6 +6361,16 @@ move-concurrently@^1.0.1:
     rimraf "^2.5.4"
     run-queue "^1.0.3"
 
+mpd-parser@^1.2.2, mpd-parser@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/mpd-parser/-/mpd-parser-1.3.0.tgz#38c20f4d73542b4ed554158bc1f0fa571dc61388"
+  integrity sha512-WgeIwxAqkmb9uTn4ClicXpEQYCEduDqRKfmUdp4X8vmghKfBNXZLYpREn9eqrDx/Tf5LhzRcJLSpi4ohfV742Q==
+  dependencies:
+    "@babel/runtime" "^7.12.5"
+    "@videojs/vhs-utils" "^4.0.0"
+    "@xmldom/xmldom" "^0.8.3"
+    global "^4.4.0"
+
 ms@2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@@ -6215,6 +6404,27 @@ mute-stream@0.0.8:
   resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
   integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
 
+mux.js@4.3.2:
+  version "4.3.2"
+  resolved "https://registry.npmmirror.com/mux.js/-/mux.js-4.3.2.tgz#576d537df037dc5ec35ec1316b948d815d35c210"
+  integrity sha512-g0q6DPdvb3yYcoK7ElBGobdSSrhY/RjPt19U7uUc733aqvc5bCS/aCvL9z+448y+IoCZnYDwyZfQBBXMSmGOaQ==
+
+mux.js@7.0.2:
+  version "7.0.2"
+  resolved "https://registry.npmmirror.com/mux.js/-/mux.js-7.0.2.tgz#410641dc922c5d173d7ce45fbdb2bb9e2a69137c"
+  integrity sha512-CM6+QuyDbc0qW1OfEjkd2+jVKzTXF+z5VOKH0eZxtZtnrG/ilkW/U7l7IXGtBNLASF9sKZMcK1u669cq50Qq0A==
+  dependencies:
+    "@babel/runtime" "^7.11.2"
+    global "^4.4.0"
+
+mux.js@^7.0.1:
+  version "7.0.3"
+  resolved "https://registry.npmmirror.com/mux.js/-/mux.js-7.0.3.tgz#18fbbc607faeeaa8c897e0410d2067be2bdc7e1e"
+  integrity sha512-gzlzJVEGFYPtl2vvEiJneSWAWD4nfYRHD5XgxmB2gWvXraMPOYk+sxfvexmNfjQUFpmk6hwLR5C6iSFmuwCHdQ==
+  dependencies:
+    "@babel/runtime" "^7.11.2"
+    global "^4.4.0"
+
 mz@^2.4.0:
   version "2.7.0"
   resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
@@ -6246,6 +6456,11 @@ nanomatch@^1.2.1, nanomatch@^1.2.9:
     snapdragon "^0.8.1"
     to-regex "^3.0.1"
 
+native-request@^1.0.5:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/native-request/-/native-request-1.1.0.tgz#acdb30fe2eefa3e1bc8c54b3a6852e9c5c0d3cb0"
+  integrity sha512-uZ5rQaeRn15XmpgE0xoPL8YWqcX90VtCFglYwAgkvKM5e8fog+vePLAhHxuuv/gRkrQxIeh5U3q9sMNUrENqWw==
+
 natural-compare@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
@@ -6735,6 +6950,11 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5:
     pbkdf2 "^3.0.3"
     safe-buffer "^5.1.1"
 
+parse-headers@^2.0.0:
+  version "2.0.5"
+  resolved "https://registry.npmmirror.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9"
+  integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==
+
 parse-headers@^2.0.2:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.4.tgz#9eaf2d02bed2d1eff494331ce3df36d7924760bf"
@@ -6920,6 +7140,18 @@ pinkie@^2.0.0:
   resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
   integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
 
+pkcs7@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.npmmirror.com/pkcs7/-/pkcs7-0.2.3.tgz#22d60666d01065c5f24439098e4a4830452273be"
+  integrity sha512-kJRwmADEQUg+qJyRgWLtpEL9q9cFjZschejTEK3GRjKvnsU9G5WWoe/wKqRgbBoqWdVSeTUKP6vIA3Y72M3rWA==
+
+pkcs7@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/pkcs7/-/pkcs7-1.0.4.tgz#6090b9e71160dabf69209d719cbafa538b00a1cb"
+  integrity sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==
+  dependencies:
+    "@babel/runtime" "^7.5.5"
+
 pkg-dir@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4"
@@ -7387,6 +7619,11 @@ process@^0.11.10:
   resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
   integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
 
+process@~0.5.1:
+  version "0.5.2"
+  resolved "https://registry.npmmirror.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
+  integrity sha512-oNpcutj+nYX2FjdEW7PGltWhXulAnFlM0My/k48L90hARCOJtvBbQXc/6itV2jDvU5xAAtonP+r6wmQgCcbAUA==
+
 progress@^2.0.0:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
@@ -7653,6 +7890,11 @@ regenerator-runtime@^0.13.4:
   resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
   integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
 
+regenerator-runtime@^0.14.0:
+  version "0.14.1"
+  resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
+  integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
+
 regenerator-transform@^0.14.2:
   version "0.14.5"
   resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4"
@@ -7905,6 +8147,13 @@ runjs@4.4.2:
     microcli "1.3.3"
     omelette "0.4.5"
 
+rust-result@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/rust-result/-/rust-result-1.0.0.tgz#34c75b2e6dc39fe5875e5bdec85b5e0f91536f72"
+  integrity sha512-6cJzSBU+J/RJCF063onnQf0cDUOHs9uZI1oroSGnHOph+CQTIJ5Pp2hK5kEQq1+7yE/EEWfulSNXAQ2jikPthA==
+  dependencies:
+    individual "^2.0.0"
+
 rw@^1.3.3:
   version "1.3.3"
   resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4"
@@ -7934,6 +8183,13 @@ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0,
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
   integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
 
+safe-json-parse@4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/safe-json-parse/-/safe-json-parse-4.0.0.tgz#7c0f578cfccd12d33a71c0e05413e2eca171eaac"
+  integrity sha512-RjZPPHugjK0TOzFrLZ8inw44s9bKox99/0AZW9o/BEQVrJfhI+fIHMErnPyRa89/yRXUUr93q+tiN6zhoVV4wQ==
+  dependencies:
+    rust-result "^1.0.0"
+
 safe-regex@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
@@ -7946,10 +8202,10 @@ safe-regex@^1.1.0:
   resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
   integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
 
-sass-loader@10.1.1:
-  version "10.1.1"
-  resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.1.1.tgz#4ddd5a3d7638e7949065dd6e9c7c04037f7e663d"
-  integrity sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw==
+sass-loader@^10.1.1:
+  version "10.4.1"
+  resolved "https://registry.npmmirror.com/sass-loader/-/sass-loader-10.4.1.tgz#bea4e173ddf512c9d7f53e9ec686186146807cbf"
+  integrity sha512-aX/iJZTTpNUNx/OSYzo2KsjIUQHqvWsAhhUijFjAPdZTEhstjZI9zTNvkTTwsx+uNUJqUwOw5gacxQMx4hJxGQ==
   dependencies:
     klona "^2.0.4"
     loader-utils "^2.0.0"
@@ -8616,6 +8872,11 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
   resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
   integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
 
+style-loader@^3.3.1:
+  version "3.3.3"
+  resolved "https://registry.npmmirror.com/style-loader/-/style-loader-3.3.3.tgz#bba8daac19930169c0c9c96706749a597ae3acff"
+  integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==
+
 stylehacks@^4.0.0:
   version "4.0.3"
   resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5"
@@ -8953,7 +9214,7 @@ ts-pnp@^1.1.6:
   resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92"
   integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==
 
-tslib@^1.9.0:
+tslib@^1.10.0, tslib@^1.9.0:
   version "1.14.1"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
   integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
@@ -8963,6 +9224,11 @@ tslib@^2.1.0:
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
   integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
 
+tsml@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/tsml/-/tsml-1.0.1.tgz#89f8218b9d9e257f47d7f6b56d01c5a4d2c68fc3"
+  integrity sha512-3KmepnH9SUsoOVtg013CRrL7c+AK7ECaquAsJdvu4288EDJuraqBlP4PDXT/rLEJ9YDn4jqLAzRJsnFPx+V6lg==
+
 tty-browserify@0.0.0:
   version "0.0.0"
   resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
@@ -9164,6 +9430,11 @@ url-slug@2.0.0:
   dependencies:
     unidecode "0.1.8"
 
+url-toolkit@^2.1.3, url-toolkit@^2.2.1:
+  version "2.2.5"
+  resolved "https://registry.npmmirror.com/url-toolkit/-/url-toolkit-2.2.5.tgz#58406b18e12c58803e14624df5e374f638b0f607"
+  integrity sha512-mtN6xk+Nac+oyJ/PrI7tzfmomRVNFIWKUbG8jdYFt52hxbiReFAXIjYskvu64/dvuW71IcB7lV8l0HvZMac6Jg==
+
 url@^0.11.0:
   version "0.11.0"
   resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
@@ -9266,6 +9537,102 @@ verror@1.10.0:
     core-util-is "1.0.2"
     extsprintf "^1.2.0"
 
+"video.js@^5.17.0 || ^6.2.0", "video.js@^5.19.1 || ^6.2.0":
+  version "6.13.0"
+  resolved "https://registry.npmmirror.com/video.js/-/video.js-6.13.0.tgz#f9487d46327340fa48ecd51372a2981dbb6cde4c"
+  integrity sha512-36/JR/GhPQSZj0o+GNbhcEYv/b0SkV9SQsjlodAnzMQYN0TA7VhmqrKPYMCi1NGRYu7S9W3OaFCFoUxkYfSVlg==
+  dependencies:
+    babel-runtime "^6.9.2"
+    global "4.3.2"
+    safe-json-parse "4.0.0"
+    tsml "1.0.1"
+    videojs-font "2.1.0"
+    videojs-ie8 "1.1.2"
+    videojs-vtt.js "0.12.6"
+    xhr "2.4.0"
+
+"video.js@^7 || ^8", video.js@^8.10.0:
+  version "8.10.0"
+  resolved "https://registry.npmmirror.com/video.js/-/video.js-8.10.0.tgz#603a49909ef33f839264da8b73513f9daf592b57"
+  integrity sha512-7UeG/flj/pp8tNGW8WKPP1VJb3x2FgLoqUWzpZqkoq5YIyf6MNzmIrKtxprl438T5RVkcj+OzV8IX4jYSAn4Sw==
+  dependencies:
+    "@babel/runtime" "^7.12.5"
+    "@videojs/http-streaming" "3.10.0"
+    "@videojs/vhs-utils" "^4.0.0"
+    "@videojs/xhr" "2.6.0"
+    aes-decrypter "^4.0.1"
+    global "4.4.0"
+    keycode "2.2.0"
+    m3u8-parser "^7.1.0"
+    mpd-parser "^1.2.2"
+    mux.js "^7.0.1"
+    safe-json-parse "4.0.0"
+    videojs-contrib-quality-levels "4.0.0"
+    videojs-font "4.1.0"
+    videojs-vtt.js "0.15.5"
+
+videojs-contrib-hls@^5.15.0:
+  version "5.15.0"
+  resolved "https://registry.npmmirror.com/videojs-contrib-hls/-/videojs-contrib-hls-5.15.0.tgz#fe4957367e5d68b7d23f78ed32e37a9dd892a0a8"
+  integrity sha512-18zbMYZ0XRBKTPEayA9bFTWWrqhT9b4G8+zf0czJLD7Epe5PcK1I/3dflTHQeQ5rwlWir+/XnFU3sMg/B2MMcw==
+  dependencies:
+    aes-decrypter "1.0.3"
+    global "^4.3.0"
+    m3u8-parser "2.1.0"
+    mux.js "4.3.2"
+    url-toolkit "^2.1.3"
+    video.js "^5.19.1 || ^6.2.0"
+    videojs-contrib-media-sources "4.7.2"
+    webwackify "0.1.6"
+
+videojs-contrib-media-sources@4.7.2:
+  version "4.7.2"
+  resolved "https://registry.npmmirror.com/videojs-contrib-media-sources/-/videojs-contrib-media-sources-4.7.2.tgz#0adf929107d5b74cf2c8abb2824c82177e43858e"
+  integrity sha512-e6iCHWBFuV05EGo7v+pS9iepObXnJ9joms467gzi8ZjpKVb3ifha9M0Ja24Rd8JfvYpzjltsgDVtGFDvIg4hQQ==
+  dependencies:
+    global "^4.3.0"
+    mux.js "4.3.2"
+    video.js "^5.17.0 || ^6.2.0"
+    webwackify "0.1.6"
+
+videojs-contrib-quality-levels@4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-4.0.0.tgz#faa8096594cdbfc3ccbefe8572fc20531ba23f3d"
+  integrity sha512-u5rmd8BjLwANp7XwuQ0Q/me34bMe6zg9PQdHfTS7aXgiVRbNTb4djcmfG7aeSrkpZjg+XCLezFNenlJaCjBHKw==
+  dependencies:
+    global "^4.4.0"
+
+videojs-font@2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/videojs-font/-/videojs-font-2.1.0.tgz#a25930a67f6c9cfbf2bb88dacb8c6b451f093379"
+  integrity sha512-zFqWpLrXf1q8NtYx5qtZhMC6SLUFScDmR6j+UGPogobxR21lvXShhnzcNNMdOxJUuFLiToJ/BPpFUQwX4xhpvA==
+
+videojs-font@4.1.0:
+  version "4.1.0"
+  resolved "https://registry.npmmirror.com/videojs-font/-/videojs-font-4.1.0.tgz#3ae1dbaac60b4f0f1c4e6f7ff9662a89df176015"
+  integrity sha512-X1LuPfLZPisPLrANIAKCknZbZu5obVM/ylfd1CN+SsCmPZQ3UMDPcvLTpPBJxcBuTpHQq2MO1QCFt7p8spnZ/w==
+
+videojs-ie8@1.1.2:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/videojs-ie8/-/videojs-ie8-1.1.2.tgz#a23d3d8608ad7192b69c6077fc4eb848998d35d9"
+  integrity sha512-0Zb2T4MLkpfZbeGMK/Z93b8Lrepr+rLFoHgQV1CoDeFqXvH7b+Vsd/VHoILGxQrgCSHFQ7mAODR6oyMjuiD4/g==
+  dependencies:
+    es5-shim "^4.5.1"
+
+videojs-vtt.js@0.12.6:
+  version "0.12.6"
+  resolved "https://registry.npmmirror.com/videojs-vtt.js/-/videojs-vtt.js-0.12.6.tgz#e078600bda899eaa6f9c3307134cd0c811947b8e"
+  integrity sha512-XFXeGBQiljnElMhwCcZst0RDbZn2n8LU7ZScXryd3a00OaZsHAjdZu/7/RdSr7Z1jHphd45FnOvOQkGK4YrWCQ==
+  dependencies:
+    global "^4.3.1"
+
+videojs-vtt.js@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/videojs-vtt.js/-/videojs-vtt.js-0.15.5.tgz#567776eaf2a7a928d88b148a8b401ade2406f2ca"
+  integrity sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==
+  dependencies:
+    global "^4.3.1"
+
 vm-browserify@^1.0.1:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
@@ -9550,6 +9917,11 @@ websocket-extensions@>=0.1.1:
   resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42"
   integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==
 
+webwackify@0.1.6:
+  version "0.1.6"
+  resolved "https://registry.npmmirror.com/webwackify/-/webwackify-0.1.6.tgz#1d42a12ac61823d7e345abde084eaaa62a4a95eb"
+  integrity sha512-pGcw1T3HpNnM/UTRQqqRkkkzythSLts05mB+7Gr00B+0VbL0m39dFL5g20rSIEUt9Wrpw+/8k+snxRlUFHhcqA==
+
 which-boxed-primitive@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
@@ -9631,6 +10003,16 @@ ws@^6.0.0, ws@^6.2.1:
   dependencies:
     async-limiter "~1.0.0"
 
+xhr@2.4.0:
+  version "2.4.0"
+  resolved "https://registry.npmmirror.com/xhr/-/xhr-2.4.0.tgz#e16e66a45f869861eeefab416d5eff722dc40993"
+  integrity sha512-TUbBsdAuJbX8olk9hsDwGK8P1ri1XlV+PdEWkYw+HQQbpkiBR8PLgD1F3kQDPBs9l4Px34hP9rCYAZOCCAENbw==
+  dependencies:
+    global "~4.3.0"
+    is-function "^1.0.1"
+    parse-headers "^2.0.0"
+    xtend "^4.0.0"
+
 xml-utils@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/xml-utils/-/xml-utils-1.0.2.tgz#8081bfefb87b72e03e4adbabdd217ccbbc395eeb"

Some files were not shown because too many files changed in this diff