From 4d2c45948f7185f925a95e4fdda25cbd382e69c4 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Sun, 25 Jun 2017 21:58:44 +0800 Subject: [PATCH] optimize danmaku performance; update dev to eslint4 and webpack3 --- dist/DPlayer.min.js | 2 +- dist/DPlayer.min.js.map | 2 +- package.json | 6 +- src/DPlayer.js | 182 ++++++++++++--------- yarn.lock | 347 ++++++++++++++++++++++------------------ 5 files changed, 299 insertions(+), 240 deletions(-) diff --git a/dist/DPlayer.min.js b/dist/DPlayer.min.js index 715ef65..c0742b7 100644 --- a/dist/DPlayer.min.js +++ b/dist/DPlayer.min.js @@ -1,2 +1,2 @@ -(function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("DPlayer",[],t):"object"==typeof exports?exports.DPlayer=t():e.DPlayer=t()})(this,function(){return function(e){function t(a){if(n[a])return n[a].exports;var i=n[a]={i:a,l:!1,exports:{}};return e[a].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,a){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:a})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=7)}([function(e,t,n){"use strict";var a={play:["0 0 16 32","M15.552 15.168q0.448 0.32 0.448 0.832 0 0.448-0.448 0.768l-13.696 8.512q-0.768 0.512-1.312 0.192t-0.544-1.28v-16.448q0-0.96 0.544-1.28t1.312 0.192z"],pause:["0 0 17 32","M14.080 4.8q2.88 0 2.88 2.048v18.24q0 2.112-2.88 2.112t-2.88-2.112v-18.24q0-2.048 2.88-2.048zM2.88 4.8q2.88 0 2.88 2.048v18.24q0 2.112-2.88 2.112t-2.88-2.112v-18.24q0-2.048 2.88-2.048z"],"volume-up":["0 0 21 32","M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8zM20.576 16q0 1.344-0.768 2.528t-2.016 1.664q-0.16 0.096-0.448 0.096-0.448 0-0.8-0.32t-0.32-0.832q0-0.384 0.192-0.64t0.544-0.448 0.608-0.384 0.512-0.64 0.192-1.024-0.192-1.024-0.512-0.64-0.608-0.384-0.544-0.448-0.192-0.64q0-0.48 0.32-0.832t0.8-0.32q0.288 0 0.448 0.096 1.248 0.48 2.016 1.664t0.768 2.528zM25.152 16q0 2.72-1.536 5.056t-4 3.36q-0.256 0.096-0.448 0.096-0.48 0-0.832-0.352t-0.32-0.8q0-0.704 0.672-1.056 1.024-0.512 1.376-0.8 1.312-0.96 2.048-2.4t0.736-3.104-0.736-3.104-2.048-2.4q-0.352-0.288-1.376-0.8-0.672-0.352-0.672-1.056 0-0.448 0.32-0.8t0.8-0.352q0.224 0 0.48 0.096 2.496 1.056 4 3.36t1.536 5.056zM29.728 16q0 4.096-2.272 7.552t-6.048 5.056q-0.224 0.096-0.448 0.096-0.48 0-0.832-0.352t-0.32-0.8q0-0.64 0.704-1.056 0.128-0.064 0.384-0.192t0.416-0.192q0.8-0.448 1.44-0.896 2.208-1.632 3.456-4.064t1.216-5.152-1.216-5.152-3.456-4.064q-0.64-0.448-1.44-0.896-0.128-0.096-0.416-0.192t-0.384-0.192q-0.704-0.416-0.704-1.056 0-0.448 0.32-0.8t0.832-0.352q0.224 0 0.448 0.096 3.776 1.632 6.048 5.056t2.272 7.552z"],"volume-down":["0 0 21 32","M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8zM20.576 16q0 1.344-0.768 2.528t-2.016 1.664q-0.16 0.096-0.448 0.096-0.448 0-0.8-0.32t-0.32-0.832q0-0.384 0.192-0.64t0.544-0.448 0.608-0.384 0.512-0.64 0.192-1.024-0.192-1.024-0.512-0.64-0.608-0.384-0.544-0.448-0.192-0.64q0-0.48 0.32-0.832t0.8-0.32q0.288 0 0.448 0.096 1.248 0.48 2.016 1.664t0.768 2.528z"],"volume-off":["0 0 21 32","M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8z"],loop:["0 0 32 32","M1.882 16.941c0 4.152 3.221 7.529 7.177 7.529v1.882c-4.996 0-9.060-4.222-9.060-9.412s4.064-9.412 9.060-9.412h7.96l-3.098-3.098 1.331-1.331 5.372 5.37-5.37 5.372-1.333-1.333 3.1-3.098h-7.962c-3.957 0-7.177 3.377-7.177 7.529zM22.94 7.529v1.882c3.957 0 7.177 3.377 7.177 7.529s-3.221 7.529-7.177 7.529h-7.962l3.098-3.098-1.331-1.331-5.37 5.37 5.372 5.372 1.331-1.331-3.1-3.1h7.96c4.998 0 9.062-4.222 9.062-9.412s-4.064-9.412-9.060-9.412z"],full:["0 0 32 33","M6.667 28h-5.333c-0.8 0-1.333-0.533-1.333-1.333v-5.333c0-0.8 0.533-1.333 1.333-1.333s1.333 0.533 1.333 1.333v4h4c0.8 0 1.333 0.533 1.333 1.333s-0.533 1.333-1.333 1.333zM30.667 28h-5.333c-0.8 0-1.333-0.533-1.333-1.333s0.533-1.333 1.333-1.333h4v-4c0-0.8 0.533-1.333 1.333-1.333s1.333 0.533 1.333 1.333v5.333c0 0.8-0.533 1.333-1.333 1.333zM30.667 12c-0.8 0-1.333-0.533-1.333-1.333v-4h-4c-0.8 0-1.333-0.533-1.333-1.333s0.533-1.333 1.333-1.333h5.333c0.8 0 1.333 0.533 1.333 1.333v5.333c0 0.8-0.533 1.333-1.333 1.333zM1.333 12c-0.8 0-1.333-0.533-1.333-1.333v-5.333c0-0.8 0.533-1.333 1.333-1.333h5.333c0.8 0 1.333 0.533 1.333 1.333s-0.533 1.333-1.333 1.333h-4v4c0 0.8-0.533 1.333-1.333 1.333z"],"full-in":["0 0 32 33","M24.965 24.38h-18.132c-1.366 0-2.478-1.113-2.478-2.478v-11.806c0-1.364 1.111-2.478 2.478-2.478h18.132c1.366 0 2.478 1.113 2.478 2.478v11.806c0 1.364-1.11 2.478-2.478 2.478zM6.833 10.097v11.806h18.134l-0.002-11.806h-18.132zM2.478 28.928h5.952c0.684 0 1.238-0.554 1.238-1.239 0-0.684-0.554-1.238-1.238-1.238h-5.952v-5.802c0-0.684-0.554-1.239-1.238-1.239s-1.239 0.556-1.239 1.239v5.802c0 1.365 1.111 2.478 2.478 2.478zM30.761 19.412c-0.684 0-1.238 0.554-1.238 1.238v5.801h-5.951c-0.686 0-1.239 0.554-1.239 1.238 0 0.686 0.554 1.239 1.239 1.239h5.951c1.366 0 2.478-1.111 2.478-2.478v-5.801c0-0.683-0.554-1.238-1.239-1.238zM0 5.55v5.802c0 0.683 0.554 1.238 1.238 1.238s1.238-0.555 1.238-1.238v-5.802h5.952c0.684 0 1.238-0.554 1.238-1.238s-0.554-1.238-1.238-1.238h-5.951c-1.366-0.001-2.478 1.111-2.478 2.476zM32 11.35v-5.801c0-1.365-1.11-2.478-2.478-2.478h-5.951c-0.686 0-1.239 0.554-1.239 1.238s0.554 1.238 1.239 1.238h5.951v5.801c0 0.683 0.554 1.237 1.238 1.237 0.686 0.002 1.239-0.553 1.239-1.236z"],setting:["0 0 32 28","M28.633 17.104c0.035 0.21 0.026 0.463-0.026 0.76s-0.14 0.598-0.262 0.904c-0.122 0.306-0.271 0.581-0.445 0.825s-0.367 0.419-0.576 0.524c-0.209 0.105-0.393 0.157-0.55 0.157s-0.332-0.035-0.524-0.105c-0.175-0.052-0.393-0.1-0.655-0.144s-0.528-0.052-0.799-0.026c-0.271 0.026-0.541 0.083-0.812 0.17s-0.502 0.236-0.694 0.445c-0.419 0.437-0.664 0.934-0.734 1.493s0.009 1.092 0.236 1.598c0.175 0.349 0.148 0.699-0.079 1.048-0.105 0.14-0.271 0.284-0.498 0.432s-0.476 0.284-0.747 0.406-0.555 0.218-0.851 0.288c-0.297 0.070-0.559 0.105-0.786 0.105-0.157 0-0.306-0.061-0.445-0.183s-0.236-0.253-0.288-0.393h-0.026c-0.192-0.541-0.52-1.009-0.982-1.402s-1-0.589-1.611-0.589c-0.594 0-1.131 0.197-1.611 0.589s-0.816 0.851-1.009 1.375c-0.087 0.21-0.218 0.362-0.393 0.458s-0.367 0.144-0.576 0.144c-0.244 0-0.52-0.044-0.825-0.131s-0.611-0.197-0.917-0.327c-0.306-0.131-0.581-0.284-0.825-0.458s-0.428-0.349-0.55-0.524c-0.087-0.122-0.135-0.266-0.144-0.432s0.057-0.397 0.197-0.694c0.192-0.402 0.266-0.86 0.223-1.375s-0.266-0.991-0.668-1.428c-0.244-0.262-0.541-0.432-0.891-0.511s-0.681-0.109-0.995-0.092c-0.367 0.017-0.742 0.087-1.127 0.21-0.244 0.070-0.489 0.052-0.734-0.052-0.192-0.070-0.371-0.231-0.537-0.485s-0.314-0.533-0.445-0.838c-0.131-0.306-0.231-0.62-0.301-0.943s-0.087-0.59-0.052-0.799c0.052-0.384 0.227-0.629 0.524-0.734 0.524-0.21 0.995-0.555 1.415-1.035s0.629-1.017 0.629-1.611c0-0.611-0.21-1.144-0.629-1.598s-0.891-0.786-1.415-0.996c-0.157-0.052-0.288-0.179-0.393-0.38s-0.157-0.406-0.157-0.616c0-0.227 0.035-0.48 0.105-0.76s0.162-0.55 0.275-0.812 0.244-0.502 0.393-0.72c0.148-0.218 0.31-0.38 0.485-0.485 0.14-0.087 0.275-0.122 0.406-0.105s0.275 0.052 0.432 0.105c0.524 0.21 1.070 0.275 1.637 0.197s1.070-0.327 1.506-0.747c0.21-0.209 0.362-0.467 0.458-0.773s0.157-0.607 0.183-0.904c0.026-0.297 0.026-0.568 0-0.812s-0.048-0.419-0.065-0.524c-0.035-0.105-0.066-0.227-0.092-0.367s-0.013-0.262 0.039-0.367c0.105-0.244 0.293-0.458 0.563-0.642s0.563-0.336 0.878-0.458c0.314-0.122 0.62-0.214 0.917-0.275s0.533-0.092 0.707-0.092c0.227 0 0.406 0.074 0.537 0.223s0.223 0.301 0.275 0.458c0.192 0.471 0.507 0.886 0.943 1.244s0.952 0.537 1.546 0.537c0.611 0 1.153-0.17 1.624-0.511s0.803-0.773 0.996-1.297c0.070-0.14 0.179-0.284 0.327-0.432s0.301-0.223 0.458-0.223c0.244 0 0.511 0.035 0.799 0.105s0.572 0.166 0.851 0.288c0.279 0.122 0.537 0.279 0.773 0.472s0.423 0.402 0.563 0.629c0.087 0.14 0.113 0.293 0.079 0.458s-0.070 0.284-0.105 0.354c-0.227 0.506-0.297 1.039-0.21 1.598s0.341 1.048 0.76 1.467c0.419 0.419 0.934 0.651 1.546 0.694s1.179-0.057 1.703-0.301c0.14-0.087 0.31-0.122 0.511-0.105s0.371 0.096 0.511 0.236c0.262 0.244 0.493 0.616 0.694 1.113s0.336 1 0.406 1.506c0.035 0.297-0.013 0.528-0.144 0.694s-0.266 0.275-0.406 0.327c-0.542 0.192-1.004 0.528-1.388 1.009s-0.576 1.026-0.576 1.637c0 0.594 0.162 1.113 0.485 1.559s0.747 0.764 1.27 0.956c0.122 0.070 0.227 0.14 0.314 0.21 0.192 0.157 0.323 0.358 0.393 0.602v0zM16.451 19.462c0.786 0 1.528-0.149 2.227-0.445s1.305-0.707 1.821-1.231c0.515-0.524 0.921-1.131 1.218-1.821s0.445-1.428 0.445-2.214c0-0.786-0.148-1.524-0.445-2.214s-0.703-1.292-1.218-1.808c-0.515-0.515-1.122-0.921-1.821-1.218s-1.441-0.445-2.227-0.445c-0.786 0-1.524 0.148-2.214 0.445s-1.292 0.703-1.808 1.218c-0.515 0.515-0.921 1.118-1.218 1.808s-0.445 1.428-0.445 2.214c0 0.786 0.149 1.524 0.445 2.214s0.703 1.297 1.218 1.821c0.515 0.524 1.118 0.934 1.808 1.231s1.428 0.445 2.214 0.445v0z"],right:["0 0 32 32","M22 16l-10.105-10.6-1.895 1.987 8.211 8.613-8.211 8.612 1.895 1.988 8.211-8.613z"],comment:["0 0 32 32","M27.128 0.38h-22.553c-2.336 0-4.229 1.825-4.229 4.076v16.273c0 2.251 1.893 4.076 4.229 4.076h4.229v-2.685h8.403l-8.784 8.072 1.566 1.44 7.429-6.827h9.71c2.335 0 4.229-1.825 4.229-4.076v-16.273c0-2.252-1.894-4.076-4.229-4.076zM28.538 19.403c0 1.5-1.262 2.717-2.819 2.717h-8.36l-0.076-0.070-0.076 0.070h-11.223c-1.557 0-2.819-1.217-2.819-2.717v-13.589c0-1.501 1.262-2.718 2.819-2.718h19.734c1.557 0 2.819-0.141 2.819 1.359v14.947zM9.206 10.557c-1.222 0-2.215 0.911-2.215 2.036s0.992 2.035 2.215 2.035c1.224 0 2.216-0.911 2.216-2.035s-0.992-2.036-2.216-2.036zM22.496 10.557c-1.224 0-2.215 0.911-2.215 2.036s0.991 2.035 2.215 2.035c1.224 0 2.215-0.911 2.215-2.035s-0.991-2.036-2.215-2.036zM15.852 10.557c-1.224 0-2.215 0.911-2.215 2.036s0.991 2.035 2.215 2.035c1.222 0 2.215-0.911 2.215-2.035s-0.992-2.036-2.215-2.036z"],"comment-off":["0 0 32 32","M27.090 0.131h-22.731c-2.354 0-4.262 1.839-4.262 4.109v16.401c0 2.269 1.908 4.109 4.262 4.109h4.262v-2.706h8.469l-8.853 8.135 1.579 1.451 7.487-6.88h9.787c2.353 0 4.262-1.84 4.262-4.109v-16.401c0-2.27-1.909-4.109-4.262-4.109v0zM28.511 19.304c0 1.512-1.272 2.738-2.841 2.738h-8.425l-0.076-0.070-0.076 0.070h-11.311c-1.569 0-2.841-1.226-2.841-2.738v-13.696c0-1.513 1.272-2.739 2.841-2.739h19.889c1.569 0 2.841-0.142 2.841 1.37v15.064z"],send:["0 0 32 32","M13.725 30l3.9-5.325-3.9-1.125v6.45zM0 17.5l11.050 3.35 13.6-11.55-10.55 12.425 11.8 3.65 6.1-23.375-32 15.5z"],menu:["0 0 22 32","M20.8 14.4q0.704 0 1.152 0.48t0.448 1.12-0.48 1.12-1.12 0.48h-19.2q-0.64 0-1.12-0.48t-0.48-1.12 0.448-1.12 1.152-0.48h19.2zM1.6 11.2q-0.64 0-1.12-0.48t-0.48-1.12 0.448-1.12 1.152-0.48h19.2q0.704 0 1.152 0.48t0.448 1.12-0.48 1.12-1.12 0.48h-19.2zM20.8 20.8q0.704 0 1.152 0.48t0.448 1.12-0.48 1.12-1.12 0.48h-19.2q-0.64 0-1.12-0.48t-0.48-1.12 0.448-1.12 1.152-0.48h19.2z"],camera:["0 0 32 32","M16 23c-3.309 0-6-2.691-6-6s2.691-6 6-6 6 2.691 6 6-2.691 6-6 6zM16 13c-2.206 0-4 1.794-4 4s1.794 4 4 4c2.206 0 4-1.794 4-4s-1.794-4-4-4zM27 28h-22c-1.654 0-3-1.346-3-3v-16c0-1.654 1.346-3 3-3h3c0.552 0 1 0.448 1 1s-0.448 1-1 1h-3c-0.551 0-1 0.449-1 1v16c0 0.552 0.449 1 1 1h22c0.552 0 1-0.448 1-1v-16c0-0.551-0.448-1-1-1h-11c-0.552 0-1-0.448-1-1s0.448-1 1-1h11c1.654 0 3 1.346 3 3v16c0 1.654-1.346 3-3 3zM24 10.5c0 0.828 0.672 1.5 1.5 1.5s1.5-0.672 1.5-1.5c0-0.828-0.672-1.5-1.5-1.5s-1.5 0.672-1.5 1.5zM15 4c0 0.552-0.448 1-1 1h-4c-0.552 0-1-0.448-1-1v0c0-0.552 0.448-1 1-1h4c0.552 0 1 0.448 1 1v0z"]};e.exports=function(e){return'\n \n \n \n \n'}},function(e,t,n){"use strict";var a=n(0),i={main:function(e,t,n){for(var s="",l=0;l\n
\n '+s+"\n "+(e.logo?'\n \n ':"")+'\n
\n
\n
\n
\n \n '+(e.danmaku?''+n("Danmaku is loading")+"":"")+'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n
\n
\n
\n 0:00 / 0:00\n
\n
\n '+(e.video.quality?'\n
\n \n
\n '+i.qualityList(e.video.quality)+"\n
\n
\n ":"")+"\n "+(e.screenshot?'\n \n '+a("camera")+"\n \n ":"")+'\n
\n \n
\n \n
\n
\n
'+n("Set danmaku color")+'
\n \n \n \n \n \n \n
\n
\n
'+n("Set danmaku type")+'
\n \n \n \n
\n
\n \n \n
\n
\n
\n \n
\n
\n
\n \n \n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
\n
\n '+i.contextmenuList(e.contextmenu)+'\n
'},contextmenuList:function(e){for(var t='";return t+=""},qualityList:function(e){for(var t='
',n=0;n'+e[n].name+"
";return t+=""},video:function(e,t,n,a,i){return''},setting:function(e){return{original:'\n
\n '+e("Speed")+'\n
\n '+a("right")+'\n
\n
\n
\n '+e("Loop")+'\n
\n \n \n
\n
\n
\n '+e("Danmaku")+'\n
\n \n \n
\n
\n
\n '+e("Opacity for danmaku")+'\n
\n
\n
\n \n
\n
\n
\n
',speed:'\n
\n 0.5\n
\n
\n 0.75\n
\n
\n '+e("Normal")+'\n
\n
\n 1.25\n
\n
\n 1.5\n
\n
\n 2\n
'}}};e.exports=i},function(e,t,n){"use strict";var a={"Danmaku is loading":"弹幕加载中",Top:"顶部",Bottom:"底部",Rolling:"滚动","Input danmaku, hit Enter":"输入弹幕,回车发送","About author":"关于作者","DPlayer feedback":"播放器意见反馈","About DPlayer":"关于 DPlayer 播放器",Loop:"洗脑循环",Speed:"速度","Opacity for danmaku":"弹幕透明度",Normal:"正常","Please input danmaku content!":"要输入弹幕内容啊喂!","Set danmaku color":"设置弹幕颜色","Set danmaku type":"设置弹幕类型",Danmaku:"弹幕","This video fails to load":"视频加载失败","Switching to":"正在切换至","Switched to":"已经切换至",quality:"画质"};e.exports=function(e){var t=this;this.lang=e,this.tran=function(e){return"en"===t.lang?e:"zh"===t.lang?a[e]:void 0}}},function(e,t,n){"use strict";var a=n(8);e.exports=function(e){/mobile/i.test(window.navigator.userAgent)&&(e.autoplay=!1);var t={element:document.getElementsByClassName("dplayer")[0],autoplay:!1,theme:"#b7daff",loop:!1,lang:-1!==navigator.language.indexOf("zh")?"zh":"en",screenshot:!1,hotkey:!0,preload:"auto",apiBackend:a,contextmenu:[{text:"关于作者",link:"http://diygod.me"},{text:"播放器意见反馈",link:"https://github.com/DIYgod/DPlayer/issues"},{text:"关于 DPlayer 播放器",link:"https://github.com/DIYgod/DPlayer"}]};for(var n in t)t.hasOwnProperty(n)&&!e.hasOwnProperty(n)&&(e[n]=t[n]);return"[object Array]"!==Object.prototype.toString.call(e.video.url)&&(e.video.url=[e.video.url]),e.video&&!e.video.hasOwnProperty("type")&&(e.video.type="auto"),e.danmaku&&!e.danmaku.hasOwnProperty("user")&&(e.danmaku.user="DIYgod"),e.video.quality&&(e.video.url=[e.video.quality[e.video.defaultQuality].url]),e}},function(e,t,n){"use strict";e.exports={secondToTime:function(e){var t=function(e){return e<10?"0"+e:""+e},n=parseInt(e/60),a=parseInt(e-60*n);return t(n)+":"+t(a)},getElementViewLeft:function(e){var t=e.offsetLeft,n=e.offsetParent,a=document.body.scrollLeft+document.documentElement.scrollLeft;if(document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement)for(;null!==n&&n!==e;)t+=n.offsetLeft,n=n.offsetParent;else for(;null!==n;)t+=n.offsetLeft,n=n.offsetParent;return t-a}}},function(e,t,n){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=function(){function e(e,t){for(var n=0;n1,this.index=0,this.current=this.videos[this.index],this.duration=n||0,this.durationArr=[],this.eventAll=[],this.eventCurrent=[],this.on("all","durationchange",function(e,t){1!==t.duration&&(i.durationArr[e]=t.duration,n||(i.duration=i.durationArr.reduce(function(e,t){return e+t})))}),this.on("current","end",function(){i.switch(i.index+1)})}return i(e,[{key:"switch",value:function(e,t){this.index!==e?(this.videos[e].classList.add("dplayer-video-current"),this.current.paused||this.videos[e].play(),this.current.classList.remove("dplayer-video-current"),this.current.pause(),this.index=e,this.current=this.videos[this.index],this.videos[e].currentTime=t||0):this.videos[e].currentTime=t||0}},{key:"on",value:function(e,t,n){var a=this;if("function"==typeof n&&("all"===e?(this.eventAll[t]||(this.eventAll[t]=[]),this.eventAll[t].push(n)):(this.eventCurrent[t]||(this.eventCurrent[t]=[]),this.eventCurrent[t].push(n)),-1===["seeking"].indexOf(t)))for(var i=0;i0?t:0,t=t<1?t:1,g[e+"Bar"].style[n]=100*t+"%"};var i=["play","pause","canplay","playing","ended","error"];this.event={};for(var s=0;sw+.01&&!n.video.attr("paused")&&(n.element.classList.remove("dplayer-loading"),x=!1),w=E,n.updateBar("played",n.video.currentTime()/n.video.duration,"width"),n.element.getElementsByClassName("dplayer-ptime")[0].innerHTML=l.secondToTime(n.video.currentTime()),n.trigger("playing")},100),n.option.danmaku&&X&&(T=setInterval(function(){if(n.dan)for(var e=n.dan[n.danIndex];e&&n.video.currentTime()>parseFloat(e.time);)n.pushDanmaku(e.text,e.color,e.type),e=n.dan[++n.danIndex]},100))},this.clearTime=function(){clearInterval(n.playedTime),n.option.danmaku&&clearInterval(T)},k.addEventListener("click",function(e){var t=e||window.event;L=k.clientWidth;var a=(t.clientX-l.getElementViewLeft(k))/L;a=a>0?a:0,a=a<1?a:1,n.updateBar("played",a,"width"),n.video.seek(parseFloat(g.playedBar.style.width)/100*n.video.duration)}),this.isTipsShow=!1,this.timeTipsHandler=this.timeTipsHandler(k,b).bind(this),k.addEventListener("mousemove",this.timeTipsHandler),k.addEventListener("mouseover",this.timeTipsHandler),k.addEventListener("mouseenter",this.timeTipsHandler),k.addEventListener("mouseout",this.timeTipsHandler),k.addEventListener("mouseleave",this.timeTipsHandler);var B=function(e){var t=e||window.event,a=(t.clientX-l.getElementViewLeft(k))/L;a=a>0?a:0,a=a<1?a:1,n.updateBar("played",a,"width"),n.element.getElementsByClassName("dplayer-ptime")[0].innerHTML=l.secondToTime(a*n.video.duration)},q=function e(){document.removeEventListener("mouseup",e),document.removeEventListener("mousemove",B),n.video.seek(parseFloat(g.playedBar.style.width)/100*n.video.duration),n.setTime()};k.addEventListener("mousedown",function(){L=k.clientWidth,n.clearTime(),document.addEventListener("mousemove",B),document.addEventListener("mouseup",q)}),g.volumeBar=this.element.getElementsByClassName("dplayer-volume-bar-inner")[0];var C=this.element.getElementsByClassName("dplayer-volume")[0],M=this.element.getElementsByClassName("dplayer-volume-bar-wrap")[0],N=this.element.getElementsByClassName("dplayer-volume-bar")[0],z=this.element.getElementsByClassName("dplayer-volume-icon")[0];this.switchVolumeIcon=function(){var e=n.element.getElementsByClassName("dplayer-volume-icon")[0];n.video.attr("volume")>=.8?e.innerHTML=o("volume-up"):n.video.attr("volume")>0?e.innerHTML=o("volume-down"):e.innerHTML=o("volume-off")};var D=function(e){var t=e||window.event,a=(t.clientX-l.getElementViewLeft(N)-5.5)/35;n.volume(a)},S=function e(){document.removeEventListener("mouseup",e),document.removeEventListener("mousemove",D),C.classList.remove("dplayer-volume-active")};M.addEventListener("click",function(e){var t=e||window.event,a=(t.clientX-l.getElementViewLeft(N)-5.5)/35;n.volume(a)}),M.addEventListener("mousedown",function(){document.addEventListener("mousemove",D),document.addEventListener("mouseup",S),C.classList.add("dplayer-volume-active")}),z.addEventListener("click",function(){n.video.attr("muted")?(n.video.attr("muted",!1),n.switchVolumeIcon(),n.updateBar("volume",n.video.attr("volume"),"width")):(n.video.attr("muted",!0),z.innerHTML=o("volume-off"),n.updateBar("volume",0,"width"))});var I=0;if(!p){var H=function(){n.element.classList.remove("dplayer-hide-controller"),clearTimeout(I),I=setTimeout(function(){n.video.attr("played").length&&(n.element.classList.add("dplayer-hide-controller"),V(),ae())},2e3)};this.element.addEventListener("mousemove",H),this.element.addEventListener("click",H)}this.danOpacity=localStorage.getItem("DPlayer-opacity")||.7;var P=c.setting(this.tran),A=this.element.getElementsByClassName("dplayer-setting-icon")[0],F=this.element.getElementsByClassName("dplayer-setting-box")[0],O=this.element.getElementsByClassName("dplayer-mask")[0];F.innerHTML=P.original;var V=function(){F.classList.contains("dplayer-setting-box-open")&&(F.classList.remove("dplayer-setting-box-open"),O.classList.remove("dplayer-mask-show"),setTimeout(function(){F.classList.remove("dplayer-setting-box-narrow"),F.innerHTML=P.original,W()},300))},R=function(){F.classList.add("dplayer-setting-box-open"),O.classList.add("dplayer-mask-show")};O.addEventListener("click",function(){V()}),A.addEventListener("click",function(){R()}),this.loop=this.option.loop;var j=this.element.getElementsByClassName("dplayer-danmaku")[0],X=!0,W=function(){var e=n.element.getElementsByClassName("dplayer-setting-loop")[0],t=e.getElementsByClassName("dplayer-toggle-setting-input")[0];t.checked=n.loop,e.addEventListener("click",function(){t.checked=!t.checked,t.checked?n.loop=!0:n.loop=!1,V()});var a=n.element.getElementsByClassName("dplayer-setting-showdan")[0],i=a.getElementsByClassName("dplayer-showdan-setting-input")[0];if(i.checked=X,a.addEventListener("click",function(){if(i.checked=!i.checked,i.checked){if(X=!0,n.option.danmaku){for(var e=0;e=n.video.currentTime()){n.danIndex=e;break}n.danIndex=n.dan.length}T=setInterval(function(){for(var e=n.dan[n.danIndex];e&&n.video.currentTime()>=parseFloat(e.time);)n.pushDanmaku(e.text,e.color,e.type),e=n.dan[++n.danIndex]},0)}}else X=!1,n.option.danmaku&&(clearInterval(T),j.innerHTML='
',n.danTunnel={right:{},top:{},bottom:{}},n.itemDemo=n.element.getElementsByClassName("dplayer-danmaku-item")[0]);V()}),n.element.getElementsByClassName("dplayer-setting-speed")[0].addEventListener("click",function(){F.classList.add("dplayer-setting-box-narrow"),F.innerHTML=P.speed;for(var e=F.getElementsByClassName("dplayer-setting-speed-item"),t=0;t0?a:0,a=a<1?a:1,n.updateBar("danmaku",a,"width");for(var i=n.element.getElementsByClassName("dplayer-danmaku-item"),s=0;s0?a:0,a=a<1?a:1,n.updateBar("danmaku",a,"width");for(var i=n.element.getElementsByClassName("dplayer-danmaku-item"),s=0;s/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")},K=function(){if(Q.blur(),!Q.value.replace(/^\s+|\s+$/g,""))return void n.notice(n.tran("Please input danmaku content!"));var e={token:n.option.danmaku.token,player:n.option.danmaku.id,author:n.option.danmaku.user,time:n.video.currentTime(),text:Q.value,color:n.element.querySelector(".dplayer-comment-setting-color input:checked").value,type:n.element.querySelector(".dplayer-comment-setting-type input:checked").value};n.option.apiBackend.send(n.option.danmaku.api,e),Q.value="",ae(),n.dan.splice(n.danIndex,0,e),n.danIndex++,n.pushDanmaku(G(e.text),e.color,e.type).style.border="2px solid "+n.option.theme},Z=function(){U.classList.contains("dplayer-comment-setting-open")&&U.classList.remove("dplayer-comment-setting-open")},ee=function(){U.classList.contains("dplayer-comment-setting-open")?U.classList.remove("dplayer-comment-setting-open"):U.classList.add("dplayer-comment-setting-open")},te=0,ne=0,ae=function(){Y.classList.contains("dplayer-comment-box-open")&&(Y.classList.remove("dplayer-comment-box-open"),O.classList.remove("dplayer-mask-show"),n.element.classList.remove("dplayer-show-controller"),clearInterval(te),clearTimeout(ne),Z())},ie=function(){Y.classList.contains("dplayer-comment-box-open")||(Y.classList.add("dplayer-comment-box-open"),O.classList.add("dplayer-mask-show"),n.element.classList.add("dplayer-show-controller"),te=setInterval(function(){clearTimeout(I)},1e3),ne=setTimeout(function(){Q.focus()},300))};O.addEventListener("click",function(){ae()}),_.addEventListener("click",function(){ie()}),$.addEventListener("click",function(){ee()}),this.element.getElementsByClassName("dplayer-comment-setting-color")[0].addEventListener("click",function(){n.element.querySelector('input[name="dplayer-danmaku-color-${index}"]:checked+span')&&($.getElementsByClassName("dplayer-fill")[0].style.fill=n.element.querySelector('input[name="dplayer-danmaku-color-${index}"]:checked').value)}),Q.addEventListener("click",function(){Z()}),Q.addEventListener("keydown",function(e){13===(e||window.event).keyCode&&K()}),J.addEventListener("click",K);var se=function(){for(var e=j.offsetWidth,t=n.element.getElementsByClassName("dplayer-danmaku-item"),a=0;a=a.width?(oe.style.right=a.width-i+"px",oe.style.left="initial"):(oe.style.left=t.clientX-n.element.getBoundingClientRect().left+"px",oe.style.right="initial"),s+oe.offsetHeight>=a.height?(oe.style.bottom=a.height-s+"px",oe.style.top="initial"):(oe.style.top=t.clientY-n.element.getBoundingClientRect().top+"px",oe.style.bottom="initial"),O.classList.add("dplayer-mask-show"),O.addEventListener("click",function(){O.classList.remove("dplayer-mask-show"),oe.classList.remove("dplayer-menu-show")})}),this.option.video.quality&&this.element.getElementsByClassName("dplayer-quality-list")[0].addEventListener("click",function(e){e.target.classList.contains("dplayer-quality-item")&&n.switchQuality(e.target.dataset.index)}),this.option.screenshot){var de=this.element.getElementsByClassName("dplayer-camera-icon")[0];de.addEventListener("click",function(){var e=document.createElement("canvas");e.width=n.video.attr("videoWidth"),e.height=n.video.attr("videoHeight"),e.getContext("2d").drawImage(n.video.current,0,0,e.width,e.height),de.href=e.toDataURL(),de.download="DPlayer.png"})}m++}return s(e,[{key:"play",value:function(e){"[object Number]"===Object.prototype.toString.call(e)&&this.video.seek(e),this.paused=!1,this.video.attr("paused")&&(this.bezel.innerHTML=o("play"),this.bezel.classList.add("dplayer-bezel-transition")),this.playButton.innerHTML=o("pause"),this.video.play(),this.playedTime&&this.clearTime(),this.setTime(),this.element.classList.add("dplayer-playing"),this.trigger("play")}},{key:"pause",value:function(){this.paused=!0,this.element.classList.remove("dplayer-loading"),this.video.attr("paused")||(this.bezel.innerHTML=o("pause"),this.bezel.classList.add("dplayer-bezel-transition")),this.ended=!1,this.playButton.innerHTML=o("play"),this.video.pause(),this.clearTime(),this.element.classList.remove("dplayer-playing"),this.trigger("pause")}},{key:"volume",value:function(e){e=e>0?e:0,e=e<1?e:1,this.updateBar("volume",e,"width"),this.video.attr("volume",e),this.video.attr("muted")&&this.video.attr("muted",!1),this.switchVolumeIcon()}},{key:"toggle",value:function(){this.video.attr("paused")?this.play():this.pause()}},{key:"on",value:function(e,t){"function"==typeof t&&this.event[e].push(t)}},{key:"_readAllEndpoints",value:function(e,t){for(var n=this,a=[],i=0,s=0;s',this.danTuel={right:{},top:{},bottom:{}},this.itemDemo=this.element.getElementsByClassName("dplayer-danmaku-item")[0],this.option.danmaku=t,this.readDanmaku())}},{key:"initVideo",value:function(){var e=this;if(("auto"===this.option.video.type?/m3u8(#|\?|$)/i.exec(this.option.video.url):"hls"===this.option.video.type)&&Hls.isSupported()){var t=new Hls;t.attachMedia(this.video.current),t.on(Hls.Events.MEDIA_ATTACHED,function(){t.loadSource(e.option.video.url),t.on(Hls.Events.MANIFEST_PARSED,function(e,t){this.notice("manifest loaded, found "+t.levels.length+" quality level")})})}if(("auto"===this.option.video.type?/.flv(#|\?|$)/i.exec(this.option.video.url):"flv"===this.option.video.type)&&flvjs.isSupported()){var n=flvjs.createPlayer({type:"flv",url:this.option.video.url});n.attachMediaElement(this.video.current),n.load()}this.option.danmaku&&this.video.on("all","seeking",function(){for(var t=0;t=e.video.currentTime())return void(e.danIndex=t);e.danIndex=e.dan.length}}),this.video.on("all","durationchange",function(t,n){1!==n.duration&&(e.element.getElementsByClassName("dplayer-dtime")[0].innerHTML=l.secondToTime(e.video.duration))}),this.video.on("current","progress",function(t,n){var a=n.buffered.length?n.buffered.end(n.buffered.length-1)/n.duration:0;e.updateBar("loaded",a,"width")}),this.video.on("all","error",function(){e.notice(e.tran("This video fails to load"),-1),e.trigger("pause")}),this.video.on("current","canplay",function(){e.trigger("canplay")}),this.ended=!1,this.video.on("all","ended",function(t){t===e.video.videos.length-1&&(e.updateBar("played",1,"width"),e.loop?(e.video.switch(0),e.video.play()):(e.ended=!0,e.pause(),e.trigger("ended")))}),this.video.on("current","play",function(){e.paused&&e.play()}),this.video.on("current","pause",function(){e.paused||e.pause()}),this.video.attr("volume",parseInt(this.element.getElementsByClassName("dplayer-volume-bar-inner")[0].style.width)/100)}},{key:"switchQuality",value:function(e){var t=this;if(this.qualityIndex!==e&&!this.switchingQuality){this.qualityIndex=e,this.switchingQuality=!0,this.quality=this.option.video.quality[e],this.element.getElementsByClassName("dplayer-quality-icon")[0].innerHTML=this.quality.name,this.video.pause();var n=c.video(!1,null,this.option.screenshot,"auto",this.quality.url),a=(new DOMParser).parseFromString(n,"text/html").body.firstChild,i=this.element.getElementsByClassName("dplayer-video-wrap")[0];i.prepend(a),this.prevVideo=this.video,this.video=new u([a],this.prevVideo.duration),this.initVideo(),this.video.seek(this.prevVideo.currentTime()),this.notice(this.tran("Switching to")+" "+this.quality.name+" "+this.tran("quality"),-1),this.video.on("current","canplay",function(){if(t.prevVideo){if(t.video.currentTime()!==t.prevVideo.currentTime())return void t.video.seek(t.prevVideo.currentTime());i.removeChild(t.prevVideo.current),t.video.current.classList.add("dplayer-video-current"),t.video.play(),t.prevVideo=null,t.notice(t.tran("Switched to")+" "+t.quality.name+" "+t.tran("quality")),t.switchingQuality=!1}})}}},{key:"timeTipsHandler",value:function(e,t){var n=this,a=function(e){var t=0,n=0;do{t+=e.offsetTop||0,n+=e.offsetLeft||0,e=e.offsetParent}while(e);return{top:t,left:n}};return function(i){if(n.video.duration){var s=i.clientX,o=a(e).left,d=s-o;switch(t.innerText=l.secondToTime(n.video.duration*(d/e.offsetWidth)),t.style.left=d-20+"px",i.type){case"mouseenter":case"mouseover":case"mousemove":if(n.isTipsShow)return;t.classList.remove("hidden"),n.isTipsShow=!0;break;case"mouseleave":case"mouseout":if(!n.isTipsShow)return;t.classList.add("hidden"),n.isTipsShow=!1}}}}},{key:"notice",value:function(e,t){var n=this.element.getElementsByClassName("dplayer-notice")[0];n.innerHTML=e,n.style.opacity=1,this.noticeTime&&clearTimeout(this.noticeTime),t&&t<0||(this.noticeTime=setTimeout(function(){n.style.opacity=0},t||2e3))}}]),e}();e.exports=v},function(e,t,n){"use strict";var a=function(e,t,n,a,i){var s=new XMLHttpRequest;s.onreadystatechange=function(){if(4===s.readyState){if(s.status>=200&&s.status<300||304===s.status){var e=JSON.parse(s.responseText);return 1!==e.code?a(s,e):n(s,e)}i(s)}},s.open(null!==t?"POST":"GET",e,!0),s.send(null!==t?JSON.stringify(t):null)};e.exports={send:function(e,t){a(e,t,function(e,t){console.log("Post danmaku: ",t)},function(e,t){alert(t.msg)},function(e){console.log("Request was unsuccessful: "+e.status)})},read:function(e,t){a(e,null,function(e,n){t(null,n.danmaku)},function(e,n){t({status:e.status,response:n})},function(e){t({status:e.status,response:null})})}}}])}); +(function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("DPlayer",[],t):"object"==typeof exports?exports.DPlayer=t():e.DPlayer=t()})(this,function(){return function(e){function t(a){if(n[a])return n[a].exports;var i=n[a]={i:a,l:!1,exports:{}};return e[a].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,a){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:a})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=1)}([function(e,t,n){"use strict";var a={play:["0 0 16 32","M15.552 15.168q0.448 0.32 0.448 0.832 0 0.448-0.448 0.768l-13.696 8.512q-0.768 0.512-1.312 0.192t-0.544-1.28v-16.448q0-0.96 0.544-1.28t1.312 0.192z"],pause:["0 0 17 32","M14.080 4.8q2.88 0 2.88 2.048v18.24q0 2.112-2.88 2.112t-2.88-2.112v-18.24q0-2.048 2.88-2.048zM2.88 4.8q2.88 0 2.88 2.048v18.24q0 2.112-2.88 2.112t-2.88-2.112v-18.24q0-2.048 2.88-2.048z"],"volume-up":["0 0 21 32","M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8zM20.576 16q0 1.344-0.768 2.528t-2.016 1.664q-0.16 0.096-0.448 0.096-0.448 0-0.8-0.32t-0.32-0.832q0-0.384 0.192-0.64t0.544-0.448 0.608-0.384 0.512-0.64 0.192-1.024-0.192-1.024-0.512-0.64-0.608-0.384-0.544-0.448-0.192-0.64q0-0.48 0.32-0.832t0.8-0.32q0.288 0 0.448 0.096 1.248 0.48 2.016 1.664t0.768 2.528zM25.152 16q0 2.72-1.536 5.056t-4 3.36q-0.256 0.096-0.448 0.096-0.48 0-0.832-0.352t-0.32-0.8q0-0.704 0.672-1.056 1.024-0.512 1.376-0.8 1.312-0.96 2.048-2.4t0.736-3.104-0.736-3.104-2.048-2.4q-0.352-0.288-1.376-0.8-0.672-0.352-0.672-1.056 0-0.448 0.32-0.8t0.8-0.352q0.224 0 0.48 0.096 2.496 1.056 4 3.36t1.536 5.056zM29.728 16q0 4.096-2.272 7.552t-6.048 5.056q-0.224 0.096-0.448 0.096-0.48 0-0.832-0.352t-0.32-0.8q0-0.64 0.704-1.056 0.128-0.064 0.384-0.192t0.416-0.192q0.8-0.448 1.44-0.896 2.208-1.632 3.456-4.064t1.216-5.152-1.216-5.152-3.456-4.064q-0.64-0.448-1.44-0.896-0.128-0.096-0.416-0.192t-0.384-0.192q-0.704-0.416-0.704-1.056 0-0.448 0.32-0.8t0.832-0.352q0.224 0 0.448 0.096 3.776 1.632 6.048 5.056t2.272 7.552z"],"volume-down":["0 0 21 32","M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8zM20.576 16q0 1.344-0.768 2.528t-2.016 1.664q-0.16 0.096-0.448 0.096-0.448 0-0.8-0.32t-0.32-0.832q0-0.384 0.192-0.64t0.544-0.448 0.608-0.384 0.512-0.64 0.192-1.024-0.192-1.024-0.512-0.64-0.608-0.384-0.544-0.448-0.192-0.64q0-0.48 0.32-0.832t0.8-0.32q0.288 0 0.448 0.096 1.248 0.48 2.016 1.664t0.768 2.528z"],"volume-off":["0 0 21 32","M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8z"],loop:["0 0 32 32","M1.882 16.941c0 4.152 3.221 7.529 7.177 7.529v1.882c-4.996 0-9.060-4.222-9.060-9.412s4.064-9.412 9.060-9.412h7.96l-3.098-3.098 1.331-1.331 5.372 5.37-5.37 5.372-1.333-1.333 3.1-3.098h-7.962c-3.957 0-7.177 3.377-7.177 7.529zM22.94 7.529v1.882c3.957 0 7.177 3.377 7.177 7.529s-3.221 7.529-7.177 7.529h-7.962l3.098-3.098-1.331-1.331-5.37 5.37 5.372 5.372 1.331-1.331-3.1-3.1h7.96c4.998 0 9.062-4.222 9.062-9.412s-4.064-9.412-9.060-9.412z"],full:["0 0 32 33","M6.667 28h-5.333c-0.8 0-1.333-0.533-1.333-1.333v-5.333c0-0.8 0.533-1.333 1.333-1.333s1.333 0.533 1.333 1.333v4h4c0.8 0 1.333 0.533 1.333 1.333s-0.533 1.333-1.333 1.333zM30.667 28h-5.333c-0.8 0-1.333-0.533-1.333-1.333s0.533-1.333 1.333-1.333h4v-4c0-0.8 0.533-1.333 1.333-1.333s1.333 0.533 1.333 1.333v5.333c0 0.8-0.533 1.333-1.333 1.333zM30.667 12c-0.8 0-1.333-0.533-1.333-1.333v-4h-4c-0.8 0-1.333-0.533-1.333-1.333s0.533-1.333 1.333-1.333h5.333c0.8 0 1.333 0.533 1.333 1.333v5.333c0 0.8-0.533 1.333-1.333 1.333zM1.333 12c-0.8 0-1.333-0.533-1.333-1.333v-5.333c0-0.8 0.533-1.333 1.333-1.333h5.333c0.8 0 1.333 0.533 1.333 1.333s-0.533 1.333-1.333 1.333h-4v4c0 0.8-0.533 1.333-1.333 1.333z"],"full-in":["0 0 32 33","M24.965 24.38h-18.132c-1.366 0-2.478-1.113-2.478-2.478v-11.806c0-1.364 1.111-2.478 2.478-2.478h18.132c1.366 0 2.478 1.113 2.478 2.478v11.806c0 1.364-1.11 2.478-2.478 2.478zM6.833 10.097v11.806h18.134l-0.002-11.806h-18.132zM2.478 28.928h5.952c0.684 0 1.238-0.554 1.238-1.239 0-0.684-0.554-1.238-1.238-1.238h-5.952v-5.802c0-0.684-0.554-1.239-1.238-1.239s-1.239 0.556-1.239 1.239v5.802c0 1.365 1.111 2.478 2.478 2.478zM30.761 19.412c-0.684 0-1.238 0.554-1.238 1.238v5.801h-5.951c-0.686 0-1.239 0.554-1.239 1.238 0 0.686 0.554 1.239 1.239 1.239h5.951c1.366 0 2.478-1.111 2.478-2.478v-5.801c0-0.683-0.554-1.238-1.239-1.238zM0 5.55v5.802c0 0.683 0.554 1.238 1.238 1.238s1.238-0.555 1.238-1.238v-5.802h5.952c0.684 0 1.238-0.554 1.238-1.238s-0.554-1.238-1.238-1.238h-5.951c-1.366-0.001-2.478 1.111-2.478 2.476zM32 11.35v-5.801c0-1.365-1.11-2.478-2.478-2.478h-5.951c-0.686 0-1.239 0.554-1.239 1.238s0.554 1.238 1.239 1.238h5.951v5.801c0 0.683 0.554 1.237 1.238 1.237 0.686 0.002 1.239-0.553 1.239-1.236z"],setting:["0 0 32 28","M28.633 17.104c0.035 0.21 0.026 0.463-0.026 0.76s-0.14 0.598-0.262 0.904c-0.122 0.306-0.271 0.581-0.445 0.825s-0.367 0.419-0.576 0.524c-0.209 0.105-0.393 0.157-0.55 0.157s-0.332-0.035-0.524-0.105c-0.175-0.052-0.393-0.1-0.655-0.144s-0.528-0.052-0.799-0.026c-0.271 0.026-0.541 0.083-0.812 0.17s-0.502 0.236-0.694 0.445c-0.419 0.437-0.664 0.934-0.734 1.493s0.009 1.092 0.236 1.598c0.175 0.349 0.148 0.699-0.079 1.048-0.105 0.14-0.271 0.284-0.498 0.432s-0.476 0.284-0.747 0.406-0.555 0.218-0.851 0.288c-0.297 0.070-0.559 0.105-0.786 0.105-0.157 0-0.306-0.061-0.445-0.183s-0.236-0.253-0.288-0.393h-0.026c-0.192-0.541-0.52-1.009-0.982-1.402s-1-0.589-1.611-0.589c-0.594 0-1.131 0.197-1.611 0.589s-0.816 0.851-1.009 1.375c-0.087 0.21-0.218 0.362-0.393 0.458s-0.367 0.144-0.576 0.144c-0.244 0-0.52-0.044-0.825-0.131s-0.611-0.197-0.917-0.327c-0.306-0.131-0.581-0.284-0.825-0.458s-0.428-0.349-0.55-0.524c-0.087-0.122-0.135-0.266-0.144-0.432s0.057-0.397 0.197-0.694c0.192-0.402 0.266-0.86 0.223-1.375s-0.266-0.991-0.668-1.428c-0.244-0.262-0.541-0.432-0.891-0.511s-0.681-0.109-0.995-0.092c-0.367 0.017-0.742 0.087-1.127 0.21-0.244 0.070-0.489 0.052-0.734-0.052-0.192-0.070-0.371-0.231-0.537-0.485s-0.314-0.533-0.445-0.838c-0.131-0.306-0.231-0.62-0.301-0.943s-0.087-0.59-0.052-0.799c0.052-0.384 0.227-0.629 0.524-0.734 0.524-0.21 0.995-0.555 1.415-1.035s0.629-1.017 0.629-1.611c0-0.611-0.21-1.144-0.629-1.598s-0.891-0.786-1.415-0.996c-0.157-0.052-0.288-0.179-0.393-0.38s-0.157-0.406-0.157-0.616c0-0.227 0.035-0.48 0.105-0.76s0.162-0.55 0.275-0.812 0.244-0.502 0.393-0.72c0.148-0.218 0.31-0.38 0.485-0.485 0.14-0.087 0.275-0.122 0.406-0.105s0.275 0.052 0.432 0.105c0.524 0.21 1.070 0.275 1.637 0.197s1.070-0.327 1.506-0.747c0.21-0.209 0.362-0.467 0.458-0.773s0.157-0.607 0.183-0.904c0.026-0.297 0.026-0.568 0-0.812s-0.048-0.419-0.065-0.524c-0.035-0.105-0.066-0.227-0.092-0.367s-0.013-0.262 0.039-0.367c0.105-0.244 0.293-0.458 0.563-0.642s0.563-0.336 0.878-0.458c0.314-0.122 0.62-0.214 0.917-0.275s0.533-0.092 0.707-0.092c0.227 0 0.406 0.074 0.537 0.223s0.223 0.301 0.275 0.458c0.192 0.471 0.507 0.886 0.943 1.244s0.952 0.537 1.546 0.537c0.611 0 1.153-0.17 1.624-0.511s0.803-0.773 0.996-1.297c0.070-0.14 0.179-0.284 0.327-0.432s0.301-0.223 0.458-0.223c0.244 0 0.511 0.035 0.799 0.105s0.572 0.166 0.851 0.288c0.279 0.122 0.537 0.279 0.773 0.472s0.423 0.402 0.563 0.629c0.087 0.14 0.113 0.293 0.079 0.458s-0.070 0.284-0.105 0.354c-0.227 0.506-0.297 1.039-0.21 1.598s0.341 1.048 0.76 1.467c0.419 0.419 0.934 0.651 1.546 0.694s1.179-0.057 1.703-0.301c0.14-0.087 0.31-0.122 0.511-0.105s0.371 0.096 0.511 0.236c0.262 0.244 0.493 0.616 0.694 1.113s0.336 1 0.406 1.506c0.035 0.297-0.013 0.528-0.144 0.694s-0.266 0.275-0.406 0.327c-0.542 0.192-1.004 0.528-1.388 1.009s-0.576 1.026-0.576 1.637c0 0.594 0.162 1.113 0.485 1.559s0.747 0.764 1.27 0.956c0.122 0.070 0.227 0.14 0.314 0.21 0.192 0.157 0.323 0.358 0.393 0.602v0zM16.451 19.462c0.786 0 1.528-0.149 2.227-0.445s1.305-0.707 1.821-1.231c0.515-0.524 0.921-1.131 1.218-1.821s0.445-1.428 0.445-2.214c0-0.786-0.148-1.524-0.445-2.214s-0.703-1.292-1.218-1.808c-0.515-0.515-1.122-0.921-1.821-1.218s-1.441-0.445-2.227-0.445c-0.786 0-1.524 0.148-2.214 0.445s-1.292 0.703-1.808 1.218c-0.515 0.515-0.921 1.118-1.218 1.808s-0.445 1.428-0.445 2.214c0 0.786 0.149 1.524 0.445 2.214s0.703 1.297 1.218 1.821c0.515 0.524 1.118 0.934 1.808 1.231s1.428 0.445 2.214 0.445v0z"],right:["0 0 32 32","M22 16l-10.105-10.6-1.895 1.987 8.211 8.613-8.211 8.612 1.895 1.988 8.211-8.613z"],comment:["0 0 32 32","M27.128 0.38h-22.553c-2.336 0-4.229 1.825-4.229 4.076v16.273c0 2.251 1.893 4.076 4.229 4.076h4.229v-2.685h8.403l-8.784 8.072 1.566 1.44 7.429-6.827h9.71c2.335 0 4.229-1.825 4.229-4.076v-16.273c0-2.252-1.894-4.076-4.229-4.076zM28.538 19.403c0 1.5-1.262 2.717-2.819 2.717h-8.36l-0.076-0.070-0.076 0.070h-11.223c-1.557 0-2.819-1.217-2.819-2.717v-13.589c0-1.501 1.262-2.718 2.819-2.718h19.734c1.557 0 2.819-0.141 2.819 1.359v14.947zM9.206 10.557c-1.222 0-2.215 0.911-2.215 2.036s0.992 2.035 2.215 2.035c1.224 0 2.216-0.911 2.216-2.035s-0.992-2.036-2.216-2.036zM22.496 10.557c-1.224 0-2.215 0.911-2.215 2.036s0.991 2.035 2.215 2.035c1.224 0 2.215-0.911 2.215-2.035s-0.991-2.036-2.215-2.036zM15.852 10.557c-1.224 0-2.215 0.911-2.215 2.036s0.991 2.035 2.215 2.035c1.222 0 2.215-0.911 2.215-2.035s-0.992-2.036-2.215-2.036z"],"comment-off":["0 0 32 32","M27.090 0.131h-22.731c-2.354 0-4.262 1.839-4.262 4.109v16.401c0 2.269 1.908 4.109 4.262 4.109h4.262v-2.706h8.469l-8.853 8.135 1.579 1.451 7.487-6.88h9.787c2.353 0 4.262-1.84 4.262-4.109v-16.401c0-2.27-1.909-4.109-4.262-4.109v0zM28.511 19.304c0 1.512-1.272 2.738-2.841 2.738h-8.425l-0.076-0.070-0.076 0.070h-11.311c-1.569 0-2.841-1.226-2.841-2.738v-13.696c0-1.513 1.272-2.739 2.841-2.739h19.889c1.569 0 2.841-0.142 2.841 1.37v15.064z"],send:["0 0 32 32","M13.725 30l3.9-5.325-3.9-1.125v6.45zM0 17.5l11.050 3.35 13.6-11.55-10.55 12.425 11.8 3.65 6.1-23.375-32 15.5z"],menu:["0 0 22 32","M20.8 14.4q0.704 0 1.152 0.48t0.448 1.12-0.48 1.12-1.12 0.48h-19.2q-0.64 0-1.12-0.48t-0.48-1.12 0.448-1.12 1.152-0.48h19.2zM1.6 11.2q-0.64 0-1.12-0.48t-0.48-1.12 0.448-1.12 1.152-0.48h19.2q0.704 0 1.152 0.48t0.448 1.12-0.48 1.12-1.12 0.48h-19.2zM20.8 20.8q0.704 0 1.152 0.48t0.448 1.12-0.48 1.12-1.12 0.48h-19.2q-0.64 0-1.12-0.48t-0.48-1.12 0.448-1.12 1.152-0.48h19.2z"],camera:["0 0 32 32","M16 23c-3.309 0-6-2.691-6-6s2.691-6 6-6 6 2.691 6 6-2.691 6-6 6zM16 13c-2.206 0-4 1.794-4 4s1.794 4 4 4c2.206 0 4-1.794 4-4s-1.794-4-4-4zM27 28h-22c-1.654 0-3-1.346-3-3v-16c0-1.654 1.346-3 3-3h3c0.552 0 1 0.448 1 1s-0.448 1-1 1h-3c-0.551 0-1 0.449-1 1v16c0 0.552 0.449 1 1 1h22c0.552 0 1-0.448 1-1v-16c0-0.551-0.448-1-1-1h-11c-0.552 0-1-0.448-1-1s0.448-1 1-1h11c1.654 0 3 1.346 3 3v16c0 1.654-1.346 3-3 3zM24 10.5c0 0.828 0.672 1.5 1.5 1.5s1.5-0.672 1.5-1.5c0-0.828-0.672-1.5-1.5-1.5s-1.5 0.672-1.5 1.5zM15 4c0 0.552-0.448 1-1 1h-4c-0.552 0-1-0.448-1-1v0c0-0.552 0.448-1 1-1h4c0.552 0 1 0.448 1 1v0z"]};e.exports=function(e){return'\n \n \n \n \n'}},function(e,t,n){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},s=function(){function e(e,t){for(var n=0;n0?t:0,t=t<1?t:1,g[e+"Bar"].style[n]=100*t+"%"};var i=["play","pause","canplay","playing","ended","error"];this.event={};for(var s=0;sL+.01&&!n.video.attr("paused")&&(n.element.classList.remove("dplayer-loading"),x=!1),L=E,n.updateBar("played",n.video.currentTime()/n.video.duration,"width"),n.element.getElementsByClassName("dplayer-ptime")[0].innerHTML=l.secondToTime(n.video.currentTime()),n.trigger("playing")),n.danmakuTime&&n.option.danmaku&&j&&n.dan){for(var e=n.dan[n.danIndex],t=[];e&&n.video.currentTime()>parseFloat(e.time);)t.push(e),e=n.dan[++n.danIndex];n.pushDanmaku(t)}requestAnimationFrame(n.animationFrame)},requestAnimationFrame(this.animationFrame),this.setTime=function(e){e?n[e+"Time"]=!0:(n.danmakuTime=!0,n.playedTime=!0)},this.clearTime=function(e){e?n[e+"Time"]=!1:(n.danmakuTime=!1,n.playedTime=!1)},k.addEventListener("click",function(e){var t=e||window.event;w=k.clientWidth;var a=(t.clientX-l.getElementViewLeft(k))/w;a=a>0?a:0,a=a<1?a:1,n.updateBar("played",a,"width"),n.video.seek(parseFloat(g.playedBar.style.width)/100*n.video.duration)}),this.isTipsShow=!1,this.timeTipsHandler=this.timeTipsHandler(k,b).bind(this),k.addEventListener("mousemove",this.timeTipsHandler),k.addEventListener("mouseover",this.timeTipsHandler),k.addEventListener("mouseenter",this.timeTipsHandler),k.addEventListener("mouseout",this.timeTipsHandler),k.addEventListener("mouseleave",this.timeTipsHandler);var T=function(e){var t=e||window.event,a=(t.clientX-l.getElementViewLeft(k))/w;a=a>0?a:0,a=a<1?a:1,n.updateBar("played",a,"width"),n.element.getElementsByClassName("dplayer-ptime")[0].innerHTML=l.secondToTime(a*n.video.duration)},B=function e(){document.removeEventListener("mouseup",e),document.removeEventListener("mousemove",T),n.video.seek(parseFloat(g.playedBar.style.width)/100*n.video.duration),n.setTime()};k.addEventListener("mousedown",function(){w=k.clientWidth,n.clearTime(),document.addEventListener("mousemove",T),document.addEventListener("mouseup",B)}),g.volumeBar=this.element.getElementsByClassName("dplayer-volume-bar-inner")[0];var q=this.element.getElementsByClassName("dplayer-volume")[0],C=this.element.getElementsByClassName("dplayer-volume-bar-wrap")[0],M=this.element.getElementsByClassName("dplayer-volume-bar")[0],N=this.element.getElementsByClassName("dplayer-volume-icon")[0];this.switchVolumeIcon=function(){var e=n.element.getElementsByClassName("dplayer-volume-icon")[0];n.video.attr("volume")>=.8?e.innerHTML=o("volume-up"):n.video.attr("volume")>0?e.innerHTML=o("volume-down"):e.innerHTML=o("volume-off")};var z=function(e){var t=e||window.event,a=(t.clientX-l.getElementViewLeft(M)-5.5)/35;n.volume(a)},D=function e(){document.removeEventListener("mouseup",e),document.removeEventListener("mousemove",z),q.classList.remove("dplayer-volume-active")};C.addEventListener("click",function(e){var t=e||window.event,a=(t.clientX-l.getElementViewLeft(M)-5.5)/35;n.volume(a)}),C.addEventListener("mousedown",function(){document.addEventListener("mousemove",z),document.addEventListener("mouseup",D),q.classList.add("dplayer-volume-active")}),N.addEventListener("click",function(){n.video.attr("muted")?(n.video.attr("muted",!1),n.switchVolumeIcon(),n.updateBar("volume",n.video.attr("volume"),"width")):(n.video.attr("muted",!0),N.innerHTML=o("volume-off"),n.updateBar("volume",0,"width"))});var S=0;if(!p){var H=function(){n.element.classList.remove("dplayer-hide-controller"),clearTimeout(S),S=setTimeout(function(){n.video.attr("played").length&&(n.element.classList.add("dplayer-hide-controller"),O(),ne())},2e3)};this.element.addEventListener("mousemove",H),this.element.addEventListener("click",H)}this.danOpacity=localStorage.getItem("DPlayer-opacity")||.7;var I=c.setting(this.tran),P=this.element.getElementsByClassName("dplayer-setting-icon")[0],A=this.element.getElementsByClassName("dplayer-setting-box")[0],F=this.element.getElementsByClassName("dplayer-mask")[0];A.innerHTML=I.original;var O=function(){A.classList.contains("dplayer-setting-box-open")&&(A.classList.remove("dplayer-setting-box-open"),F.classList.remove("dplayer-mask-show"),setTimeout(function(){A.classList.remove("dplayer-setting-box-narrow"),A.innerHTML=I.original,X()},300))},V=function(){A.classList.add("dplayer-setting-box-open"),F.classList.add("dplayer-mask-show")};F.addEventListener("click",function(){O()}),P.addEventListener("click",function(){V()}),this.loop=this.option.loop;var R=this.element.getElementsByClassName("dplayer-danmaku")[0],j=!0,X=function(){var e=n.element.getElementsByClassName("dplayer-setting-loop")[0],t=e.getElementsByClassName("dplayer-toggle-setting-input")[0];t.checked=n.loop,e.addEventListener("click",function(){t.checked=!t.checked,t.checked?n.loop=!0:n.loop=!1,O()});var a=n.element.getElementsByClassName("dplayer-setting-showdan")[0],i=a.getElementsByClassName("dplayer-showdan-setting-input")[0];if(i.checked=j,a.addEventListener("click",function(){if(i.checked=!i.checked,i.checked){if(j=!0,n.option.danmaku){for(var e=0;e=n.video.currentTime()){n.danIndex=e;break}n.danIndex=n.dan.length}n.paused||n.setTime("danmaku")}}else j=!1,n.option.danmaku&&(n.clearTime("danmaku"),R.innerHTML='
',n.danTunnel={right:{},top:{},bottom:{}},n.itemDemo=n.element.getElementsByClassName("dplayer-danmaku-item")[0]);O()}),n.element.getElementsByClassName("dplayer-setting-speed")[0].addEventListener("click",function(){A.classList.add("dplayer-setting-box-narrow"),A.innerHTML=I.speed;for(var e=A.getElementsByClassName("dplayer-setting-speed-item"),t=0;t0?a:0,a=a<1?a:1,n.updateBar("danmaku",a,"width");for(var i=n.element.getElementsByClassName("dplayer-danmaku-item"),s=0;s0?a:0,a=a<1?a:1,n.updateBar("danmaku",a,"width");for(var i=n.element.getElementsByClassName("dplayer-danmaku-item"),s=0;s/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")},G=function(){if(W.blur(),!W.value.replace(/^\s+|\s+$/g,""))return void n.notice(n.tran("Please input danmaku content!"));var e={token:n.option.danmaku.token,player:n.option.danmaku.id,author:n.option.danmaku.user,time:n.video.currentTime(),text:W.value,color:n.element.querySelector(".dplayer-comment-setting-color input:checked").value,type:n.element.querySelector(".dplayer-comment-setting-type input:checked").value};n.option.apiBackend.send(n.option.danmaku.api,e),W.value="",ne(),n.dan.splice(n.danIndex,0,e),n.danIndex++;var t={text:J(e.text),color:e.color,type:e.type};n.pushDanmaku(t).style.border="2px solid "+n.option.theme},K=function(){$.classList.contains("dplayer-comment-setting-open")&&$.classList.remove("dplayer-comment-setting-open")},Z=function(){$.classList.contains("dplayer-comment-setting-open")?$.classList.remove("dplayer-comment-setting-open"):$.classList.add("dplayer-comment-setting-open")},ee=0,te=0,ne=function(){_.classList.contains("dplayer-comment-box-open")&&(_.classList.remove("dplayer-comment-box-open"),F.classList.remove("dplayer-mask-show"),n.element.classList.remove("dplayer-show-controller"),clearInterval(ee),clearTimeout(te),K())},ae=function(){_.classList.contains("dplayer-comment-box-open")||(_.classList.add("dplayer-comment-box-open"),F.classList.add("dplayer-mask-show"),n.element.classList.add("dplayer-show-controller"),ee=setInterval(function(){clearTimeout(S)},1e3),te=setTimeout(function(){W.focus()},300))};F.addEventListener("click",function(){ne()}),Q.addEventListener("click",function(){ae()}),Y.addEventListener("click",function(){Z()}),this.element.getElementsByClassName("dplayer-comment-setting-color")[0].addEventListener("click",function(){n.element.querySelector('input[name="dplayer-danmaku-color-${index}"]:checked+span')&&(Y.getElementsByClassName("dplayer-fill")[0].style.fill=n.element.querySelector('input[name="dplayer-danmaku-color-${index}"]:checked').value)}),W.addEventListener("click",function(){K()}),W.addEventListener("keydown",function(e){13===(e||window.event).keyCode&&G()}),U.addEventListener("click",G);var ie=function(){for(var e=R.offsetWidth,t=n.element.getElementsByClassName("dplayer-danmaku-item"),a=0;a=a.width?(le.style.right=a.width-i+"px",le.style.left="initial"):(le.style.left=t.clientX-n.element.getBoundingClientRect().left+"px",le.style.right="initial"),s+le.offsetHeight>=a.height?(le.style.bottom=a.height-s+"px",le.style.top="initial"):(le.style.top=t.clientY-n.element.getBoundingClientRect().top+"px",le.style.bottom="initial"),F.classList.add("dplayer-mask-show"),F.addEventListener("click",function(){F.classList.remove("dplayer-mask-show"),le.classList.remove("dplayer-menu-show")})}),this.option.video.quality&&this.element.getElementsByClassName("dplayer-quality-list")[0].addEventListener("click",function(e){e.target.classList.contains("dplayer-quality-item")&&n.switchQuality(e.target.dataset.index)}),this.option.screenshot){var oe=this.element.getElementsByClassName("dplayer-camera-icon")[0];oe.addEventListener("click",function(){var e=document.createElement("canvas");e.width=n.video.attr("videoWidth"),e.height=n.video.attr("videoHeight"),e.getContext("2d").drawImage(n.video.current,0,0,e.width,e.height),oe.href=e.toDataURL(),oe.download="DPlayer.png"})}m++}return s(e,[{key:"play",value:function(e){"[object Number]"===Object.prototype.toString.call(e)&&this.video.seek(e),this.paused=!1,this.video.attr("paused")&&(this.bezel.innerHTML=o("play"),this.bezel.classList.add("dplayer-bezel-transition")),this.playButton.innerHTML=o("pause"),this.video.play(),this.setTime(),this.element.classList.add("dplayer-playing"),this.trigger("play")}},{key:"pause",value:function(){this.paused=!0,this.element.classList.remove("dplayer-loading"),this.video.attr("paused")||(this.bezel.innerHTML=o("pause"),this.bezel.classList.add("dplayer-bezel-transition")),this.ended=!1,this.playButton.innerHTML=o("play"),this.video.pause(),this.clearTime(),this.element.classList.remove("dplayer-playing"),this.trigger("pause")}},{key:"volume",value:function(e){e=e>0?e:0,e=e<1?e:1,this.updateBar("volume",e,"width"),this.video.attr("volume",e),this.video.attr("muted")&&this.video.attr("muted",!1),this.switchVolumeIcon()}},{key:"toggle",value:function(){this.video.attr("paused")?this.play():this.pause()}},{key:"on",value:function(e,t){"function"==typeof t&&this.event[e].push(t)}},{key:"_readAllEndpoints",value:function(e,t){for(var n=this,a=[],i=0,s=0;s',this.danTuel={right:{},top:{},bottom:{}},this.itemDemo=this.element.getElementsByClassName("dplayer-danmaku-item")[0],this.option.danmaku=t,this.readDanmaku())}},{key:"initVideo",value:function(){var e=this;if(("auto"===this.option.video.type?/m3u8(#|\?|$)/i.exec(this.option.video.url):"hls"===this.option.video.type)&&Hls.isSupported()){var t=new Hls;t.attachMedia(this.video.current),t.on(Hls.Events.MEDIA_ATTACHED,function(){t.loadSource(e.option.video.url),t.on(Hls.Events.MANIFEST_PARSED,function(e,t){this.notice("manifest loaded, found "+t.levels.length+" quality level")})})}if(("auto"===this.option.video.type?/.flv(#|\?|$)/i.exec(this.option.video.url):"flv"===this.option.video.type)&&flvjs.isSupported()){var n=flvjs.createPlayer({type:"flv",url:this.option.video.url});n.attachMediaElement(this.video.current),n.load()}this.option.danmaku&&this.video.on("all","seeking",function(){for(var t=0;t=e.video.currentTime())return void(e.danIndex=t);e.danIndex=e.dan.length}}),this.video.on("all","durationchange",function(t,n){1!==n.duration&&(e.element.getElementsByClassName("dplayer-dtime")[0].innerHTML=l.secondToTime(e.video.duration))}),this.video.on("current","progress",function(t,n){var a=n.buffered.length?n.buffered.end(n.buffered.length-1)/n.duration:0;e.updateBar("loaded",a,"width")}),this.video.on("all","error",function(){e.notice(e.tran("This video fails to load"),-1),e.trigger("pause")}),this.video.on("current","canplay",function(){e.trigger("canplay")}),this.ended=!1,this.video.on("all","ended",function(t){t===e.video.videos.length-1&&(e.updateBar("played",1,"width"),e.loop?(e.video.switch(0),e.video.play()):(e.ended=!0,e.pause(),e.trigger("ended")),e.danIndex=0)}),this.video.on("current","play",function(){e.paused&&e.play()}),this.video.on("current","pause",function(){e.paused||e.pause()}),this.video.attr("volume",parseInt(this.element.getElementsByClassName("dplayer-volume-bar-inner")[0].style.width)/100)}},{key:"switchQuality",value:function(e){var t=this;if(this.qualityIndex!==e&&!this.switchingQuality){this.qualityIndex=e,this.switchingQuality=!0,this.quality=this.option.video.quality[e],this.element.getElementsByClassName("dplayer-quality-icon")[0].innerHTML=this.quality.name,this.video.pause();var n=c.video(!1,null,this.option.screenshot,"auto",this.quality.url),a=(new DOMParser).parseFromString(n,"text/html").body.firstChild,i=this.element.getElementsByClassName("dplayer-video-wrap")[0];i.prepend(a),this.prevVideo=this.video,this.video=new u([a],this.prevVideo.duration),this.initVideo(),this.video.seek(this.prevVideo.currentTime()),this.notice(this.tran("Switching to")+" "+this.quality.name+" "+this.tran("quality"),-1),this.video.on("current","canplay",function(){if(t.prevVideo){if(t.video.currentTime()!==t.prevVideo.currentTime())return void t.video.seek(t.prevVideo.currentTime());i.removeChild(t.prevVideo.current),t.video.current.classList.add("dplayer-video-current"),t.video.play(),t.prevVideo=null,t.notice(t.tran("Switched to")+" "+t.quality.name+" "+t.tran("quality")),t.switchingQuality=!1}})}}},{key:"timeTipsHandler",value:function(e,t){var n=this,a=function(e){var t=0,n=0;do{t+=e.offsetTop||0,n+=e.offsetLeft||0,e=e.offsetParent}while(e);return{top:t,left:n}};return function(i){if(n.video.duration){var s=i.clientX,o=a(e).left,d=s-o;switch(t.innerText=l.secondToTime(n.video.duration*(d/e.offsetWidth)),t.style.left=d-20+"px",i.type){case"mouseenter":case"mouseover":case"mousemove":if(n.isTipsShow)return;t.classList.remove("hidden"),n.isTipsShow=!0;break;case"mouseleave":case"mouseout":if(!n.isTipsShow)return;t.classList.add("hidden"),n.isTipsShow=!1}}}}},{key:"notice",value:function(e,t){var n=this.element.getElementsByClassName("dplayer-notice")[0];n.innerHTML=e,n.style.opacity=1,this.noticeTime&&clearTimeout(this.noticeTime),t&&t<0||(this.noticeTime=setTimeout(function(){n.style.opacity=0},t||2e3))}}]),e}();e.exports=v},function(e,t){},function(e,t,n){"use strict";e.exports={secondToTime:function(e){var t=function(e){return e<10?"0"+e:""+e},n=parseInt(e/60),a=parseInt(e-60*n);return t(n)+":"+t(a)},getElementViewLeft:function(e){var t=e.offsetLeft,n=e.offsetParent,a=document.body.scrollLeft+document.documentElement.scrollLeft;if(document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement)for(;null!==n&&n!==e;)t+=n.offsetLeft,n=n.offsetParent;else for(;null!==n;)t+=n.offsetLeft,n=n.offsetParent;return t-a}}},function(e,t,n){"use strict";var a=n(5);e.exports=function(e){/mobile/i.test(window.navigator.userAgent)&&(e.autoplay=!1);var t={element:document.getElementsByClassName("dplayer")[0],autoplay:!1,theme:"#b7daff",loop:!1,lang:-1!==navigator.language.indexOf("zh")?"zh":"en",screenshot:!1,hotkey:!0,preload:"auto",apiBackend:a,contextmenu:[{text:"关于作者",link:"http://diygod.me"},{text:"播放器意见反馈",link:"https://github.com/DIYgod/DPlayer/issues"},{text:"关于 DPlayer 播放器",link:"https://github.com/DIYgod/DPlayer"}]};for(var n in t)t.hasOwnProperty(n)&&!e.hasOwnProperty(n)&&(e[n]=t[n]);return"[object Array]"!==Object.prototype.toString.call(e.video.url)&&(e.video.url=[e.video.url]),e.video&&!e.video.hasOwnProperty("type")&&(e.video.type="auto"),e.danmaku&&!e.danmaku.hasOwnProperty("user")&&(e.danmaku.user="DIYgod"),e.video.quality&&(e.video.url=[e.video.quality[e.video.defaultQuality].url]),e}},function(e,t,n){"use strict";var a=function(e,t,n,a,i){var s=new XMLHttpRequest;s.onreadystatechange=function(){if(4===s.readyState){if(s.status>=200&&s.status<300||304===s.status){var e=JSON.parse(s.responseText);return 1!==e.code?a(s,e):n(s,e)}i(s)}},s.open(null!==t?"POST":"GET",e,!0),s.send(null!==t?JSON.stringify(t):null)};e.exports={send:function(e,t){a(e,t,function(e,t){console.log("Post danmaku: ",t)},function(e,t){alert(t.msg)},function(e){console.log("Request was unsuccessful: "+e.status)})},read:function(e,t){a(e,null,function(e,n){t(null,n.danmaku)},function(e,n){t({status:e.status,response:n})},function(e){t({status:e.status,response:null})})}}},function(e,t,n){"use strict";var a={"Danmaku is loading":"弹幕加载中",Top:"顶部",Bottom:"底部",Rolling:"滚动","Input danmaku, hit Enter":"输入弹幕,回车发送","About author":"关于作者","DPlayer feedback":"播放器意见反馈","About DPlayer":"关于 DPlayer 播放器",Loop:"洗脑循环",Speed:"速度","Opacity for danmaku":"弹幕透明度",Normal:"正常","Please input danmaku content!":"要输入弹幕内容啊喂!","Set danmaku color":"设置弹幕颜色","Set danmaku type":"设置弹幕类型",Danmaku:"弹幕","This video fails to load":"视频加载失败","Switching to":"正在切换至","Switched to":"已经切换至",quality:"画质"};e.exports=function(e){var t=this;this.lang=e,this.tran=function(e){return"en"===t.lang?e:"zh"===t.lang?a[e]:void 0}}},function(e,t,n){"use strict";var a=n(0),i={main:function(e,t,n){for(var s="",l=0;l\n
\n '+s+"\n "+(e.logo?'\n \n ':"")+'\n
\n
\n
\n
\n \n '+(e.danmaku?''+n("Danmaku is loading")+"":"")+'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n
\n
\n
\n 0:00 / 0:00\n
\n
\n '+(e.video.quality?'\n
\n \n
\n '+i.qualityList(e.video.quality)+"\n
\n
\n ":"")+"\n "+(e.screenshot?'\n \n '+a("camera")+"\n \n ":"")+'\n
\n \n
\n \n
\n
\n
'+n("Set danmaku color")+'
\n \n \n \n \n \n \n
\n
\n
'+n("Set danmaku type")+'
\n \n \n \n
\n
\n \n \n
\n
\n
\n \n
\n
\n
\n \n \n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
\n
\n '+i.contextmenuList(e.contextmenu)+'\n
'},contextmenuList:function(e){for(var t='";return t+=""},qualityList:function(e){for(var t='
',n=0;n'+e[n].name+"
";return t+=""},video:function(e,t,n,a,i){return''},setting:function(e){return{original:'\n
\n '+e("Speed")+'\n
\n '+a("right")+'\n
\n
\n
\n '+e("Loop")+'\n
\n \n \n
\n
\n
\n '+e("Danmaku")+'\n
\n \n \n
\n
\n
\n '+e("Opacity for danmaku")+'\n
\n
\n
\n \n
\n
\n
\n
',speed:'\n
\n 0.5\n
\n
\n 0.75\n
\n
\n '+e("Normal")+'\n
\n
\n 1.25\n
\n
\n 1.5\n
\n
\n 2\n
'}}};e.exports=i},function(e,t,n){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=function(){function e(e,t){for(var n=0;n1,this.index=0,this.current=this.videos[this.index],this.duration=n||0,this.durationArr=[],this.eventAll=[],this.eventCurrent=[],this.on("all","durationchange",function(e,t){1!==t.duration&&(i.durationArr[e]=t.duration,n||(i.duration=i.durationArr.reduce(function(e,t){return e+t})))}),this.on("current","end",function(){i.switch(i.index+1)})}return i(e,[{key:"switch",value:function(e,t){this.index!==e?(this.videos[e].classList.add("dplayer-video-current"),this.current.paused||this.videos[e].play(),this.current.classList.remove("dplayer-video-current"),this.current.pause(),this.index=e,this.current=this.videos[this.index],this.videos[e].currentTime=t||0):this.videos[e].currentTime=t||0}},{key:"on",value:function(e,t,n){var a=this;if("function"==typeof n&&("all"===e?(this.eventAll[t]||(this.eventAll[t]=[]),this.eventAll[t].push(n)):(this.eventCurrent[t]||(this.eventCurrent[t]=[]),this.eventCurrent[t].push(n)),-1===["seeking"].indexOf(t)))for(var i=0;i\\n \\n \\n \\n';\n};\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar svg = __webpack_require__(0);\n\nvar html = {\n main: function main(option, index, tran) {\n var videos = '';\n for (var i = 0; i < option.video.url.length; i++) {\n videos += html.video(i === 0, option.video.pic, option.screenshot, option.video.url.length ? 'metadata' : option.preload, option.video.url[i]);\n }\n return '\\n
\\n
\\n ' + videos + '\\n ' + (option.logo ? '\\n
\\n ' : '') + '\\n
\\n
\\n
\\n
\\n \\n ' + (option.danmaku ? '' + tran('Danmaku is loading') + '' : '') + '\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n
\\n
\\n
\\n
\\n
\\n \\n
\\n \\n
\\n
\\n
\\n \\n
\\n
\\n
\\n
\\n 0:00 / 0:00\\n
\\n
\\n ' + (option.video.quality ? '\\n
\\n \\n
\\n ' + html.qualityList(option.video.quality) + '\\n
\\n
\\n ' : '') + '\\n ' + (option.screenshot ? '\\n \\n ' + svg('camera') + '\\n \\n ' : '') + '\\n
\\n \\n
\\n \\n
\\n
\\n
' + tran('Set danmaku color') + '
\\n \\n \\n \\n \\n \\n \\n
\\n
\\n
' + tran('Set danmaku type') + '
\\n \\n \\n \\n
\\n
\\n \\n \\n
\\n
\\n
\\n \\n
\\n
\\n
\\n \\n \\n
\\n
\\n
\\n
00:00
\\n
\\n
\\n
\\n \\n
\\n
\\n
\\n
\\n ' + html.contextmenuList(option.contextmenu) + '\\n
';\n },\n\n contextmenuList: function contextmenuList(contextmenu) {\n var result = '
';\n for (var i = 0; i < contextmenu.length; i++) {\n result += '';\n }\n result += '
';\n\n return result;\n },\n\n qualityList: function qualityList(quality) {\n var result = '
';\n for (var i = 0; i < quality.length; i++) {\n result += '
' + quality[i].name + '
';\n }\n result += '
';\n\n return result;\n },\n\n video: function video(current, pic, screenshot, preload, url) {\n return '';\n },\n\n setting: function setting(tran) {\n return {\n 'original': '\\n
\\n ' + tran('Speed') + '\\n
\\n ' + svg('right') + '\\n
\\n
\\n
\\n ' + tran('Loop') + '\\n
\\n \\n \\n
\\n
\\n
\\n ' + tran('Danmaku') + '\\n
\\n \\n \\n
\\n
\\n
\\n ' + tran('Opacity for danmaku') + '\\n
\\n
\\n
\\n \\n
\\n
\\n
\\n
',\n 'speed': '\\n
\\n 0.5\\n
\\n
\\n 0.75\\n
\\n
\\n ' + tran('Normal') + '\\n
\\n
\\n 1.25\\n
\\n
\\n 1.5\\n
\\n
\\n 2\\n
'\n };\n }\n};\n\nmodule.exports = html;\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar tranZH = {\n 'Danmaku is loading': '弹幕加载中',\n 'Top': '顶部',\n 'Bottom': '底部',\n 'Rolling': '滚动',\n 'Input danmaku, hit Enter': '输入弹幕,回车发送',\n 'About author': '关于作者',\n 'DPlayer feedback': '播放器意见反馈',\n 'About DPlayer': '关于 DPlayer 播放器',\n 'Loop': '洗脑循环',\n 'Speed': '速度',\n 'Opacity for danmaku': '弹幕透明度',\n 'Normal': '正常',\n 'Please input danmaku content!': '要输入弹幕内容啊喂!',\n 'Set danmaku color': '设置弹幕颜色',\n 'Set danmaku type': '设置弹幕类型',\n 'Danmaku': '弹幕',\n 'This video fails to load': '视频加载失败',\n 'Switching to': '正在切换至',\n 'Switched to': '已经切换至',\n 'quality': '画质'\n};\n\nmodule.exports = function (lang) {\n var _this = this;\n\n this.lang = lang;\n this.tran = function (text) {\n if (_this.lang === 'en') {\n return text;\n } else if (_this.lang === 'zh') {\n return tranZH[text];\n }\n };\n};\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar defaultApiBackend = __webpack_require__(8);\n\nmodule.exports = function (option) {\n var isMobile = /mobile/i.test(window.navigator.userAgent);\n // compatibility: some mobile browsers don't suppose autoplay\n if (isMobile) {\n option.autoplay = false;\n }\n\n // default options\n var defaultOption = {\n element: document.getElementsByClassName('dplayer')[0],\n autoplay: false,\n theme: '#b7daff',\n loop: false,\n lang: navigator.language.indexOf('zh') !== -1 ? 'zh' : 'en',\n screenshot: false,\n hotkey: true,\n preload: 'auto',\n apiBackend: defaultApiBackend,\n contextmenu: [{\n text: '关于作者',\n link: 'http://diygod.me'\n }, {\n text: '播放器意见反馈',\n link: 'https://github.com/DIYgod/DPlayer/issues'\n }, {\n text: '关于 DPlayer 播放器',\n link: 'https://github.com/DIYgod/DPlayer'\n }]\n };\n for (var defaultKey in defaultOption) {\n if (defaultOption.hasOwnProperty(defaultKey) && !option.hasOwnProperty(defaultKey)) {\n option[defaultKey] = defaultOption[defaultKey];\n }\n }\n if (Object.prototype.toString.call(option.video.url) !== '[object Array]') {\n option.video.url = [option.video.url];\n }\n if (option.video && !option.video.hasOwnProperty('type')) {\n option.video.type = 'auto';\n }\n if (option.danmaku && !option.danmaku.hasOwnProperty('user')) {\n option.danmaku.user = 'DIYgod';\n }\n\n if (option.video.quality) {\n option.video.url = [option.video.quality[option.video.defaultQuality].url];\n }\n\n return option;\n};\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = {\n\n /**\n * Parse second to 00:00 format\n *\n * @param {Number} second\n * @return {String} 00:00 format\n */\n secondToTime: function secondToTime(second) {\n var add0 = function add0(num) {\n return num < 10 ? '0' + num : '' + num;\n };\n var min = parseInt(second / 60);\n var sec = parseInt(second - min * 60);\n return add0(min) + ':' + add0(sec);\n },\n\n /**\n * control play progress\n */\n // get element's view position\n getElementViewLeft: function getElementViewLeft(element) {\n var actualLeft = element.offsetLeft;\n var current = element.offsetParent;\n var elementScrollLeft = document.body.scrollLeft + document.documentElement.scrollLeft;\n if (!document.fullscreenElement && !document.mozFullScreenElement && !document.webkitFullscreenElement) {\n while (current !== null) {\n actualLeft += current.offsetLeft;\n current = current.offsetParent;\n }\n } else {\n while (current !== null && current !== element) {\n actualLeft += current.offsetLeft;\n current = current.offsetParent;\n }\n }\n return actualLeft - elementScrollLeft;\n }\n};\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Video = function () {\n function Video(videos, duration) {\n var _this = this;\n\n _classCallCheck(this, Video);\n\n this.videos = videos;\n this.multi = this.videos.length > 1;\n this.index = 0;\n this.current = this.videos[this.index];\n\n this.duration = duration || 0;\n this.durationArr = [];\n this.eventAll = [];\n this.eventCurrent = [];\n\n this.on('all', 'durationchange', function (i, video) {\n if (video.duration !== 1) {\n // some Android browsers will output 1 at first\n _this.durationArr[i] = video.duration;\n if (!duration) {\n _this.duration = _this.durationArr.reduce(function (sum, cur) {\n return sum + cur;\n });\n }\n }\n });\n this.on('current', 'end', function () {\n _this.switch(_this.index + 1);\n });\n }\n\n _createClass(Video, [{\n key: 'switch',\n value: function _switch(index, time) {\n if (this.index !== index) {\n this.videos[index].classList.add('dplayer-video-current');\n if (!this.current.paused) {\n this.videos[index].play();\n }\n this.current.classList.remove('dplayer-video-current');\n this.current.pause();\n\n this.index = index;\n this.current = this.videos[this.index];\n this.videos[index].currentTime = time ? time : 0;\n } else {\n this.videos[index].currentTime = time ? time : 0;\n }\n }\n\n // bind event \n\n }, {\n key: 'on',\n value: function on(type, event, callback) {\n var _this2 = this;\n\n if (typeof callback === 'function') {\n if (type === 'all') {\n if (!this.eventAll[event]) {\n this.eventAll[event] = [];\n }\n this.eventAll[event].push(callback);\n } else {\n if (!this.eventCurrent[event]) {\n this.eventCurrent[event] = [];\n }\n this.eventCurrent[event].push(callback);\n }\n\n if (['seeking'].indexOf(event) === -1) {\n var _loop = function _loop(i) {\n _this2.videos[i].addEventListener(event, function () {\n if (type === 'all' || _this2.videos[i] === _this2.current) {\n callback(i, _this2.videos[i]);\n }\n });\n };\n\n for (var i = 0; i < this.videos.length; i++) {\n _loop(i);\n }\n }\n }\n }\n\n // trigger event\n\n }, {\n key: 'trigger',\n value: function trigger(type, event) {\n var events = type === 'all' ? this.eventAll : this.eventCurrent;\n for (var i = 0; i < events[event].length; i++) {\n events[event][i]();\n }\n }\n }, {\n key: 'currentTime',\n value: function currentTime() {\n if (this.durationArr.slice(0, this.index).length) {\n return this.durationArr.slice(0, this.index).reduce(function (sum, cur) {\n return sum + cur;\n }) + this.current.currentTime;\n } else {\n return this.current.currentTime;\n }\n }\n }, {\n key: 'seek',\n value: function seek(time) {\n time = Math.max(time, 0);\n time = Math.min(time, this.duration);\n\n var i = 0;\n var tmptime = 0;\n while (tmptime <= time) {\n tmptime += this.durationArr[i];\n i++;\n }\n\n var currentTime = void 0;\n if (this.durationArr.slice(0, this.index).length) {\n currentTime = time - this.durationArr.slice(0, i - 1).reduce(function (sum, cur) {\n return sum + cur;\n });\n } else {\n currentTime = time;\n }\n\n this.switch(i - 1, currentTime);\n\n this.trigger('all', 'seeking');\n }\n }, {\n key: 'attr',\n value: function attr(option, value) {\n if (value !== undefined) {\n for (var i = 0; i < this.videos.length; i++) {\n this.videos[i][option] = value;\n }\n }\n return this.current[option];\n }\n }, {\n key: 'play',\n value: function play() {\n this.current.play();\n }\n }, {\n key: 'pause',\n value: function pause() {\n this.current.pause();\n }\n }, {\n key: 'toggle',\n value: function toggle() {\n this.current.paused ? this.play() : this.pause();\n }\n }]);\n\n return Video;\n}();\n\nmodule.exports = Video;\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nconsole.log('\\n %c DPlayer 1.3.2 %c http://dplayer.js.org \\n\\n', 'color: #fadfa3; background: #030307; padding:5px 0;', 'background: #fadfa3; padding:5px 0;');\n\n__webpack_require__(6);\nvar utils = __webpack_require__(4);\nvar svg = __webpack_require__(0);\nvar handleOption = __webpack_require__(3);\nvar i18n = __webpack_require__(2);\nvar html = __webpack_require__(1);\nvar Video = __webpack_require__(5);\nvar isMobile = /mobile/i.test(window.navigator.userAgent);\n\nvar index = 0;\n\nvar DPlayer = function () {\n\n /**\n * DPlayer constructor function\n *\n * @param {Object} option - See README\n * @constructor\n */\n function DPlayer(option) {\n var _this = this;\n\n _classCallCheck(this, DPlayer);\n\n this.option = handleOption(option);\n\n this.option.element.classList.add('dplayer');\n\n if (this.option.video.quality) {\n this.qualityIndex = this.option.video.defaultQuality;\n this.quality = this.option.video.quality[this.option.video.defaultQuality];\n }\n\n this.tran = new i18n(this.option.lang).tran;\n\n /**\n * Update progress bar, including loading progress bar and play progress bar\n *\n * @param {String} type - Point out which bar it is, should be played loaded or volume\n * @param {Number} percentage\n * @param {String} direction - Point out the direction of this bar, Should be height or width\n */\n this.updateBar = function (type, percentage, direction) {\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n bar[type + 'Bar'].style[direction] = percentage * 100 + '%';\n };\n\n // define DPlayer events\n var eventTypes = ['play', 'pause', 'canplay', 'playing', 'ended', 'error'];\n this.event = {};\n for (var i = 0; i < eventTypes.length; i++) {\n this.event[eventTypes[i]] = [];\n }\n this.trigger = function (type) {\n for (var _i = 0; _i < _this.event[type].length; _i++) {\n _this.event[type][_i]();\n }\n };\n\n this.element = this.option.element;\n if (!this.option.danmaku) {\n this.element.classList.add('dplayer-no-danmaku');\n }\n if (isMobile) {\n this.element.classList.add('dplayer-mobile');\n }\n\n this.element.innerHTML = html.main(option, index, this.tran);\n\n // arrow style\n this.arrow = this.element.offsetWidth <= 500;\n if (this.arrow) {\n var arrowStyle = document.createElement('style');\n arrowStyle.innerHTML = '.dplayer .dplayer-danmaku{font-size:18px}';\n document.head.appendChild(arrowStyle);\n }\n\n // get this video manager\n this.video = new Video(this.element.getElementsByClassName('dplayer-video-current'));\n\n this.initVideo();\n\n this.bezel = this.element.getElementsByClassName('dplayer-bezel-icon')[0];\n this.bezel.addEventListener('animationend', function () {\n _this.bezel.classList.remove('dplayer-bezel-transition');\n });\n\n // play and pause button\n this.playButton = this.element.getElementsByClassName('dplayer-play-icon')[0];\n this.paused = true;\n this.playButton.addEventListener('click', function () {\n _this.toggle();\n });\n\n var videoWrap = this.element.getElementsByClassName('dplayer-video-wrap')[0];\n var conMask = this.element.getElementsByClassName('dplayer-controller-mask')[0];\n if (!isMobile) {\n videoWrap.addEventListener('click', function () {\n _this.toggle();\n });\n conMask.addEventListener('click', function () {\n _this.toggle();\n });\n } else {\n var toggleController = function toggleController() {\n if (_this.element.classList.contains('dplayer-hide-controller')) {\n _this.element.classList.remove('dplayer-hide-controller');\n } else {\n _this.element.classList.add('dplayer-hide-controller');\n }\n };\n videoWrap.addEventListener('click', toggleController);\n conMask.addEventListener('click', toggleController);\n }\n\n var bar = {};\n bar.playedBar = this.element.getElementsByClassName('dplayer-played')[0];\n bar.loadedBar = this.element.getElementsByClassName('dplayer-loaded')[0];\n var pbar = this.element.getElementsByClassName('dplayer-bar-wrap')[0];\n var pbarTimeTips = this.element.getElementsByClassName('dplayer-bar-time')[0];\n var barWidth = void 0;\n\n var lastPlayPos = 0;\n var currentPlayPos = 0;\n var bufferingDetected = false;\n var danmakuTime = void 0;\n this.setTime = function () {\n _this.playedTime = setInterval(function () {\n // whether the video is buffering\n currentPlayPos = _this.video.currentTime();\n if (!bufferingDetected && currentPlayPos < lastPlayPos + 0.01 && !_this.video.attr('paused')) {\n _this.element.classList.add('dplayer-loading');\n bufferingDetected = true;\n }\n if (bufferingDetected && currentPlayPos > lastPlayPos + 0.01 && !_this.video.attr('paused')) {\n _this.element.classList.remove('dplayer-loading');\n bufferingDetected = false;\n }\n lastPlayPos = currentPlayPos;\n\n _this.updateBar('played', _this.video.currentTime() / _this.video.duration, 'width');\n _this.element.getElementsByClassName('dplayer-ptime')[0].innerHTML = utils.secondToTime(_this.video.currentTime());\n _this.trigger('playing');\n }, 100);\n if (_this.option.danmaku && showdan) {\n danmakuTime = setInterval(function () {\n if (_this.dan) {\n var item = _this.dan[_this.danIndex];\n while (item && _this.video.currentTime() > parseFloat(item.time)) {\n _this.pushDanmaku(item.text, item.color, item.type);\n item = _this.dan[++_this.danIndex];\n }\n }\n }, 100);\n }\n };\n this.clearTime = function () {\n clearInterval(_this.playedTime);\n if (_this.option.danmaku) {\n clearInterval(danmakuTime);\n }\n };\n\n pbar.addEventListener('click', function (event) {\n var e = event || window.event;\n barWidth = pbar.clientWidth;\n var percentage = (e.clientX - utils.getElementViewLeft(pbar)) / barWidth;\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n _this.updateBar('played', percentage, 'width');\n _this.video.seek(parseFloat(bar.playedBar.style.width) / 100 * _this.video.duration);\n });\n\n this.isTipsShow = false;\n this.timeTipsHandler = this.timeTipsHandler(pbar, pbarTimeTips).bind(this);\n pbar.addEventListener('mousemove', this.timeTipsHandler);\n pbar.addEventListener('mouseover', this.timeTipsHandler);\n pbar.addEventListener('mouseenter', this.timeTipsHandler);\n pbar.addEventListener('mouseout', this.timeTipsHandler);\n pbar.addEventListener('mouseleave', this.timeTipsHandler);\n\n var thumbMove = function thumbMove(event) {\n var e = event || window.event;\n var percentage = (e.clientX - utils.getElementViewLeft(pbar)) / barWidth;\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n _this.updateBar('played', percentage, 'width');\n _this.element.getElementsByClassName('dplayer-ptime')[0].innerHTML = utils.secondToTime(percentage * _this.video.duration);\n };\n\n var thumbUp = function thumbUp() {\n document.removeEventListener('mouseup', thumbUp);\n document.removeEventListener('mousemove', thumbMove);\n _this.video.seek(parseFloat(bar.playedBar.style.width) / 100 * _this.video.duration);\n _this.setTime();\n };\n\n pbar.addEventListener('mousedown', function () {\n barWidth = pbar.clientWidth;\n _this.clearTime();\n document.addEventListener('mousemove', thumbMove);\n document.addEventListener('mouseup', thumbUp);\n });\n\n /**\n * control volume\n */\n bar.volumeBar = this.element.getElementsByClassName('dplayer-volume-bar-inner')[0];\n var volumeEle = this.element.getElementsByClassName('dplayer-volume')[0];\n var volumeBarWrapWrap = this.element.getElementsByClassName('dplayer-volume-bar-wrap')[0];\n var volumeBarWrap = this.element.getElementsByClassName('dplayer-volume-bar')[0];\n var volumeicon = this.element.getElementsByClassName('dplayer-volume-icon')[0];\n var vWidth = 35;\n\n this.switchVolumeIcon = function () {\n var volumeicon = _this.element.getElementsByClassName('dplayer-volume-icon')[0];\n if (_this.video.attr('volume') >= 0.8) {\n volumeicon.innerHTML = svg('volume-up');\n } else if (_this.video.attr('volume') > 0) {\n volumeicon.innerHTML = svg('volume-down');\n } else {\n volumeicon.innerHTML = svg('volume-off');\n }\n };\n var volumeMove = function volumeMove(event) {\n var e = event || window.event;\n var percentage = (e.clientX - utils.getElementViewLeft(volumeBarWrap) - 5.5) / vWidth;\n _this.volume(percentage);\n };\n var volumeUp = function volumeUp() {\n document.removeEventListener('mouseup', volumeUp);\n document.removeEventListener('mousemove', volumeMove);\n volumeEle.classList.remove('dplayer-volume-active');\n };\n\n volumeBarWrapWrap.addEventListener('click', function (event) {\n var e = event || window.event;\n var percentage = (e.clientX - utils.getElementViewLeft(volumeBarWrap) - 5.5) / vWidth;\n _this.volume(percentage);\n });\n volumeBarWrapWrap.addEventListener('mousedown', function () {\n document.addEventListener('mousemove', volumeMove);\n document.addEventListener('mouseup', volumeUp);\n volumeEle.classList.add('dplayer-volume-active');\n });\n volumeicon.addEventListener('click', function () {\n if (_this.video.attr('muted')) {\n _this.video.attr('muted', false);\n _this.switchVolumeIcon();\n _this.updateBar('volume', _this.video.attr('volume'), 'width');\n } else {\n _this.video.attr('muted', true);\n volumeicon.innerHTML = svg('volume-off');\n _this.updateBar('volume', 0, 'width');\n }\n });\n\n /**\n * auto hide controller\n */\n var hideTime = 0;\n if (!isMobile) {\n var hideController = function hideController() {\n _this.element.classList.remove('dplayer-hide-controller');\n clearTimeout(hideTime);\n hideTime = setTimeout(function () {\n if (_this.video.attr('played').length) {\n _this.element.classList.add('dplayer-hide-controller');\n closeSetting();\n closeComment();\n }\n }, 2000);\n };\n this.element.addEventListener('mousemove', hideController);\n this.element.addEventListener('click', hideController);\n }\n\n /**\n * setting\n */\n this.danOpacity = localStorage.getItem('DPlayer-opacity') || 0.7;\n var settingHTML = html.setting(this.tran);\n\n // toggle setting box\n var settingIcon = this.element.getElementsByClassName('dplayer-setting-icon')[0];\n var settingBox = this.element.getElementsByClassName('dplayer-setting-box')[0];\n var mask = this.element.getElementsByClassName('dplayer-mask')[0];\n settingBox.innerHTML = settingHTML.original;\n\n var closeSetting = function closeSetting() {\n if (settingBox.classList.contains('dplayer-setting-box-open')) {\n settingBox.classList.remove('dplayer-setting-box-open');\n mask.classList.remove('dplayer-mask-show');\n setTimeout(function () {\n settingBox.classList.remove('dplayer-setting-box-narrow');\n settingBox.innerHTML = settingHTML.original;\n settingEvent();\n }, 300);\n }\n };\n var openSetting = function openSetting() {\n settingBox.classList.add('dplayer-setting-box-open');\n mask.classList.add('dplayer-mask-show');\n };\n\n mask.addEventListener('click', function () {\n closeSetting();\n });\n settingIcon.addEventListener('click', function () {\n openSetting();\n });\n\n this.loop = this.option.loop;\n var danContainer = this.element.getElementsByClassName('dplayer-danmaku')[0];\n var showdan = true;\n var settingEvent = function settingEvent() {\n // loop control\n var loopEle = _this.element.getElementsByClassName('dplayer-setting-loop')[0];\n var loopToggle = loopEle.getElementsByClassName('dplayer-toggle-setting-input')[0];\n\n loopToggle.checked = _this.loop;\n\n loopEle.addEventListener('click', function () {\n loopToggle.checked = !loopToggle.checked;\n if (loopToggle.checked) {\n _this.loop = true;\n } else {\n _this.loop = false;\n }\n closeSetting();\n });\n\n // show danmaku control\n var showDanEle = _this.element.getElementsByClassName('dplayer-setting-showdan')[0];\n var showDanToggle = showDanEle.getElementsByClassName('dplayer-showdan-setting-input')[0];\n\n showDanToggle.checked = showdan;\n\n showDanEle.addEventListener('click', function () {\n showDanToggle.checked = !showDanToggle.checked;\n if (showDanToggle.checked) {\n showdan = true;\n if (_this.option.danmaku) {\n for (var _i2 = 0; _i2 < _this.dan.length; _i2++) {\n if (_this.dan[_i2].time >= _this.video.currentTime()) {\n _this.danIndex = _i2;\n break;\n }\n _this.danIndex = _this.dan.length;\n }\n danmakuTime = setInterval(function () {\n var item = _this.dan[_this.danIndex];\n while (item && _this.video.currentTime() >= parseFloat(item.time)) {\n _this.pushDanmaku(item.text, item.color, item.type);\n item = _this.dan[++_this.danIndex];\n }\n }, 0);\n }\n } else {\n showdan = false;\n if (_this.option.danmaku) {\n clearInterval(danmakuTime);\n danContainer.innerHTML = '
';\n _this.danTunnel = {\n right: {},\n top: {},\n bottom: {}\n };\n _this.itemDemo = _this.element.getElementsByClassName('dplayer-danmaku-item')[0];\n }\n }\n closeSetting();\n });\n\n // speed control\n var speedEle = _this.element.getElementsByClassName('dplayer-setting-speed')[0];\n speedEle.addEventListener('click', function () {\n settingBox.classList.add('dplayer-setting-box-narrow');\n settingBox.innerHTML = settingHTML.speed;\n\n var speedItem = settingBox.getElementsByClassName('dplayer-setting-speed-item');\n\n var _loop = function _loop(_i3) {\n speedItem[_i3].addEventListener('click', function () {\n _this.video.attr('playbackRate', speedItem[_i3].dataset.speed);\n closeSetting();\n });\n };\n\n for (var _i3 = 0; _i3 < speedItem.length; _i3++) {\n _loop(_i3);\n }\n });\n\n if (_this.option.danmaku) {\n // danmaku opacity\n bar.danmakuBar = _this.element.getElementsByClassName('dplayer-danmaku-bar-inner')[0];\n var danmakuBarWrapWrap = _this.element.getElementsByClassName('dplayer-danmaku-bar-wrap')[0];\n var danmakuBarWrap = _this.element.getElementsByClassName('dplayer-danmaku-bar')[0];\n var danmakuSettingBox = _this.element.getElementsByClassName('dplayer-setting-danmaku')[0];\n var dWidth = 130;\n _this.updateBar('danmaku', _this.danOpacity, 'width');\n\n var danmakuMove = function danmakuMove(event) {\n var e = event || window.event;\n var percentage = (e.clientX - utils.getElementViewLeft(danmakuBarWrap)) / dWidth;\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n _this.updateBar('danmaku', percentage, 'width');\n var items = _this.element.getElementsByClassName('dplayer-danmaku-item');\n for (var _i4 = 0; _i4 < items.length; _i4++) {\n items[_i4].style.opacity = percentage;\n }\n _this.danOpacity = percentage;\n localStorage.setItem('DPlayer-opacity', _this.danOpacity);\n };\n var danmakuUp = function danmakuUp() {\n document.removeEventListener('mouseup', danmakuUp);\n document.removeEventListener('mousemove', danmakuMove);\n danmakuSettingBox.classList.remove('dplayer-setting-danmaku-active');\n };\n\n danmakuBarWrapWrap.addEventListener('click', function (event) {\n var e = event || window.event;\n var percentage = (e.clientX - utils.getElementViewLeft(danmakuBarWrap)) / dWidth;\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n _this.updateBar('danmaku', percentage, 'width');\n var items = _this.element.getElementsByClassName('dplayer-danmaku-item');\n for (var _i5 = 0; _i5 < items.length; _i5++) {\n items[_i5].style.opacity = percentage;\n }\n _this.danOpacity = percentage;\n localStorage.setItem('DPlayer-opacity', _this.danOpacity);\n });\n danmakuBarWrapWrap.addEventListener('mousedown', function () {\n document.addEventListener('mousemove', danmakuMove);\n document.addEventListener('mouseup', danmakuUp);\n danmakuSettingBox.classList.add('dplayer-setting-danmaku-active');\n });\n }\n };\n settingEvent();\n\n // set duration time\n if (this.video.duration !== 1) {\n // compatibility: Android browsers will output 1 at first\n this.element.getElementsByClassName('dplayer-dtime')[0].innerHTML = this.video.duration ? utils.secondToTime(this.video.duration) : '00:00';\n }\n\n // danmaku\n this.danTunnel = {\n right: {},\n top: {},\n bottom: {}\n };\n this.itemDemo = this.element.getElementsByClassName('dplayer-danmaku-item')[0];\n\n if (this.option.danmaku) {\n this.danIndex = 0;\n this.readDanmaku();\n } else {\n // autoplay\n if (this.option.autoplay && !isMobile) {\n this.play();\n } else if (isMobile) {\n this.pause();\n }\n }\n\n /**\n * comment\n */\n var commentInput = this.element.getElementsByClassName('dplayer-comment-input')[0];\n var commentIcon = this.element.getElementsByClassName('dplayer-comment-icon')[0];\n var commentBox = this.element.getElementsByClassName('dplayer-comment-box')[0];\n var commentSettingIcon = this.element.getElementsByClassName('dplayer-comment-setting-icon')[0];\n var commentSettingBox = this.element.getElementsByClassName('dplayer-comment-setting-box')[0];\n var commentSendIcon = this.element.getElementsByClassName('dplayer-send-icon')[0];\n\n var htmlEncode = function htmlEncode(str) {\n return str.replace(/&/g, \"&\").replace(//g, \">\").replace(/\"/g, \""\").replace(/'/g, \"'\").replace(/\\//g, \"/\");\n };\n\n var sendComment = function sendComment() {\n commentInput.blur();\n\n // text can't be empty\n if (!commentInput.value.replace(/^\\s+|\\s+$/g, '')) {\n _this.notice(_this.tran('Please input danmaku content!'));\n return;\n }\n\n var danmakuData = {\n token: _this.option.danmaku.token,\n player: _this.option.danmaku.id,\n author: _this.option.danmaku.user,\n time: _this.video.currentTime(),\n text: commentInput.value,\n color: _this.element.querySelector('.dplayer-comment-setting-color input:checked').value,\n type: _this.element.querySelector('.dplayer-comment-setting-type input:checked').value\n };\n _this.option.apiBackend.send(_this.option.danmaku.api, danmakuData);\n\n commentInput.value = '';\n closeComment();\n _this.dan.splice(_this.danIndex, 0, danmakuData);\n _this.danIndex++;\n var item = _this.pushDanmaku(htmlEncode(danmakuData.text), danmakuData.color, danmakuData.type);\n item.style.border = '2px solid ' + _this.option.theme;\n };\n\n var closeCommentSetting = function closeCommentSetting() {\n if (commentSettingBox.classList.contains('dplayer-comment-setting-open')) {\n commentSettingBox.classList.remove('dplayer-comment-setting-open');\n }\n };\n var toggleCommentSetting = function toggleCommentSetting() {\n if (commentSettingBox.classList.contains('dplayer-comment-setting-open')) {\n commentSettingBox.classList.remove('dplayer-comment-setting-open');\n } else {\n commentSettingBox.classList.add('dplayer-comment-setting-open');\n }\n };\n\n var disableHide = 0;\n var commentFocusTimeout = 0;\n var closeComment = function closeComment() {\n if (!commentBox.classList.contains('dplayer-comment-box-open')) {\n return;\n }\n\n commentBox.classList.remove('dplayer-comment-box-open');\n mask.classList.remove('dplayer-mask-show');\n _this.element.classList.remove('dplayer-show-controller');\n\n clearInterval(disableHide);\n clearTimeout(commentFocusTimeout);\n closeCommentSetting();\n };\n var openComment = function openComment() {\n if (commentBox.classList.contains('dplayer-comment-box-open')) {\n return;\n }\n\n commentBox.classList.add('dplayer-comment-box-open');\n mask.classList.add('dplayer-mask-show');\n _this.element.classList.add('dplayer-show-controller');\n\n disableHide = setInterval(function () {\n clearTimeout(hideTime);\n }, 1000);\n commentFocusTimeout = setTimeout(function () {\n commentInput.focus();\n }, 300);\n };\n\n mask.addEventListener('click', function () {\n closeComment();\n });\n commentIcon.addEventListener('click', function () {\n openComment();\n });\n commentSettingIcon.addEventListener('click', function () {\n toggleCommentSetting();\n });\n\n // comment setting box\n this.element.getElementsByClassName('dplayer-comment-setting-color')[0].addEventListener('click', function () {\n var sele = _this.element.querySelector('input[name=\"dplayer-danmaku-color-${index}\"]:checked+span');\n if (sele) {\n commentSettingIcon.getElementsByClassName('dplayer-fill')[0].style.fill = _this.element.querySelector('input[name=\"dplayer-danmaku-color-${index}\"]:checked').value;\n }\n });\n\n commentInput.addEventListener('click', function () {\n closeCommentSetting();\n });\n commentInput.addEventListener('keydown', function (e) {\n var event = e || window.event;\n if (event.keyCode === 13) {\n sendComment();\n }\n });\n\n commentSendIcon.addEventListener('click', sendComment);\n\n /**\n * full screen\n */\n var resetAnimation = function resetAnimation() {\n var danWidth = danContainer.offsetWidth;\n var items = _this.element.getElementsByClassName('dplayer-danmaku-item');\n for (var _i6 = 0; _i6 < items.length; _i6++) {\n items[_i6].style.transform = 'translateX(-' + danWidth + 'px)';\n }\n };\n\n this.element.addEventListener('fullscreenchange', function () {\n resetAnimation();\n });\n this.element.addEventListener('mozfullscreenchange', function () {\n resetAnimation();\n });\n this.element.addEventListener('webkitfullscreenchange', function () {\n resetAnimation();\n });\n // browser full screen\n this.element.getElementsByClassName('dplayer-full-icon')[0].addEventListener('click', function () {\n if (!document.fullscreenElement && !document.mozFullScreenElement && !document.webkitFullscreenElement) {\n if (_this.element.requestFullscreen) {\n _this.element.requestFullscreen();\n } else if (_this.element.mozRequestFullScreen) {\n _this.element.mozRequestFullScreen();\n } else if (_this.element.webkitRequestFullscreen) {\n _this.element.webkitRequestFullscreen();\n } else if (_this.video.attr('webkitEnterFullscreen')) {\n // Safari for iOS\n _this.video.current.webkitEnterFullscreen();\n }\n } else {\n if (document.cancelFullScreen) {\n document.cancelFullScreen();\n } else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen();\n } else if (document.webkitCancelFullScreen) {\n document.webkitCancelFullScreen();\n }\n }\n resetAnimation();\n });\n // web full screen\n this.element.getElementsByClassName('dplayer-full-in-icon')[0].addEventListener('click', function () {\n if (_this.element.classList.contains('dplayer-fulled')) {\n _this.element.classList.remove('dplayer-fulled');\n } else {\n _this.element.classList.add('dplayer-fulled');\n resetAnimation();\n }\n });\n\n /**\n * hot key\n */\n var handleKeyDown = function handleKeyDown(e) {\n var tag = document.activeElement.tagName.toUpperCase();\n var editable = document.activeElement.getAttribute('contenteditable');\n if (tag !== 'INPUT' && tag !== 'TEXTAREA' && editable !== '' && editable !== 'true') {\n var event = e || window.event;\n var percentage = void 0;\n switch (event.keyCode) {\n case 32:\n event.preventDefault();\n _this.toggle();\n break;\n case 37:\n event.preventDefault();\n _this.video.seek(_this.video.currentTime() - 5);\n break;\n case 39:\n event.preventDefault();\n _this.video.seek(_this.video.currentTime() + 5);\n break;\n case 38:\n event.preventDefault();\n percentage = _this.video.attr('volume') + 0.1;\n _this.volume(percentage);\n break;\n case 40:\n event.preventDefault();\n percentage = _this.video.attr('volume') - 0.1;\n _this.volume(percentage);\n break;\n }\n }\n };\n if (this.option.hotkey) {\n document.addEventListener('keydown', handleKeyDown);\n }\n document.addEventListener('keydown', function (e) {\n // Press ESC to quit web full screen\n var event = e || window.event;\n switch (event.keyCode) {\n case 27:\n if (_this.element.classList.contains('dplayer-fulled')) {\n _this.element.classList.remove('dplayer-fulled');\n resetAnimation();\n }\n break;\n }\n });\n\n /**\n * right key\n */\n var menu = this.element.getElementsByClassName('dplayer-menu')[0];\n this.element.addEventListener('contextmenu', function (e) {\n var event = e || window.event;\n event.preventDefault();\n\n menu.classList.add('dplayer-menu-show');\n\n var clientRect = _this.element.getBoundingClientRect();\n var menuLeft = event.clientX - clientRect.left;\n var menuTop = event.clientY - clientRect.top;\n if (menuLeft + menu.offsetWidth >= clientRect.width) {\n menu.style.right = clientRect.width - menuLeft + 'px';\n menu.style.left = 'initial';\n } else {\n menu.style.left = event.clientX - _this.element.getBoundingClientRect().left + 'px';\n menu.style.right = 'initial';\n }\n if (menuTop + menu.offsetHeight >= clientRect.height) {\n menu.style.bottom = clientRect.height - menuTop + 'px';\n menu.style.top = 'initial';\n } else {\n menu.style.top = event.clientY - _this.element.getBoundingClientRect().top + 'px';\n menu.style.bottom = 'initial';\n }\n\n mask.classList.add('dplayer-mask-show');\n mask.addEventListener('click', function () {\n mask.classList.remove('dplayer-mask-show');\n menu.classList.remove('dplayer-menu-show');\n });\n });\n\n /**\n * Switch quality\n */\n if (this.option.video.quality) {\n this.element.getElementsByClassName('dplayer-quality-list')[0].addEventListener('click', function (e) {\n if (e.target.classList.contains('dplayer-quality-item')) {\n _this.switchQuality(e.target.dataset.index);\n }\n });\n }\n\n /**\n * Screenshot\n */\n if (this.option.screenshot) {\n var camareIcon = this.element.getElementsByClassName('dplayer-camera-icon')[0];\n camareIcon.addEventListener('click', function () {\n var canvas = document.createElement(\"canvas\");\n canvas.width = _this.video.attr('videoWidth');\n canvas.height = _this.video.attr('videoHeight');\n canvas.getContext('2d').drawImage(_this.video.current, 0, 0, canvas.width, canvas.height);\n\n camareIcon.href = canvas.toDataURL();\n camareIcon.download = \"DPlayer.png\";\n });\n }\n\n index++;\n }\n\n /**\n * Play music\n */\n\n\n _createClass(DPlayer, [{\n key: 'play',\n value: function play(time) {\n if (Object.prototype.toString.call(time) === '[object Number]') {\n this.video.seek(time);\n }\n this.paused = false;\n if (this.video.attr('paused')) {\n this.bezel.innerHTML = svg('play');\n this.bezel.classList.add('dplayer-bezel-transition');\n }\n\n this.playButton.innerHTML = svg('pause');\n\n this.video.play();\n if (this.playedTime) {\n this.clearTime();\n }\n this.setTime();\n this.element.classList.add('dplayer-playing');\n this.trigger('play');\n }\n\n /**\n * Pause music\n */\n\n }, {\n key: 'pause',\n value: function pause() {\n this.paused = true;\n this.element.classList.remove('dplayer-loading');\n\n if (!this.video.attr('paused')) {\n this.bezel.innerHTML = svg('pause');\n this.bezel.classList.add('dplayer-bezel-transition');\n }\n\n this.ended = false;\n this.playButton.innerHTML = svg('play');\n this.video.pause();\n this.clearTime();\n this.element.classList.remove('dplayer-playing');\n this.trigger('pause');\n }\n\n /**\n * Set volume\n */\n\n }, {\n key: 'volume',\n value: function volume(percentage) {\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n this.updateBar('volume', percentage, 'width');\n this.video.attr('volume', percentage);\n if (this.video.attr('muted')) {\n this.video.attr('muted', false);\n }\n this.switchVolumeIcon();\n }\n\n /**\n * Toggle between play and pause\n */\n\n }, {\n key: 'toggle',\n value: function toggle() {\n if (this.video.attr('paused')) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * attach event\n */\n\n }, {\n key: 'on',\n value: function on(event, callback) {\n if (typeof callback === 'function') {\n this.event[event].push(callback);\n }\n }\n\n /**\n * Asynchronously read danmaku from all API endpoints\n */\n\n }, {\n key: '_readAllEndpoints',\n value: function _readAllEndpoints(endpoints, finish) {\n var _this2 = this;\n\n var results = [];\n var readCount = 0;\n var cbk = function cbk(i) {\n return function (err, data) {\n ++readCount;\n if (err) {\n if (err.response) {\n _this2.notice(err.response.msg);\n } else {\n _this2.notice('Request was unsuccessful: ' + err.status);\n }\n results[i] = [];\n } else {\n results[i] = data;\n }\n if (readCount === endpoints.length) {\n return finish(results);\n }\n };\n };\n\n for (var i = 0; i < endpoints.length; ++i) {\n this.option.apiBackend.read(endpoints[i], cbk(i));\n }\n }\n\n /**\n * Read danmaku from API\n */\n\n }, {\n key: 'readDanmaku',\n value: function readDanmaku() {\n var _this3 = this;\n\n var isMobile = /mobile/i.test(window.navigator.userAgent);\n var apiurl = void 0;\n if (this.option.danmaku.maximum) {\n apiurl = this.option.danmaku.api + '?id=' + this.option.danmaku.id + '&max=' + this.option.danmaku.maximum;\n } else {\n apiurl = this.option.danmaku.api + '?id=' + this.option.danmaku.id;\n }\n var endpoints = (this.option.danmaku.addition || []).slice(0);\n endpoints.push(apiurl);\n\n this._readAllEndpoints(endpoints, function (results) {\n _this3.danIndex = 0;\n _this3.dan = [].concat.apply([], results).sort(function (a, b) {\n return a.time - b.time;\n });\n _this3.element.getElementsByClassName('dplayer-danloading')[0].style.display = 'none';\n\n // autoplay\n if (_this3.option.autoplay && !isMobile) {\n _this3.play();\n } else if (isMobile) {\n _this3.pause();\n }\n });\n }\n\n /**\n * Push a danmaku into DPlayer\n *\n * @param {String} text - danmaku content\n * @param {String} color - danmaku color, default: `#fff`\n * @param {String} type - danmaku type, `right` `top` `bottom`, default: `right`\n */\n\n }, {\n key: 'pushDanmaku',\n value: function pushDanmaku(text, color, type) {\n var _this4 = this;\n\n var danContainer = this.element.getElementsByClassName('dplayer-danmaku')[0];\n var itemHeight = this.arrow ? 24 : 30;\n var danWidth = danContainer.offsetWidth;\n var danHeight = danContainer.offsetHeight;\n var itemY = parseInt(danHeight / itemHeight);\n\n var danItemRight = function danItemRight(ele) {\n return danContainer.getBoundingClientRect().right - ele.getBoundingClientRect().right;\n };\n\n var danSpeed = function danSpeed(width) {\n return (danWidth + width) / 5;\n };\n\n var getTunnel = function getTunnel(ele, type, width) {\n var tmp = danWidth / danSpeed(width);\n\n var _loop2 = function _loop2(i) {\n var item = _this4.danTunnel[type][i + ''];\n if (item && item.length) {\n for (var j = 0; j < item.length; j++) {\n var danRight = danItemRight(item[j]) - 10;\n if (danRight <= danWidth - tmp * danSpeed(item[j].offsetWidth) || danRight <= 0) {\n break;\n }\n if (j === item.length - 1) {\n _this4.danTunnel[type][i + ''].push(ele);\n ele.addEventListener('animationend', function () {\n _this4.danTunnel[type][i + ''].splice(0, 1);\n });\n return {\n v: i % itemY\n };\n }\n }\n } else {\n _this4.danTunnel[type][i + ''] = [ele];\n ele.addEventListener('animationend', function () {\n _this4.danTunnel[type][i + ''].splice(0, 1);\n });\n return {\n v: i % itemY\n };\n }\n };\n\n for (var i = 0;; i++) {\n var _ret2 = _loop2(i);\n\n if ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === \"object\") return _ret2.v;\n }\n };\n\n if (!type) {\n type = 'right';\n }\n if (!color) {\n color = '#fff';\n }\n var item = document.createElement('div');\n item.classList.add('dplayer-danmaku-item');\n item.classList.add('dplayer-danmaku-' + type);\n item.innerHTML = text;\n item.style.opacity = this.danOpacity;\n item.style.color = color;\n item.addEventListener('animationend', function () {\n danContainer.removeChild(item);\n });\n\n // measure\n this.itemDemo.innerHTML = text;\n var itemWidth = this.itemDemo.offsetWidth;\n\n // adjust\n switch (type) {\n case 'right':\n item.style.top = itemHeight * getTunnel(item, type, itemWidth) + 'px';\n item.style.width = itemWidth + 1 + 'px';\n item.style.transform = 'translateX(-' + danWidth + 'px)';\n break;\n case 'top':\n item.style.top = itemHeight * getTunnel(item, type) + 'px';\n break;\n case 'bottom':\n item.style.bottom = itemHeight * getTunnel(item, type) + 'px';\n break;\n default:\n console.error('Can\\'t handled danmaku type: ' + type);\n }\n\n // insert\n danContainer.appendChild(item);\n\n // move\n item.classList.add('dplayer-danmaku-move');\n\n return item;\n }\n\n /**\n * Switch to a new video\n *\n * @param {Object} video - new video info\n * @param {Object} danmaku - new danmaku info\n */\n\n }, {\n key: 'switchVideo',\n value: function switchVideo(video, danmaku) {\n this.video.attr('poster', video.pic ? video.pic : '');\n this.video.attr('src', video.url);\n this.pause();\n if (danmaku) {\n this.dan = [];\n this.danIndex = 0;\n this.element.getElementsByClassName('dplayer-danloading')[0].style.display = 'block';\n this.updateBar('played', 0, 'width');\n this.updateBar('loaded', 0, 'width');\n this.element.getElementsByClassName('dplayer-ptime')[0].innerHTML = '00:00';\n this.element.getElementsByClassName('dplayer-danmaku')[0].innerHTML = '
';\n this.danTuel = {\n right: {},\n top: {},\n bottom: {}\n };\n this.itemDemo = this.element.getElementsByClassName('dplayer-danmaku-item')[0];\n this.option.danmaku = danmaku;\n this.readDanmaku();\n }\n }\n }, {\n key: 'initVideo',\n value: function initVideo() {\n var _this5 = this;\n\n // Support HTTP Live Streaming\n var enablehls = void 0;\n if (this.option.video.type === 'auto') {\n enablehls = /m3u8(#|\\?|$)/i.exec(this.option.video.url);\n } else if (this.option.video.type === 'hls') {\n enablehls = true;\n } else {\n enablehls = false;\n }\n if (enablehls && Hls.isSupported()) {\n // this.element.getElementsByClassName('dplayer-time')[0].style.display = 'none';\n var hls = new Hls();\n hls.attachMedia(this.video.current);\n hls.on(Hls.Events.MEDIA_ATTACHED, function () {\n hls.loadSource(_this5.option.video.url);\n hls.on(Hls.Events.MANIFEST_PARSED, function (event, data) {\n this.notice(\"manifest loaded, found \" + data.levels.length + \" quality level\");\n });\n });\n }\n\n // Support FLV\n var enableflv = void 0;\n if (this.option.video.type === 'auto') {\n enableflv = /.flv(#|\\?|$)/i.exec(this.option.video.url);\n } else if (this.option.video.type === 'flv') {\n enableflv = true;\n } else {\n enableflv = false;\n }\n if (enableflv && flvjs.isSupported()) {\n var flvPlayer = flvjs.createPlayer({\n type: 'flv',\n url: this.option.video.url\n });\n flvPlayer.attachMediaElement(this.video.current);\n flvPlayer.load();\n }\n\n if (this.option.danmaku) {\n this.video.on('all', 'seeking', function () {\n for (var i = 0; i < _this5.dan.length; i++) {\n if (_this5.dan[i].time >= _this5.video.currentTime()) {\n _this5.danIndex = i;\n return;\n }\n _this5.danIndex = _this5.dan.length;\n }\n });\n }\n\n /**\n * video events\n */\n // show video time: the metadata has loaded or changed\n this.video.on('all', 'durationchange', function (i, video) {\n if (video.duration !== 1) {\n // compatibility: Android browsers will output 1 at first\n _this5.element.getElementsByClassName('dplayer-dtime')[0].innerHTML = utils.secondToTime(_this5.video.duration);\n }\n });\n\n // show video loaded bar: to inform interested parties of progress downloading the media\n this.video.on('current', 'progress', function (i, video) {\n var percentage = video.buffered.length ? video.buffered.end(video.buffered.length - 1) / video.duration : 0;\n _this5.updateBar('loaded', percentage, 'width');\n });\n\n // video download error: an error occurs\n this.video.on('all', 'error', function () {\n _this5.notice(_this5.tran('This video fails to load'), -1);\n _this5.trigger('pause');\n });\n\n // video can play: enough data is available that the media can be played\n this.video.on('current', 'canplay', function () {\n _this5.trigger('canplay');\n });\n\n // music end\n this.ended = false;\n this.video.on('all', 'ended', function (i) {\n if (i === _this5.video.videos.length - 1) {\n _this5.updateBar('played', 1, 'width');\n if (!_this5.loop) {\n _this5.ended = true;\n _this5.pause();\n _this5.trigger('ended');\n } else {\n _this5.video.switch(0);\n _this5.video.play();\n }\n }\n });\n\n this.video.on('current', 'play', function () {\n if (_this5.paused) {\n _this5.play();\n }\n });\n\n this.video.on('current', 'pause', function () {\n if (!_this5.paused) {\n _this5.pause();\n }\n });\n\n // control volume\n this.video.attr('volume', parseInt(this.element.getElementsByClassName('dplayer-volume-bar-inner')[0].style.width) / 100);\n }\n }, {\n key: 'switchQuality',\n value: function switchQuality(index) {\n var _this6 = this;\n\n if (this.qualityIndex === index || this.switchingQuality) {\n return;\n } else {\n this.qualityIndex = index;\n }\n this.switchingQuality = true;\n this.quality = this.option.video.quality[index];\n this.element.getElementsByClassName('dplayer-quality-icon')[0].innerHTML = this.quality.name;\n\n this.video.pause();\n var videoHTML = html.video(false, null, this.option.screenshot, 'auto', this.quality.url);\n var videoEle = new DOMParser().parseFromString(videoHTML, 'text/html').body.firstChild;\n var parent = this.element.getElementsByClassName('dplayer-video-wrap')[0];\n parent.prepend(videoEle);\n this.prevVideo = this.video;\n this.video = new Video([videoEle], this.prevVideo.duration);\n this.initVideo();\n this.video.seek(this.prevVideo.currentTime());\n this.notice(this.tran('Switching to') + ' ' + this.quality.name + ' ' + this.tran('quality'), -1);\n this.video.on('current', 'canplay', function () {\n if (_this6.prevVideo) {\n if (_this6.video.currentTime() !== _this6.prevVideo.currentTime()) {\n _this6.video.seek(_this6.prevVideo.currentTime());\n return;\n }\n parent.removeChild(_this6.prevVideo.current);\n _this6.video.current.classList.add('dplayer-video-current');\n _this6.video.play();\n _this6.prevVideo = null;\n _this6.notice(_this6.tran('Switched to') + ' ' + _this6.quality.name + ' ' + _this6.tran('quality'));\n _this6.switchingQuality = false;\n }\n });\n }\n }, {\n key: 'timeTipsHandler',\n value: function timeTipsHandler(pbar, timeTips) {\n var _this7 = this;\n\n // http://stackoverflow.com/questions/1480133/how-can-i-get-an-objects-absolute-position-on-the-page-in-javascript\n var cumulativeOffset = function cumulativeOffset(element) {\n var top = 0,\n left = 0;\n do {\n top += element.offsetTop || 0;\n left += element.offsetLeft || 0;\n element = element.offsetParent;\n } while (element);\n\n return {\n top: top,\n left: left\n };\n };\n\n return function (e) {\n if (!_this7.video.duration) {\n return;\n }\n var clientX = e.clientX;\n\n var px = cumulativeOffset(pbar).left;\n var tx = clientX - px;\n timeTips.innerText = utils.secondToTime(_this7.video.duration * (tx / pbar.offsetWidth));\n timeTips.style.left = tx - 20 + 'px';\n switch (e.type) {\n case 'mouseenter':\n case 'mouseover':\n case 'mousemove':\n if (_this7.isTipsShow) {\n return;\n }\n timeTips.classList.remove('hidden');\n _this7.isTipsShow = true;\n break;\n case 'mouseleave':\n case 'mouseout':\n if (!_this7.isTipsShow) {\n return;\n }\n timeTips.classList.add('hidden');\n _this7.isTipsShow = false;\n break;\n }\n };\n }\n }, {\n key: 'notice',\n value: function notice(text, time) {\n var noticeEle = this.element.getElementsByClassName('dplayer-notice')[0];\n noticeEle.innerHTML = text;\n noticeEle.style.opacity = 1;\n if (this.noticeTime) {\n clearTimeout(this.noticeTime);\n }\n if (time && time < 0) {\n return;\n }\n this.noticeTime = setTimeout(function () {\n noticeEle.style.opacity = 0;\n }, time || 2000);\n }\n }]);\n\n return DPlayer;\n}();\n\nmodule.exports = DPlayer;\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/*\n * xhr.status ---> fail\n * response.code === 1 ---> success\n * response.code !== 1 ---> error\n * */\n\nvar SendXMLHttpRequest = function SendXMLHttpRequest(url, data, success, error, fail) {\n var xhr = new XMLHttpRequest();\n\n xhr.onreadystatechange = function () {\n if (xhr.readyState === 4) {\n if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) {\n var response = JSON.parse(xhr.responseText);\n\n if (response.code !== 1) {\n return error(xhr, response);\n }\n\n return success(xhr, response);\n }\n\n fail(xhr);\n }\n };\n\n xhr.open(data !== null ? 'POST' : 'GET', url, true);\n xhr.send(data !== null ? JSON.stringify(data) : null);\n};\n\nmodule.exports = {\n send: function send(endpoint, danmakuData) {\n SendXMLHttpRequest(endpoint, danmakuData, function (xhr, response) {\n console.log('Post danmaku: ', response);\n }, function (xhr, response) {\n alert(response.msg);\n }, function (xhr) {\n console.log('Request was unsuccessful: ' + xhr.status);\n });\n },\n\n read: function read(endpoint, cbk) {\n SendXMLHttpRequest(endpoint, null, function (xhr, response) {\n cbk(null, response.danmaku);\n }, function (xhr, response) {\n cbk({ status: xhr.status, response: response });\n }, function (xhr) {\n cbk({ status: xhr.status, response: null });\n });\n }\n};\n\n/***/ })\n/******/ ]);\n});\n\n\n// WEBPACK FOOTER //\n// DPlayer.min.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 7);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 7da25bfbdab8c0827365","/**\n* SVG used by DPlayer\n*/\n\nconst svgSource = {\n 'play': ['0 0 16 32', 'M15.552 15.168q0.448 0.32 0.448 0.832 0 0.448-0.448 0.768l-13.696 8.512q-0.768 0.512-1.312 0.192t-0.544-1.28v-16.448q0-0.96 0.544-1.28t1.312 0.192z'],\n 'pause': ['0 0 17 32', 'M14.080 4.8q2.88 0 2.88 2.048v18.24q0 2.112-2.88 2.112t-2.88-2.112v-18.24q0-2.048 2.88-2.048zM2.88 4.8q2.88 0 2.88 2.048v18.24q0 2.112-2.88 2.112t-2.88-2.112v-18.24q0-2.048 2.88-2.048z'],\n 'volume-up': ['0 0 21 32', 'M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8zM20.576 16q0 1.344-0.768 2.528t-2.016 1.664q-0.16 0.096-0.448 0.096-0.448 0-0.8-0.32t-0.32-0.832q0-0.384 0.192-0.64t0.544-0.448 0.608-0.384 0.512-0.64 0.192-1.024-0.192-1.024-0.512-0.64-0.608-0.384-0.544-0.448-0.192-0.64q0-0.48 0.32-0.832t0.8-0.32q0.288 0 0.448 0.096 1.248 0.48 2.016 1.664t0.768 2.528zM25.152 16q0 2.72-1.536 5.056t-4 3.36q-0.256 0.096-0.448 0.096-0.48 0-0.832-0.352t-0.32-0.8q0-0.704 0.672-1.056 1.024-0.512 1.376-0.8 1.312-0.96 2.048-2.4t0.736-3.104-0.736-3.104-2.048-2.4q-0.352-0.288-1.376-0.8-0.672-0.352-0.672-1.056 0-0.448 0.32-0.8t0.8-0.352q0.224 0 0.48 0.096 2.496 1.056 4 3.36t1.536 5.056zM29.728 16q0 4.096-2.272 7.552t-6.048 5.056q-0.224 0.096-0.448 0.096-0.48 0-0.832-0.352t-0.32-0.8q0-0.64 0.704-1.056 0.128-0.064 0.384-0.192t0.416-0.192q0.8-0.448 1.44-0.896 2.208-1.632 3.456-4.064t1.216-5.152-1.216-5.152-3.456-4.064q-0.64-0.448-1.44-0.896-0.128-0.096-0.416-0.192t-0.384-0.192q-0.704-0.416-0.704-1.056 0-0.448 0.32-0.8t0.832-0.352q0.224 0 0.448 0.096 3.776 1.632 6.048 5.056t2.272 7.552z'],\n 'volume-down': ['0 0 21 32', 'M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8zM20.576 16q0 1.344-0.768 2.528t-2.016 1.664q-0.16 0.096-0.448 0.096-0.448 0-0.8-0.32t-0.32-0.832q0-0.384 0.192-0.64t0.544-0.448 0.608-0.384 0.512-0.64 0.192-1.024-0.192-1.024-0.512-0.64-0.608-0.384-0.544-0.448-0.192-0.64q0-0.48 0.32-0.832t0.8-0.32q0.288 0 0.448 0.096 1.248 0.48 2.016 1.664t0.768 2.528z'],\n 'volume-off': ['0 0 21 32', 'M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8z'],\n 'loop': ['0 0 32 32', 'M1.882 16.941c0 4.152 3.221 7.529 7.177 7.529v1.882c-4.996 0-9.060-4.222-9.060-9.412s4.064-9.412 9.060-9.412h7.96l-3.098-3.098 1.331-1.331 5.372 5.37-5.37 5.372-1.333-1.333 3.1-3.098h-7.962c-3.957 0-7.177 3.377-7.177 7.529zM22.94 7.529v1.882c3.957 0 7.177 3.377 7.177 7.529s-3.221 7.529-7.177 7.529h-7.962l3.098-3.098-1.331-1.331-5.37 5.37 5.372 5.372 1.331-1.331-3.1-3.1h7.96c4.998 0 9.062-4.222 9.062-9.412s-4.064-9.412-9.060-9.412z'],\n 'full': ['0 0 32 33', 'M6.667 28h-5.333c-0.8 0-1.333-0.533-1.333-1.333v-5.333c0-0.8 0.533-1.333 1.333-1.333s1.333 0.533 1.333 1.333v4h4c0.8 0 1.333 0.533 1.333 1.333s-0.533 1.333-1.333 1.333zM30.667 28h-5.333c-0.8 0-1.333-0.533-1.333-1.333s0.533-1.333 1.333-1.333h4v-4c0-0.8 0.533-1.333 1.333-1.333s1.333 0.533 1.333 1.333v5.333c0 0.8-0.533 1.333-1.333 1.333zM30.667 12c-0.8 0-1.333-0.533-1.333-1.333v-4h-4c-0.8 0-1.333-0.533-1.333-1.333s0.533-1.333 1.333-1.333h5.333c0.8 0 1.333 0.533 1.333 1.333v5.333c0 0.8-0.533 1.333-1.333 1.333zM1.333 12c-0.8 0-1.333-0.533-1.333-1.333v-5.333c0-0.8 0.533-1.333 1.333-1.333h5.333c0.8 0 1.333 0.533 1.333 1.333s-0.533 1.333-1.333 1.333h-4v4c0 0.8-0.533 1.333-1.333 1.333z'],\n 'full-in': ['0 0 32 33', 'M24.965 24.38h-18.132c-1.366 0-2.478-1.113-2.478-2.478v-11.806c0-1.364 1.111-2.478 2.478-2.478h18.132c1.366 0 2.478 1.113 2.478 2.478v11.806c0 1.364-1.11 2.478-2.478 2.478zM6.833 10.097v11.806h18.134l-0.002-11.806h-18.132zM2.478 28.928h5.952c0.684 0 1.238-0.554 1.238-1.239 0-0.684-0.554-1.238-1.238-1.238h-5.952v-5.802c0-0.684-0.554-1.239-1.238-1.239s-1.239 0.556-1.239 1.239v5.802c0 1.365 1.111 2.478 2.478 2.478zM30.761 19.412c-0.684 0-1.238 0.554-1.238 1.238v5.801h-5.951c-0.686 0-1.239 0.554-1.239 1.238 0 0.686 0.554 1.239 1.239 1.239h5.951c1.366 0 2.478-1.111 2.478-2.478v-5.801c0-0.683-0.554-1.238-1.239-1.238zM0 5.55v5.802c0 0.683 0.554 1.238 1.238 1.238s1.238-0.555 1.238-1.238v-5.802h5.952c0.684 0 1.238-0.554 1.238-1.238s-0.554-1.238-1.238-1.238h-5.951c-1.366-0.001-2.478 1.111-2.478 2.476zM32 11.35v-5.801c0-1.365-1.11-2.478-2.478-2.478h-5.951c-0.686 0-1.239 0.554-1.239 1.238s0.554 1.238 1.239 1.238h5.951v5.801c0 0.683 0.554 1.237 1.238 1.237 0.686 0.002 1.239-0.553 1.239-1.236z'],\n 'setting': ['0 0 32 28', 'M28.633 17.104c0.035 0.21 0.026 0.463-0.026 0.76s-0.14 0.598-0.262 0.904c-0.122 0.306-0.271 0.581-0.445 0.825s-0.367 0.419-0.576 0.524c-0.209 0.105-0.393 0.157-0.55 0.157s-0.332-0.035-0.524-0.105c-0.175-0.052-0.393-0.1-0.655-0.144s-0.528-0.052-0.799-0.026c-0.271 0.026-0.541 0.083-0.812 0.17s-0.502 0.236-0.694 0.445c-0.419 0.437-0.664 0.934-0.734 1.493s0.009 1.092 0.236 1.598c0.175 0.349 0.148 0.699-0.079 1.048-0.105 0.14-0.271 0.284-0.498 0.432s-0.476 0.284-0.747 0.406-0.555 0.218-0.851 0.288c-0.297 0.070-0.559 0.105-0.786 0.105-0.157 0-0.306-0.061-0.445-0.183s-0.236-0.253-0.288-0.393h-0.026c-0.192-0.541-0.52-1.009-0.982-1.402s-1-0.589-1.611-0.589c-0.594 0-1.131 0.197-1.611 0.589s-0.816 0.851-1.009 1.375c-0.087 0.21-0.218 0.362-0.393 0.458s-0.367 0.144-0.576 0.144c-0.244 0-0.52-0.044-0.825-0.131s-0.611-0.197-0.917-0.327c-0.306-0.131-0.581-0.284-0.825-0.458s-0.428-0.349-0.55-0.524c-0.087-0.122-0.135-0.266-0.144-0.432s0.057-0.397 0.197-0.694c0.192-0.402 0.266-0.86 0.223-1.375s-0.266-0.991-0.668-1.428c-0.244-0.262-0.541-0.432-0.891-0.511s-0.681-0.109-0.995-0.092c-0.367 0.017-0.742 0.087-1.127 0.21-0.244 0.070-0.489 0.052-0.734-0.052-0.192-0.070-0.371-0.231-0.537-0.485s-0.314-0.533-0.445-0.838c-0.131-0.306-0.231-0.62-0.301-0.943s-0.087-0.59-0.052-0.799c0.052-0.384 0.227-0.629 0.524-0.734 0.524-0.21 0.995-0.555 1.415-1.035s0.629-1.017 0.629-1.611c0-0.611-0.21-1.144-0.629-1.598s-0.891-0.786-1.415-0.996c-0.157-0.052-0.288-0.179-0.393-0.38s-0.157-0.406-0.157-0.616c0-0.227 0.035-0.48 0.105-0.76s0.162-0.55 0.275-0.812 0.244-0.502 0.393-0.72c0.148-0.218 0.31-0.38 0.485-0.485 0.14-0.087 0.275-0.122 0.406-0.105s0.275 0.052 0.432 0.105c0.524 0.21 1.070 0.275 1.637 0.197s1.070-0.327 1.506-0.747c0.21-0.209 0.362-0.467 0.458-0.773s0.157-0.607 0.183-0.904c0.026-0.297 0.026-0.568 0-0.812s-0.048-0.419-0.065-0.524c-0.035-0.105-0.066-0.227-0.092-0.367s-0.013-0.262 0.039-0.367c0.105-0.244 0.293-0.458 0.563-0.642s0.563-0.336 0.878-0.458c0.314-0.122 0.62-0.214 0.917-0.275s0.533-0.092 0.707-0.092c0.227 0 0.406 0.074 0.537 0.223s0.223 0.301 0.275 0.458c0.192 0.471 0.507 0.886 0.943 1.244s0.952 0.537 1.546 0.537c0.611 0 1.153-0.17 1.624-0.511s0.803-0.773 0.996-1.297c0.070-0.14 0.179-0.284 0.327-0.432s0.301-0.223 0.458-0.223c0.244 0 0.511 0.035 0.799 0.105s0.572 0.166 0.851 0.288c0.279 0.122 0.537 0.279 0.773 0.472s0.423 0.402 0.563 0.629c0.087 0.14 0.113 0.293 0.079 0.458s-0.070 0.284-0.105 0.354c-0.227 0.506-0.297 1.039-0.21 1.598s0.341 1.048 0.76 1.467c0.419 0.419 0.934 0.651 1.546 0.694s1.179-0.057 1.703-0.301c0.14-0.087 0.31-0.122 0.511-0.105s0.371 0.096 0.511 0.236c0.262 0.244 0.493 0.616 0.694 1.113s0.336 1 0.406 1.506c0.035 0.297-0.013 0.528-0.144 0.694s-0.266 0.275-0.406 0.327c-0.542 0.192-1.004 0.528-1.388 1.009s-0.576 1.026-0.576 1.637c0 0.594 0.162 1.113 0.485 1.559s0.747 0.764 1.27 0.956c0.122 0.070 0.227 0.14 0.314 0.21 0.192 0.157 0.323 0.358 0.393 0.602v0zM16.451 19.462c0.786 0 1.528-0.149 2.227-0.445s1.305-0.707 1.821-1.231c0.515-0.524 0.921-1.131 1.218-1.821s0.445-1.428 0.445-2.214c0-0.786-0.148-1.524-0.445-2.214s-0.703-1.292-1.218-1.808c-0.515-0.515-1.122-0.921-1.821-1.218s-1.441-0.445-2.227-0.445c-0.786 0-1.524 0.148-2.214 0.445s-1.292 0.703-1.808 1.218c-0.515 0.515-0.921 1.118-1.218 1.808s-0.445 1.428-0.445 2.214c0 0.786 0.149 1.524 0.445 2.214s0.703 1.297 1.218 1.821c0.515 0.524 1.118 0.934 1.808 1.231s1.428 0.445 2.214 0.445v0z'],\n 'right': ['0 0 32 32', 'M22 16l-10.105-10.6-1.895 1.987 8.211 8.613-8.211 8.612 1.895 1.988 8.211-8.613z'],\n 'comment': ['0 0 32 32', 'M27.128 0.38h-22.553c-2.336 0-4.229 1.825-4.229 4.076v16.273c0 2.251 1.893 4.076 4.229 4.076h4.229v-2.685h8.403l-8.784 8.072 1.566 1.44 7.429-6.827h9.71c2.335 0 4.229-1.825 4.229-4.076v-16.273c0-2.252-1.894-4.076-4.229-4.076zM28.538 19.403c0 1.5-1.262 2.717-2.819 2.717h-8.36l-0.076-0.070-0.076 0.070h-11.223c-1.557 0-2.819-1.217-2.819-2.717v-13.589c0-1.501 1.262-2.718 2.819-2.718h19.734c1.557 0 2.819-0.141 2.819 1.359v14.947zM9.206 10.557c-1.222 0-2.215 0.911-2.215 2.036s0.992 2.035 2.215 2.035c1.224 0 2.216-0.911 2.216-2.035s-0.992-2.036-2.216-2.036zM22.496 10.557c-1.224 0-2.215 0.911-2.215 2.036s0.991 2.035 2.215 2.035c1.224 0 2.215-0.911 2.215-2.035s-0.991-2.036-2.215-2.036zM15.852 10.557c-1.224 0-2.215 0.911-2.215 2.036s0.991 2.035 2.215 2.035c1.222 0 2.215-0.911 2.215-2.035s-0.992-2.036-2.215-2.036z'],\n 'comment-off': ['0 0 32 32', 'M27.090 0.131h-22.731c-2.354 0-4.262 1.839-4.262 4.109v16.401c0 2.269 1.908 4.109 4.262 4.109h4.262v-2.706h8.469l-8.853 8.135 1.579 1.451 7.487-6.88h9.787c2.353 0 4.262-1.84 4.262-4.109v-16.401c0-2.27-1.909-4.109-4.262-4.109v0zM28.511 19.304c0 1.512-1.272 2.738-2.841 2.738h-8.425l-0.076-0.070-0.076 0.070h-11.311c-1.569 0-2.841-1.226-2.841-2.738v-13.696c0-1.513 1.272-2.739 2.841-2.739h19.889c1.569 0 2.841-0.142 2.841 1.37v15.064z'],\n 'send': ['0 0 32 32', 'M13.725 30l3.9-5.325-3.9-1.125v6.45zM0 17.5l11.050 3.35 13.6-11.55-10.55 12.425 11.8 3.65 6.1-23.375-32 15.5z'],\n 'menu': ['0 0 22 32', 'M20.8 14.4q0.704 0 1.152 0.48t0.448 1.12-0.48 1.12-1.12 0.48h-19.2q-0.64 0-1.12-0.48t-0.48-1.12 0.448-1.12 1.152-0.48h19.2zM1.6 11.2q-0.64 0-1.12-0.48t-0.48-1.12 0.448-1.12 1.152-0.48h19.2q0.704 0 1.152 0.48t0.448 1.12-0.48 1.12-1.12 0.48h-19.2zM20.8 20.8q0.704 0 1.152 0.48t0.448 1.12-0.48 1.12-1.12 0.48h-19.2q-0.64 0-1.12-0.48t-0.48-1.12 0.448-1.12 1.152-0.48h19.2z'],\n 'camera': ['0 0 32 32', 'M16 23c-3.309 0-6-2.691-6-6s2.691-6 6-6 6 2.691 6 6-2.691 6-6 6zM16 13c-2.206 0-4 1.794-4 4s1.794 4 4 4c2.206 0 4-1.794 4-4s-1.794-4-4-4zM27 28h-22c-1.654 0-3-1.346-3-3v-16c0-1.654 1.346-3 3-3h3c0.552 0 1 0.448 1 1s-0.448 1-1 1h-3c-0.551 0-1 0.449-1 1v16c0 0.552 0.449 1 1 1h22c0.552 0 1-0.448 1-1v-16c0-0.551-0.448-1-1-1h-11c-0.552 0-1-0.448-1-1s0.448-1 1-1h11c1.654 0 3 1.346 3 3v16c0 1.654-1.346 3-3 3zM24 10.5c0 0.828 0.672 1.5 1.5 1.5s1.5-0.672 1.5-1.5c0-0.828-0.672-1.5-1.5-1.5s-1.5 0.672-1.5 1.5zM15 4c0 0.552-0.448 1-1 1h-4c-0.552 0-1-0.448-1-1v0c0-0.552 0.448-1 1-1h4c0.552 0 1 0.448 1 1v0z']\n};\n\nmodule.exports = (type) => `\n \n \n \n \n`;\n\n\n// WEBPACK FOOTER //\n// ./src/svg.js","const svg = require('./svg.js');\n\nconst html = {\n main: (option, index, tran) => {\n let videos = ``;\n for (let i = 0; i < option.video.url.length; i++) {\n videos += html.video(i === 0, option.video.pic, option.screenshot, option.video.url.length ? 'metadata' : option.preload, option.video.url[i]);\n }\n return `\n
\n
\n ${videos}\n ${option.logo ? `\n
\n ` : ``}\n
\n
\n
\n
\n \n ${option.danmaku ? `${tran('Danmaku is loading')}` : ``}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n
\n
\n
\n 0:00 / 0:00\n
\n
\n ${option.video.quality ? `\n
\n \n
\n ${html.qualityList(option.video.quality)}\n
\n
\n ` : ``}\n ${option.screenshot ? `\n \n ${svg('camera')}\n \n ` : ``}\n
\n \n
\n \n
\n
\n
${tran('Set danmaku color')}
\n \n \n \n \n \n \n
\n
\n
${tran('Set danmaku type')}
\n \n \n \n
\n
\n \n \n
\n
\n
\n \n
\n
\n
\n \n \n
\n
\n
\n
00:00
\n
\n
\n
\n \n
\n
\n
\n
\n ${html.contextmenuList(option.contextmenu)}\n
`;\n },\n\n contextmenuList: (contextmenu) => {\n let result = '
';\n for (let i = 0; i < contextmenu.length; i++) {\n result += ``;\n }\n result += '
';\n\n return result;\n },\n\n qualityList: (quality) => {\n let result = '
';\n for (let i = 0; i < quality.length; i++) {\n result += `
${quality[i].name}
`;\n }\n result += '
';\n\n return result;\n },\n\n video: (current, pic, screenshot, preload, url) => ``,\n\n setting: (tran) => ({\n 'original': `\n
\n ${tran('Speed')}\n
\n ${svg('right')}\n
\n
\n
\n ${tran('Loop')}\n
\n \n \n
\n
\n
\n ${tran('Danmaku')}\n
\n \n \n
\n
\n
\n ${tran('Opacity for danmaku')}\n
\n
\n
\n \n
\n
\n
\n
`,\n 'speed': `\n
\n 0.5\n
\n
\n 0.75\n
\n
\n ${tran('Normal')}\n
\n
\n 1.25\n
\n
\n 1.5\n
\n
\n 2\n
`\n }) \n};\n\nmodule.exports = html;\n\n\n// WEBPACK FOOTER //\n// ./src/html.js","const tranZH = {\n 'Danmaku is loading': '弹幕加载中',\n 'Top': '顶部',\n 'Bottom': '底部',\n 'Rolling': '滚动',\n 'Input danmaku, hit Enter': '输入弹幕,回车发送',\n 'About author': '关于作者',\n 'DPlayer feedback': '播放器意见反馈',\n 'About DPlayer': '关于 DPlayer 播放器',\n 'Loop': '洗脑循环',\n 'Speed': '速度',\n 'Opacity for danmaku': '弹幕透明度',\n 'Normal': '正常',\n 'Please input danmaku content!': '要输入弹幕内容啊喂!',\n 'Set danmaku color': '设置弹幕颜色',\n 'Set danmaku type': '设置弹幕类型',\n 'Danmaku': '弹幕',\n 'This video fails to load': '视频加载失败',\n 'Switching to': '正在切换至',\n 'Switched to': '已经切换至',\n 'quality': '画质',\n};\n\nmodule.exports = function (lang) {\n this.lang = lang;\n this.tran = (text) => {\n if (this.lang === 'en') {\n return text;\n }\n else if (this.lang === 'zh') {\n return tranZH[text];\n }\n };\n};\n\n\n// WEBPACK FOOTER //\n// ./src/i18n.js","const defaultApiBackend = require('./api.js');\n\nmodule.exports = (option) => {\n const isMobile = /mobile/i.test(window.navigator.userAgent);\n // compatibility: some mobile browsers don't suppose autoplay\n if (isMobile) {\n option.autoplay = false;\n }\n\n // default options\n const defaultOption = {\n element: document.getElementsByClassName('dplayer')[0],\n autoplay: false,\n theme: '#b7daff',\n loop: false,\n lang: navigator.language.indexOf('zh') !== -1 ? 'zh' : 'en',\n screenshot: false,\n hotkey: true,\n preload: 'auto',\n apiBackend: defaultApiBackend,\n contextmenu: [\n {\n text: '关于作者',\n link: 'http://diygod.me'\n },\n {\n text: '播放器意见反馈',\n link: 'https://github.com/DIYgod/DPlayer/issues'\n },\n {\n text: '关于 DPlayer 播放器',\n link: 'https://github.com/DIYgod/DPlayer'\n }\n ]\n };\n for (const defaultKey in defaultOption) {\n if (defaultOption.hasOwnProperty(defaultKey) && !option.hasOwnProperty(defaultKey)) {\n option[defaultKey] = defaultOption[defaultKey];\n }\n }\n if (Object.prototype.toString.call(option.video.url) !== '[object Array]') {\n option.video.url = [option.video.url];\n }\n if (option.video && !option.video.hasOwnProperty('type')) {\n option.video.type = 'auto';\n }\n if (option.danmaku && !option.danmaku.hasOwnProperty('user')) {\n option.danmaku.user = 'DIYgod';\n }\n\n if (option.video.quality) {\n option.video.url = [option.video.quality[option.video.defaultQuality].url];\n }\n\n return option;\n};\n\n\n// WEBPACK FOOTER //\n// ./src/option.js","module.exports = {\n\n /**\n * Parse second to 00:00 format\n *\n * @param {Number} second\n * @return {String} 00:00 format\n */\n secondToTime: (second) => {\n const add0 = (num) => num < 10 ? '0' + num : '' + num;\n const min = parseInt(second / 60);\n const sec = parseInt(second - min * 60);\n return add0(min) + ':' + add0(sec);\n },\n\n /**\n * control play progress\n */\n // get element's view position\n getElementViewLeft: (element) => {\n let actualLeft = element.offsetLeft;\n let current = element.offsetParent;\n const elementScrollLeft = document.body.scrollLeft + document.documentElement.scrollLeft;\n if (!document.fullscreenElement && !document.mozFullScreenElement && !document.webkitFullscreenElement) {\n while (current !== null) {\n actualLeft += current.offsetLeft;\n current = current.offsetParent;\n }\n }\n else {\n while (current !== null && current !== element) {\n actualLeft += current.offsetLeft;\n current = current.offsetParent;\n }\n }\n return actualLeft - elementScrollLeft;\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/utils.js","class Video {\n constructor (videos, duration) {\n this.videos = videos;\n this.multi = this.videos.length > 1;\n this.index = 0;\n this.current = this.videos[this.index];\n\n this.duration = duration || 0;\n this.durationArr = [];\n this.eventAll = [];\n this.eventCurrent = [];\n \n this.on('all', 'durationchange', (i, video) => {\n if (video.duration !== 1) { // some Android browsers will output 1 at first\n this.durationArr[i] = video.duration;\n if (!duration) {\n this.duration = this.durationArr.reduce((sum, cur) => sum + cur); \n }\n }\n });\n this.on('current', 'end', () => {\n this.switch(this.index + 1);\n });\n }\n\n switch (index, time) {\n if (this.index !== index) {\n this.videos[index].classList.add('dplayer-video-current');\n if (!this.current.paused) {\n this.videos[index].play();\n }\n this.current.classList.remove('dplayer-video-current');\n this.current.pause();\n\n this.index = index;\n this.current = this.videos[this.index];\n this.videos[index].currentTime = time ? time : 0;\n }\n else {\n this.videos[index].currentTime = time ? time : 0;\n }\n }\n\n // bind event \n on (type, event, callback) {\n if (typeof callback === 'function') {\n if (type === 'all') {\n if (!this.eventAll[event]) {\n this.eventAll[event] = [];\n }\n this.eventAll[event].push(callback);\n }\n else {\n if (!this.eventCurrent[event]) {\n this.eventCurrent[event] = [];\n }\n this.eventCurrent[event].push(callback);\n }\n\n if (['seeking'].indexOf(event) === -1) {\n for (let i = 0; i < this.videos.length; i++) {\n this.videos[i].addEventListener(event, () => {\n if (type === 'all' || this.videos[i] === this.current) {\n callback(i, this.videos[i]);\n }\n });\n }\n }\n }\n }\n\n // trigger event\n trigger (type, event) {\n const events = type === 'all' ? this.eventAll : this.eventCurrent;\n for (let i = 0; i < events[event].length; i++) {\n events[event][i]();\n }\n }\n\n currentTime () {\n if (this.durationArr.slice(0, this.index).length) {\n return this.durationArr.slice(0, this.index).reduce((sum, cur) => sum + cur) + this.current.currentTime;\n }\n else {\n return this.current.currentTime;\n }\n }\n\n seek (time) {\n time = Math.max(time, 0);\n time = Math.min(time, this.duration);\n\n let i = 0;\n let tmptime = 0;\n while (tmptime <= time) {\n tmptime += this.durationArr[i];\n i++;\n }\n\n let currentTime;\n if (this.durationArr.slice(0, this.index).length) {\n currentTime = time - this.durationArr.slice(0, i - 1).reduce((sum, cur) => sum + cur);\n }\n else {\n currentTime = time;\n }\n \n this.switch(i - 1, currentTime);\n\n this.trigger('all', 'seeking');\n }\n\n attr (option, value) {\n if (value !== undefined) {\n for (let i = 0; i < this.videos.length; i++) {\n this.videos[i][option] = value;\n }\n }\n return this.current[option];\n }\n\n play () {\n this.current.play();\n }\n\n pause () {\n this.current.pause();\n }\n\n toggle () {\n this.current.paused ? this.play() : this.pause();\n }\n}\n\nmodule.exports = Video;\n\n\n// WEBPACK FOOTER //\n// ./src/video.js","console.log('\\n %c DPlayer 1.3.2 %c http://dplayer.js.org \\n\\n', 'color: #fadfa3; background: #030307; padding:5px 0;', 'background: #fadfa3; padding:5px 0;');\n\nrequire('./DPlayer.scss');\nconst utils = require('./utils.js');\nconst svg = require('./svg.js');\nconst handleOption = require('./option.js');\nconst i18n = require('./i18n.js');\nconst html = require('./html.js');\nconst Video = require('./video.js');\nconst isMobile = /mobile/i.test(window.navigator.userAgent);\n\nlet index = 0;\n\nclass DPlayer {\n\n /**\n * DPlayer constructor function\n *\n * @param {Object} option - See README\n * @constructor\n */\n constructor (option) {\n this.option = handleOption(option);\n\n this.option.element.classList.add('dplayer');\n\n if (this.option.video.quality) {\n this.qualityIndex = this.option.video.defaultQuality;\n this.quality = this.option.video.quality[this.option.video.defaultQuality];\n }\n\n this.tran = new i18n(this.option.lang).tran;\n\n /**\n * Update progress bar, including loading progress bar and play progress bar\n *\n * @param {String} type - Point out which bar it is, should be played loaded or volume\n * @param {Number} percentage\n * @param {String} direction - Point out the direction of this bar, Should be height or width\n */\n this.updateBar = (type, percentage, direction) => {\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n bar[type + 'Bar'].style[direction] = percentage * 100 + '%';\n };\n\n // define DPlayer events\n const eventTypes = ['play', 'pause', 'canplay', 'playing', 'ended', 'error'];\n this.event = {};\n for (let i = 0; i < eventTypes.length; i++) {\n this.event[eventTypes[i]] = [];\n }\n this.trigger = (type) => {\n for (let i = 0; i < this.event[type].length; i++) {\n this.event[type][i]();\n }\n };\n\n this.element = this.option.element;\n if (!this.option.danmaku) {\n this.element.classList.add('dplayer-no-danmaku');\n }\n if (isMobile) {\n this.element.classList.add('dplayer-mobile');\n }\n\n this.element.innerHTML = html.main(option, index, this.tran);\n\n // arrow style\n this.arrow = this.element.offsetWidth <= 500;\n if (this.arrow) {\n const arrowStyle = document.createElement('style');\n arrowStyle.innerHTML = `.dplayer .dplayer-danmaku{font-size:18px}`;\n document.head.appendChild(arrowStyle);\n }\n\n // get this video manager\n this.video = new Video(this.element.getElementsByClassName('dplayer-video-current'));\n\n this.initVideo();\n\n this.bezel = this.element.getElementsByClassName('dplayer-bezel-icon')[0];\n this.bezel.addEventListener('animationend', () => {\n this.bezel.classList.remove('dplayer-bezel-transition');\n });\n\n // play and pause button\n this.playButton = this.element.getElementsByClassName('dplayer-play-icon')[0];\n this.paused = true;\n this.playButton.addEventListener('click', () => {\n this.toggle();\n });\n\n const videoWrap = this.element.getElementsByClassName('dplayer-video-wrap')[0];\n const conMask = this.element.getElementsByClassName('dplayer-controller-mask')[0];\n if (!isMobile) {\n videoWrap.addEventListener('click', () => {\n this.toggle();\n });\n conMask.addEventListener('click', () => {\n this.toggle();\n });\n }\n else {\n const toggleController = () => {\n if (this.element.classList.contains('dplayer-hide-controller')) {\n this.element.classList.remove('dplayer-hide-controller');\n }\n else {\n this.element.classList.add('dplayer-hide-controller');\n }\n };\n videoWrap.addEventListener('click', toggleController);\n conMask.addEventListener('click', toggleController);\n }\n\n const bar = {};\n bar.playedBar = this.element.getElementsByClassName('dplayer-played')[0];\n bar.loadedBar = this.element.getElementsByClassName('dplayer-loaded')[0];\n const pbar = this.element.getElementsByClassName('dplayer-bar-wrap')[0];\n const pbarTimeTips = this.element.getElementsByClassName('dplayer-bar-time')[0];\n let barWidth;\n\n let lastPlayPos = 0;\n let currentPlayPos = 0;\n let bufferingDetected = false;\n let danmakuTime;\n this.setTime = () => {\n this.playedTime = setInterval(() => {\n // whether the video is buffering\n currentPlayPos = this.video.currentTime();\n if (!bufferingDetected\n && currentPlayPos < lastPlayPos + 0.01\n && !this.video.attr('paused')) {\n this.element.classList.add('dplayer-loading');\n bufferingDetected = true;\n }\n if (bufferingDetected\n && currentPlayPos > lastPlayPos + 0.01\n && !this.video.attr('paused')) {\n this.element.classList.remove('dplayer-loading');\n bufferingDetected = false;\n }\n lastPlayPos = currentPlayPos;\n\n this.updateBar('played', this.video.currentTime() / this.video.duration, 'width');\n this.element.getElementsByClassName('dplayer-ptime')[0].innerHTML = utils.secondToTime(this.video.currentTime());\n this.trigger('playing');\n }, 100);\n if (this.option.danmaku && showdan) {\n danmakuTime = setInterval(() => {\n if (this.dan) {\n let item = this.dan[this.danIndex];\n while (item && this.video.currentTime() > parseFloat(item.time)) {\n this.pushDanmaku(item.text, item.color, item.type);\n item = this.dan[++this.danIndex];\n }\n }\n }, 100);\n }\n };\n this.clearTime = () => {\n clearInterval(this.playedTime);\n if (this.option.danmaku) {\n clearInterval(danmakuTime);\n }\n };\n\n pbar.addEventListener('click', (event) => {\n const e = event || window.event;\n barWidth = pbar.clientWidth;\n let percentage = (e.clientX - utils.getElementViewLeft(pbar)) / barWidth;\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n this.updateBar('played', percentage, 'width');\n this.video.seek(parseFloat(bar.playedBar.style.width) / 100 * this.video.duration);\n });\n\n this.isTipsShow = false;\n this.timeTipsHandler = this.timeTipsHandler(\n pbar, pbarTimeTips).bind(this);\n pbar.addEventListener('mousemove', this.timeTipsHandler);\n pbar.addEventListener('mouseover', this.timeTipsHandler);\n pbar.addEventListener('mouseenter', this.timeTipsHandler);\n pbar.addEventListener('mouseout', this.timeTipsHandler);\n pbar.addEventListener('mouseleave', this.timeTipsHandler);\n\n const thumbMove = (event) => {\n const e = event || window.event;\n let percentage = (e.clientX - utils.getElementViewLeft(pbar)) / barWidth;\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n this.updateBar('played', percentage, 'width');\n this.element.getElementsByClassName('dplayer-ptime')[0].innerHTML = utils.secondToTime(percentage * this.video.duration);\n };\n\n const thumbUp = () => {\n document.removeEventListener('mouseup', thumbUp);\n document.removeEventListener('mousemove', thumbMove);\n this.video.seek(parseFloat(bar.playedBar.style.width) / 100 * this.video.duration);\n this.setTime();\n };\n\n pbar.addEventListener('mousedown', () => {\n barWidth = pbar.clientWidth;\n this.clearTime();\n document.addEventListener('mousemove', thumbMove);\n document.addEventListener('mouseup', thumbUp);\n });\n\n\n /**\n * control volume\n */\n bar.volumeBar = this.element.getElementsByClassName('dplayer-volume-bar-inner')[0];\n const volumeEle = this.element.getElementsByClassName('dplayer-volume')[0];\n const volumeBarWrapWrap = this.element.getElementsByClassName('dplayer-volume-bar-wrap')[0];\n const volumeBarWrap = this.element.getElementsByClassName('dplayer-volume-bar')[0];\n const volumeicon = this.element.getElementsByClassName('dplayer-volume-icon')[0];\n const vWidth = 35;\n\n this.switchVolumeIcon = () => {\n const volumeicon = this.element.getElementsByClassName('dplayer-volume-icon')[0];\n if (this.video.attr('volume') >= 0.8) {\n volumeicon.innerHTML = svg('volume-up');\n }\n else if (this.video.attr('volume') > 0) {\n volumeicon.innerHTML = svg('volume-down');\n }\n else {\n volumeicon.innerHTML = svg('volume-off');\n }\n };\n const volumeMove = (event) => {\n const e = event || window.event;\n const percentage = (e.clientX - utils.getElementViewLeft(volumeBarWrap) - 5.5) / vWidth;\n this.volume(percentage);\n };\n const volumeUp = () => {\n document.removeEventListener('mouseup', volumeUp);\n document.removeEventListener('mousemove', volumeMove);\n volumeEle.classList.remove('dplayer-volume-active');\n };\n\n volumeBarWrapWrap.addEventListener('click', (event) => {\n const e = event || window.event;\n const percentage = (e.clientX - utils.getElementViewLeft(volumeBarWrap) - 5.5) / vWidth;\n this.volume(percentage);\n });\n volumeBarWrapWrap.addEventListener('mousedown', () => {\n document.addEventListener('mousemove', volumeMove);\n document.addEventListener('mouseup', volumeUp);\n volumeEle.classList.add('dplayer-volume-active');\n });\n volumeicon.addEventListener('click', () => {\n if (this.video.attr('muted')) {\n this.video.attr('muted', false);\n this.switchVolumeIcon();\n this.updateBar('volume', this.video.attr('volume'), 'width');\n }\n else {\n this.video.attr('muted', true);\n volumeicon.innerHTML = svg('volume-off');\n this.updateBar('volume', 0, 'width');\n }\n });\n\n\n /**\n * auto hide controller\n */\n let hideTime = 0;\n if (!isMobile) {\n const hideController = () => {\n this.element.classList.remove('dplayer-hide-controller');\n clearTimeout(hideTime);\n hideTime = setTimeout(() => {\n if (this.video.attr('played').length) {\n this.element.classList.add('dplayer-hide-controller');\n closeSetting();\n closeComment();\n }\n }, 2000);\n };\n this.element.addEventListener('mousemove', hideController);\n this.element.addEventListener('click', hideController);\n }\n\n\n /**\n * setting\n */\n this.danOpacity = localStorage.getItem('DPlayer-opacity') || 0.7;\n const settingHTML = html.setting(this.tran);\n\n // toggle setting box\n const settingIcon = this.element.getElementsByClassName('dplayer-setting-icon')[0];\n const settingBox = this.element.getElementsByClassName('dplayer-setting-box')[0];\n const mask = this.element.getElementsByClassName('dplayer-mask')[0];\n settingBox.innerHTML = settingHTML.original;\n\n const closeSetting = () => {\n if (settingBox.classList.contains('dplayer-setting-box-open')) {\n settingBox.classList.remove('dplayer-setting-box-open');\n mask.classList.remove('dplayer-mask-show');\n setTimeout(() => {\n settingBox.classList.remove('dplayer-setting-box-narrow');\n settingBox.innerHTML = settingHTML.original;\n settingEvent();\n }, 300);\n }\n };\n const openSetting = () => {\n settingBox.classList.add('dplayer-setting-box-open');\n mask.classList.add('dplayer-mask-show');\n };\n\n mask.addEventListener('click', () => {\n closeSetting();\n });\n settingIcon.addEventListener('click', () => {\n openSetting();\n });\n\n this.loop = this.option.loop;\n const danContainer = this.element.getElementsByClassName('dplayer-danmaku')[0];\n let showdan = true;\n const settingEvent = () => {\n // loop control\n const loopEle = this.element.getElementsByClassName('dplayer-setting-loop')[0];\n const loopToggle = loopEle.getElementsByClassName('dplayer-toggle-setting-input')[0];\n\n loopToggle.checked = this.loop;\n\n loopEle.addEventListener('click', () => {\n loopToggle.checked = !loopToggle.checked;\n if (loopToggle.checked) {\n this.loop = true;\n }\n else {\n this.loop = false;\n }\n closeSetting();\n });\n\n // show danmaku control\n const showDanEle = this.element.getElementsByClassName('dplayer-setting-showdan')[0];\n const showDanToggle = showDanEle.getElementsByClassName('dplayer-showdan-setting-input')[0];\n\n showDanToggle.checked = showdan;\n\n showDanEle.addEventListener('click', () => {\n showDanToggle.checked = !showDanToggle.checked;\n if (showDanToggle.checked) {\n showdan = true;\n if (this.option.danmaku) {\n for (let i = 0; i < this.dan.length; i++) {\n if (this.dan[i].time >= this.video.currentTime()) {\n this.danIndex = i;\n break;\n }\n this.danIndex = this.dan.length;\n }\n danmakuTime = setInterval(() => {\n let item = this.dan[this.danIndex];\n while (item && this.video.currentTime() >= parseFloat(item.time)) {\n this.pushDanmaku(item.text, item.color, item.type);\n item = this.dan[++this.danIndex];\n }\n }, 0);\n }\n }\n else {\n showdan = false;\n if (this.option.danmaku) {\n clearInterval(danmakuTime);\n danContainer.innerHTML = `
`;\n this.danTunnel = {\n right: {},\n top: {},\n bottom: {}\n };\n this.itemDemo = this.element.getElementsByClassName('dplayer-danmaku-item')[0];\n }\n }\n closeSetting();\n });\n\n // speed control\n const speedEle = this.element.getElementsByClassName('dplayer-setting-speed')[0];\n speedEle.addEventListener('click', () => {\n settingBox.classList.add('dplayer-setting-box-narrow');\n settingBox.innerHTML = settingHTML.speed;\n\n const speedItem = settingBox.getElementsByClassName('dplayer-setting-speed-item');\n for (let i = 0; i < speedItem.length; i++) {\n speedItem[i].addEventListener('click', () => {\n this.video.attr('playbackRate', speedItem[i].dataset.speed);\n closeSetting();\n });\n }\n });\n\n if (this.option.danmaku) {\n // danmaku opacity\n bar.danmakuBar = this.element.getElementsByClassName('dplayer-danmaku-bar-inner')[0];\n const danmakuBarWrapWrap = this.element.getElementsByClassName('dplayer-danmaku-bar-wrap')[0];\n const danmakuBarWrap = this.element.getElementsByClassName('dplayer-danmaku-bar')[0];\n const danmakuSettingBox = this.element.getElementsByClassName('dplayer-setting-danmaku')[0];\n const dWidth = 130;\n this.updateBar('danmaku', this.danOpacity, 'width');\n\n const danmakuMove = (event) => {\n const e = event || window.event;\n let percentage = (e.clientX - utils.getElementViewLeft(danmakuBarWrap)) / dWidth;\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n this.updateBar('danmaku', percentage, 'width');\n const items = this.element.getElementsByClassName('dplayer-danmaku-item');\n for (let i = 0; i < items.length; i++) {\n items[i].style.opacity = percentage;\n }\n this.danOpacity = percentage;\n localStorage.setItem('DPlayer-opacity', this.danOpacity);\n };\n const danmakuUp = () => {\n document.removeEventListener('mouseup', danmakuUp);\n document.removeEventListener('mousemove', danmakuMove);\n danmakuSettingBox.classList.remove('dplayer-setting-danmaku-active');\n };\n\n danmakuBarWrapWrap.addEventListener('click', (event) => {\n const e = event || window.event;\n let percentage = (e.clientX - utils.getElementViewLeft(danmakuBarWrap)) / dWidth;\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n this.updateBar('danmaku', percentage, 'width');\n const items = this.element.getElementsByClassName('dplayer-danmaku-item');\n for (let i = 0; i < items.length; i++) {\n items[i].style.opacity = percentage;\n }\n this.danOpacity = percentage;\n localStorage.setItem('DPlayer-opacity', this.danOpacity);\n });\n danmakuBarWrapWrap.addEventListener('mousedown', () => {\n document.addEventListener('mousemove', danmakuMove);\n document.addEventListener('mouseup', danmakuUp);\n danmakuSettingBox.classList.add('dplayer-setting-danmaku-active');\n });\n }\n };\n settingEvent();\n\n // set duration time\n if (this.video.duration !== 1) { // compatibility: Android browsers will output 1 at first\n this.element.getElementsByClassName('dplayer-dtime')[0].innerHTML = this.video.duration ? utils.secondToTime(this.video.duration) : '00:00';\n }\n\n // danmaku\n this.danTunnel = {\n right: {},\n top: {},\n bottom: {}\n };\n this.itemDemo = this.element.getElementsByClassName('dplayer-danmaku-item')[0];\n\n if (this.option.danmaku) {\n this.danIndex = 0;\n this.readDanmaku();\n }\n else {\n // autoplay\n if (this.option.autoplay && !isMobile) {\n this.play();\n }\n else if (isMobile) {\n this.pause();\n }\n }\n\n\n /**\n * comment\n */\n const commentInput = this.element.getElementsByClassName('dplayer-comment-input')[0];\n const commentIcon = this.element.getElementsByClassName('dplayer-comment-icon')[0];\n const commentBox = this.element.getElementsByClassName('dplayer-comment-box')[0];\n const commentSettingIcon = this.element.getElementsByClassName('dplayer-comment-setting-icon')[0];\n const commentSettingBox = this.element.getElementsByClassName('dplayer-comment-setting-box')[0];\n const commentSendIcon = this.element.getElementsByClassName('dplayer-send-icon')[0];\n\n const htmlEncode = (str) => str.\n replace(/&/g, \"&\").\n replace(//g, \">\").\n replace(/\"/g, \""\").\n replace(/'/g, \"'\").\n replace(/\\//g, \"/\");\n\n const sendComment = () => {\n commentInput.blur();\n\n // text can't be empty\n if (!commentInput.value.replace(/^\\s+|\\s+$/g, '')) {\n this.notice(this.tran('Please input danmaku content!'));\n return;\n }\n\n const danmakuData = {\n token: this.option.danmaku.token,\n player: this.option.danmaku.id,\n author: this.option.danmaku.user,\n time: this.video.currentTime(),\n text: commentInput.value,\n color: this.element.querySelector('.dplayer-comment-setting-color input:checked').value,\n type: this.element.querySelector('.dplayer-comment-setting-type input:checked').value\n };\n this.option.apiBackend.send(this.option.danmaku.api, danmakuData);\n\n commentInput.value = '';\n closeComment();\n this.dan.splice(this.danIndex, 0, danmakuData);\n this.danIndex++;\n const item = this.pushDanmaku(htmlEncode(danmakuData.text), danmakuData.color, danmakuData.type);\n item.style.border = `2px solid ${this.option.theme}`;\n };\n\n const closeCommentSetting = () => {\n if (commentSettingBox.classList.contains('dplayer-comment-setting-open')) {\n commentSettingBox.classList.remove('dplayer-comment-setting-open');\n }\n };\n const toggleCommentSetting = () => {\n if (commentSettingBox.classList.contains('dplayer-comment-setting-open')) {\n commentSettingBox.classList.remove('dplayer-comment-setting-open');\n }\n else {\n commentSettingBox.classList.add('dplayer-comment-setting-open');\n }\n };\n\n let disableHide = 0;\n let commentFocusTimeout = 0;\n const closeComment = () => {\n if (!commentBox.classList.contains('dplayer-comment-box-open')) {\n return;\n }\n\n commentBox.classList.remove('dplayer-comment-box-open');\n mask.classList.remove('dplayer-mask-show');\n this.element.classList.remove('dplayer-show-controller');\n\n clearInterval(disableHide);\n clearTimeout(commentFocusTimeout);\n closeCommentSetting();\n };\n const openComment = () => {\n if (commentBox.classList.contains('dplayer-comment-box-open')) {\n return;\n }\n\n commentBox.classList.add('dplayer-comment-box-open');\n mask.classList.add('dplayer-mask-show');\n this.element.classList.add('dplayer-show-controller');\n\n disableHide = setInterval(() => {\n clearTimeout(hideTime);\n }, 1000);\n commentFocusTimeout = setTimeout(() => {\n commentInput.focus();\n }, 300);\n };\n\n mask.addEventListener('click', () => {\n closeComment();\n });\n commentIcon.addEventListener('click', () => {\n openComment();\n });\n commentSettingIcon.addEventListener('click', () => {\n toggleCommentSetting();\n });\n\n // comment setting box\n this.element.getElementsByClassName('dplayer-comment-setting-color')[0].addEventListener('click', () => {\n const sele = this.element.querySelector('input[name=\"dplayer-danmaku-color-${index}\"]:checked+span');\n if (sele) {\n commentSettingIcon.getElementsByClassName('dplayer-fill')[0].style.fill = this.element.querySelector('input[name=\"dplayer-danmaku-color-${index}\"]:checked').value;\n }\n });\n\n commentInput.addEventListener('click', () => {\n closeCommentSetting();\n });\n commentInput.addEventListener('keydown', (e) => {\n const event = e || window.event;\n if (event.keyCode === 13) {\n sendComment();\n }\n });\n\n commentSendIcon.addEventListener('click', sendComment);\n\n\n /**\n * full screen\n */\n const resetAnimation = () => {\n const danWidth = danContainer.offsetWidth;\n const items = this.element.getElementsByClassName('dplayer-danmaku-item');\n for (let i = 0; i < items.length; i++) {\n items[i].style.transform = `translateX(-${danWidth}px)`;\n }\n };\n\n this.element.addEventListener('fullscreenchange', () => {\n resetAnimation();\n });\n this.element.addEventListener('mozfullscreenchange', () => {\n resetAnimation();\n });\n this.element.addEventListener('webkitfullscreenchange', () => {\n resetAnimation();\n });\n // browser full screen\n this.element.getElementsByClassName('dplayer-full-icon')[0].addEventListener('click', () => {\n if (!document.fullscreenElement && !document.mozFullScreenElement && !document.webkitFullscreenElement) {\n if (this.element.requestFullscreen) {\n this.element.requestFullscreen();\n }\n else if (this.element.mozRequestFullScreen) {\n this.element.mozRequestFullScreen();\n }\n else if (this.element.webkitRequestFullscreen) {\n this.element.webkitRequestFullscreen();\n }\n else if (this.video.attr('webkitEnterFullscreen')) { // Safari for iOS\n this.video.current.webkitEnterFullscreen();\n }\n }\n else {\n if (document.cancelFullScreen) {\n document.cancelFullScreen();\n }\n else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen();\n }\n else if (document.webkitCancelFullScreen) {\n document.webkitCancelFullScreen();\n }\n }\n resetAnimation();\n });\n // web full screen\n this.element.getElementsByClassName('dplayer-full-in-icon')[0].addEventListener('click', () => {\n if (this.element.classList.contains('dplayer-fulled')) {\n this.element.classList.remove('dplayer-fulled');\n }\n else {\n this.element.classList.add('dplayer-fulled');\n resetAnimation();\n }\n });\n\n /**\n * hot key\n */\n const handleKeyDown = (e) => {\n const tag = document.activeElement.tagName.toUpperCase();\n const editable = document.activeElement.getAttribute('contenteditable');\n if (tag !== 'INPUT' && tag !== 'TEXTAREA' && editable !== '' && editable !== 'true') {\n const event = e || window.event;\n let percentage;\n switch (event.keyCode) {\n case 32:\n event.preventDefault();\n this.toggle();\n break;\n case 37:\n event.preventDefault();\n this.video.seek(this.video.currentTime() - 5);\n break;\n case 39:\n event.preventDefault();\n this.video.seek(this.video.currentTime() + 5);\n break;\n case 38:\n event.preventDefault();\n percentage = this.video.attr('volume') + 0.1;\n this.volume(percentage);\n break;\n case 40:\n event.preventDefault();\n percentage = this.video.attr('volume') - 0.1;\n this.volume(percentage);\n break;\n }\n }\n };\n if (this.option.hotkey) {\n document.addEventListener('keydown', handleKeyDown);\n }\n document.addEventListener('keydown', (e) => { // Press ESC to quit web full screen\n const event = e || window.event;\n switch (event.keyCode) {\n case 27:\n if (this.element.classList.contains('dplayer-fulled')) {\n this.element.classList.remove('dplayer-fulled');\n resetAnimation();\n }\n break;\n }\n });\n\n /**\n * right key\n */\n const menu = this.element.getElementsByClassName('dplayer-menu')[0];\n this.element.addEventListener('contextmenu', (e) => {\n const event = e || window.event;\n event.preventDefault();\n\n menu.classList.add('dplayer-menu-show');\n\n const clientRect = this.element.getBoundingClientRect();\n const menuLeft = event.clientX - clientRect.left;\n const menuTop = event.clientY - clientRect.top;\n if (menuLeft + menu.offsetWidth >= clientRect.width) {\n menu.style.right = clientRect.width - menuLeft + 'px';\n menu.style.left = 'initial';\n }\n else {\n menu.style.left = event.clientX - this.element.getBoundingClientRect().left + 'px';\n menu.style.right = 'initial';\n }\n if (menuTop + menu.offsetHeight >= clientRect.height) {\n menu.style.bottom = clientRect.height - menuTop + 'px';\n menu.style.top = 'initial';\n }\n else {\n menu.style.top = event.clientY - this.element.getBoundingClientRect().top + 'px';\n menu.style.bottom = 'initial';\n }\n\n mask.classList.add('dplayer-mask-show');\n mask.addEventListener('click', () => {\n mask.classList.remove('dplayer-mask-show');\n menu.classList.remove('dplayer-menu-show');\n });\n });\n\n /**\n * Switch quality\n */\n if (this.option.video.quality) {\n this.element.getElementsByClassName('dplayer-quality-list')[0].addEventListener('click', (e) => {\n if (e.target.classList.contains('dplayer-quality-item')) {\n this.switchQuality(e.target.dataset.index);\n }\n });\n }\n\n /**\n * Screenshot\n */\n if (this.option.screenshot) {\n const camareIcon = this.element.getElementsByClassName('dplayer-camera-icon')[0];\n camareIcon.addEventListener('click', () => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = this.video.attr('videoWidth');\n canvas.height = this.video.attr('videoHeight');\n canvas.getContext('2d').drawImage(this.video.current, 0, 0, canvas.width, canvas.height);\n\n camareIcon.href = canvas.toDataURL();\n camareIcon.download = \"DPlayer.png\";\n });\n }\n\n index++;\n }\n\n /**\n * Play music\n */\n play (time) {\n if (Object.prototype.toString.call(time) === '[object Number]') {\n this.video.seek(time);\n }\n this.paused = false;\n if (this.video.attr('paused')) {\n this.bezel.innerHTML = svg('play');\n this.bezel.classList.add('dplayer-bezel-transition');\n }\n\n this.playButton.innerHTML = svg('pause');\n\n this.video.play();\n if (this.playedTime) {\n this.clearTime();\n }\n this.setTime();\n this.element.classList.add('dplayer-playing');\n this.trigger('play');\n }\n\n /**\n * Pause music\n */\n pause () {\n this.paused = true;\n this.element.classList.remove('dplayer-loading');\n\n if (!this.video.attr('paused')) {\n this.bezel.innerHTML = svg('pause');\n this.bezel.classList.add('dplayer-bezel-transition');\n }\n\n this.ended = false;\n this.playButton.innerHTML = svg('play');\n this.video.pause();\n this.clearTime();\n this.element.classList.remove('dplayer-playing');\n this.trigger('pause');\n }\n\n /**\n * Set volume\n */\n volume (percentage) {\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n this.updateBar('volume', percentage, 'width');\n this.video.attr('volume', percentage);\n if (this.video.attr('muted')) {\n this.video.attr('muted', false);\n }\n this.switchVolumeIcon();\n }\n\n /**\n * Toggle between play and pause\n */\n toggle () {\n if (this.video.attr('paused')) {\n this.play();\n }\n else {\n this.pause();\n }\n }\n\n /**\n * attach event\n */\n on (event, callback) {\n if (typeof callback === 'function') {\n this.event[event].push(callback);\n }\n }\n\n /**\n * Asynchronously read danmaku from all API endpoints\n */\n _readAllEndpoints (endpoints, finish) {\n const results = [];\n let readCount = 0;\n const cbk = (i) => (err, data) => {\n ++readCount;\n if (err) {\n if (err.response) {\n this.notice(err.response.msg);\n }\n else {\n this.notice('Request was unsuccessful: ' + err.status);\n }\n results[i] = [];\n }\n else {\n results[i] = data;\n }\n if (readCount === endpoints.length) {\n return finish(results);\n }\n };\n\n for (let i = 0; i < endpoints.length; ++i) {\n this.option.apiBackend.read(endpoints[i], cbk(i));\n }\n }\n\n /**\n * Read danmaku from API\n */\n readDanmaku () {\n const isMobile = /mobile/i.test(window.navigator.userAgent);\n let apiurl;\n if (this.option.danmaku.maximum) {\n apiurl = `${this.option.danmaku.api}?id=${this.option.danmaku.id}&max=${this.option.danmaku.maximum}`;\n }\n else {\n apiurl = `${this.option.danmaku.api}?id=${this.option.danmaku.id}`;\n }\n const endpoints = (this.option.danmaku.addition || []).slice(0);\n endpoints.push(apiurl);\n\n this._readAllEndpoints(endpoints, (results) => {\n this.danIndex = 0;\n this.dan = [].concat.apply([], results).sort((a, b) => a.time - b.time);\n this.element.getElementsByClassName('dplayer-danloading')[0].style.display = 'none';\n\n // autoplay\n if (this.option.autoplay && !isMobile) {\n this.play();\n }\n else if (isMobile) {\n this.pause();\n }\n });\n }\n\n /**\n * Push a danmaku into DPlayer\n *\n * @param {String} text - danmaku content\n * @param {String} color - danmaku color, default: `#fff`\n * @param {String} type - danmaku type, `right` `top` `bottom`, default: `right`\n */\n pushDanmaku (text, color, type) {\n const danContainer = this.element.getElementsByClassName('dplayer-danmaku')[0];\n const itemHeight = this.arrow ? 24 : 30;\n const danWidth = danContainer.offsetWidth;\n const danHeight = danContainer.offsetHeight;\n const itemY = parseInt(danHeight / itemHeight);\n\n const danItemRight = (ele) => danContainer.getBoundingClientRect().right - ele.getBoundingClientRect().right;\n\n const danSpeed = (width) => (danWidth + width) / 5;\n\n const getTunnel = (ele, type, width) => {\n const tmp = danWidth / danSpeed(width);\n\n for (let i = 0; ; i++) {\n const item = this.danTunnel[type][i + ''];\n if (item && item.length) {\n for (let j = 0; j < item.length; j++) {\n const danRight = danItemRight(item[j]) - 10;\n if (danRight <= danWidth - tmp * danSpeed(item[j].offsetWidth) || danRight <= 0) {\n break;\n }\n if (j === item.length - 1) {\n this.danTunnel[type][i + ''].push(ele);\n ele.addEventListener('animationend', () => {\n this.danTunnel[type][i + ''].splice(0, 1);\n });\n return i % itemY;\n }\n }\n }\n else {\n this.danTunnel[type][i + ''] = [ele];\n ele.addEventListener('animationend', () => {\n this.danTunnel[type][i + ''].splice(0, 1);\n });\n return i % itemY;\n }\n }\n };\n\n if (!type) {\n type = 'right';\n }\n if (!color) {\n color = '#fff';\n }\n const item = document.createElement(`div`);\n item.classList.add(`dplayer-danmaku-item`);\n item.classList.add(`dplayer-danmaku-${type}`);\n item.innerHTML = text;\n item.style.opacity = this.danOpacity;\n item.style.color = color;\n item.addEventListener('animationend', () => {\n danContainer.removeChild(item);\n });\n\n // measure\n this.itemDemo.innerHTML = text;\n const itemWidth = this.itemDemo.offsetWidth;\n\n // adjust\n switch (type) {\n case 'right':\n item.style.top = itemHeight * getTunnel(item, type, itemWidth) + 'px';\n item.style.width = itemWidth + 1 + 'px';\n item.style.transform = `translateX(-${danWidth}px)`;\n break;\n case 'top':\n item.style.top = itemHeight * getTunnel(item, type) + 'px';\n break;\n case 'bottom':\n item.style.bottom = itemHeight * getTunnel(item, type) + 'px';\n break;\n default:\n console.error(`Can't handled danmaku type: ${type}`);\n }\n\n // insert\n danContainer.appendChild(item);\n\n // move\n item.classList.add(`dplayer-danmaku-move`);\n\n return item;\n }\n\n /**\n * Switch to a new video\n *\n * @param {Object} video - new video info\n * @param {Object} danmaku - new danmaku info\n */\n switchVideo (video, danmaku) {\n this.video.attr('poster', video.pic ? video.pic : '');\n this.video.attr('src', video.url);\n this.pause();\n if (danmaku) {\n this.dan = [];\n this.danIndex = 0;\n this.element.getElementsByClassName('dplayer-danloading')[0].style.display = 'block';\n this.updateBar('played', 0, 'width');\n this.updateBar('loaded', 0, 'width');\n this.element.getElementsByClassName('dplayer-ptime')[0].innerHTML = '00:00';\n this.element.getElementsByClassName('dplayer-danmaku')[0].innerHTML = `
`;\n this.danTuel = {\n right: {},\n top: {},\n bottom: {}\n };\n this.itemDemo = this.element.getElementsByClassName('dplayer-danmaku-item')[0];\n this.option.danmaku = danmaku;\n this.readDanmaku();\n }\n }\n\n initVideo () {\n // Support HTTP Live Streaming\n let enablehls;\n if (this.option.video.type === 'auto') {\n enablehls = /m3u8(#|\\?|$)/i.exec(this.option.video.url);\n }\n else if (this.option.video.type === 'hls') {\n enablehls = true;\n }\n else {\n enablehls = false;\n }\n if (enablehls && Hls.isSupported()) {\n // this.element.getElementsByClassName('dplayer-time')[0].style.display = 'none';\n const hls = new Hls();\n hls.attachMedia(this.video.current);\n hls.on(Hls.Events.MEDIA_ATTACHED, () => {\n hls.loadSource(this.option.video.url);\n hls.on(Hls.Events.MANIFEST_PARSED, function (event, data) {\n this.notice(\"manifest loaded, found \" + data.levels.length + \" quality level\");\n });\n });\n }\n\n // Support FLV\n let enableflv;\n if (this.option.video.type === 'auto') {\n enableflv = /.flv(#|\\?|$)/i.exec(this.option.video.url);\n }\n else if (this.option.video.type === 'flv') {\n enableflv = true;\n }\n else {\n enableflv = false;\n }\n if (enableflv && flvjs.isSupported()) {\n const flvPlayer = flvjs.createPlayer({\n type: 'flv',\n url: this.option.video.url\n });\n flvPlayer.attachMediaElement(this.video.current);\n flvPlayer.load();\n }\n\n if (this.option.danmaku) {\n this.video.on('all', 'seeking', () => {\n for (let i = 0; i < this.dan.length; i++) {\n if (this.dan[i].time >= this.video.currentTime()) {\n this.danIndex = i;\n return;\n }\n this.danIndex = this.dan.length;\n }\n });\n }\n\n\n /**\n * video events\n */\n // show video time: the metadata has loaded or changed\n this.video.on('all', 'durationchange', (i, video) => {\n if (video.duration !== 1) { // compatibility: Android browsers will output 1 at first\n this.element.getElementsByClassName('dplayer-dtime')[0].innerHTML = utils.secondToTime(this.video.duration);\n }\n });\n\n // show video loaded bar: to inform interested parties of progress downloading the media\n this.video.on('current', 'progress', (i, video) => {\n const percentage = video.buffered.length ? video.buffered.end(video.buffered.length - 1) / video.duration : 0;\n this.updateBar('loaded', percentage, 'width');\n });\n\n // video download error: an error occurs\n this.video.on('all', 'error', () => {\n this.notice(this.tran('This video fails to load'), -1);\n this.trigger('pause');\n });\n\n // video can play: enough data is available that the media can be played\n this.video.on('current', 'canplay', () => {\n this.trigger('canplay');\n });\n\n // music end\n this.ended = false;\n this.video.on('all', 'ended', (i) => {\n if (i === this.video.videos.length - 1) {\n this.updateBar('played', 1, 'width');\n if (!this.loop) {\n this.ended = true;\n this.pause();\n this.trigger('ended');\n }\n else {\n this.video.switch(0);\n this.video.play();\n }\n }\n });\n\n this.video.on('current', 'play', () => {\n if (this.paused) {\n this.play();\n }\n });\n\n this.video.on('current', 'pause', () => {\n if (!this.paused) {\n this.pause();\n }\n });\n\n // control volume\n this.video.attr('volume', parseInt(this.element.getElementsByClassName('dplayer-volume-bar-inner')[0].style.width) / 100);\n }\n\n switchQuality (index) {\n if (this.qualityIndex === index || this.switchingQuality) {\n return;\n }\n else {\n this.qualityIndex = index;\n }\n this.switchingQuality = true;\n this.quality = this.option.video.quality[index];\n this.element.getElementsByClassName('dplayer-quality-icon')[0].innerHTML = this.quality.name;\n\n this.video.pause();\n const videoHTML = html.video(false, null, this.option.screenshot, 'auto', this.quality.url);\n const videoEle = new DOMParser().parseFromString(videoHTML, 'text/html').body.firstChild;\n const parent = this.element.getElementsByClassName('dplayer-video-wrap')[0];\n parent.prepend(videoEle);\n this.prevVideo = this.video;\n this.video = new Video([videoEle], this.prevVideo.duration);\n this.initVideo();\n this.video.seek(this.prevVideo.currentTime());\n this.notice(`${this.tran('Switching to')} ${this.quality.name} ${this.tran('quality')}`, -1);\n this.video.on('current', 'canplay', () => {\n if (this.prevVideo) {\n if (this.video.currentTime() !== this.prevVideo.currentTime()) {\n this.video.seek(this.prevVideo.currentTime());\n return;\n }\n parent.removeChild(this.prevVideo.current);\n this.video.current.classList.add('dplayer-video-current');\n this.video.play();\n this.prevVideo = null;\n this.notice(`${this.tran('Switched to')} ${this.quality.name} ${this.tran('quality')}`);\n this.switchingQuality = false;\n }\n });\n }\n\n timeTipsHandler (pbar, timeTips) {\n // http://stackoverflow.com/questions/1480133/how-can-i-get-an-objects-absolute-position-on-the-page-in-javascript\n const cumulativeOffset = (element) => {\n let top = 0, left = 0;\n do {\n top += element.offsetTop || 0;\n left += element.offsetLeft || 0;\n element = element.offsetParent;\n } while (element);\n\n return {\n top: top,\n left: left\n };\n };\n\n return (e) => {\n if (!this.video.duration) {\n return;\n }\n const { clientX } = e;\n const px = cumulativeOffset(pbar).left;\n const tx = clientX - px;\n timeTips.innerText = utils.secondToTime(this.video.duration * (tx / pbar.offsetWidth));\n timeTips.style.left = `${(tx - 20)}px`;\n switch (e.type) {\n case 'mouseenter':\n case 'mouseover':\n case 'mousemove':\n if (this.isTipsShow) {\n return;\n }\n timeTips.classList.remove('hidden');\n this.isTipsShow = true;\n break;\n case 'mouseleave':\n case 'mouseout':\n if (!this.isTipsShow) {\n return;\n }\n timeTips.classList.add('hidden');\n this.isTipsShow = false;\n break;\n }\n };\n }\n\n notice (text, time) {\n const noticeEle = this.element.getElementsByClassName('dplayer-notice')[0];\n noticeEle.innerHTML = text;\n noticeEle.style.opacity = 1;\n if (this.noticeTime) {\n clearTimeout(this.noticeTime);\n }\n if (time && time < 0) {\n return;\n }\n this.noticeTime = setTimeout(() => {\n noticeEle.style.opacity = 0;\n }, time || 2000);\n }\n}\n\nmodule.exports = DPlayer;\n\n\n\n// WEBPACK FOOTER //\n// ./src/DPlayer.js","/*\n * xhr.status ---> fail\n * response.code === 1 ---> success\n * response.code !== 1 ---> error\n * */\n\nconst SendXMLHttpRequest = (url, data, success, error, fail) => {\n const xhr = new XMLHttpRequest();\n\n xhr.onreadystatechange = () => {\n if (xhr.readyState === 4) {\n if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) {\n const response = JSON.parse(xhr.responseText);\n\n if (response.code !== 1) {\n return error(xhr, response);\n }\n\n return success(xhr, response);\n }\n\n fail(xhr);\n }\n };\n\n xhr.open(data !== null ? 'POST' : 'GET', url, true);\n xhr.send(data !== null ? JSON.stringify(data) : null);\n};\n\nmodule.exports = {\n send: (endpoint, danmakuData) => {\n SendXMLHttpRequest(endpoint, danmakuData, (xhr, response) => {\n console.log('Post danmaku: ', response);\n }, (xhr, response) => {\n alert(response.msg);\n }, (xhr) => {\n console.log('Request was unsuccessful: ' + xhr.status);\n });\n },\n\n read: (endpoint, cbk) => {\n SendXMLHttpRequest(endpoint, null, (xhr, response) => {\n cbk(null, response.danmaku);\n }, (xhr, response) => {\n cbk({ status: xhr.status, response });\n }, (xhr) => {\n cbk({ status: xhr.status, response: null });\n });\n }\n};\n\n\n// WEBPACK FOOTER //\n// ./src/api.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///DPlayer.min.js","webpack:///webpack/bootstrap 2cb1704de1f3a1b3c55e","webpack:///./src/svg.js","webpack:///./src/DPlayer.js","webpack:///./src/utils.js","webpack:///./src/option.js","webpack:///./src/api.js","webpack:///./src/i18n.js","webpack:///./src/html.js","webpack:///./src/video.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","svgSource","play","pause","volume-up","volume-down","volume-off","loop","full","full-in","setting","right","comment","comment-off","send","menu","camera","type","_classCallCheck","instance","Constructor","TypeError","_typeof","Symbol","iterator","obj","constructor","_createClass","defineProperties","target","props","length","descriptor","writable","key","protoProps","staticProps","console","log","utils","svg","handleOption","i18n","html","Video","isMobile","test","window","navigator","userAgent","index","DPlayer","option","_this","element","classList","add","video","quality","qualityIndex","defaultQuality","tran","lang","updateBar","percentage","direction","bar","style","eventTypes","event","trigger","danmaku","innerHTML","main","arrow","offsetWidth","arrowStyle","document","createElement","head","appendChild","getElementsByClassName","initVideo","bezel","addEventListener","remove","playButton","paused","toggle","videoWrap","conMask","toggleController","contains","playedBar","loadedBar","pbar","pbarTimeTips","barWidth","lastPlayPos","currentPlayPos","bufferingDetected","danmakuTime","playedTime","animationFrame","currentTime","attr","duration","secondToTime","showdan","dan","item","danIndex","danmakus","parseFloat","time","push","pushDanmaku","requestAnimationFrame","setTime","clearTime","e","clientWidth","clientX","getElementViewLeft","seek","width","isTipsShow","timeTipsHandler","bind","thumbMove","thumbUp","removeEventListener","volumeBar","volumeEle","volumeBarWrapWrap","volumeBarWrap","volumeicon","switchVolumeIcon","volumeMove","volume","volumeUp","hideTime","hideController","clearTimeout","setTimeout","closeSetting","closeComment","danOpacity","localStorage","getItem","settingHTML","settingIcon","settingBox","mask","original","settingEvent","openSetting","danContainer","loopEle","loopToggle","checked","showDanEle","showDanToggle","danTunnel","top","bottom","itemDemo","speed","speedItem","dataset","danmakuBar","danmakuBarWrapWrap","danmakuBarWrap","danmakuSettingBox","danmakuMove","items","opacity","setItem","danmakuUp","readDanmaku","autoplay","commentInput","commentIcon","commentBox","commentSettingIcon","commentSettingBox","commentSendIcon","htmlEncode","str","replace","sendComment","blur","value","notice","danmakuData","token","player","id","author","user","text","color","querySelector","apiBackend","api","splice","border","theme","closeCommentSetting","toggleCommentSetting","disableHide","commentFocusTimeout","clearInterval","openComment","setInterval","focus","fill","keyCode","resetAnimation","danWidth","transform","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","cancelFullScreen","mozCancelFullScreen","webkitCancelFullScreen","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","current","webkitEnterFullscreen","handleKeyDown","tag","activeElement","tagName","toUpperCase","editable","getAttribute","preventDefault","hotkey","clientRect","getBoundingClientRect","menuLeft","left","menuTop","clientY","offsetHeight","height","switchQuality","screenshot","camareIcon","canvas","getContext","drawImage","href","toDataURL","download","toString","ended","callback","endpoints","finish","_this2","results","readCount","read","err","data","response","msg","status","_this3","apiurl","maximum","addition","slice","_readAllEndpoints","concat","apply","sort","a","b","display","_this4","itemHeight","danHeight","itemY","parseInt","danItemRight","ele","eleWidth","eleRight","danSpeed","getTunnel","tmp","_ret2","v","j","danRight","docFragment","createDocumentFragment","removeChild","itemWidth","error","pic","url","danTuel","_this5","exec","Hls","isSupported","hls","attachMedia","on","Events","MEDIA_ATTACHED","loadSource","MANIFEST_PARSED","levels","flvjs","flvPlayer","createPlayer","attachMediaElement","load","buffered","end","videos","switch","_this6","switchingQuality","videoHTML","videoEle","DOMParser","parseFromString","body","firstChild","parent","prepend","prevVideo","timeTips","_this7","cumulativeOffset","offsetTop","offsetLeft","offsetParent","px","tx","innerText","noticeEle","noticeTime","second","add0","num","min","sec","actualLeft","elementScrollLeft","scrollLeft","documentElement","defaultApiBackend","defaultOption","language","indexOf","preload","contextmenu","link","defaultKey","SendXMLHttpRequest","success","fail","xhr","XMLHttpRequest","onreadystatechange","readyState","JSON","parse","responseText","code","open","stringify","endpoint","alert","cbk","tranZH","Danmaku is loading","Top","Bottom","Rolling","Input danmaku, hit Enter","About author","DPlayer feedback","About DPlayer","Loop","Speed","Opacity for danmaku","Normal","Please input danmaku content!","Set danmaku color","Set danmaku type","Danmaku","This video fails to load","Switching to","Switched to","logo","qualityList","contextmenuList","result","multi","durationArr","eventAll","eventCurrent","reduce","sum","cur","events","Math","max","tmptime","undefined"],"mappings":"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","file":"DPlayer.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"DPlayer\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"DPlayer\"] = factory();\n\telse\n\t\troot[\"DPlayer\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"DPlayer\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"DPlayer\"] = factory();\n\telse\n\t\troot[\"DPlayer\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 1);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/**\n* SVG used by DPlayer\n*/\n\nvar svgSource = {\n 'play': ['0 0 16 32', 'M15.552 15.168q0.448 0.32 0.448 0.832 0 0.448-0.448 0.768l-13.696 8.512q-0.768 0.512-1.312 0.192t-0.544-1.28v-16.448q0-0.96 0.544-1.28t1.312 0.192z'],\n 'pause': ['0 0 17 32', 'M14.080 4.8q2.88 0 2.88 2.048v18.24q0 2.112-2.88 2.112t-2.88-2.112v-18.24q0-2.048 2.88-2.048zM2.88 4.8q2.88 0 2.88 2.048v18.24q0 2.112-2.88 2.112t-2.88-2.112v-18.24q0-2.048 2.88-2.048z'],\n 'volume-up': ['0 0 21 32', 'M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8zM20.576 16q0 1.344-0.768 2.528t-2.016 1.664q-0.16 0.096-0.448 0.096-0.448 0-0.8-0.32t-0.32-0.832q0-0.384 0.192-0.64t0.544-0.448 0.608-0.384 0.512-0.64 0.192-1.024-0.192-1.024-0.512-0.64-0.608-0.384-0.544-0.448-0.192-0.64q0-0.48 0.32-0.832t0.8-0.32q0.288 0 0.448 0.096 1.248 0.48 2.016 1.664t0.768 2.528zM25.152 16q0 2.72-1.536 5.056t-4 3.36q-0.256 0.096-0.448 0.096-0.48 0-0.832-0.352t-0.32-0.8q0-0.704 0.672-1.056 1.024-0.512 1.376-0.8 1.312-0.96 2.048-2.4t0.736-3.104-0.736-3.104-2.048-2.4q-0.352-0.288-1.376-0.8-0.672-0.352-0.672-1.056 0-0.448 0.32-0.8t0.8-0.352q0.224 0 0.48 0.096 2.496 1.056 4 3.36t1.536 5.056zM29.728 16q0 4.096-2.272 7.552t-6.048 5.056q-0.224 0.096-0.448 0.096-0.48 0-0.832-0.352t-0.32-0.8q0-0.64 0.704-1.056 0.128-0.064 0.384-0.192t0.416-0.192q0.8-0.448 1.44-0.896 2.208-1.632 3.456-4.064t1.216-5.152-1.216-5.152-3.456-4.064q-0.64-0.448-1.44-0.896-0.128-0.096-0.416-0.192t-0.384-0.192q-0.704-0.416-0.704-1.056 0-0.448 0.32-0.8t0.832-0.352q0.224 0 0.448 0.096 3.776 1.632 6.048 5.056t2.272 7.552z'],\n 'volume-down': ['0 0 21 32', 'M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8zM20.576 16q0 1.344-0.768 2.528t-2.016 1.664q-0.16 0.096-0.448 0.096-0.448 0-0.8-0.32t-0.32-0.832q0-0.384 0.192-0.64t0.544-0.448 0.608-0.384 0.512-0.64 0.192-1.024-0.192-1.024-0.512-0.64-0.608-0.384-0.544-0.448-0.192-0.64q0-0.48 0.32-0.832t0.8-0.32q0.288 0 0.448 0.096 1.248 0.48 2.016 1.664t0.768 2.528z'],\n 'volume-off': ['0 0 21 32', 'M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8z'],\n 'loop': ['0 0 32 32', 'M1.882 16.941c0 4.152 3.221 7.529 7.177 7.529v1.882c-4.996 0-9.060-4.222-9.060-9.412s4.064-9.412 9.060-9.412h7.96l-3.098-3.098 1.331-1.331 5.372 5.37-5.37 5.372-1.333-1.333 3.1-3.098h-7.962c-3.957 0-7.177 3.377-7.177 7.529zM22.94 7.529v1.882c3.957 0 7.177 3.377 7.177 7.529s-3.221 7.529-7.177 7.529h-7.962l3.098-3.098-1.331-1.331-5.37 5.37 5.372 5.372 1.331-1.331-3.1-3.1h7.96c4.998 0 9.062-4.222 9.062-9.412s-4.064-9.412-9.060-9.412z'],\n 'full': ['0 0 32 33', 'M6.667 28h-5.333c-0.8 0-1.333-0.533-1.333-1.333v-5.333c0-0.8 0.533-1.333 1.333-1.333s1.333 0.533 1.333 1.333v4h4c0.8 0 1.333 0.533 1.333 1.333s-0.533 1.333-1.333 1.333zM30.667 28h-5.333c-0.8 0-1.333-0.533-1.333-1.333s0.533-1.333 1.333-1.333h4v-4c0-0.8 0.533-1.333 1.333-1.333s1.333 0.533 1.333 1.333v5.333c0 0.8-0.533 1.333-1.333 1.333zM30.667 12c-0.8 0-1.333-0.533-1.333-1.333v-4h-4c-0.8 0-1.333-0.533-1.333-1.333s0.533-1.333 1.333-1.333h5.333c0.8 0 1.333 0.533 1.333 1.333v5.333c0 0.8-0.533 1.333-1.333 1.333zM1.333 12c-0.8 0-1.333-0.533-1.333-1.333v-5.333c0-0.8 0.533-1.333 1.333-1.333h5.333c0.8 0 1.333 0.533 1.333 1.333s-0.533 1.333-1.333 1.333h-4v4c0 0.8-0.533 1.333-1.333 1.333z'],\n 'full-in': ['0 0 32 33', 'M24.965 24.38h-18.132c-1.366 0-2.478-1.113-2.478-2.478v-11.806c0-1.364 1.111-2.478 2.478-2.478h18.132c1.366 0 2.478 1.113 2.478 2.478v11.806c0 1.364-1.11 2.478-2.478 2.478zM6.833 10.097v11.806h18.134l-0.002-11.806h-18.132zM2.478 28.928h5.952c0.684 0 1.238-0.554 1.238-1.239 0-0.684-0.554-1.238-1.238-1.238h-5.952v-5.802c0-0.684-0.554-1.239-1.238-1.239s-1.239 0.556-1.239 1.239v5.802c0 1.365 1.111 2.478 2.478 2.478zM30.761 19.412c-0.684 0-1.238 0.554-1.238 1.238v5.801h-5.951c-0.686 0-1.239 0.554-1.239 1.238 0 0.686 0.554 1.239 1.239 1.239h5.951c1.366 0 2.478-1.111 2.478-2.478v-5.801c0-0.683-0.554-1.238-1.239-1.238zM0 5.55v5.802c0 0.683 0.554 1.238 1.238 1.238s1.238-0.555 1.238-1.238v-5.802h5.952c0.684 0 1.238-0.554 1.238-1.238s-0.554-1.238-1.238-1.238h-5.951c-1.366-0.001-2.478 1.111-2.478 2.476zM32 11.35v-5.801c0-1.365-1.11-2.478-2.478-2.478h-5.951c-0.686 0-1.239 0.554-1.239 1.238s0.554 1.238 1.239 1.238h5.951v5.801c0 0.683 0.554 1.237 1.238 1.237 0.686 0.002 1.239-0.553 1.239-1.236z'],\n 'setting': ['0 0 32 28', 'M28.633 17.104c0.035 0.21 0.026 0.463-0.026 0.76s-0.14 0.598-0.262 0.904c-0.122 0.306-0.271 0.581-0.445 0.825s-0.367 0.419-0.576 0.524c-0.209 0.105-0.393 0.157-0.55 0.157s-0.332-0.035-0.524-0.105c-0.175-0.052-0.393-0.1-0.655-0.144s-0.528-0.052-0.799-0.026c-0.271 0.026-0.541 0.083-0.812 0.17s-0.502 0.236-0.694 0.445c-0.419 0.437-0.664 0.934-0.734 1.493s0.009 1.092 0.236 1.598c0.175 0.349 0.148 0.699-0.079 1.048-0.105 0.14-0.271 0.284-0.498 0.432s-0.476 0.284-0.747 0.406-0.555 0.218-0.851 0.288c-0.297 0.070-0.559 0.105-0.786 0.105-0.157 0-0.306-0.061-0.445-0.183s-0.236-0.253-0.288-0.393h-0.026c-0.192-0.541-0.52-1.009-0.982-1.402s-1-0.589-1.611-0.589c-0.594 0-1.131 0.197-1.611 0.589s-0.816 0.851-1.009 1.375c-0.087 0.21-0.218 0.362-0.393 0.458s-0.367 0.144-0.576 0.144c-0.244 0-0.52-0.044-0.825-0.131s-0.611-0.197-0.917-0.327c-0.306-0.131-0.581-0.284-0.825-0.458s-0.428-0.349-0.55-0.524c-0.087-0.122-0.135-0.266-0.144-0.432s0.057-0.397 0.197-0.694c0.192-0.402 0.266-0.86 0.223-1.375s-0.266-0.991-0.668-1.428c-0.244-0.262-0.541-0.432-0.891-0.511s-0.681-0.109-0.995-0.092c-0.367 0.017-0.742 0.087-1.127 0.21-0.244 0.070-0.489 0.052-0.734-0.052-0.192-0.070-0.371-0.231-0.537-0.485s-0.314-0.533-0.445-0.838c-0.131-0.306-0.231-0.62-0.301-0.943s-0.087-0.59-0.052-0.799c0.052-0.384 0.227-0.629 0.524-0.734 0.524-0.21 0.995-0.555 1.415-1.035s0.629-1.017 0.629-1.611c0-0.611-0.21-1.144-0.629-1.598s-0.891-0.786-1.415-0.996c-0.157-0.052-0.288-0.179-0.393-0.38s-0.157-0.406-0.157-0.616c0-0.227 0.035-0.48 0.105-0.76s0.162-0.55 0.275-0.812 0.244-0.502 0.393-0.72c0.148-0.218 0.31-0.38 0.485-0.485 0.14-0.087 0.275-0.122 0.406-0.105s0.275 0.052 0.432 0.105c0.524 0.21 1.070 0.275 1.637 0.197s1.070-0.327 1.506-0.747c0.21-0.209 0.362-0.467 0.458-0.773s0.157-0.607 0.183-0.904c0.026-0.297 0.026-0.568 0-0.812s-0.048-0.419-0.065-0.524c-0.035-0.105-0.066-0.227-0.092-0.367s-0.013-0.262 0.039-0.367c0.105-0.244 0.293-0.458 0.563-0.642s0.563-0.336 0.878-0.458c0.314-0.122 0.62-0.214 0.917-0.275s0.533-0.092 0.707-0.092c0.227 0 0.406 0.074 0.537 0.223s0.223 0.301 0.275 0.458c0.192 0.471 0.507 0.886 0.943 1.244s0.952 0.537 1.546 0.537c0.611 0 1.153-0.17 1.624-0.511s0.803-0.773 0.996-1.297c0.070-0.14 0.179-0.284 0.327-0.432s0.301-0.223 0.458-0.223c0.244 0 0.511 0.035 0.799 0.105s0.572 0.166 0.851 0.288c0.279 0.122 0.537 0.279 0.773 0.472s0.423 0.402 0.563 0.629c0.087 0.14 0.113 0.293 0.079 0.458s-0.070 0.284-0.105 0.354c-0.227 0.506-0.297 1.039-0.21 1.598s0.341 1.048 0.76 1.467c0.419 0.419 0.934 0.651 1.546 0.694s1.179-0.057 1.703-0.301c0.14-0.087 0.31-0.122 0.511-0.105s0.371 0.096 0.511 0.236c0.262 0.244 0.493 0.616 0.694 1.113s0.336 1 0.406 1.506c0.035 0.297-0.013 0.528-0.144 0.694s-0.266 0.275-0.406 0.327c-0.542 0.192-1.004 0.528-1.388 1.009s-0.576 1.026-0.576 1.637c0 0.594 0.162 1.113 0.485 1.559s0.747 0.764 1.27 0.956c0.122 0.070 0.227 0.14 0.314 0.21 0.192 0.157 0.323 0.358 0.393 0.602v0zM16.451 19.462c0.786 0 1.528-0.149 2.227-0.445s1.305-0.707 1.821-1.231c0.515-0.524 0.921-1.131 1.218-1.821s0.445-1.428 0.445-2.214c0-0.786-0.148-1.524-0.445-2.214s-0.703-1.292-1.218-1.808c-0.515-0.515-1.122-0.921-1.821-1.218s-1.441-0.445-2.227-0.445c-0.786 0-1.524 0.148-2.214 0.445s-1.292 0.703-1.808 1.218c-0.515 0.515-0.921 1.118-1.218 1.808s-0.445 1.428-0.445 2.214c0 0.786 0.149 1.524 0.445 2.214s0.703 1.297 1.218 1.821c0.515 0.524 1.118 0.934 1.808 1.231s1.428 0.445 2.214 0.445v0z'],\n 'right': ['0 0 32 32', 'M22 16l-10.105-10.6-1.895 1.987 8.211 8.613-8.211 8.612 1.895 1.988 8.211-8.613z'],\n 'comment': ['0 0 32 32', 'M27.128 0.38h-22.553c-2.336 0-4.229 1.825-4.229 4.076v16.273c0 2.251 1.893 4.076 4.229 4.076h4.229v-2.685h8.403l-8.784 8.072 1.566 1.44 7.429-6.827h9.71c2.335 0 4.229-1.825 4.229-4.076v-16.273c0-2.252-1.894-4.076-4.229-4.076zM28.538 19.403c0 1.5-1.262 2.717-2.819 2.717h-8.36l-0.076-0.070-0.076 0.070h-11.223c-1.557 0-2.819-1.217-2.819-2.717v-13.589c0-1.501 1.262-2.718 2.819-2.718h19.734c1.557 0 2.819-0.141 2.819 1.359v14.947zM9.206 10.557c-1.222 0-2.215 0.911-2.215 2.036s0.992 2.035 2.215 2.035c1.224 0 2.216-0.911 2.216-2.035s-0.992-2.036-2.216-2.036zM22.496 10.557c-1.224 0-2.215 0.911-2.215 2.036s0.991 2.035 2.215 2.035c1.224 0 2.215-0.911 2.215-2.035s-0.991-2.036-2.215-2.036zM15.852 10.557c-1.224 0-2.215 0.911-2.215 2.036s0.991 2.035 2.215 2.035c1.222 0 2.215-0.911 2.215-2.035s-0.992-2.036-2.215-2.036z'],\n 'comment-off': ['0 0 32 32', 'M27.090 0.131h-22.731c-2.354 0-4.262 1.839-4.262 4.109v16.401c0 2.269 1.908 4.109 4.262 4.109h4.262v-2.706h8.469l-8.853 8.135 1.579 1.451 7.487-6.88h9.787c2.353 0 4.262-1.84 4.262-4.109v-16.401c0-2.27-1.909-4.109-4.262-4.109v0zM28.511 19.304c0 1.512-1.272 2.738-2.841 2.738h-8.425l-0.076-0.070-0.076 0.070h-11.311c-1.569 0-2.841-1.226-2.841-2.738v-13.696c0-1.513 1.272-2.739 2.841-2.739h19.889c1.569 0 2.841-0.142 2.841 1.37v15.064z'],\n 'send': ['0 0 32 32', 'M13.725 30l3.9-5.325-3.9-1.125v6.45zM0 17.5l11.050 3.35 13.6-11.55-10.55 12.425 11.8 3.65 6.1-23.375-32 15.5z'],\n 'menu': ['0 0 22 32', 'M20.8 14.4q0.704 0 1.152 0.48t0.448 1.12-0.48 1.12-1.12 0.48h-19.2q-0.64 0-1.12-0.48t-0.48-1.12 0.448-1.12 1.152-0.48h19.2zM1.6 11.2q-0.64 0-1.12-0.48t-0.48-1.12 0.448-1.12 1.152-0.48h19.2q0.704 0 1.152 0.48t0.448 1.12-0.48 1.12-1.12 0.48h-19.2zM20.8 20.8q0.704 0 1.152 0.48t0.448 1.12-0.48 1.12-1.12 0.48h-19.2q-0.64 0-1.12-0.48t-0.48-1.12 0.448-1.12 1.152-0.48h19.2z'],\n 'camera': ['0 0 32 32', 'M16 23c-3.309 0-6-2.691-6-6s2.691-6 6-6 6 2.691 6 6-2.691 6-6 6zM16 13c-2.206 0-4 1.794-4 4s1.794 4 4 4c2.206 0 4-1.794 4-4s-1.794-4-4-4zM27 28h-22c-1.654 0-3-1.346-3-3v-16c0-1.654 1.346-3 3-3h3c0.552 0 1 0.448 1 1s-0.448 1-1 1h-3c-0.551 0-1 0.449-1 1v16c0 0.552 0.449 1 1 1h22c0.552 0 1-0.448 1-1v-16c0-0.551-0.448-1-1-1h-11c-0.552 0-1-0.448-1-1s0.448-1 1-1h11c1.654 0 3 1.346 3 3v16c0 1.654-1.346 3-3 3zM24 10.5c0 0.828 0.672 1.5 1.5 1.5s1.5-0.672 1.5-1.5c0-0.828-0.672-1.5-1.5-1.5s-1.5 0.672-1.5 1.5zM15 4c0 0.552-0.448 1-1 1h-4c-0.552 0-1-0.448-1-1v0c0-0.552 0.448-1 1-1h4c0.552 0 1 0.448 1 1v0z']\n};\n\nmodule.exports = function (type) {\n return '\\n \\n \\n \\n \\n';\n};\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nconsole.log('\\n %c DPlayer 1.3.3 %c http://dplayer.js.org \\n\\n', 'color: #fadfa3; background: #030307; padding:5px 0;', 'background: #fadfa3; padding:5px 0;');\n\n__webpack_require__(2);\nvar utils = __webpack_require__(3);\nvar svg = __webpack_require__(0);\nvar handleOption = __webpack_require__(4);\nvar i18n = __webpack_require__(6);\nvar html = __webpack_require__(7);\nvar Video = __webpack_require__(8);\nvar isMobile = /mobile/i.test(window.navigator.userAgent);\n\nvar index = 0;\n\nvar DPlayer = function () {\n\n /**\n * DPlayer constructor function\n *\n * @param {Object} option - See README\n * @constructor\n */\n function DPlayer(option) {\n var _this = this;\n\n _classCallCheck(this, DPlayer);\n\n this.option = handleOption(option);\n\n this.option.element.classList.add('dplayer');\n\n if (this.option.video.quality) {\n this.qualityIndex = this.option.video.defaultQuality;\n this.quality = this.option.video.quality[this.option.video.defaultQuality];\n }\n\n this.tran = new i18n(this.option.lang).tran;\n\n /**\n * Update progress bar, including loading progress bar and play progress bar\n *\n * @param {String} type - Point out which bar it is, should be played loaded or volume\n * @param {Number} percentage\n * @param {String} direction - Point out the direction of this bar, Should be height or width\n */\n this.updateBar = function (type, percentage, direction) {\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n bar[type + 'Bar'].style[direction] = percentage * 100 + '%';\n };\n\n // define DPlayer events\n var eventTypes = ['play', 'pause', 'canplay', 'playing', 'ended', 'error'];\n this.event = {};\n for (var i = 0; i < eventTypes.length; i++) {\n this.event[eventTypes[i]] = [];\n }\n this.trigger = function (type) {\n for (var _i = 0; _i < _this.event[type].length; _i++) {\n _this.event[type][_i]();\n }\n };\n\n this.element = this.option.element;\n if (!this.option.danmaku) {\n this.element.classList.add('dplayer-no-danmaku');\n }\n if (isMobile) {\n this.element.classList.add('dplayer-mobile');\n }\n\n this.element.innerHTML = html.main(option, index, this.tran);\n\n // arrow style\n this.arrow = this.element.offsetWidth <= 500;\n if (this.arrow) {\n var arrowStyle = document.createElement('style');\n arrowStyle.innerHTML = '.dplayer .dplayer-danmaku{font-size:18px}';\n document.head.appendChild(arrowStyle);\n }\n\n // get this video manager\n this.video = new Video(this.element.getElementsByClassName('dplayer-video-current'));\n\n this.initVideo();\n\n this.bezel = this.element.getElementsByClassName('dplayer-bezel-icon')[0];\n this.bezel.addEventListener('animationend', function () {\n _this.bezel.classList.remove('dplayer-bezel-transition');\n });\n\n // play and pause button\n this.playButton = this.element.getElementsByClassName('dplayer-play-icon')[0];\n this.paused = true;\n this.playButton.addEventListener('click', function () {\n _this.toggle();\n });\n\n var videoWrap = this.element.getElementsByClassName('dplayer-video-wrap')[0];\n var conMask = this.element.getElementsByClassName('dplayer-controller-mask')[0];\n if (!isMobile) {\n videoWrap.addEventListener('click', function () {\n _this.toggle();\n });\n conMask.addEventListener('click', function () {\n _this.toggle();\n });\n } else {\n var toggleController = function toggleController() {\n if (_this.element.classList.contains('dplayer-hide-controller')) {\n _this.element.classList.remove('dplayer-hide-controller');\n } else {\n _this.element.classList.add('dplayer-hide-controller');\n }\n };\n videoWrap.addEventListener('click', toggleController);\n conMask.addEventListener('click', toggleController);\n }\n\n var bar = {};\n bar.playedBar = this.element.getElementsByClassName('dplayer-played')[0];\n bar.loadedBar = this.element.getElementsByClassName('dplayer-loaded')[0];\n var pbar = this.element.getElementsByClassName('dplayer-bar-wrap')[0];\n var pbarTimeTips = this.element.getElementsByClassName('dplayer-bar-time')[0];\n var barWidth = void 0;\n\n var lastPlayPos = 0;\n var currentPlayPos = 0;\n var bufferingDetected = false;\n this.danmakuTime = false;\n this.playedTime = false;\n this.animationFrame = function () {\n if (_this.playedTime) {\n // whether the video is buffering\n currentPlayPos = _this.video.currentTime();\n if (!bufferingDetected && currentPlayPos < lastPlayPos + 0.01 && !_this.video.attr('paused')) {\n _this.element.classList.add('dplayer-loading');\n bufferingDetected = true;\n }\n if (bufferingDetected && currentPlayPos > lastPlayPos + 0.01 && !_this.video.attr('paused')) {\n _this.element.classList.remove('dplayer-loading');\n bufferingDetected = false;\n }\n lastPlayPos = currentPlayPos;\n\n _this.updateBar('played', _this.video.currentTime() / _this.video.duration, 'width');\n _this.element.getElementsByClassName('dplayer-ptime')[0].innerHTML = utils.secondToTime(_this.video.currentTime());\n _this.trigger('playing');\n }\n if (_this.danmakuTime && _this.option.danmaku && showdan && _this.dan) {\n var item = _this.dan[_this.danIndex];\n var danmakus = [];\n while (item && _this.video.currentTime() > parseFloat(item.time)) {\n danmakus.push(item);\n item = _this.dan[++_this.danIndex];\n }\n _this.pushDanmaku(danmakus);\n }\n requestAnimationFrame(_this.animationFrame);\n };\n requestAnimationFrame(this.animationFrame);\n\n this.setTime = function (type) {\n if (!type) {\n _this.danmakuTime = true;\n _this.playedTime = true;\n } else {\n _this[type + 'Time'] = true;\n }\n };\n this.clearTime = function (type) {\n if (!type) {\n _this.danmakuTime = false;\n _this.playedTime = false;\n } else {\n _this[type + 'Time'] = false;\n }\n };\n\n pbar.addEventListener('click', function (event) {\n var e = event || window.event;\n barWidth = pbar.clientWidth;\n var percentage = (e.clientX - utils.getElementViewLeft(pbar)) / barWidth;\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n _this.updateBar('played', percentage, 'width');\n _this.video.seek(parseFloat(bar.playedBar.style.width) / 100 * _this.video.duration);\n });\n\n this.isTipsShow = false;\n this.timeTipsHandler = this.timeTipsHandler(pbar, pbarTimeTips).bind(this);\n pbar.addEventListener('mousemove', this.timeTipsHandler);\n pbar.addEventListener('mouseover', this.timeTipsHandler);\n pbar.addEventListener('mouseenter', this.timeTipsHandler);\n pbar.addEventListener('mouseout', this.timeTipsHandler);\n pbar.addEventListener('mouseleave', this.timeTipsHandler);\n\n var thumbMove = function thumbMove(event) {\n var e = event || window.event;\n var percentage = (e.clientX - utils.getElementViewLeft(pbar)) / barWidth;\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n _this.updateBar('played', percentage, 'width');\n _this.element.getElementsByClassName('dplayer-ptime')[0].innerHTML = utils.secondToTime(percentage * _this.video.duration);\n };\n\n var thumbUp = function thumbUp() {\n document.removeEventListener('mouseup', thumbUp);\n document.removeEventListener('mousemove', thumbMove);\n _this.video.seek(parseFloat(bar.playedBar.style.width) / 100 * _this.video.duration);\n _this.setTime();\n };\n\n pbar.addEventListener('mousedown', function () {\n barWidth = pbar.clientWidth;\n _this.clearTime();\n document.addEventListener('mousemove', thumbMove);\n document.addEventListener('mouseup', thumbUp);\n });\n\n /**\n * control volume\n */\n bar.volumeBar = this.element.getElementsByClassName('dplayer-volume-bar-inner')[0];\n var volumeEle = this.element.getElementsByClassName('dplayer-volume')[0];\n var volumeBarWrapWrap = this.element.getElementsByClassName('dplayer-volume-bar-wrap')[0];\n var volumeBarWrap = this.element.getElementsByClassName('dplayer-volume-bar')[0];\n var volumeicon = this.element.getElementsByClassName('dplayer-volume-icon')[0];\n var vWidth = 35;\n\n this.switchVolumeIcon = function () {\n var volumeicon = _this.element.getElementsByClassName('dplayer-volume-icon')[0];\n if (_this.video.attr('volume') >= 0.8) {\n volumeicon.innerHTML = svg('volume-up');\n } else if (_this.video.attr('volume') > 0) {\n volumeicon.innerHTML = svg('volume-down');\n } else {\n volumeicon.innerHTML = svg('volume-off');\n }\n };\n var volumeMove = function volumeMove(event) {\n var e = event || window.event;\n var percentage = (e.clientX - utils.getElementViewLeft(volumeBarWrap) - 5.5) / vWidth;\n _this.volume(percentage);\n };\n var volumeUp = function volumeUp() {\n document.removeEventListener('mouseup', volumeUp);\n document.removeEventListener('mousemove', volumeMove);\n volumeEle.classList.remove('dplayer-volume-active');\n };\n\n volumeBarWrapWrap.addEventListener('click', function (event) {\n var e = event || window.event;\n var percentage = (e.clientX - utils.getElementViewLeft(volumeBarWrap) - 5.5) / vWidth;\n _this.volume(percentage);\n });\n volumeBarWrapWrap.addEventListener('mousedown', function () {\n document.addEventListener('mousemove', volumeMove);\n document.addEventListener('mouseup', volumeUp);\n volumeEle.classList.add('dplayer-volume-active');\n });\n volumeicon.addEventListener('click', function () {\n if (_this.video.attr('muted')) {\n _this.video.attr('muted', false);\n _this.switchVolumeIcon();\n _this.updateBar('volume', _this.video.attr('volume'), 'width');\n } else {\n _this.video.attr('muted', true);\n volumeicon.innerHTML = svg('volume-off');\n _this.updateBar('volume', 0, 'width');\n }\n });\n\n /**\n * auto hide controller\n */\n var hideTime = 0;\n if (!isMobile) {\n var hideController = function hideController() {\n _this.element.classList.remove('dplayer-hide-controller');\n clearTimeout(hideTime);\n hideTime = setTimeout(function () {\n if (_this.video.attr('played').length) {\n _this.element.classList.add('dplayer-hide-controller');\n closeSetting();\n closeComment();\n }\n }, 2000);\n };\n this.element.addEventListener('mousemove', hideController);\n this.element.addEventListener('click', hideController);\n }\n\n /**\n * setting\n */\n this.danOpacity = localStorage.getItem('DPlayer-opacity') || 0.7;\n var settingHTML = html.setting(this.tran);\n\n // toggle setting box\n var settingIcon = this.element.getElementsByClassName('dplayer-setting-icon')[0];\n var settingBox = this.element.getElementsByClassName('dplayer-setting-box')[0];\n var mask = this.element.getElementsByClassName('dplayer-mask')[0];\n settingBox.innerHTML = settingHTML.original;\n\n var closeSetting = function closeSetting() {\n if (settingBox.classList.contains('dplayer-setting-box-open')) {\n settingBox.classList.remove('dplayer-setting-box-open');\n mask.classList.remove('dplayer-mask-show');\n setTimeout(function () {\n settingBox.classList.remove('dplayer-setting-box-narrow');\n settingBox.innerHTML = settingHTML.original;\n settingEvent();\n }, 300);\n }\n };\n var openSetting = function openSetting() {\n settingBox.classList.add('dplayer-setting-box-open');\n mask.classList.add('dplayer-mask-show');\n };\n\n mask.addEventListener('click', function () {\n closeSetting();\n });\n settingIcon.addEventListener('click', function () {\n openSetting();\n });\n\n this.loop = this.option.loop;\n var danContainer = this.element.getElementsByClassName('dplayer-danmaku')[0];\n var showdan = true;\n var settingEvent = function settingEvent() {\n // loop control\n var loopEle = _this.element.getElementsByClassName('dplayer-setting-loop')[0];\n var loopToggle = loopEle.getElementsByClassName('dplayer-toggle-setting-input')[0];\n\n loopToggle.checked = _this.loop;\n\n loopEle.addEventListener('click', function () {\n loopToggle.checked = !loopToggle.checked;\n if (loopToggle.checked) {\n _this.loop = true;\n } else {\n _this.loop = false;\n }\n closeSetting();\n });\n\n // show danmaku control\n var showDanEle = _this.element.getElementsByClassName('dplayer-setting-showdan')[0];\n var showDanToggle = showDanEle.getElementsByClassName('dplayer-showdan-setting-input')[0];\n\n showDanToggle.checked = showdan;\n\n showDanEle.addEventListener('click', function () {\n showDanToggle.checked = !showDanToggle.checked;\n if (showDanToggle.checked) {\n showdan = true;\n if (_this.option.danmaku) {\n for (var _i2 = 0; _i2 < _this.dan.length; _i2++) {\n if (_this.dan[_i2].time >= _this.video.currentTime()) {\n _this.danIndex = _i2;\n break;\n }\n _this.danIndex = _this.dan.length;\n }\n if (!_this.paused) {\n _this.setTime('danmaku');\n }\n }\n } else {\n showdan = false;\n if (_this.option.danmaku) {\n _this.clearTime('danmaku');\n danContainer.innerHTML = '
';\n _this.danTunnel = {\n right: {},\n top: {},\n bottom: {}\n };\n _this.itemDemo = _this.element.getElementsByClassName('dplayer-danmaku-item')[0];\n }\n }\n closeSetting();\n });\n\n // speed control\n var speedEle = _this.element.getElementsByClassName('dplayer-setting-speed')[0];\n speedEle.addEventListener('click', function () {\n settingBox.classList.add('dplayer-setting-box-narrow');\n settingBox.innerHTML = settingHTML.speed;\n\n var speedItem = settingBox.getElementsByClassName('dplayer-setting-speed-item');\n\n var _loop = function _loop(_i3) {\n speedItem[_i3].addEventListener('click', function () {\n _this.video.attr('playbackRate', speedItem[_i3].dataset.speed);\n closeSetting();\n });\n };\n\n for (var _i3 = 0; _i3 < speedItem.length; _i3++) {\n _loop(_i3);\n }\n });\n\n if (_this.option.danmaku) {\n // danmaku opacity\n bar.danmakuBar = _this.element.getElementsByClassName('dplayer-danmaku-bar-inner')[0];\n var danmakuBarWrapWrap = _this.element.getElementsByClassName('dplayer-danmaku-bar-wrap')[0];\n var danmakuBarWrap = _this.element.getElementsByClassName('dplayer-danmaku-bar')[0];\n var danmakuSettingBox = _this.element.getElementsByClassName('dplayer-setting-danmaku')[0];\n var dWidth = 130;\n _this.updateBar('danmaku', _this.danOpacity, 'width');\n\n var danmakuMove = function danmakuMove(event) {\n var e = event || window.event;\n var percentage = (e.clientX - utils.getElementViewLeft(danmakuBarWrap)) / dWidth;\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n _this.updateBar('danmaku', percentage, 'width');\n var items = _this.element.getElementsByClassName('dplayer-danmaku-item');\n for (var _i4 = 0; _i4 < items.length; _i4++) {\n items[_i4].style.opacity = percentage;\n }\n _this.danOpacity = percentage;\n localStorage.setItem('DPlayer-opacity', _this.danOpacity);\n };\n var danmakuUp = function danmakuUp() {\n document.removeEventListener('mouseup', danmakuUp);\n document.removeEventListener('mousemove', danmakuMove);\n danmakuSettingBox.classList.remove('dplayer-setting-danmaku-active');\n };\n\n danmakuBarWrapWrap.addEventListener('click', function (event) {\n var e = event || window.event;\n var percentage = (e.clientX - utils.getElementViewLeft(danmakuBarWrap)) / dWidth;\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n _this.updateBar('danmaku', percentage, 'width');\n var items = _this.element.getElementsByClassName('dplayer-danmaku-item');\n for (var _i5 = 0; _i5 < items.length; _i5++) {\n items[_i5].style.opacity = percentage;\n }\n _this.danOpacity = percentage;\n localStorage.setItem('DPlayer-opacity', _this.danOpacity);\n });\n danmakuBarWrapWrap.addEventListener('mousedown', function () {\n document.addEventListener('mousemove', danmakuMove);\n document.addEventListener('mouseup', danmakuUp);\n danmakuSettingBox.classList.add('dplayer-setting-danmaku-active');\n });\n }\n };\n settingEvent();\n\n // set duration time\n if (this.video.duration !== 1) {\n // compatibility: Android browsers will output 1 at first\n this.element.getElementsByClassName('dplayer-dtime')[0].innerHTML = this.video.duration ? utils.secondToTime(this.video.duration) : '00:00';\n }\n\n // danmaku\n this.danTunnel = {\n right: {},\n top: {},\n bottom: {}\n };\n this.itemDemo = this.element.getElementsByClassName('dplayer-danmaku-item')[0];\n\n if (this.option.danmaku) {\n this.danIndex = 0;\n this.readDanmaku();\n } else {\n // autoplay\n if (this.option.autoplay && !isMobile) {\n this.play();\n } else if (isMobile) {\n this.pause();\n }\n }\n\n /**\n * comment\n */\n var commentInput = this.element.getElementsByClassName('dplayer-comment-input')[0];\n var commentIcon = this.element.getElementsByClassName('dplayer-comment-icon')[0];\n var commentBox = this.element.getElementsByClassName('dplayer-comment-box')[0];\n var commentSettingIcon = this.element.getElementsByClassName('dplayer-comment-setting-icon')[0];\n var commentSettingBox = this.element.getElementsByClassName('dplayer-comment-setting-box')[0];\n var commentSendIcon = this.element.getElementsByClassName('dplayer-send-icon')[0];\n\n var htmlEncode = function htmlEncode(str) {\n return str.replace(/&/g, \"&\").replace(//g, \">\").replace(/\"/g, \""\").replace(/'/g, \"'\").replace(/\\//g, \"/\");\n };\n\n var sendComment = function sendComment() {\n commentInput.blur();\n\n // text can't be empty\n if (!commentInput.value.replace(/^\\s+|\\s+$/g, '')) {\n _this.notice(_this.tran('Please input danmaku content!'));\n return;\n }\n\n var danmakuData = {\n token: _this.option.danmaku.token,\n player: _this.option.danmaku.id,\n author: _this.option.danmaku.user,\n time: _this.video.currentTime(),\n text: commentInput.value,\n color: _this.element.querySelector('.dplayer-comment-setting-color input:checked').value,\n type: _this.element.querySelector('.dplayer-comment-setting-type input:checked').value\n };\n _this.option.apiBackend.send(_this.option.danmaku.api, danmakuData);\n\n commentInput.value = '';\n closeComment();\n _this.dan.splice(_this.danIndex, 0, danmakuData);\n _this.danIndex++;\n var danmaku = {\n text: htmlEncode(danmakuData.text),\n color: danmakuData.color,\n type: danmakuData.type\n };\n var item = _this.pushDanmaku(danmaku);\n item.style.border = '2px solid ' + _this.option.theme;\n };\n\n var closeCommentSetting = function closeCommentSetting() {\n if (commentSettingBox.classList.contains('dplayer-comment-setting-open')) {\n commentSettingBox.classList.remove('dplayer-comment-setting-open');\n }\n };\n var toggleCommentSetting = function toggleCommentSetting() {\n if (commentSettingBox.classList.contains('dplayer-comment-setting-open')) {\n commentSettingBox.classList.remove('dplayer-comment-setting-open');\n } else {\n commentSettingBox.classList.add('dplayer-comment-setting-open');\n }\n };\n\n var disableHide = 0;\n var commentFocusTimeout = 0;\n var closeComment = function closeComment() {\n if (!commentBox.classList.contains('dplayer-comment-box-open')) {\n return;\n }\n\n commentBox.classList.remove('dplayer-comment-box-open');\n mask.classList.remove('dplayer-mask-show');\n _this.element.classList.remove('dplayer-show-controller');\n\n clearInterval(disableHide);\n clearTimeout(commentFocusTimeout);\n closeCommentSetting();\n };\n var openComment = function openComment() {\n if (commentBox.classList.contains('dplayer-comment-box-open')) {\n return;\n }\n\n commentBox.classList.add('dplayer-comment-box-open');\n mask.classList.add('dplayer-mask-show');\n _this.element.classList.add('dplayer-show-controller');\n\n disableHide = setInterval(function () {\n clearTimeout(hideTime);\n }, 1000);\n commentFocusTimeout = setTimeout(function () {\n commentInput.focus();\n }, 300);\n };\n\n mask.addEventListener('click', function () {\n closeComment();\n });\n commentIcon.addEventListener('click', function () {\n openComment();\n });\n commentSettingIcon.addEventListener('click', function () {\n toggleCommentSetting();\n });\n\n // comment setting box\n this.element.getElementsByClassName('dplayer-comment-setting-color')[0].addEventListener('click', function () {\n var sele = _this.element.querySelector('input[name=\"dplayer-danmaku-color-${index}\"]:checked+span');\n if (sele) {\n commentSettingIcon.getElementsByClassName('dplayer-fill')[0].style.fill = _this.element.querySelector('input[name=\"dplayer-danmaku-color-${index}\"]:checked').value;\n }\n });\n\n commentInput.addEventListener('click', function () {\n closeCommentSetting();\n });\n commentInput.addEventListener('keydown', function (e) {\n var event = e || window.event;\n if (event.keyCode === 13) {\n sendComment();\n }\n });\n\n commentSendIcon.addEventListener('click', sendComment);\n\n /**\n * full screen\n */\n var resetAnimation = function resetAnimation() {\n var danWidth = danContainer.offsetWidth;\n var items = _this.element.getElementsByClassName('dplayer-danmaku-item');\n for (var _i6 = 0; _i6 < items.length; _i6++) {\n items[_i6].style.transform = 'translateX(-' + danWidth + 'px)';\n }\n };\n\n this.element.addEventListener('fullscreenchange', function () {\n resetAnimation();\n });\n this.element.addEventListener('mozfullscreenchange', function () {\n resetAnimation();\n });\n this.element.addEventListener('webkitfullscreenchange', function () {\n resetAnimation();\n });\n // browser full screen\n this.element.getElementsByClassName('dplayer-full-icon')[0].addEventListener('click', function () {\n if (!document.fullscreenElement && !document.mozFullScreenElement && !document.webkitFullscreenElement) {\n if (_this.element.requestFullscreen) {\n _this.element.requestFullscreen();\n } else if (_this.element.mozRequestFullScreen) {\n _this.element.mozRequestFullScreen();\n } else if (_this.element.webkitRequestFullscreen) {\n _this.element.webkitRequestFullscreen();\n } else if (_this.video.attr('webkitEnterFullscreen')) {\n // Safari for iOS\n _this.video.current.webkitEnterFullscreen();\n }\n } else {\n if (document.cancelFullScreen) {\n document.cancelFullScreen();\n } else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen();\n } else if (document.webkitCancelFullScreen) {\n document.webkitCancelFullScreen();\n }\n }\n resetAnimation();\n });\n // web full screen\n this.element.getElementsByClassName('dplayer-full-in-icon')[0].addEventListener('click', function () {\n if (_this.element.classList.contains('dplayer-fulled')) {\n _this.element.classList.remove('dplayer-fulled');\n } else {\n _this.element.classList.add('dplayer-fulled');\n resetAnimation();\n }\n });\n\n /**\n * hot key\n */\n var handleKeyDown = function handleKeyDown(e) {\n var tag = document.activeElement.tagName.toUpperCase();\n var editable = document.activeElement.getAttribute('contenteditable');\n if (tag !== 'INPUT' && tag !== 'TEXTAREA' && editable !== '' && editable !== 'true') {\n var event = e || window.event;\n var percentage = void 0;\n switch (event.keyCode) {\n case 32:\n event.preventDefault();\n _this.toggle();\n break;\n case 37:\n event.preventDefault();\n _this.video.seek(_this.video.currentTime() - 5);\n break;\n case 39:\n event.preventDefault();\n _this.video.seek(_this.video.currentTime() + 5);\n break;\n case 38:\n event.preventDefault();\n percentage = _this.video.attr('volume') + 0.1;\n _this.volume(percentage);\n break;\n case 40:\n event.preventDefault();\n percentage = _this.video.attr('volume') - 0.1;\n _this.volume(percentage);\n break;\n }\n }\n };\n if (this.option.hotkey) {\n document.addEventListener('keydown', handleKeyDown);\n }\n document.addEventListener('keydown', function (e) {\n // Press ESC to quit web full screen\n var event = e || window.event;\n switch (event.keyCode) {\n case 27:\n if (_this.element.classList.contains('dplayer-fulled')) {\n _this.element.classList.remove('dplayer-fulled');\n resetAnimation();\n }\n break;\n }\n });\n\n /**\n * right key\n */\n var menu = this.element.getElementsByClassName('dplayer-menu')[0];\n this.element.addEventListener('contextmenu', function (e) {\n var event = e || window.event;\n event.preventDefault();\n\n menu.classList.add('dplayer-menu-show');\n\n var clientRect = _this.element.getBoundingClientRect();\n var menuLeft = event.clientX - clientRect.left;\n var menuTop = event.clientY - clientRect.top;\n if (menuLeft + menu.offsetWidth >= clientRect.width) {\n menu.style.right = clientRect.width - menuLeft + 'px';\n menu.style.left = 'initial';\n } else {\n menu.style.left = event.clientX - _this.element.getBoundingClientRect().left + 'px';\n menu.style.right = 'initial';\n }\n if (menuTop + menu.offsetHeight >= clientRect.height) {\n menu.style.bottom = clientRect.height - menuTop + 'px';\n menu.style.top = 'initial';\n } else {\n menu.style.top = event.clientY - _this.element.getBoundingClientRect().top + 'px';\n menu.style.bottom = 'initial';\n }\n\n mask.classList.add('dplayer-mask-show');\n mask.addEventListener('click', function () {\n mask.classList.remove('dplayer-mask-show');\n menu.classList.remove('dplayer-menu-show');\n });\n });\n\n /**\n * Switch quality\n */\n if (this.option.video.quality) {\n this.element.getElementsByClassName('dplayer-quality-list')[0].addEventListener('click', function (e) {\n if (e.target.classList.contains('dplayer-quality-item')) {\n _this.switchQuality(e.target.dataset.index);\n }\n });\n }\n\n /**\n * Screenshot\n */\n if (this.option.screenshot) {\n var camareIcon = this.element.getElementsByClassName('dplayer-camera-icon')[0];\n camareIcon.addEventListener('click', function () {\n var canvas = document.createElement(\"canvas\");\n canvas.width = _this.video.attr('videoWidth');\n canvas.height = _this.video.attr('videoHeight');\n canvas.getContext('2d').drawImage(_this.video.current, 0, 0, canvas.width, canvas.height);\n\n camareIcon.href = canvas.toDataURL();\n camareIcon.download = \"DPlayer.png\";\n });\n }\n\n index++;\n }\n\n /**\n * Play music\n */\n\n\n _createClass(DPlayer, [{\n key: 'play',\n value: function play(time) {\n if (Object.prototype.toString.call(time) === '[object Number]') {\n this.video.seek(time);\n }\n this.paused = false;\n if (this.video.attr('paused')) {\n this.bezel.innerHTML = svg('play');\n this.bezel.classList.add('dplayer-bezel-transition');\n }\n\n this.playButton.innerHTML = svg('pause');\n\n this.video.play();\n this.setTime();\n this.element.classList.add('dplayer-playing');\n this.trigger('play');\n }\n\n /**\n * Pause music\n */\n\n }, {\n key: 'pause',\n value: function pause() {\n this.paused = true;\n this.element.classList.remove('dplayer-loading');\n\n if (!this.video.attr('paused')) {\n this.bezel.innerHTML = svg('pause');\n this.bezel.classList.add('dplayer-bezel-transition');\n }\n\n this.ended = false;\n this.playButton.innerHTML = svg('play');\n this.video.pause();\n this.clearTime();\n this.element.classList.remove('dplayer-playing');\n this.trigger('pause');\n }\n\n /**\n * Set volume\n */\n\n }, {\n key: 'volume',\n value: function volume(percentage) {\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n this.updateBar('volume', percentage, 'width');\n this.video.attr('volume', percentage);\n if (this.video.attr('muted')) {\n this.video.attr('muted', false);\n }\n this.switchVolumeIcon();\n }\n\n /**\n * Toggle between play and pause\n */\n\n }, {\n key: 'toggle',\n value: function toggle() {\n if (this.video.attr('paused')) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * attach event\n */\n\n }, {\n key: 'on',\n value: function on(event, callback) {\n if (typeof callback === 'function') {\n this.event[event].push(callback);\n }\n }\n\n /**\n * Asynchronously read danmaku from all API endpoints\n */\n\n }, {\n key: '_readAllEndpoints',\n value: function _readAllEndpoints(endpoints, finish) {\n var _this2 = this;\n\n var results = [];\n var readCount = 0;\n var cbk = function cbk(i) {\n return function (err, data) {\n ++readCount;\n if (err) {\n if (err.response) {\n _this2.notice(err.response.msg);\n } else {\n _this2.notice('Request was unsuccessful: ' + err.status);\n }\n results[i] = [];\n } else {\n results[i] = data;\n }\n if (readCount === endpoints.length) {\n return finish(results);\n }\n };\n };\n\n for (var i = 0; i < endpoints.length; ++i) {\n this.option.apiBackend.read(endpoints[i], cbk(i));\n }\n }\n\n /**\n * Read danmaku from API\n */\n\n }, {\n key: 'readDanmaku',\n value: function readDanmaku() {\n var _this3 = this;\n\n var isMobile = /mobile/i.test(window.navigator.userAgent);\n var apiurl = void 0;\n if (this.option.danmaku.maximum) {\n apiurl = this.option.danmaku.api + '?id=' + this.option.danmaku.id + '&max=' + this.option.danmaku.maximum;\n } else {\n apiurl = this.option.danmaku.api + '?id=' + this.option.danmaku.id;\n }\n var endpoints = (this.option.danmaku.addition || []).slice(0);\n endpoints.push(apiurl);\n\n this._readAllEndpoints(endpoints, function (results) {\n _this3.danIndex = 0;\n _this3.dan = [].concat.apply([], results).sort(function (a, b) {\n return a.time - b.time;\n });\n _this3.element.getElementsByClassName('dplayer-danloading')[0].style.display = 'none';\n\n // autoplay\n if (_this3.option.autoplay && !isMobile) {\n _this3.play();\n } else if (isMobile) {\n _this3.pause();\n }\n });\n }\n\n /**\n * Push a danmaku into DPlayer\n *\n * @param {Object Array} danmaku - {text, color, type}\n * text - danmaku content\n * color - danmaku color, default: `#fff`\n * type - danmaku type, `right` `top` `bottom`, default: `right`\n */\n\n }, {\n key: 'pushDanmaku',\n value: function pushDanmaku(danmaku) {\n var _this4 = this;\n\n var danContainer = this.element.getElementsByClassName('dplayer-danmaku')[0];\n var itemHeight = this.arrow ? 24 : 30;\n var danWidth = danContainer.offsetWidth;\n var danHeight = danContainer.offsetHeight;\n var itemY = parseInt(danHeight / itemHeight);\n\n var danItemRight = function danItemRight(ele) {\n var eleWidth = ele.offsetWidth || parseInt(ele.style.width);\n var eleRight = ele.getBoundingClientRect().right || danContainer.getBoundingClientRect().right + eleWidth;\n return danContainer.getBoundingClientRect().right - eleRight;\n };\n\n var danSpeed = function danSpeed(width) {\n return (danWidth + width) / 5;\n };\n\n var getTunnel = function getTunnel(ele, type, width) {\n var tmp = danWidth / danSpeed(width);\n\n var _loop2 = function _loop2(i) {\n var item = _this4.danTunnel[type][i + ''];\n if (item && item.length) {\n for (var j = 0; j < item.length; j++) {\n var danRight = danItemRight(item[j]) - 10;\n if (danRight <= danWidth - tmp * danSpeed(parseInt(item[j].style.width)) || danRight <= 0) {\n break;\n }\n if (j === item.length - 1) {\n _this4.danTunnel[type][i + ''].push(ele);\n ele.addEventListener('animationend', function () {\n _this4.danTunnel[type][i + ''].splice(0, 1);\n });\n return {\n v: i % itemY\n };\n }\n }\n } else {\n _this4.danTunnel[type][i + ''] = [ele];\n ele.addEventListener('animationend', function () {\n _this4.danTunnel[type][i + ''].splice(0, 1);\n });\n return {\n v: i % itemY\n };\n }\n };\n\n for (var i = 0;; i++) {\n var _ret2 = _loop2(i);\n\n if ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === \"object\") return _ret2.v;\n }\n };\n\n if (Object.prototype.toString.call(danmaku) !== '[object Array]') {\n danmaku = [danmaku];\n }\n\n var docFragment = document.createDocumentFragment();\n\n var _loop3 = function _loop3(i) {\n if (!danmaku[i].type) {\n danmaku[i].type = 'right';\n }\n if (!danmaku[i].color) {\n danmaku[i].color = '#fff';\n }\n var item = document.createElement('div');\n item.classList.add('dplayer-danmaku-item');\n item.classList.add('dplayer-danmaku-' + danmaku[i].type);\n item.innerHTML = danmaku[i].text;\n item.style.opacity = _this4.danOpacity;\n item.style.color = danmaku[i].color;\n item.addEventListener('animationend', function () {\n danContainer.removeChild(item);\n });\n\n // measure\n _this4.itemDemo.innerHTML = danmaku[i].text;\n var itemWidth = _this4.itemDemo.offsetWidth;\n\n // adjust\n switch (danmaku[i].type) {\n case 'right':\n item.style.width = itemWidth + 1 + 'px';\n item.style.top = itemHeight * getTunnel(item, danmaku[i].type, itemWidth) + 'px';\n item.style.transform = 'translateX(-' + danWidth + 'px)';\n break;\n case 'top':\n item.style.top = itemHeight * getTunnel(item, danmaku[i].type) + 'px';\n break;\n case 'bottom':\n item.style.bottom = itemHeight * getTunnel(item, danmaku[i].type) + 'px';\n break;\n default:\n console.error('Can\\'t handled danmaku type: ' + danmaku[i].type);\n }\n\n // move\n item.classList.add('dplayer-danmaku-move');\n\n // insert\n docFragment.appendChild(item);\n };\n\n for (var i = 0; i < danmaku.length; i++) {\n _loop3(i);\n }\n\n danContainer.appendChild(docFragment);\n\n return docFragment;\n }\n\n /**\n * Switch to a new video\n *\n * @param {Object} video - new video info\n * @param {Object} danmaku - new danmaku info\n */\n\n }, {\n key: 'switchVideo',\n value: function switchVideo(video, danmaku) {\n this.video.attr('poster', video.pic ? video.pic : '');\n this.video.attr('src', video.url);\n this.pause();\n if (danmaku) {\n this.dan = [];\n this.danIndex = 0;\n this.element.getElementsByClassName('dplayer-danloading')[0].style.display = 'block';\n this.updateBar('played', 0, 'width');\n this.updateBar('loaded', 0, 'width');\n this.element.getElementsByClassName('dplayer-ptime')[0].innerHTML = '00:00';\n this.element.getElementsByClassName('dplayer-danmaku')[0].innerHTML = '
';\n this.danTuel = {\n right: {},\n top: {},\n bottom: {}\n };\n this.itemDemo = this.element.getElementsByClassName('dplayer-danmaku-item')[0];\n this.option.danmaku = danmaku;\n this.readDanmaku();\n }\n }\n }, {\n key: 'initVideo',\n value: function initVideo() {\n var _this5 = this;\n\n // Support HTTP Live Streaming\n var enablehls = void 0;\n if (this.option.video.type === 'auto') {\n enablehls = /m3u8(#|\\?|$)/i.exec(this.option.video.url);\n } else if (this.option.video.type === 'hls') {\n enablehls = true;\n } else {\n enablehls = false;\n }\n if (enablehls && Hls.isSupported()) {\n // this.element.getElementsByClassName('dplayer-time')[0].style.display = 'none';\n var hls = new Hls();\n hls.attachMedia(this.video.current);\n hls.on(Hls.Events.MEDIA_ATTACHED, function () {\n hls.loadSource(_this5.option.video.url);\n hls.on(Hls.Events.MANIFEST_PARSED, function (event, data) {\n this.notice(\"manifest loaded, found \" + data.levels.length + \" quality level\");\n });\n });\n }\n\n // Support FLV\n var enableflv = void 0;\n if (this.option.video.type === 'auto') {\n enableflv = /.flv(#|\\?|$)/i.exec(this.option.video.url);\n } else if (this.option.video.type === 'flv') {\n enableflv = true;\n } else {\n enableflv = false;\n }\n if (enableflv && flvjs.isSupported()) {\n var flvPlayer = flvjs.createPlayer({\n type: 'flv',\n url: this.option.video.url\n });\n flvPlayer.attachMediaElement(this.video.current);\n flvPlayer.load();\n }\n\n if (this.option.danmaku) {\n this.video.on('all', 'seeking', function () {\n for (var i = 0; i < _this5.dan.length; i++) {\n if (_this5.dan[i].time >= _this5.video.currentTime()) {\n _this5.danIndex = i;\n return;\n }\n _this5.danIndex = _this5.dan.length;\n }\n });\n }\n\n /**\n * video events\n */\n // show video time: the metadata has loaded or changed\n this.video.on('all', 'durationchange', function (i, video) {\n if (video.duration !== 1) {\n // compatibility: Android browsers will output 1 at first\n _this5.element.getElementsByClassName('dplayer-dtime')[0].innerHTML = utils.secondToTime(_this5.video.duration);\n }\n });\n\n // show video loaded bar: to inform interested parties of progress downloading the media\n this.video.on('current', 'progress', function (i, video) {\n var percentage = video.buffered.length ? video.buffered.end(video.buffered.length - 1) / video.duration : 0;\n _this5.updateBar('loaded', percentage, 'width');\n });\n\n // video download error: an error occurs\n this.video.on('all', 'error', function () {\n _this5.notice(_this5.tran('This video fails to load'), -1);\n _this5.trigger('pause');\n });\n\n // video can play: enough data is available that the media can be played\n this.video.on('current', 'canplay', function () {\n _this5.trigger('canplay');\n });\n\n // music end\n this.ended = false;\n this.video.on('all', 'ended', function (i) {\n if (i === _this5.video.videos.length - 1) {\n _this5.updateBar('played', 1, 'width');\n if (!_this5.loop) {\n _this5.ended = true;\n _this5.pause();\n _this5.trigger('ended');\n } else {\n _this5.video.switch(0);\n _this5.video.play();\n }\n _this5.danIndex = 0;\n }\n });\n\n this.video.on('current', 'play', function () {\n if (_this5.paused) {\n _this5.play();\n }\n });\n\n this.video.on('current', 'pause', function () {\n if (!_this5.paused) {\n _this5.pause();\n }\n });\n\n // control volume\n this.video.attr('volume', parseInt(this.element.getElementsByClassName('dplayer-volume-bar-inner')[0].style.width) / 100);\n }\n }, {\n key: 'switchQuality',\n value: function switchQuality(index) {\n var _this6 = this;\n\n if (this.qualityIndex === index || this.switchingQuality) {\n return;\n } else {\n this.qualityIndex = index;\n }\n this.switchingQuality = true;\n this.quality = this.option.video.quality[index];\n this.element.getElementsByClassName('dplayer-quality-icon')[0].innerHTML = this.quality.name;\n\n this.video.pause();\n var videoHTML = html.video(false, null, this.option.screenshot, 'auto', this.quality.url);\n var videoEle = new DOMParser().parseFromString(videoHTML, 'text/html').body.firstChild;\n var parent = this.element.getElementsByClassName('dplayer-video-wrap')[0];\n parent.prepend(videoEle);\n this.prevVideo = this.video;\n this.video = new Video([videoEle], this.prevVideo.duration);\n this.initVideo();\n this.video.seek(this.prevVideo.currentTime());\n this.notice(this.tran('Switching to') + ' ' + this.quality.name + ' ' + this.tran('quality'), -1);\n this.video.on('current', 'canplay', function () {\n if (_this6.prevVideo) {\n if (_this6.video.currentTime() !== _this6.prevVideo.currentTime()) {\n _this6.video.seek(_this6.prevVideo.currentTime());\n return;\n }\n parent.removeChild(_this6.prevVideo.current);\n _this6.video.current.classList.add('dplayer-video-current');\n _this6.video.play();\n _this6.prevVideo = null;\n _this6.notice(_this6.tran('Switched to') + ' ' + _this6.quality.name + ' ' + _this6.tran('quality'));\n _this6.switchingQuality = false;\n }\n });\n }\n }, {\n key: 'timeTipsHandler',\n value: function timeTipsHandler(pbar, timeTips) {\n var _this7 = this;\n\n // http://stackoverflow.com/questions/1480133/how-can-i-get-an-objects-absolute-position-on-the-page-in-javascript\n var cumulativeOffset = function cumulativeOffset(element) {\n var top = 0,\n left = 0;\n do {\n top += element.offsetTop || 0;\n left += element.offsetLeft || 0;\n element = element.offsetParent;\n } while (element);\n\n return {\n top: top,\n left: left\n };\n };\n\n return function (e) {\n if (!_this7.video.duration) {\n return;\n }\n var clientX = e.clientX;\n\n var px = cumulativeOffset(pbar).left;\n var tx = clientX - px;\n timeTips.innerText = utils.secondToTime(_this7.video.duration * (tx / pbar.offsetWidth));\n timeTips.style.left = tx - 20 + 'px';\n switch (e.type) {\n case 'mouseenter':\n case 'mouseover':\n case 'mousemove':\n if (_this7.isTipsShow) {\n return;\n }\n timeTips.classList.remove('hidden');\n _this7.isTipsShow = true;\n break;\n case 'mouseleave':\n case 'mouseout':\n if (!_this7.isTipsShow) {\n return;\n }\n timeTips.classList.add('hidden');\n _this7.isTipsShow = false;\n break;\n }\n };\n }\n }, {\n key: 'notice',\n value: function notice(text, time) {\n var noticeEle = this.element.getElementsByClassName('dplayer-notice')[0];\n noticeEle.innerHTML = text;\n noticeEle.style.opacity = 1;\n if (this.noticeTime) {\n clearTimeout(this.noticeTime);\n }\n if (time && time < 0) {\n return;\n }\n this.noticeTime = setTimeout(function () {\n noticeEle.style.opacity = 0;\n }, time || 2000);\n }\n }]);\n\n return DPlayer;\n}();\n\nmodule.exports = DPlayer;\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = {\n\n /**\n * Parse second to 00:00 format\n *\n * @param {Number} second\n * @return {String} 00:00 format\n */\n secondToTime: function secondToTime(second) {\n var add0 = function add0(num) {\n return num < 10 ? '0' + num : '' + num;\n };\n var min = parseInt(second / 60);\n var sec = parseInt(second - min * 60);\n return add0(min) + ':' + add0(sec);\n },\n\n /**\n * control play progress\n */\n // get element's view position\n getElementViewLeft: function getElementViewLeft(element) {\n var actualLeft = element.offsetLeft;\n var current = element.offsetParent;\n var elementScrollLeft = document.body.scrollLeft + document.documentElement.scrollLeft;\n if (!document.fullscreenElement && !document.mozFullScreenElement && !document.webkitFullscreenElement) {\n while (current !== null) {\n actualLeft += current.offsetLeft;\n current = current.offsetParent;\n }\n } else {\n while (current !== null && current !== element) {\n actualLeft += current.offsetLeft;\n current = current.offsetParent;\n }\n }\n return actualLeft - elementScrollLeft;\n }\n};\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar defaultApiBackend = __webpack_require__(5);\n\nmodule.exports = function (option) {\n var isMobile = /mobile/i.test(window.navigator.userAgent);\n // compatibility: some mobile browsers don't suppose autoplay\n if (isMobile) {\n option.autoplay = false;\n }\n\n // default options\n var defaultOption = {\n element: document.getElementsByClassName('dplayer')[0],\n autoplay: false,\n theme: '#b7daff',\n loop: false,\n lang: navigator.language.indexOf('zh') !== -1 ? 'zh' : 'en',\n screenshot: false,\n hotkey: true,\n preload: 'auto',\n apiBackend: defaultApiBackend,\n contextmenu: [{\n text: '关于作者',\n link: 'http://diygod.me'\n }, {\n text: '播放器意见反馈',\n link: 'https://github.com/DIYgod/DPlayer/issues'\n }, {\n text: '关于 DPlayer 播放器',\n link: 'https://github.com/DIYgod/DPlayer'\n }]\n };\n for (var defaultKey in defaultOption) {\n if (defaultOption.hasOwnProperty(defaultKey) && !option.hasOwnProperty(defaultKey)) {\n option[defaultKey] = defaultOption[defaultKey];\n }\n }\n if (Object.prototype.toString.call(option.video.url) !== '[object Array]') {\n option.video.url = [option.video.url];\n }\n if (option.video && !option.video.hasOwnProperty('type')) {\n option.video.type = 'auto';\n }\n if (option.danmaku && !option.danmaku.hasOwnProperty('user')) {\n option.danmaku.user = 'DIYgod';\n }\n\n if (option.video.quality) {\n option.video.url = [option.video.quality[option.video.defaultQuality].url];\n }\n\n return option;\n};\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/*\n * xhr.status ---> fail\n * response.code === 1 ---> success\n * response.code !== 1 ---> error\n * */\n\nvar SendXMLHttpRequest = function SendXMLHttpRequest(url, data, success, error, fail) {\n var xhr = new XMLHttpRequest();\n\n xhr.onreadystatechange = function () {\n if (xhr.readyState === 4) {\n if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) {\n var response = JSON.parse(xhr.responseText);\n\n if (response.code !== 1) {\n return error(xhr, response);\n }\n\n return success(xhr, response);\n }\n\n fail(xhr);\n }\n };\n\n xhr.open(data !== null ? 'POST' : 'GET', url, true);\n xhr.send(data !== null ? JSON.stringify(data) : null);\n};\n\nmodule.exports = {\n send: function send(endpoint, danmakuData) {\n SendXMLHttpRequest(endpoint, danmakuData, function (xhr, response) {\n console.log('Post danmaku: ', response);\n }, function (xhr, response) {\n alert(response.msg);\n }, function (xhr) {\n console.log('Request was unsuccessful: ' + xhr.status);\n });\n },\n\n read: function read(endpoint, cbk) {\n SendXMLHttpRequest(endpoint, null, function (xhr, response) {\n cbk(null, response.danmaku);\n }, function (xhr, response) {\n cbk({ status: xhr.status, response: response });\n }, function (xhr) {\n cbk({ status: xhr.status, response: null });\n });\n }\n};\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar tranZH = {\n 'Danmaku is loading': '弹幕加载中',\n 'Top': '顶部',\n 'Bottom': '底部',\n 'Rolling': '滚动',\n 'Input danmaku, hit Enter': '输入弹幕,回车发送',\n 'About author': '关于作者',\n 'DPlayer feedback': '播放器意见反馈',\n 'About DPlayer': '关于 DPlayer 播放器',\n 'Loop': '洗脑循环',\n 'Speed': '速度',\n 'Opacity for danmaku': '弹幕透明度',\n 'Normal': '正常',\n 'Please input danmaku content!': '要输入弹幕内容啊喂!',\n 'Set danmaku color': '设置弹幕颜色',\n 'Set danmaku type': '设置弹幕类型',\n 'Danmaku': '弹幕',\n 'This video fails to load': '视频加载失败',\n 'Switching to': '正在切换至',\n 'Switched to': '已经切换至',\n 'quality': '画质'\n};\n\nmodule.exports = function (lang) {\n var _this = this;\n\n this.lang = lang;\n this.tran = function (text) {\n if (_this.lang === 'en') {\n return text;\n } else if (_this.lang === 'zh') {\n return tranZH[text];\n }\n };\n};\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar svg = __webpack_require__(0);\n\nvar html = {\n main: function main(option, index, tran) {\n var videos = '';\n for (var i = 0; i < option.video.url.length; i++) {\n videos += html.video(i === 0, option.video.pic, option.screenshot, option.video.url.length ? 'metadata' : option.preload, option.video.url[i]);\n }\n return '\\n
\\n
\\n ' + videos + '\\n ' + (option.logo ? '\\n
\\n ' : '') + '\\n
\\n
\\n
\\n
\\n \\n ' + (option.danmaku ? '' + tran('Danmaku is loading') + '' : '') + '\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n
\\n
\\n
\\n
\\n
\\n \\n
\\n \\n
\\n
\\n
\\n \\n
\\n
\\n
\\n
\\n 0:00 / 0:00\\n
\\n
\\n ' + (option.video.quality ? '\\n
\\n \\n
\\n ' + html.qualityList(option.video.quality) + '\\n
\\n
\\n ' : '') + '\\n ' + (option.screenshot ? '\\n \\n ' + svg('camera') + '\\n \\n ' : '') + '\\n
\\n \\n
\\n \\n
\\n
\\n
' + tran('Set danmaku color') + '
\\n \\n \\n \\n \\n \\n \\n
\\n
\\n
' + tran('Set danmaku type') + '
\\n \\n \\n \\n
\\n
\\n \\n \\n
\\n
\\n
\\n \\n
\\n
\\n
\\n \\n \\n
\\n
\\n
\\n
00:00
\\n
\\n
\\n
\\n \\n
\\n
\\n
\\n
\\n ' + html.contextmenuList(option.contextmenu) + '\\n
';\n },\n\n contextmenuList: function contextmenuList(contextmenu) {\n var result = '
';\n for (var i = 0; i < contextmenu.length; i++) {\n result += '';\n }\n result += '
';\n\n return result;\n },\n\n qualityList: function qualityList(quality) {\n var result = '
';\n for (var i = 0; i < quality.length; i++) {\n result += '
' + quality[i].name + '
';\n }\n result += '
';\n\n return result;\n },\n\n video: function video(current, pic, screenshot, preload, url) {\n return '';\n },\n\n setting: function setting(tran) {\n return {\n 'original': '\\n
\\n ' + tran('Speed') + '\\n
\\n ' + svg('right') + '\\n
\\n
\\n
\\n ' + tran('Loop') + '\\n
\\n \\n \\n
\\n
\\n
\\n ' + tran('Danmaku') + '\\n
\\n \\n \\n
\\n
\\n
\\n ' + tran('Opacity for danmaku') + '\\n
\\n
\\n
\\n \\n
\\n
\\n
\\n
',\n 'speed': '\\n
\\n 0.5\\n
\\n
\\n 0.75\\n
\\n
\\n ' + tran('Normal') + '\\n
\\n
\\n 1.25\\n
\\n
\\n 1.5\\n
\\n
\\n 2\\n
'\n };\n }\n};\n\nmodule.exports = html;\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Video = function () {\n function Video(videos, duration) {\n var _this = this;\n\n _classCallCheck(this, Video);\n\n this.videos = videos;\n this.multi = this.videos.length > 1;\n this.index = 0;\n this.current = this.videos[this.index];\n\n this.duration = duration || 0;\n this.durationArr = [];\n this.eventAll = [];\n this.eventCurrent = [];\n\n this.on('all', 'durationchange', function (i, video) {\n if (video.duration !== 1) {\n // some Android browsers will output 1 at first\n _this.durationArr[i] = video.duration;\n if (!duration) {\n _this.duration = _this.durationArr.reduce(function (sum, cur) {\n return sum + cur;\n });\n }\n }\n });\n this.on('current', 'end', function () {\n _this.switch(_this.index + 1);\n });\n }\n\n _createClass(Video, [{\n key: 'switch',\n value: function _switch(index, time) {\n if (this.index !== index) {\n this.videos[index].classList.add('dplayer-video-current');\n if (!this.current.paused) {\n this.videos[index].play();\n }\n this.current.classList.remove('dplayer-video-current');\n this.current.pause();\n\n this.index = index;\n this.current = this.videos[this.index];\n this.videos[index].currentTime = time ? time : 0;\n } else {\n this.videos[index].currentTime = time ? time : 0;\n }\n }\n\n // bind event \n\n }, {\n key: 'on',\n value: function on(type, event, callback) {\n var _this2 = this;\n\n if (typeof callback === 'function') {\n if (type === 'all') {\n if (!this.eventAll[event]) {\n this.eventAll[event] = [];\n }\n this.eventAll[event].push(callback);\n } else {\n if (!this.eventCurrent[event]) {\n this.eventCurrent[event] = [];\n }\n this.eventCurrent[event].push(callback);\n }\n\n if (['seeking'].indexOf(event) === -1) {\n var _loop = function _loop(i) {\n _this2.videos[i].addEventListener(event, function () {\n if (type === 'all' || _this2.videos[i] === _this2.current) {\n callback(i, _this2.videos[i]);\n }\n });\n };\n\n for (var i = 0; i < this.videos.length; i++) {\n _loop(i);\n }\n }\n }\n }\n\n // trigger event\n\n }, {\n key: 'trigger',\n value: function trigger(type, event) {\n var events = type === 'all' ? this.eventAll : this.eventCurrent;\n for (var i = 0; i < events[event].length; i++) {\n events[event][i]();\n }\n }\n }, {\n key: 'currentTime',\n value: function currentTime() {\n if (this.durationArr.slice(0, this.index).length) {\n return this.durationArr.slice(0, this.index).reduce(function (sum, cur) {\n return sum + cur;\n }) + this.current.currentTime;\n } else {\n return this.current.currentTime;\n }\n }\n }, {\n key: 'seek',\n value: function seek(time) {\n time = Math.max(time, 0);\n time = Math.min(time, this.duration);\n\n var i = 0;\n var tmptime = 0;\n while (tmptime <= time) {\n tmptime += this.durationArr[i];\n i++;\n }\n\n var currentTime = void 0;\n if (this.durationArr.slice(0, this.index).length) {\n currentTime = time - this.durationArr.slice(0, i - 1).reduce(function (sum, cur) {\n return sum + cur;\n });\n } else {\n currentTime = time;\n }\n\n this.switch(i - 1, currentTime);\n\n this.trigger('all', 'seeking');\n }\n }, {\n key: 'attr',\n value: function attr(option, value) {\n if (value !== undefined) {\n for (var i = 0; i < this.videos.length; i++) {\n this.videos[i][option] = value;\n }\n }\n return this.current[option];\n }\n }, {\n key: 'play',\n value: function play() {\n this.current.play();\n }\n }, {\n key: 'pause',\n value: function pause() {\n this.current.pause();\n }\n }, {\n key: 'toggle',\n value: function toggle() {\n this.current.paused ? this.play() : this.pause();\n }\n }]);\n\n return Video;\n}();\n\nmodule.exports = Video;\n\n/***/ })\n/******/ ]);\n});\n\n\n// WEBPACK FOOTER //\n// DPlayer.min.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 2cb1704de1f3a1b3c55e","/**\n* SVG used by DPlayer\n*/\n\nconst svgSource = {\n 'play': ['0 0 16 32', 'M15.552 15.168q0.448 0.32 0.448 0.832 0 0.448-0.448 0.768l-13.696 8.512q-0.768 0.512-1.312 0.192t-0.544-1.28v-16.448q0-0.96 0.544-1.28t1.312 0.192z'],\n 'pause': ['0 0 17 32', 'M14.080 4.8q2.88 0 2.88 2.048v18.24q0 2.112-2.88 2.112t-2.88-2.112v-18.24q0-2.048 2.88-2.048zM2.88 4.8q2.88 0 2.88 2.048v18.24q0 2.112-2.88 2.112t-2.88-2.112v-18.24q0-2.048 2.88-2.048z'],\n 'volume-up': ['0 0 21 32', 'M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8zM20.576 16q0 1.344-0.768 2.528t-2.016 1.664q-0.16 0.096-0.448 0.096-0.448 0-0.8-0.32t-0.32-0.832q0-0.384 0.192-0.64t0.544-0.448 0.608-0.384 0.512-0.64 0.192-1.024-0.192-1.024-0.512-0.64-0.608-0.384-0.544-0.448-0.192-0.64q0-0.48 0.32-0.832t0.8-0.32q0.288 0 0.448 0.096 1.248 0.48 2.016 1.664t0.768 2.528zM25.152 16q0 2.72-1.536 5.056t-4 3.36q-0.256 0.096-0.448 0.096-0.48 0-0.832-0.352t-0.32-0.8q0-0.704 0.672-1.056 1.024-0.512 1.376-0.8 1.312-0.96 2.048-2.4t0.736-3.104-0.736-3.104-2.048-2.4q-0.352-0.288-1.376-0.8-0.672-0.352-0.672-1.056 0-0.448 0.32-0.8t0.8-0.352q0.224 0 0.48 0.096 2.496 1.056 4 3.36t1.536 5.056zM29.728 16q0 4.096-2.272 7.552t-6.048 5.056q-0.224 0.096-0.448 0.096-0.48 0-0.832-0.352t-0.32-0.8q0-0.64 0.704-1.056 0.128-0.064 0.384-0.192t0.416-0.192q0.8-0.448 1.44-0.896 2.208-1.632 3.456-4.064t1.216-5.152-1.216-5.152-3.456-4.064q-0.64-0.448-1.44-0.896-0.128-0.096-0.416-0.192t-0.384-0.192q-0.704-0.416-0.704-1.056 0-0.448 0.32-0.8t0.832-0.352q0.224 0 0.448 0.096 3.776 1.632 6.048 5.056t2.272 7.552z'],\n 'volume-down': ['0 0 21 32', 'M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8zM20.576 16q0 1.344-0.768 2.528t-2.016 1.664q-0.16 0.096-0.448 0.096-0.448 0-0.8-0.32t-0.32-0.832q0-0.384 0.192-0.64t0.544-0.448 0.608-0.384 0.512-0.64 0.192-1.024-0.192-1.024-0.512-0.64-0.608-0.384-0.544-0.448-0.192-0.64q0-0.48 0.32-0.832t0.8-0.32q0.288 0 0.448 0.096 1.248 0.48 2.016 1.664t0.768 2.528z'],\n 'volume-off': ['0 0 21 32', 'M13.728 6.272v19.456q0 0.448-0.352 0.8t-0.8 0.32-0.8-0.32l-5.952-5.952h-4.672q-0.48 0-0.8-0.352t-0.352-0.8v-6.848q0-0.48 0.352-0.8t0.8-0.352h4.672l5.952-5.952q0.32-0.32 0.8-0.32t0.8 0.32 0.352 0.8z'],\n 'loop': ['0 0 32 32', 'M1.882 16.941c0 4.152 3.221 7.529 7.177 7.529v1.882c-4.996 0-9.060-4.222-9.060-9.412s4.064-9.412 9.060-9.412h7.96l-3.098-3.098 1.331-1.331 5.372 5.37-5.37 5.372-1.333-1.333 3.1-3.098h-7.962c-3.957 0-7.177 3.377-7.177 7.529zM22.94 7.529v1.882c3.957 0 7.177 3.377 7.177 7.529s-3.221 7.529-7.177 7.529h-7.962l3.098-3.098-1.331-1.331-5.37 5.37 5.372 5.372 1.331-1.331-3.1-3.1h7.96c4.998 0 9.062-4.222 9.062-9.412s-4.064-9.412-9.060-9.412z'],\n 'full': ['0 0 32 33', 'M6.667 28h-5.333c-0.8 0-1.333-0.533-1.333-1.333v-5.333c0-0.8 0.533-1.333 1.333-1.333s1.333 0.533 1.333 1.333v4h4c0.8 0 1.333 0.533 1.333 1.333s-0.533 1.333-1.333 1.333zM30.667 28h-5.333c-0.8 0-1.333-0.533-1.333-1.333s0.533-1.333 1.333-1.333h4v-4c0-0.8 0.533-1.333 1.333-1.333s1.333 0.533 1.333 1.333v5.333c0 0.8-0.533 1.333-1.333 1.333zM30.667 12c-0.8 0-1.333-0.533-1.333-1.333v-4h-4c-0.8 0-1.333-0.533-1.333-1.333s0.533-1.333 1.333-1.333h5.333c0.8 0 1.333 0.533 1.333 1.333v5.333c0 0.8-0.533 1.333-1.333 1.333zM1.333 12c-0.8 0-1.333-0.533-1.333-1.333v-5.333c0-0.8 0.533-1.333 1.333-1.333h5.333c0.8 0 1.333 0.533 1.333 1.333s-0.533 1.333-1.333 1.333h-4v4c0 0.8-0.533 1.333-1.333 1.333z'],\n 'full-in': ['0 0 32 33', 'M24.965 24.38h-18.132c-1.366 0-2.478-1.113-2.478-2.478v-11.806c0-1.364 1.111-2.478 2.478-2.478h18.132c1.366 0 2.478 1.113 2.478 2.478v11.806c0 1.364-1.11 2.478-2.478 2.478zM6.833 10.097v11.806h18.134l-0.002-11.806h-18.132zM2.478 28.928h5.952c0.684 0 1.238-0.554 1.238-1.239 0-0.684-0.554-1.238-1.238-1.238h-5.952v-5.802c0-0.684-0.554-1.239-1.238-1.239s-1.239 0.556-1.239 1.239v5.802c0 1.365 1.111 2.478 2.478 2.478zM30.761 19.412c-0.684 0-1.238 0.554-1.238 1.238v5.801h-5.951c-0.686 0-1.239 0.554-1.239 1.238 0 0.686 0.554 1.239 1.239 1.239h5.951c1.366 0 2.478-1.111 2.478-2.478v-5.801c0-0.683-0.554-1.238-1.239-1.238zM0 5.55v5.802c0 0.683 0.554 1.238 1.238 1.238s1.238-0.555 1.238-1.238v-5.802h5.952c0.684 0 1.238-0.554 1.238-1.238s-0.554-1.238-1.238-1.238h-5.951c-1.366-0.001-2.478 1.111-2.478 2.476zM32 11.35v-5.801c0-1.365-1.11-2.478-2.478-2.478h-5.951c-0.686 0-1.239 0.554-1.239 1.238s0.554 1.238 1.239 1.238h5.951v5.801c0 0.683 0.554 1.237 1.238 1.237 0.686 0.002 1.239-0.553 1.239-1.236z'],\n 'setting': ['0 0 32 28', 'M28.633 17.104c0.035 0.21 0.026 0.463-0.026 0.76s-0.14 0.598-0.262 0.904c-0.122 0.306-0.271 0.581-0.445 0.825s-0.367 0.419-0.576 0.524c-0.209 0.105-0.393 0.157-0.55 0.157s-0.332-0.035-0.524-0.105c-0.175-0.052-0.393-0.1-0.655-0.144s-0.528-0.052-0.799-0.026c-0.271 0.026-0.541 0.083-0.812 0.17s-0.502 0.236-0.694 0.445c-0.419 0.437-0.664 0.934-0.734 1.493s0.009 1.092 0.236 1.598c0.175 0.349 0.148 0.699-0.079 1.048-0.105 0.14-0.271 0.284-0.498 0.432s-0.476 0.284-0.747 0.406-0.555 0.218-0.851 0.288c-0.297 0.070-0.559 0.105-0.786 0.105-0.157 0-0.306-0.061-0.445-0.183s-0.236-0.253-0.288-0.393h-0.026c-0.192-0.541-0.52-1.009-0.982-1.402s-1-0.589-1.611-0.589c-0.594 0-1.131 0.197-1.611 0.589s-0.816 0.851-1.009 1.375c-0.087 0.21-0.218 0.362-0.393 0.458s-0.367 0.144-0.576 0.144c-0.244 0-0.52-0.044-0.825-0.131s-0.611-0.197-0.917-0.327c-0.306-0.131-0.581-0.284-0.825-0.458s-0.428-0.349-0.55-0.524c-0.087-0.122-0.135-0.266-0.144-0.432s0.057-0.397 0.197-0.694c0.192-0.402 0.266-0.86 0.223-1.375s-0.266-0.991-0.668-1.428c-0.244-0.262-0.541-0.432-0.891-0.511s-0.681-0.109-0.995-0.092c-0.367 0.017-0.742 0.087-1.127 0.21-0.244 0.070-0.489 0.052-0.734-0.052-0.192-0.070-0.371-0.231-0.537-0.485s-0.314-0.533-0.445-0.838c-0.131-0.306-0.231-0.62-0.301-0.943s-0.087-0.59-0.052-0.799c0.052-0.384 0.227-0.629 0.524-0.734 0.524-0.21 0.995-0.555 1.415-1.035s0.629-1.017 0.629-1.611c0-0.611-0.21-1.144-0.629-1.598s-0.891-0.786-1.415-0.996c-0.157-0.052-0.288-0.179-0.393-0.38s-0.157-0.406-0.157-0.616c0-0.227 0.035-0.48 0.105-0.76s0.162-0.55 0.275-0.812 0.244-0.502 0.393-0.72c0.148-0.218 0.31-0.38 0.485-0.485 0.14-0.087 0.275-0.122 0.406-0.105s0.275 0.052 0.432 0.105c0.524 0.21 1.070 0.275 1.637 0.197s1.070-0.327 1.506-0.747c0.21-0.209 0.362-0.467 0.458-0.773s0.157-0.607 0.183-0.904c0.026-0.297 0.026-0.568 0-0.812s-0.048-0.419-0.065-0.524c-0.035-0.105-0.066-0.227-0.092-0.367s-0.013-0.262 0.039-0.367c0.105-0.244 0.293-0.458 0.563-0.642s0.563-0.336 0.878-0.458c0.314-0.122 0.62-0.214 0.917-0.275s0.533-0.092 0.707-0.092c0.227 0 0.406 0.074 0.537 0.223s0.223 0.301 0.275 0.458c0.192 0.471 0.507 0.886 0.943 1.244s0.952 0.537 1.546 0.537c0.611 0 1.153-0.17 1.624-0.511s0.803-0.773 0.996-1.297c0.070-0.14 0.179-0.284 0.327-0.432s0.301-0.223 0.458-0.223c0.244 0 0.511 0.035 0.799 0.105s0.572 0.166 0.851 0.288c0.279 0.122 0.537 0.279 0.773 0.472s0.423 0.402 0.563 0.629c0.087 0.14 0.113 0.293 0.079 0.458s-0.070 0.284-0.105 0.354c-0.227 0.506-0.297 1.039-0.21 1.598s0.341 1.048 0.76 1.467c0.419 0.419 0.934 0.651 1.546 0.694s1.179-0.057 1.703-0.301c0.14-0.087 0.31-0.122 0.511-0.105s0.371 0.096 0.511 0.236c0.262 0.244 0.493 0.616 0.694 1.113s0.336 1 0.406 1.506c0.035 0.297-0.013 0.528-0.144 0.694s-0.266 0.275-0.406 0.327c-0.542 0.192-1.004 0.528-1.388 1.009s-0.576 1.026-0.576 1.637c0 0.594 0.162 1.113 0.485 1.559s0.747 0.764 1.27 0.956c0.122 0.070 0.227 0.14 0.314 0.21 0.192 0.157 0.323 0.358 0.393 0.602v0zM16.451 19.462c0.786 0 1.528-0.149 2.227-0.445s1.305-0.707 1.821-1.231c0.515-0.524 0.921-1.131 1.218-1.821s0.445-1.428 0.445-2.214c0-0.786-0.148-1.524-0.445-2.214s-0.703-1.292-1.218-1.808c-0.515-0.515-1.122-0.921-1.821-1.218s-1.441-0.445-2.227-0.445c-0.786 0-1.524 0.148-2.214 0.445s-1.292 0.703-1.808 1.218c-0.515 0.515-0.921 1.118-1.218 1.808s-0.445 1.428-0.445 2.214c0 0.786 0.149 1.524 0.445 2.214s0.703 1.297 1.218 1.821c0.515 0.524 1.118 0.934 1.808 1.231s1.428 0.445 2.214 0.445v0z'],\n 'right': ['0 0 32 32', 'M22 16l-10.105-10.6-1.895 1.987 8.211 8.613-8.211 8.612 1.895 1.988 8.211-8.613z'],\n 'comment': ['0 0 32 32', 'M27.128 0.38h-22.553c-2.336 0-4.229 1.825-4.229 4.076v16.273c0 2.251 1.893 4.076 4.229 4.076h4.229v-2.685h8.403l-8.784 8.072 1.566 1.44 7.429-6.827h9.71c2.335 0 4.229-1.825 4.229-4.076v-16.273c0-2.252-1.894-4.076-4.229-4.076zM28.538 19.403c0 1.5-1.262 2.717-2.819 2.717h-8.36l-0.076-0.070-0.076 0.070h-11.223c-1.557 0-2.819-1.217-2.819-2.717v-13.589c0-1.501 1.262-2.718 2.819-2.718h19.734c1.557 0 2.819-0.141 2.819 1.359v14.947zM9.206 10.557c-1.222 0-2.215 0.911-2.215 2.036s0.992 2.035 2.215 2.035c1.224 0 2.216-0.911 2.216-2.035s-0.992-2.036-2.216-2.036zM22.496 10.557c-1.224 0-2.215 0.911-2.215 2.036s0.991 2.035 2.215 2.035c1.224 0 2.215-0.911 2.215-2.035s-0.991-2.036-2.215-2.036zM15.852 10.557c-1.224 0-2.215 0.911-2.215 2.036s0.991 2.035 2.215 2.035c1.222 0 2.215-0.911 2.215-2.035s-0.992-2.036-2.215-2.036z'],\n 'comment-off': ['0 0 32 32', 'M27.090 0.131h-22.731c-2.354 0-4.262 1.839-4.262 4.109v16.401c0 2.269 1.908 4.109 4.262 4.109h4.262v-2.706h8.469l-8.853 8.135 1.579 1.451 7.487-6.88h9.787c2.353 0 4.262-1.84 4.262-4.109v-16.401c0-2.27-1.909-4.109-4.262-4.109v0zM28.511 19.304c0 1.512-1.272 2.738-2.841 2.738h-8.425l-0.076-0.070-0.076 0.070h-11.311c-1.569 0-2.841-1.226-2.841-2.738v-13.696c0-1.513 1.272-2.739 2.841-2.739h19.889c1.569 0 2.841-0.142 2.841 1.37v15.064z'],\n 'send': ['0 0 32 32', 'M13.725 30l3.9-5.325-3.9-1.125v6.45zM0 17.5l11.050 3.35 13.6-11.55-10.55 12.425 11.8 3.65 6.1-23.375-32 15.5z'],\n 'menu': ['0 0 22 32', 'M20.8 14.4q0.704 0 1.152 0.48t0.448 1.12-0.48 1.12-1.12 0.48h-19.2q-0.64 0-1.12-0.48t-0.48-1.12 0.448-1.12 1.152-0.48h19.2zM1.6 11.2q-0.64 0-1.12-0.48t-0.48-1.12 0.448-1.12 1.152-0.48h19.2q0.704 0 1.152 0.48t0.448 1.12-0.48 1.12-1.12 0.48h-19.2zM20.8 20.8q0.704 0 1.152 0.48t0.448 1.12-0.48 1.12-1.12 0.48h-19.2q-0.64 0-1.12-0.48t-0.48-1.12 0.448-1.12 1.152-0.48h19.2z'],\n 'camera': ['0 0 32 32', 'M16 23c-3.309 0-6-2.691-6-6s2.691-6 6-6 6 2.691 6 6-2.691 6-6 6zM16 13c-2.206 0-4 1.794-4 4s1.794 4 4 4c2.206 0 4-1.794 4-4s-1.794-4-4-4zM27 28h-22c-1.654 0-3-1.346-3-3v-16c0-1.654 1.346-3 3-3h3c0.552 0 1 0.448 1 1s-0.448 1-1 1h-3c-0.551 0-1 0.449-1 1v16c0 0.552 0.449 1 1 1h22c0.552 0 1-0.448 1-1v-16c0-0.551-0.448-1-1-1h-11c-0.552 0-1-0.448-1-1s0.448-1 1-1h11c1.654 0 3 1.346 3 3v16c0 1.654-1.346 3-3 3zM24 10.5c0 0.828 0.672 1.5 1.5 1.5s1.5-0.672 1.5-1.5c0-0.828-0.672-1.5-1.5-1.5s-1.5 0.672-1.5 1.5zM15 4c0 0.552-0.448 1-1 1h-4c-0.552 0-1-0.448-1-1v0c0-0.552 0.448-1 1-1h4c0.552 0 1 0.448 1 1v0z']\n};\n\nmodule.exports = (type) => `\n \n \n \n \n`;\n\n\n// WEBPACK FOOTER //\n// ./src/svg.js","console.log('\\n %c DPlayer 1.3.3 %c http://dplayer.js.org \\n\\n', 'color: #fadfa3; background: #030307; padding:5px 0;', 'background: #fadfa3; padding:5px 0;');\n\nrequire('./DPlayer.scss');\nconst utils = require('./utils.js');\nconst svg = require('./svg.js');\nconst handleOption = require('./option.js');\nconst i18n = require('./i18n.js');\nconst html = require('./html.js');\nconst Video = require('./video.js');\nconst isMobile = /mobile/i.test(window.navigator.userAgent);\n\nlet index = 0;\n\nclass DPlayer {\n\n /**\n * DPlayer constructor function\n *\n * @param {Object} option - See README\n * @constructor\n */\n constructor (option) {\n this.option = handleOption(option);\n\n this.option.element.classList.add('dplayer');\n\n if (this.option.video.quality) {\n this.qualityIndex = this.option.video.defaultQuality;\n this.quality = this.option.video.quality[this.option.video.defaultQuality];\n }\n\n this.tran = new i18n(this.option.lang).tran;\n\n /**\n * Update progress bar, including loading progress bar and play progress bar\n *\n * @param {String} type - Point out which bar it is, should be played loaded or volume\n * @param {Number} percentage\n * @param {String} direction - Point out the direction of this bar, Should be height or width\n */\n this.updateBar = (type, percentage, direction) => {\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n bar[type + 'Bar'].style[direction] = percentage * 100 + '%';\n };\n\n // define DPlayer events\n const eventTypes = ['play', 'pause', 'canplay', 'playing', 'ended', 'error'];\n this.event = {};\n for (let i = 0; i < eventTypes.length; i++) {\n this.event[eventTypes[i]] = [];\n }\n this.trigger = (type) => {\n for (let i = 0; i < this.event[type].length; i++) {\n this.event[type][i]();\n }\n };\n\n this.element = this.option.element;\n if (!this.option.danmaku) {\n this.element.classList.add('dplayer-no-danmaku');\n }\n if (isMobile) {\n this.element.classList.add('dplayer-mobile');\n }\n\n this.element.innerHTML = html.main(option, index, this.tran);\n\n // arrow style\n this.arrow = this.element.offsetWidth <= 500;\n if (this.arrow) {\n const arrowStyle = document.createElement('style');\n arrowStyle.innerHTML = `.dplayer .dplayer-danmaku{font-size:18px}`;\n document.head.appendChild(arrowStyle);\n }\n\n // get this video manager\n this.video = new Video(this.element.getElementsByClassName('dplayer-video-current'));\n\n this.initVideo();\n\n this.bezel = this.element.getElementsByClassName('dplayer-bezel-icon')[0];\n this.bezel.addEventListener('animationend', () => {\n this.bezel.classList.remove('dplayer-bezel-transition');\n });\n\n // play and pause button\n this.playButton = this.element.getElementsByClassName('dplayer-play-icon')[0];\n this.paused = true;\n this.playButton.addEventListener('click', () => {\n this.toggle();\n });\n\n const videoWrap = this.element.getElementsByClassName('dplayer-video-wrap')[0];\n const conMask = this.element.getElementsByClassName('dplayer-controller-mask')[0];\n if (!isMobile) {\n videoWrap.addEventListener('click', () => {\n this.toggle();\n });\n conMask.addEventListener('click', () => {\n this.toggle();\n });\n }\n else {\n const toggleController = () => {\n if (this.element.classList.contains('dplayer-hide-controller')) {\n this.element.classList.remove('dplayer-hide-controller');\n }\n else {\n this.element.classList.add('dplayer-hide-controller');\n }\n };\n videoWrap.addEventListener('click', toggleController);\n conMask.addEventListener('click', toggleController);\n }\n\n const bar = {};\n bar.playedBar = this.element.getElementsByClassName('dplayer-played')[0];\n bar.loadedBar = this.element.getElementsByClassName('dplayer-loaded')[0];\n const pbar = this.element.getElementsByClassName('dplayer-bar-wrap')[0];\n const pbarTimeTips = this.element.getElementsByClassName('dplayer-bar-time')[0];\n let barWidth;\n\n let lastPlayPos = 0;\n let currentPlayPos = 0;\n let bufferingDetected = false;\n this.danmakuTime = false;\n this.playedTime = false;\n this.animationFrame = () => {\n if (this.playedTime) {\n // whether the video is buffering\n currentPlayPos = this.video.currentTime();\n if (!bufferingDetected\n && currentPlayPos < lastPlayPos + 0.01\n && !this.video.attr('paused')) {\n this.element.classList.add('dplayer-loading');\n bufferingDetected = true;\n }\n if (bufferingDetected\n && currentPlayPos > lastPlayPos + 0.01\n && !this.video.attr('paused')) {\n this.element.classList.remove('dplayer-loading');\n bufferingDetected = false;\n }\n lastPlayPos = currentPlayPos;\n\n this.updateBar('played', this.video.currentTime() / this.video.duration, 'width');\n this.element.getElementsByClassName('dplayer-ptime')[0].innerHTML = utils.secondToTime(this.video.currentTime());\n this.trigger('playing');\n }\n if (this.danmakuTime && this.option.danmaku && showdan && this.dan) {\n let item = this.dan[this.danIndex];\n const danmakus = [];\n while (item && this.video.currentTime() > parseFloat(item.time)) {\n danmakus.push(item);\n item = this.dan[++this.danIndex];\n }\n this.pushDanmaku(danmakus);\n }\n requestAnimationFrame(this.animationFrame);\n };\n requestAnimationFrame(this.animationFrame);\n\n this.setTime = (type) => {\n if (!type) {\n this.danmakuTime = true;\n this.playedTime = true;\n }\n else {\n this[`${type}Time`] = true;\n }\n };\n this.clearTime = (type) => {\n if (!type) {\n this.danmakuTime = false;\n this.playedTime = false;\n }\n else {\n this[`${type}Time`] = false;\n }\n };\n\n pbar.addEventListener('click', (event) => {\n const e = event || window.event;\n barWidth = pbar.clientWidth;\n let percentage = (e.clientX - utils.getElementViewLeft(pbar)) / barWidth;\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n this.updateBar('played', percentage, 'width');\n this.video.seek(parseFloat(bar.playedBar.style.width) / 100 * this.video.duration);\n });\n\n this.isTipsShow = false;\n this.timeTipsHandler = this.timeTipsHandler(\n pbar, pbarTimeTips).bind(this);\n pbar.addEventListener('mousemove', this.timeTipsHandler);\n pbar.addEventListener('mouseover', this.timeTipsHandler);\n pbar.addEventListener('mouseenter', this.timeTipsHandler);\n pbar.addEventListener('mouseout', this.timeTipsHandler);\n pbar.addEventListener('mouseleave', this.timeTipsHandler);\n\n const thumbMove = (event) => {\n const e = event || window.event;\n let percentage = (e.clientX - utils.getElementViewLeft(pbar)) / barWidth;\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n this.updateBar('played', percentage, 'width');\n this.element.getElementsByClassName('dplayer-ptime')[0].innerHTML = utils.secondToTime(percentage * this.video.duration);\n };\n\n const thumbUp = () => {\n document.removeEventListener('mouseup', thumbUp);\n document.removeEventListener('mousemove', thumbMove);\n this.video.seek(parseFloat(bar.playedBar.style.width) / 100 * this.video.duration);\n this.setTime();\n };\n\n pbar.addEventListener('mousedown', () => {\n barWidth = pbar.clientWidth;\n this.clearTime();\n document.addEventListener('mousemove', thumbMove);\n document.addEventListener('mouseup', thumbUp);\n });\n\n\n /**\n * control volume\n */\n bar.volumeBar = this.element.getElementsByClassName('dplayer-volume-bar-inner')[0];\n const volumeEle = this.element.getElementsByClassName('dplayer-volume')[0];\n const volumeBarWrapWrap = this.element.getElementsByClassName('dplayer-volume-bar-wrap')[0];\n const volumeBarWrap = this.element.getElementsByClassName('dplayer-volume-bar')[0];\n const volumeicon = this.element.getElementsByClassName('dplayer-volume-icon')[0];\n const vWidth = 35;\n\n this.switchVolumeIcon = () => {\n const volumeicon = this.element.getElementsByClassName('dplayer-volume-icon')[0];\n if (this.video.attr('volume') >= 0.8) {\n volumeicon.innerHTML = svg('volume-up');\n }\n else if (this.video.attr('volume') > 0) {\n volumeicon.innerHTML = svg('volume-down');\n }\n else {\n volumeicon.innerHTML = svg('volume-off');\n }\n };\n const volumeMove = (event) => {\n const e = event || window.event;\n const percentage = (e.clientX - utils.getElementViewLeft(volumeBarWrap) - 5.5) / vWidth;\n this.volume(percentage);\n };\n const volumeUp = () => {\n document.removeEventListener('mouseup', volumeUp);\n document.removeEventListener('mousemove', volumeMove);\n volumeEle.classList.remove('dplayer-volume-active');\n };\n\n volumeBarWrapWrap.addEventListener('click', (event) => {\n const e = event || window.event;\n const percentage = (e.clientX - utils.getElementViewLeft(volumeBarWrap) - 5.5) / vWidth;\n this.volume(percentage);\n });\n volumeBarWrapWrap.addEventListener('mousedown', () => {\n document.addEventListener('mousemove', volumeMove);\n document.addEventListener('mouseup', volumeUp);\n volumeEle.classList.add('dplayer-volume-active');\n });\n volumeicon.addEventListener('click', () => {\n if (this.video.attr('muted')) {\n this.video.attr('muted', false);\n this.switchVolumeIcon();\n this.updateBar('volume', this.video.attr('volume'), 'width');\n }\n else {\n this.video.attr('muted', true);\n volumeicon.innerHTML = svg('volume-off');\n this.updateBar('volume', 0, 'width');\n }\n });\n\n\n /**\n * auto hide controller\n */\n let hideTime = 0;\n if (!isMobile) {\n const hideController = () => {\n this.element.classList.remove('dplayer-hide-controller');\n clearTimeout(hideTime);\n hideTime = setTimeout(() => {\n if (this.video.attr('played').length) {\n this.element.classList.add('dplayer-hide-controller');\n closeSetting();\n closeComment();\n }\n }, 2000);\n };\n this.element.addEventListener('mousemove', hideController);\n this.element.addEventListener('click', hideController);\n }\n\n\n /**\n * setting\n */\n this.danOpacity = localStorage.getItem('DPlayer-opacity') || 0.7;\n const settingHTML = html.setting(this.tran);\n\n // toggle setting box\n const settingIcon = this.element.getElementsByClassName('dplayer-setting-icon')[0];\n const settingBox = this.element.getElementsByClassName('dplayer-setting-box')[0];\n const mask = this.element.getElementsByClassName('dplayer-mask')[0];\n settingBox.innerHTML = settingHTML.original;\n\n const closeSetting = () => {\n if (settingBox.classList.contains('dplayer-setting-box-open')) {\n settingBox.classList.remove('dplayer-setting-box-open');\n mask.classList.remove('dplayer-mask-show');\n setTimeout(() => {\n settingBox.classList.remove('dplayer-setting-box-narrow');\n settingBox.innerHTML = settingHTML.original;\n settingEvent();\n }, 300);\n }\n };\n const openSetting = () => {\n settingBox.classList.add('dplayer-setting-box-open');\n mask.classList.add('dplayer-mask-show');\n };\n\n mask.addEventListener('click', () => {\n closeSetting();\n });\n settingIcon.addEventListener('click', () => {\n openSetting();\n });\n\n this.loop = this.option.loop;\n const danContainer = this.element.getElementsByClassName('dplayer-danmaku')[0];\n let showdan = true;\n const settingEvent = () => {\n // loop control\n const loopEle = this.element.getElementsByClassName('dplayer-setting-loop')[0];\n const loopToggle = loopEle.getElementsByClassName('dplayer-toggle-setting-input')[0];\n\n loopToggle.checked = this.loop;\n\n loopEle.addEventListener('click', () => {\n loopToggle.checked = !loopToggle.checked;\n if (loopToggle.checked) {\n this.loop = true;\n }\n else {\n this.loop = false;\n }\n closeSetting();\n });\n\n // show danmaku control\n const showDanEle = this.element.getElementsByClassName('dplayer-setting-showdan')[0];\n const showDanToggle = showDanEle.getElementsByClassName('dplayer-showdan-setting-input')[0];\n\n showDanToggle.checked = showdan;\n\n showDanEle.addEventListener('click', () => {\n showDanToggle.checked = !showDanToggle.checked;\n if (showDanToggle.checked) {\n showdan = true;\n if (this.option.danmaku) {\n for (let i = 0; i < this.dan.length; i++) {\n if (this.dan[i].time >= this.video.currentTime()) {\n this.danIndex = i;\n break;\n }\n this.danIndex = this.dan.length;\n }\n if (!this.paused) {\n this.setTime('danmaku'); \n }\n }\n }\n else {\n showdan = false;\n if (this.option.danmaku) {\n this.clearTime('danmaku');\n danContainer.innerHTML = `
`;\n this.danTunnel = {\n right: {},\n top: {},\n bottom: {}\n };\n this.itemDemo = this.element.getElementsByClassName('dplayer-danmaku-item')[0];\n }\n }\n closeSetting();\n });\n\n // speed control\n const speedEle = this.element.getElementsByClassName('dplayer-setting-speed')[0];\n speedEle.addEventListener('click', () => {\n settingBox.classList.add('dplayer-setting-box-narrow');\n settingBox.innerHTML = settingHTML.speed;\n\n const speedItem = settingBox.getElementsByClassName('dplayer-setting-speed-item');\n for (let i = 0; i < speedItem.length; i++) {\n speedItem[i].addEventListener('click', () => {\n this.video.attr('playbackRate', speedItem[i].dataset.speed);\n closeSetting();\n });\n }\n });\n\n if (this.option.danmaku) {\n // danmaku opacity\n bar.danmakuBar = this.element.getElementsByClassName('dplayer-danmaku-bar-inner')[0];\n const danmakuBarWrapWrap = this.element.getElementsByClassName('dplayer-danmaku-bar-wrap')[0];\n const danmakuBarWrap = this.element.getElementsByClassName('dplayer-danmaku-bar')[0];\n const danmakuSettingBox = this.element.getElementsByClassName('dplayer-setting-danmaku')[0];\n const dWidth = 130;\n this.updateBar('danmaku', this.danOpacity, 'width');\n\n const danmakuMove = (event) => {\n const e = event || window.event;\n let percentage = (e.clientX - utils.getElementViewLeft(danmakuBarWrap)) / dWidth;\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n this.updateBar('danmaku', percentage, 'width');\n const items = this.element.getElementsByClassName('dplayer-danmaku-item');\n for (let i = 0; i < items.length; i++) {\n items[i].style.opacity = percentage;\n }\n this.danOpacity = percentage;\n localStorage.setItem('DPlayer-opacity', this.danOpacity);\n };\n const danmakuUp = () => {\n document.removeEventListener('mouseup', danmakuUp);\n document.removeEventListener('mousemove', danmakuMove);\n danmakuSettingBox.classList.remove('dplayer-setting-danmaku-active');\n };\n\n danmakuBarWrapWrap.addEventListener('click', (event) => {\n const e = event || window.event;\n let percentage = (e.clientX - utils.getElementViewLeft(danmakuBarWrap)) / dWidth;\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n this.updateBar('danmaku', percentage, 'width');\n const items = this.element.getElementsByClassName('dplayer-danmaku-item');\n for (let i = 0; i < items.length; i++) {\n items[i].style.opacity = percentage;\n }\n this.danOpacity = percentage;\n localStorage.setItem('DPlayer-opacity', this.danOpacity);\n });\n danmakuBarWrapWrap.addEventListener('mousedown', () => {\n document.addEventListener('mousemove', danmakuMove);\n document.addEventListener('mouseup', danmakuUp);\n danmakuSettingBox.classList.add('dplayer-setting-danmaku-active');\n });\n }\n };\n settingEvent();\n\n // set duration time\n if (this.video.duration !== 1) { // compatibility: Android browsers will output 1 at first\n this.element.getElementsByClassName('dplayer-dtime')[0].innerHTML = this.video.duration ? utils.secondToTime(this.video.duration) : '00:00';\n }\n\n // danmaku\n this.danTunnel = {\n right: {},\n top: {},\n bottom: {}\n };\n this.itemDemo = this.element.getElementsByClassName('dplayer-danmaku-item')[0];\n\n if (this.option.danmaku) {\n this.danIndex = 0;\n this.readDanmaku();\n }\n else {\n // autoplay\n if (this.option.autoplay && !isMobile) {\n this.play();\n }\n else if (isMobile) {\n this.pause();\n }\n }\n\n\n /**\n * comment\n */\n const commentInput = this.element.getElementsByClassName('dplayer-comment-input')[0];\n const commentIcon = this.element.getElementsByClassName('dplayer-comment-icon')[0];\n const commentBox = this.element.getElementsByClassName('dplayer-comment-box')[0];\n const commentSettingIcon = this.element.getElementsByClassName('dplayer-comment-setting-icon')[0];\n const commentSettingBox = this.element.getElementsByClassName('dplayer-comment-setting-box')[0];\n const commentSendIcon = this.element.getElementsByClassName('dplayer-send-icon')[0];\n\n const htmlEncode = (str) => str.\n replace(/&/g, \"&\").\n replace(//g, \">\").\n replace(/\"/g, \""\").\n replace(/'/g, \"'\").\n replace(/\\//g, \"/\");\n\n const sendComment = () => {\n commentInput.blur();\n\n // text can't be empty\n if (!commentInput.value.replace(/^\\s+|\\s+$/g, '')) {\n this.notice(this.tran('Please input danmaku content!'));\n return;\n }\n\n const danmakuData = {\n token: this.option.danmaku.token,\n player: this.option.danmaku.id,\n author: this.option.danmaku.user,\n time: this.video.currentTime(),\n text: commentInput.value,\n color: this.element.querySelector('.dplayer-comment-setting-color input:checked').value,\n type: this.element.querySelector('.dplayer-comment-setting-type input:checked').value\n };\n this.option.apiBackend.send(this.option.danmaku.api, danmakuData);\n\n commentInput.value = '';\n closeComment();\n this.dan.splice(this.danIndex, 0, danmakuData);\n this.danIndex++;\n const danmaku = {\n text: htmlEncode(danmakuData.text),\n color: danmakuData.color,\n type: danmakuData.type\n };\n const item = this.pushDanmaku(danmaku);\n item.style.border = `2px solid ${this.option.theme}`;\n };\n\n const closeCommentSetting = () => {\n if (commentSettingBox.classList.contains('dplayer-comment-setting-open')) {\n commentSettingBox.classList.remove('dplayer-comment-setting-open');\n }\n };\n const toggleCommentSetting = () => {\n if (commentSettingBox.classList.contains('dplayer-comment-setting-open')) {\n commentSettingBox.classList.remove('dplayer-comment-setting-open');\n }\n else {\n commentSettingBox.classList.add('dplayer-comment-setting-open');\n }\n };\n\n let disableHide = 0;\n let commentFocusTimeout = 0;\n const closeComment = () => {\n if (!commentBox.classList.contains('dplayer-comment-box-open')) {\n return;\n }\n\n commentBox.classList.remove('dplayer-comment-box-open');\n mask.classList.remove('dplayer-mask-show');\n this.element.classList.remove('dplayer-show-controller');\n\n clearInterval(disableHide);\n clearTimeout(commentFocusTimeout);\n closeCommentSetting();\n };\n const openComment = () => {\n if (commentBox.classList.contains('dplayer-comment-box-open')) {\n return;\n }\n\n commentBox.classList.add('dplayer-comment-box-open');\n mask.classList.add('dplayer-mask-show');\n this.element.classList.add('dplayer-show-controller');\n\n disableHide = setInterval(() => {\n clearTimeout(hideTime);\n }, 1000);\n commentFocusTimeout = setTimeout(() => {\n commentInput.focus();\n }, 300);\n };\n\n mask.addEventListener('click', () => {\n closeComment();\n });\n commentIcon.addEventListener('click', () => {\n openComment();\n });\n commentSettingIcon.addEventListener('click', () => {\n toggleCommentSetting();\n });\n\n // comment setting box\n this.element.getElementsByClassName('dplayer-comment-setting-color')[0].addEventListener('click', () => {\n const sele = this.element.querySelector('input[name=\"dplayer-danmaku-color-${index}\"]:checked+span');\n if (sele) {\n commentSettingIcon.getElementsByClassName('dplayer-fill')[0].style.fill = this.element.querySelector('input[name=\"dplayer-danmaku-color-${index}\"]:checked').value;\n }\n });\n\n commentInput.addEventListener('click', () => {\n closeCommentSetting();\n });\n commentInput.addEventListener('keydown', (e) => {\n const event = e || window.event;\n if (event.keyCode === 13) {\n sendComment();\n }\n });\n\n commentSendIcon.addEventListener('click', sendComment);\n\n\n /**\n * full screen\n */\n const resetAnimation = () => {\n const danWidth = danContainer.offsetWidth;\n const items = this.element.getElementsByClassName('dplayer-danmaku-item');\n for (let i = 0; i < items.length; i++) {\n items[i].style.transform = `translateX(-${danWidth}px)`;\n }\n };\n\n this.element.addEventListener('fullscreenchange', () => {\n resetAnimation();\n });\n this.element.addEventListener('mozfullscreenchange', () => {\n resetAnimation();\n });\n this.element.addEventListener('webkitfullscreenchange', () => {\n resetAnimation();\n });\n // browser full screen\n this.element.getElementsByClassName('dplayer-full-icon')[0].addEventListener('click', () => {\n if (!document.fullscreenElement && !document.mozFullScreenElement && !document.webkitFullscreenElement) {\n if (this.element.requestFullscreen) {\n this.element.requestFullscreen();\n }\n else if (this.element.mozRequestFullScreen) {\n this.element.mozRequestFullScreen();\n }\n else if (this.element.webkitRequestFullscreen) {\n this.element.webkitRequestFullscreen();\n }\n else if (this.video.attr('webkitEnterFullscreen')) { // Safari for iOS\n this.video.current.webkitEnterFullscreen();\n }\n }\n else {\n if (document.cancelFullScreen) {\n document.cancelFullScreen();\n }\n else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen();\n }\n else if (document.webkitCancelFullScreen) {\n document.webkitCancelFullScreen();\n }\n }\n resetAnimation();\n });\n // web full screen\n this.element.getElementsByClassName('dplayer-full-in-icon')[0].addEventListener('click', () => {\n if (this.element.classList.contains('dplayer-fulled')) {\n this.element.classList.remove('dplayer-fulled');\n }\n else {\n this.element.classList.add('dplayer-fulled');\n resetAnimation();\n }\n });\n\n /**\n * hot key\n */\n const handleKeyDown = (e) => {\n const tag = document.activeElement.tagName.toUpperCase();\n const editable = document.activeElement.getAttribute('contenteditable');\n if (tag !== 'INPUT' && tag !== 'TEXTAREA' && editable !== '' && editable !== 'true') {\n const event = e || window.event;\n let percentage;\n switch (event.keyCode) {\n case 32:\n event.preventDefault();\n this.toggle();\n break;\n case 37:\n event.preventDefault();\n this.video.seek(this.video.currentTime() - 5);\n break;\n case 39:\n event.preventDefault();\n this.video.seek(this.video.currentTime() + 5);\n break;\n case 38:\n event.preventDefault();\n percentage = this.video.attr('volume') + 0.1;\n this.volume(percentage);\n break;\n case 40:\n event.preventDefault();\n percentage = this.video.attr('volume') - 0.1;\n this.volume(percentage);\n break;\n }\n }\n };\n if (this.option.hotkey) {\n document.addEventListener('keydown', handleKeyDown);\n }\n document.addEventListener('keydown', (e) => { // Press ESC to quit web full screen\n const event = e || window.event;\n switch (event.keyCode) {\n case 27:\n if (this.element.classList.contains('dplayer-fulled')) {\n this.element.classList.remove('dplayer-fulled');\n resetAnimation();\n }\n break;\n }\n });\n\n /**\n * right key\n */\n const menu = this.element.getElementsByClassName('dplayer-menu')[0];\n this.element.addEventListener('contextmenu', (e) => {\n const event = e || window.event;\n event.preventDefault();\n\n menu.classList.add('dplayer-menu-show');\n\n const clientRect = this.element.getBoundingClientRect();\n const menuLeft = event.clientX - clientRect.left;\n const menuTop = event.clientY - clientRect.top;\n if (menuLeft + menu.offsetWidth >= clientRect.width) {\n menu.style.right = clientRect.width - menuLeft + 'px';\n menu.style.left = 'initial';\n }\n else {\n menu.style.left = event.clientX - this.element.getBoundingClientRect().left + 'px';\n menu.style.right = 'initial';\n }\n if (menuTop + menu.offsetHeight >= clientRect.height) {\n menu.style.bottom = clientRect.height - menuTop + 'px';\n menu.style.top = 'initial';\n }\n else {\n menu.style.top = event.clientY - this.element.getBoundingClientRect().top + 'px';\n menu.style.bottom = 'initial';\n }\n\n mask.classList.add('dplayer-mask-show');\n mask.addEventListener('click', () => {\n mask.classList.remove('dplayer-mask-show');\n menu.classList.remove('dplayer-menu-show');\n });\n });\n\n /**\n * Switch quality\n */\n if (this.option.video.quality) {\n this.element.getElementsByClassName('dplayer-quality-list')[0].addEventListener('click', (e) => {\n if (e.target.classList.contains('dplayer-quality-item')) {\n this.switchQuality(e.target.dataset.index);\n }\n });\n }\n\n /**\n * Screenshot\n */\n if (this.option.screenshot) {\n const camareIcon = this.element.getElementsByClassName('dplayer-camera-icon')[0];\n camareIcon.addEventListener('click', () => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = this.video.attr('videoWidth');\n canvas.height = this.video.attr('videoHeight');\n canvas.getContext('2d').drawImage(this.video.current, 0, 0, canvas.width, canvas.height);\n\n camareIcon.href = canvas.toDataURL();\n camareIcon.download = \"DPlayer.png\";\n });\n }\n\n index++;\n }\n\n /**\n * Play music\n */\n play (time) {\n if (Object.prototype.toString.call(time) === '[object Number]') {\n this.video.seek(time);\n }\n this.paused = false;\n if (this.video.attr('paused')) {\n this.bezel.innerHTML = svg('play');\n this.bezel.classList.add('dplayer-bezel-transition');\n }\n\n this.playButton.innerHTML = svg('pause');\n\n this.video.play();\n this.setTime();\n this.element.classList.add('dplayer-playing');\n this.trigger('play');\n }\n\n /**\n * Pause music\n */\n pause () {\n this.paused = true;\n this.element.classList.remove('dplayer-loading');\n\n if (!this.video.attr('paused')) {\n this.bezel.innerHTML = svg('pause');\n this.bezel.classList.add('dplayer-bezel-transition');\n }\n\n this.ended = false;\n this.playButton.innerHTML = svg('play');\n this.video.pause();\n this.clearTime();\n this.element.classList.remove('dplayer-playing');\n this.trigger('pause');\n }\n\n /**\n * Set volume\n */\n volume (percentage) {\n percentage = percentage > 0 ? percentage : 0;\n percentage = percentage < 1 ? percentage : 1;\n this.updateBar('volume', percentage, 'width');\n this.video.attr('volume', percentage);\n if (this.video.attr('muted')) {\n this.video.attr('muted', false);\n }\n this.switchVolumeIcon();\n }\n\n /**\n * Toggle between play and pause\n */\n toggle () {\n if (this.video.attr('paused')) {\n this.play();\n }\n else {\n this.pause();\n }\n }\n\n /**\n * attach event\n */\n on (event, callback) {\n if (typeof callback === 'function') {\n this.event[event].push(callback);\n }\n }\n\n /**\n * Asynchronously read danmaku from all API endpoints\n */\n _readAllEndpoints (endpoints, finish) {\n const results = [];\n let readCount = 0;\n const cbk = (i) => (err, data) => {\n ++readCount;\n if (err) {\n if (err.response) {\n this.notice(err.response.msg);\n }\n else {\n this.notice('Request was unsuccessful: ' + err.status);\n }\n results[i] = [];\n }\n else {\n results[i] = data;\n }\n if (readCount === endpoints.length) {\n return finish(results);\n }\n };\n\n for (let i = 0; i < endpoints.length; ++i) {\n this.option.apiBackend.read(endpoints[i], cbk(i));\n }\n }\n\n /**\n * Read danmaku from API\n */\n readDanmaku () {\n const isMobile = /mobile/i.test(window.navigator.userAgent);\n let apiurl;\n if (this.option.danmaku.maximum) {\n apiurl = `${this.option.danmaku.api}?id=${this.option.danmaku.id}&max=${this.option.danmaku.maximum}`;\n }\n else {\n apiurl = `${this.option.danmaku.api}?id=${this.option.danmaku.id}`;\n }\n const endpoints = (this.option.danmaku.addition || []).slice(0);\n endpoints.push(apiurl);\n\n this._readAllEndpoints(endpoints, (results) => {\n this.danIndex = 0;\n this.dan = [].concat.apply([], results).sort((a, b) => a.time - b.time);\n this.element.getElementsByClassName('dplayer-danloading')[0].style.display = 'none';\n\n // autoplay\n if (this.option.autoplay && !isMobile) {\n this.play();\n }\n else if (isMobile) {\n this.pause();\n }\n });\n }\n\n /**\n * Push a danmaku into DPlayer\n *\n * @param {Object Array} danmaku - {text, color, type}\n * text - danmaku content\n * color - danmaku color, default: `#fff`\n * type - danmaku type, `right` `top` `bottom`, default: `right`\n */\n pushDanmaku (danmaku) {\n const danContainer = this.element.getElementsByClassName('dplayer-danmaku')[0];\n const itemHeight = this.arrow ? 24 : 30;\n const danWidth = danContainer.offsetWidth;\n const danHeight = danContainer.offsetHeight;\n const itemY = parseInt(danHeight / itemHeight);\n\n const danItemRight = (ele) => {\n const eleWidth = ele.offsetWidth || parseInt(ele.style.width);\n const eleRight = ele.getBoundingClientRect().right || danContainer.getBoundingClientRect().right + eleWidth;\n return danContainer.getBoundingClientRect().right - eleRight;\n };\n\n const danSpeed = (width) => (danWidth + width) / 5;\n\n const getTunnel = (ele, type, width) => {\n const tmp = danWidth / danSpeed(width);\n\n for (let i = 0; ; i++) {\n const item = this.danTunnel[type][i + ''];\n if (item && item.length) {\n for (let j = 0; j < item.length; j++) {\n const danRight = danItemRight(item[j]) - 10;\n if (danRight <= danWidth - tmp * danSpeed(parseInt(item[j].style.width)) || danRight <= 0) {\n break;\n }\n if (j === item.length - 1) {\n this.danTunnel[type][i + ''].push(ele);\n ele.addEventListener('animationend', () => {\n this.danTunnel[type][i + ''].splice(0, 1);\n });\n return i % itemY;\n }\n }\n }\n else {\n this.danTunnel[type][i + ''] = [ele];\n ele.addEventListener('animationend', () => {\n this.danTunnel[type][i + ''].splice(0, 1);\n });\n return i % itemY;\n }\n }\n };\n\n if (Object.prototype.toString.call(danmaku) !== '[object Array]') {\n danmaku = [danmaku];\n }\n\n const docFragment = document.createDocumentFragment();\n\n for (let i = 0; i < danmaku.length; i++) {\n if (!danmaku[i].type) {\n danmaku[i].type = 'right';\n }\n if (!danmaku[i].color) {\n danmaku[i].color = '#fff';\n }\n const item = document.createElement(`div`);\n item.classList.add(`dplayer-danmaku-item`);\n item.classList.add(`dplayer-danmaku-${danmaku[i].type}`);\n item.innerHTML = danmaku[i].text;\n item.style.opacity = this.danOpacity;\n item.style.color = danmaku[i].color;\n item.addEventListener('animationend', () => {\n danContainer.removeChild(item);\n });\n\n // measure\n this.itemDemo.innerHTML = danmaku[i].text;\n const itemWidth = this.itemDemo.offsetWidth;\n\n // adjust\n switch (danmaku[i].type) {\n case 'right':\n item.style.width = itemWidth + 1 + 'px';\n item.style.top = itemHeight * getTunnel(item, danmaku[i].type, itemWidth) + 'px';\n item.style.transform = `translateX(-${danWidth}px)`;\n break;\n case 'top':\n item.style.top = itemHeight * getTunnel(item, danmaku[i].type) + 'px';\n break;\n case 'bottom':\n item.style.bottom = itemHeight * getTunnel(item, danmaku[i].type) + 'px';\n break;\n default:\n console.error(`Can't handled danmaku type: ${danmaku[i].type}`);\n }\n\n // move\n item.classList.add(`dplayer-danmaku-move`);\n\n // insert\n docFragment.appendChild(item);\n }\n\n danContainer.appendChild(docFragment);\n\n return docFragment;\n }\n\n /**\n * Switch to a new video\n *\n * @param {Object} video - new video info\n * @param {Object} danmaku - new danmaku info\n */\n switchVideo (video, danmaku) {\n this.video.attr('poster', video.pic ? video.pic : '');\n this.video.attr('src', video.url);\n this.pause();\n if (danmaku) {\n this.dan = [];\n this.danIndex = 0;\n this.element.getElementsByClassName('dplayer-danloading')[0].style.display = 'block';\n this.updateBar('played', 0, 'width');\n this.updateBar('loaded', 0, 'width');\n this.element.getElementsByClassName('dplayer-ptime')[0].innerHTML = '00:00';\n this.element.getElementsByClassName('dplayer-danmaku')[0].innerHTML = `
`;\n this.danTuel = {\n right: {},\n top: {},\n bottom: {}\n };\n this.itemDemo = this.element.getElementsByClassName('dplayer-danmaku-item')[0];\n this.option.danmaku = danmaku;\n this.readDanmaku();\n }\n }\n\n initVideo () {\n // Support HTTP Live Streaming\n let enablehls;\n if (this.option.video.type === 'auto') {\n enablehls = /m3u8(#|\\?|$)/i.exec(this.option.video.url);\n }\n else if (this.option.video.type === 'hls') {\n enablehls = true;\n }\n else {\n enablehls = false;\n }\n if (enablehls && Hls.isSupported()) {\n // this.element.getElementsByClassName('dplayer-time')[0].style.display = 'none';\n const hls = new Hls();\n hls.attachMedia(this.video.current);\n hls.on(Hls.Events.MEDIA_ATTACHED, () => {\n hls.loadSource(this.option.video.url);\n hls.on(Hls.Events.MANIFEST_PARSED, function (event, data) {\n this.notice(\"manifest loaded, found \" + data.levels.length + \" quality level\");\n });\n });\n }\n\n // Support FLV\n let enableflv;\n if (this.option.video.type === 'auto') {\n enableflv = /.flv(#|\\?|$)/i.exec(this.option.video.url);\n }\n else if (this.option.video.type === 'flv') {\n enableflv = true;\n }\n else {\n enableflv = false;\n }\n if (enableflv && flvjs.isSupported()) {\n const flvPlayer = flvjs.createPlayer({\n type: 'flv',\n url: this.option.video.url\n });\n flvPlayer.attachMediaElement(this.video.current);\n flvPlayer.load();\n }\n\n if (this.option.danmaku) {\n this.video.on('all', 'seeking', () => {\n for (let i = 0; i < this.dan.length; i++) {\n if (this.dan[i].time >= this.video.currentTime()) {\n this.danIndex = i;\n return;\n }\n this.danIndex = this.dan.length;\n }\n });\n }\n\n\n /**\n * video events\n */\n // show video time: the metadata has loaded or changed\n this.video.on('all', 'durationchange', (i, video) => {\n if (video.duration !== 1) { // compatibility: Android browsers will output 1 at first\n this.element.getElementsByClassName('dplayer-dtime')[0].innerHTML = utils.secondToTime(this.video.duration);\n }\n });\n\n // show video loaded bar: to inform interested parties of progress downloading the media\n this.video.on('current', 'progress', (i, video) => {\n const percentage = video.buffered.length ? video.buffered.end(video.buffered.length - 1) / video.duration : 0;\n this.updateBar('loaded', percentage, 'width');\n });\n\n // video download error: an error occurs\n this.video.on('all', 'error', () => {\n this.notice(this.tran('This video fails to load'), -1);\n this.trigger('pause');\n });\n\n // video can play: enough data is available that the media can be played\n this.video.on('current', 'canplay', () => {\n this.trigger('canplay');\n });\n\n // music end\n this.ended = false;\n this.video.on('all', 'ended', (i) => {\n if (i === this.video.videos.length - 1) {\n this.updateBar('played', 1, 'width');\n if (!this.loop) {\n this.ended = true;\n this.pause();\n this.trigger('ended');\n }\n else {\n this.video.switch(0);\n this.video.play();\n }\n this.danIndex = 0;\n }\n });\n\n this.video.on('current', 'play', () => {\n if (this.paused) {\n this.play();\n }\n });\n\n this.video.on('current', 'pause', () => {\n if (!this.paused) {\n this.pause();\n }\n });\n\n // control volume\n this.video.attr('volume', parseInt(this.element.getElementsByClassName('dplayer-volume-bar-inner')[0].style.width) / 100);\n }\n\n switchQuality (index) {\n if (this.qualityIndex === index || this.switchingQuality) {\n return;\n }\n else {\n this.qualityIndex = index;\n }\n this.switchingQuality = true;\n this.quality = this.option.video.quality[index];\n this.element.getElementsByClassName('dplayer-quality-icon')[0].innerHTML = this.quality.name;\n\n this.video.pause();\n const videoHTML = html.video(false, null, this.option.screenshot, 'auto', this.quality.url);\n const videoEle = new DOMParser().parseFromString(videoHTML, 'text/html').body.firstChild;\n const parent = this.element.getElementsByClassName('dplayer-video-wrap')[0];\n parent.prepend(videoEle);\n this.prevVideo = this.video;\n this.video = new Video([videoEle], this.prevVideo.duration);\n this.initVideo();\n this.video.seek(this.prevVideo.currentTime());\n this.notice(`${this.tran('Switching to')} ${this.quality.name} ${this.tran('quality')}`, -1);\n this.video.on('current', 'canplay', () => {\n if (this.prevVideo) {\n if (this.video.currentTime() !== this.prevVideo.currentTime()) {\n this.video.seek(this.prevVideo.currentTime());\n return;\n }\n parent.removeChild(this.prevVideo.current);\n this.video.current.classList.add('dplayer-video-current');\n this.video.play();\n this.prevVideo = null;\n this.notice(`${this.tran('Switched to')} ${this.quality.name} ${this.tran('quality')}`);\n this.switchingQuality = false;\n }\n });\n }\n\n timeTipsHandler (pbar, timeTips) {\n // http://stackoverflow.com/questions/1480133/how-can-i-get-an-objects-absolute-position-on-the-page-in-javascript\n const cumulativeOffset = (element) => {\n let top = 0, left = 0;\n do {\n top += element.offsetTop || 0;\n left += element.offsetLeft || 0;\n element = element.offsetParent;\n } while (element);\n\n return {\n top: top,\n left: left\n };\n };\n\n return (e) => {\n if (!this.video.duration) {\n return;\n }\n const { clientX } = e;\n const px = cumulativeOffset(pbar).left;\n const tx = clientX - px;\n timeTips.innerText = utils.secondToTime(this.video.duration * (tx / pbar.offsetWidth));\n timeTips.style.left = `${(tx - 20)}px`;\n switch (e.type) {\n case 'mouseenter':\n case 'mouseover':\n case 'mousemove':\n if (this.isTipsShow) {\n return;\n }\n timeTips.classList.remove('hidden');\n this.isTipsShow = true;\n break;\n case 'mouseleave':\n case 'mouseout':\n if (!this.isTipsShow) {\n return;\n }\n timeTips.classList.add('hidden');\n this.isTipsShow = false;\n break;\n }\n };\n }\n\n notice (text, time) {\n const noticeEle = this.element.getElementsByClassName('dplayer-notice')[0];\n noticeEle.innerHTML = text;\n noticeEle.style.opacity = 1;\n if (this.noticeTime) {\n clearTimeout(this.noticeTime);\n }\n if (time && time < 0) {\n return;\n }\n this.noticeTime = setTimeout(() => {\n noticeEle.style.opacity = 0;\n }, time || 2000);\n }\n}\n\nmodule.exports = DPlayer;\n\n\n\n// WEBPACK FOOTER //\n// ./src/DPlayer.js","module.exports = {\n\n /**\n * Parse second to 00:00 format\n *\n * @param {Number} second\n * @return {String} 00:00 format\n */\n secondToTime: (second) => {\n const add0 = (num) => num < 10 ? '0' + num : '' + num;\n const min = parseInt(second / 60);\n const sec = parseInt(second - min * 60);\n return add0(min) + ':' + add0(sec);\n },\n\n /**\n * control play progress\n */\n // get element's view position\n getElementViewLeft: (element) => {\n let actualLeft = element.offsetLeft;\n let current = element.offsetParent;\n const elementScrollLeft = document.body.scrollLeft + document.documentElement.scrollLeft;\n if (!document.fullscreenElement && !document.mozFullScreenElement && !document.webkitFullscreenElement) {\n while (current !== null) {\n actualLeft += current.offsetLeft;\n current = current.offsetParent;\n }\n }\n else {\n while (current !== null && current !== element) {\n actualLeft += current.offsetLeft;\n current = current.offsetParent;\n }\n }\n return actualLeft - elementScrollLeft;\n },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/utils.js","const defaultApiBackend = require('./api.js');\n\nmodule.exports = (option) => {\n const isMobile = /mobile/i.test(window.navigator.userAgent);\n // compatibility: some mobile browsers don't suppose autoplay\n if (isMobile) {\n option.autoplay = false;\n }\n\n // default options\n const defaultOption = {\n element: document.getElementsByClassName('dplayer')[0],\n autoplay: false,\n theme: '#b7daff',\n loop: false,\n lang: navigator.language.indexOf('zh') !== -1 ? 'zh' : 'en',\n screenshot: false,\n hotkey: true,\n preload: 'auto',\n apiBackend: defaultApiBackend,\n contextmenu: [\n {\n text: '关于作者',\n link: 'http://diygod.me'\n },\n {\n text: '播放器意见反馈',\n link: 'https://github.com/DIYgod/DPlayer/issues'\n },\n {\n text: '关于 DPlayer 播放器',\n link: 'https://github.com/DIYgod/DPlayer'\n }\n ]\n };\n for (const defaultKey in defaultOption) {\n if (defaultOption.hasOwnProperty(defaultKey) && !option.hasOwnProperty(defaultKey)) {\n option[defaultKey] = defaultOption[defaultKey];\n }\n }\n if (Object.prototype.toString.call(option.video.url) !== '[object Array]') {\n option.video.url = [option.video.url];\n }\n if (option.video && !option.video.hasOwnProperty('type')) {\n option.video.type = 'auto';\n }\n if (option.danmaku && !option.danmaku.hasOwnProperty('user')) {\n option.danmaku.user = 'DIYgod';\n }\n\n if (option.video.quality) {\n option.video.url = [option.video.quality[option.video.defaultQuality].url];\n }\n\n return option;\n};\n\n\n// WEBPACK FOOTER //\n// ./src/option.js","/*\n * xhr.status ---> fail\n * response.code === 1 ---> success\n * response.code !== 1 ---> error\n * */\n\nconst SendXMLHttpRequest = (url, data, success, error, fail) => {\n const xhr = new XMLHttpRequest();\n\n xhr.onreadystatechange = () => {\n if (xhr.readyState === 4) {\n if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) {\n const response = JSON.parse(xhr.responseText);\n\n if (response.code !== 1) {\n return error(xhr, response);\n }\n\n return success(xhr, response);\n }\n\n fail(xhr);\n }\n };\n\n xhr.open(data !== null ? 'POST' : 'GET', url, true);\n xhr.send(data !== null ? JSON.stringify(data) : null);\n};\n\nmodule.exports = {\n send: (endpoint, danmakuData) => {\n SendXMLHttpRequest(endpoint, danmakuData, (xhr, response) => {\n console.log('Post danmaku: ', response);\n }, (xhr, response) => {\n alert(response.msg);\n }, (xhr) => {\n console.log('Request was unsuccessful: ' + xhr.status);\n });\n },\n\n read: (endpoint, cbk) => {\n SendXMLHttpRequest(endpoint, null, (xhr, response) => {\n cbk(null, response.danmaku);\n }, (xhr, response) => {\n cbk({ status: xhr.status, response });\n }, (xhr) => {\n cbk({ status: xhr.status, response: null });\n });\n }\n};\n\n\n// WEBPACK FOOTER //\n// ./src/api.js","const tranZH = {\n 'Danmaku is loading': '弹幕加载中',\n 'Top': '顶部',\n 'Bottom': '底部',\n 'Rolling': '滚动',\n 'Input danmaku, hit Enter': '输入弹幕,回车发送',\n 'About author': '关于作者',\n 'DPlayer feedback': '播放器意见反馈',\n 'About DPlayer': '关于 DPlayer 播放器',\n 'Loop': '洗脑循环',\n 'Speed': '速度',\n 'Opacity for danmaku': '弹幕透明度',\n 'Normal': '正常',\n 'Please input danmaku content!': '要输入弹幕内容啊喂!',\n 'Set danmaku color': '设置弹幕颜色',\n 'Set danmaku type': '设置弹幕类型',\n 'Danmaku': '弹幕',\n 'This video fails to load': '视频加载失败',\n 'Switching to': '正在切换至',\n 'Switched to': '已经切换至',\n 'quality': '画质',\n};\n\nmodule.exports = function (lang) {\n this.lang = lang;\n this.tran = (text) => {\n if (this.lang === 'en') {\n return text;\n }\n else if (this.lang === 'zh') {\n return tranZH[text];\n }\n };\n};\n\n\n// WEBPACK FOOTER //\n// ./src/i18n.js","const svg = require('./svg.js');\n\nconst html = {\n main: (option, index, tran) => {\n let videos = ``;\n for (let i = 0; i < option.video.url.length; i++) {\n videos += html.video(i === 0, option.video.pic, option.screenshot, option.video.url.length ? 'metadata' : option.preload, option.video.url[i]);\n }\n return `\n
\n
\n ${videos}\n ${option.logo ? `\n
\n ` : ``}\n
\n
\n
\n
\n \n ${option.danmaku ? `${tran('Danmaku is loading')}` : ``}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n
\n
\n
\n 0:00 / 0:00\n
\n
\n ${option.video.quality ? `\n
\n \n
\n ${html.qualityList(option.video.quality)}\n
\n
\n ` : ``}\n ${option.screenshot ? `\n \n ${svg('camera')}\n \n ` : ``}\n
\n \n
\n \n
\n
\n
${tran('Set danmaku color')}
\n \n \n \n \n \n \n
\n
\n
${tran('Set danmaku type')}
\n \n \n \n
\n
\n \n \n
\n
\n
\n \n
\n
\n
\n \n \n
\n
\n
\n
00:00
\n
\n
\n
\n \n
\n
\n
\n
\n ${html.contextmenuList(option.contextmenu)}\n
`;\n },\n\n contextmenuList: (contextmenu) => {\n let result = '
';\n for (let i = 0; i < contextmenu.length; i++) {\n result += ``;\n }\n result += '
';\n\n return result;\n },\n\n qualityList: (quality) => {\n let result = '
';\n for (let i = 0; i < quality.length; i++) {\n result += `
${quality[i].name}
`;\n }\n result += '
';\n\n return result;\n },\n\n video: (current, pic, screenshot, preload, url) => ``,\n\n setting: (tran) => ({\n 'original': `\n
\n ${tran('Speed')}\n
\n ${svg('right')}\n
\n
\n
\n ${tran('Loop')}\n
\n \n \n
\n
\n
\n ${tran('Danmaku')}\n
\n \n \n
\n
\n
\n ${tran('Opacity for danmaku')}\n
\n
\n
\n \n
\n
\n
\n
`,\n 'speed': `\n
\n 0.5\n
\n
\n 0.75\n
\n
\n ${tran('Normal')}\n
\n
\n 1.25\n
\n
\n 1.5\n
\n
\n 2\n
`\n }) \n};\n\nmodule.exports = html;\n\n\n// WEBPACK FOOTER //\n// ./src/html.js","class Video {\n constructor (videos, duration) {\n this.videos = videos;\n this.multi = this.videos.length > 1;\n this.index = 0;\n this.current = this.videos[this.index];\n\n this.duration = duration || 0;\n this.durationArr = [];\n this.eventAll = [];\n this.eventCurrent = [];\n \n this.on('all', 'durationchange', (i, video) => {\n if (video.duration !== 1) { // some Android browsers will output 1 at first\n this.durationArr[i] = video.duration;\n if (!duration) {\n this.duration = this.durationArr.reduce((sum, cur) => sum + cur); \n }\n }\n });\n this.on('current', 'end', () => {\n this.switch(this.index + 1);\n });\n }\n\n switch (index, time) {\n if (this.index !== index) {\n this.videos[index].classList.add('dplayer-video-current');\n if (!this.current.paused) {\n this.videos[index].play();\n }\n this.current.classList.remove('dplayer-video-current');\n this.current.pause();\n\n this.index = index;\n this.current = this.videos[this.index];\n this.videos[index].currentTime = time ? time : 0;\n }\n else {\n this.videos[index].currentTime = time ? time : 0;\n }\n }\n\n // bind event \n on (type, event, callback) {\n if (typeof callback === 'function') {\n if (type === 'all') {\n if (!this.eventAll[event]) {\n this.eventAll[event] = [];\n }\n this.eventAll[event].push(callback);\n }\n else {\n if (!this.eventCurrent[event]) {\n this.eventCurrent[event] = [];\n }\n this.eventCurrent[event].push(callback);\n }\n\n if (['seeking'].indexOf(event) === -1) {\n for (let i = 0; i < this.videos.length; i++) {\n this.videos[i].addEventListener(event, () => {\n if (type === 'all' || this.videos[i] === this.current) {\n callback(i, this.videos[i]);\n }\n });\n }\n }\n }\n }\n\n // trigger event\n trigger (type, event) {\n const events = type === 'all' ? this.eventAll : this.eventCurrent;\n for (let i = 0; i < events[event].length; i++) {\n events[event][i]();\n }\n }\n\n currentTime () {\n if (this.durationArr.slice(0, this.index).length) {\n return this.durationArr.slice(0, this.index).reduce((sum, cur) => sum + cur) + this.current.currentTime;\n }\n else {\n return this.current.currentTime;\n }\n }\n\n seek (time) {\n time = Math.max(time, 0);\n time = Math.min(time, this.duration);\n\n let i = 0;\n let tmptime = 0;\n while (tmptime <= time) {\n tmptime += this.durationArr[i];\n i++;\n }\n\n let currentTime;\n if (this.durationArr.slice(0, this.index).length) {\n currentTime = time - this.durationArr.slice(0, i - 1).reduce((sum, cur) => sum + cur);\n }\n else {\n currentTime = time;\n }\n \n this.switch(i - 1, currentTime);\n\n this.trigger('all', 'seeking');\n }\n\n attr (option, value) {\n if (value !== undefined) {\n for (let i = 0; i < this.videos.length; i++) {\n this.videos[i][option] = value;\n }\n }\n return this.current[option];\n }\n\n play () {\n this.current.play();\n }\n\n pause () {\n this.current.pause();\n }\n\n toggle () {\n this.current.paused ? this.play() : this.pause();\n }\n}\n\nmodule.exports = Video;\n\n\n// WEBPACK FOOTER //\n// ./src/video.js"],"sourceRoot":""} \ No newline at end of file diff --git a/package.json b/package.json index 3010b1d..d901750 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dplayer", - "version": "1.3.2", + "version": "1.3.3", "description": "Wow, such a lovely HTML5 danmaku video player", "main": "dist/DPlayer.min.js", "style": "dist/DPlayer.min.css", @@ -34,7 +34,7 @@ "babel-loader": "^7.0.0", "babel-preset-es2015": "^6.24.1", "css-loader": "^0.28.0", - "eslint": "^3.19.0", + "eslint": "^4.1.0", "eslint-loader": "^1.7.1", "exports-loader": "^0.6.4", "extract-text-webpack-plugin": "^2.1.0", @@ -45,7 +45,7 @@ "strip-loader": "^0.1.2", "style-loader": "^0.18.1", "url-loader": "^0.5.7", - "webpack": "^2.6.1", + "webpack": "^3.0.0", "webpack-dev-server": "^2.4.5" } } diff --git a/src/DPlayer.js b/src/DPlayer.js index e7e0e48..1ef0fd0 100644 --- a/src/DPlayer.js +++ b/src/DPlayer.js @@ -1,4 +1,4 @@ -console.log('\n %c DPlayer 1.3.2 %c http://dplayer.js.org \n\n', 'color: #fadfa3; background: #030307; padding:5px 0;', 'background: #fadfa3; padding:5px 0;'); +console.log('\n %c DPlayer 1.3.3 %c http://dplayer.js.org \n\n', 'color: #fadfa3; background: #030307; padding:5px 0;', 'background: #fadfa3; padding:5px 0;'); require('./DPlayer.scss'); const utils = require('./utils.js'); @@ -124,9 +124,10 @@ class DPlayer { let lastPlayPos = 0; let currentPlayPos = 0; let bufferingDetected = false; - let danmakuTime; - this.setTime = () => { - this.playedTime = setInterval(() => { + this.danmakuTime = false; + this.playedTime = false; + this.animationFrame = () => { + if (this.playedTime) { // whether the video is buffering currentPlayPos = this.video.currentTime(); if (!bufferingDetected @@ -146,23 +147,36 @@ class DPlayer { this.updateBar('played', this.video.currentTime() / this.video.duration, 'width'); this.element.getElementsByClassName('dplayer-ptime')[0].innerHTML = utils.secondToTime(this.video.currentTime()); this.trigger('playing'); - }, 100); - if (this.option.danmaku && showdan) { - danmakuTime = setInterval(() => { - if (this.dan) { - let item = this.dan[this.danIndex]; - while (item && this.video.currentTime() > parseFloat(item.time)) { - this.pushDanmaku(item.text, item.color, item.type); - item = this.dan[++this.danIndex]; - } - } - }, 100); + } + if (this.danmakuTime && this.option.danmaku && showdan && this.dan) { + let item = this.dan[this.danIndex]; + const danmakus = []; + while (item && this.video.currentTime() > parseFloat(item.time)) { + danmakus.push(item); + item = this.dan[++this.danIndex]; + } + this.pushDanmaku(danmakus); + } + requestAnimationFrame(this.animationFrame); + }; + requestAnimationFrame(this.animationFrame); + + this.setTime = (type) => { + if (!type) { + this.danmakuTime = true; + this.playedTime = true; + } + else { + this[`${type}Time`] = true; } }; - this.clearTime = () => { - clearInterval(this.playedTime); - if (this.option.danmaku) { - clearInterval(danmakuTime); + this.clearTime = (type) => { + if (!type) { + this.danmakuTime = false; + this.playedTime = false; + } + else { + this[`${type}Time`] = false; } }; @@ -361,19 +375,15 @@ class DPlayer { } this.danIndex = this.dan.length; } - danmakuTime = setInterval(() => { - let item = this.dan[this.danIndex]; - while (item && this.video.currentTime() >= parseFloat(item.time)) { - this.pushDanmaku(item.text, item.color, item.type); - item = this.dan[++this.danIndex]; - } - }, 0); + if (!this.paused) { + this.setTime('danmaku'); + } } } else { showdan = false; if (this.option.danmaku) { - clearInterval(danmakuTime); + this.clearTime('danmaku'); danContainer.innerHTML = `
`; this.danTunnel = { right: {}, @@ -521,7 +531,12 @@ class DPlayer { closeComment(); this.dan.splice(this.danIndex, 0, danmakuData); this.danIndex++; - const item = this.pushDanmaku(htmlEncode(danmakuData.text), danmakuData.color, danmakuData.type); + const danmaku = { + text: htmlEncode(danmakuData.text), + color: danmakuData.color, + type: danmakuData.type + }; + const item = this.pushDanmaku(danmaku); item.style.border = `2px solid ${this.option.theme}`; }; @@ -795,9 +810,6 @@ class DPlayer { this.playButton.innerHTML = svg('pause'); this.video.play(); - if (this.playedTime) { - this.clearTime(); - } this.setTime(); this.element.classList.add('dplayer-playing'); this.trigger('play'); @@ -921,18 +933,23 @@ class DPlayer { /** * Push a danmaku into DPlayer * - * @param {String} text - danmaku content - * @param {String} color - danmaku color, default: `#fff` - * @param {String} type - danmaku type, `right` `top` `bottom`, default: `right` + * @param {Object Array} danmaku - {text, color, type} + * text - danmaku content + * color - danmaku color, default: `#fff` + * type - danmaku type, `right` `top` `bottom`, default: `right` */ - pushDanmaku (text, color, type) { + pushDanmaku (danmaku) { const danContainer = this.element.getElementsByClassName('dplayer-danmaku')[0]; const itemHeight = this.arrow ? 24 : 30; const danWidth = danContainer.offsetWidth; const danHeight = danContainer.offsetHeight; const itemY = parseInt(danHeight / itemHeight); - const danItemRight = (ele) => danContainer.getBoundingClientRect().right - ele.getBoundingClientRect().right; + const danItemRight = (ele) => { + const eleWidth = ele.offsetWidth || parseInt(ele.style.width); + const eleRight = ele.getBoundingClientRect().right || danContainer.getBoundingClientRect().right + eleWidth; + return danContainer.getBoundingClientRect().right - eleRight; + }; const danSpeed = (width) => (danWidth + width) / 5; @@ -944,7 +961,7 @@ class DPlayer { if (item && item.length) { for (let j = 0; j < item.length; j++) { const danRight = danItemRight(item[j]) - 10; - if (danRight <= danWidth - tmp * danSpeed(item[j].offsetWidth) || danRight <= 0) { + if (danRight <= danWidth - tmp * danSpeed(parseInt(item[j].style.width)) || danRight <= 0) { break; } if (j === item.length - 1) { @@ -966,50 +983,60 @@ class DPlayer { } }; - if (!type) { - type = 'right'; - } - if (!color) { - color = '#fff'; - } - const item = document.createElement(`div`); - item.classList.add(`dplayer-danmaku-item`); - item.classList.add(`dplayer-danmaku-${type}`); - item.innerHTML = text; - item.style.opacity = this.danOpacity; - item.style.color = color; - item.addEventListener('animationend', () => { - danContainer.removeChild(item); - }); - - // measure - this.itemDemo.innerHTML = text; - const itemWidth = this.itemDemo.offsetWidth; - - // adjust - switch (type) { - case 'right': - item.style.top = itemHeight * getTunnel(item, type, itemWidth) + 'px'; - item.style.width = itemWidth + 1 + 'px'; - item.style.transform = `translateX(-${danWidth}px)`; - break; - case 'top': - item.style.top = itemHeight * getTunnel(item, type) + 'px'; - break; - case 'bottom': - item.style.bottom = itemHeight * getTunnel(item, type) + 'px'; - break; - default: - console.error(`Can't handled danmaku type: ${type}`); + if (Object.prototype.toString.call(danmaku) !== '[object Array]') { + danmaku = [danmaku]; } - // insert - danContainer.appendChild(item); + const docFragment = document.createDocumentFragment(); - // move - item.classList.add(`dplayer-danmaku-move`); + for (let i = 0; i < danmaku.length; i++) { + if (!danmaku[i].type) { + danmaku[i].type = 'right'; + } + if (!danmaku[i].color) { + danmaku[i].color = '#fff'; + } + const item = document.createElement(`div`); + item.classList.add(`dplayer-danmaku-item`); + item.classList.add(`dplayer-danmaku-${danmaku[i].type}`); + item.innerHTML = danmaku[i].text; + item.style.opacity = this.danOpacity; + item.style.color = danmaku[i].color; + item.addEventListener('animationend', () => { + danContainer.removeChild(item); + }); - return item; + // measure + this.itemDemo.innerHTML = danmaku[i].text; + const itemWidth = this.itemDemo.offsetWidth; + + // adjust + switch (danmaku[i].type) { + case 'right': + item.style.width = itemWidth + 1 + 'px'; + item.style.top = itemHeight * getTunnel(item, danmaku[i].type, itemWidth) + 'px'; + item.style.transform = `translateX(-${danWidth}px)`; + break; + case 'top': + item.style.top = itemHeight * getTunnel(item, danmaku[i].type) + 'px'; + break; + case 'bottom': + item.style.bottom = itemHeight * getTunnel(item, danmaku[i].type) + 'px'; + break; + default: + console.error(`Can't handled danmaku type: ${danmaku[i].type}`); + } + + // move + item.classList.add(`dplayer-danmaku-move`); + + // insert + docFragment.appendChild(item); + } + + danContainer.appendChild(docFragment); + + return docFragment; } /** @@ -1139,6 +1166,7 @@ class DPlayer { this.video.switch(0); this.video.play(); } + this.danIndex = 0; } }); diff --git a/yarn.lock b/yarn.lock index 3a0818c..fd0418f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -37,10 +37,14 @@ acorn@^5.0.0, acorn@^5.0.1: version "5.0.3" resolved "http://registry.npm.taobao.org/acorn/download/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d" -ajv-keywords@^1.0.0, ajv-keywords@^1.1.1: +ajv-keywords@^1.0.0: version "1.5.1" resolved "http://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" +ajv-keywords@^2.0.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-2.1.0.tgz#a296e17f7bfae7c1ce4f7e0de53d29cb32162df0" + ajv@^4.11.2, ajv@^4.7.0, ajv@^4.9.1: version "4.11.8" resolved "http://registry.npm.taobao.org/ajv/download/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" @@ -48,11 +52,13 @@ ajv@^4.11.2, ajv@^4.7.0, ajv@^4.9.1: co "^4.6.0" json-stable-stringify "^1.0.1" -ajv@^5.0.0: - version "5.1.3" - resolved "http://registry.npm.taobao.org/ajv/download/ajv-5.1.3.tgz#423d1c302c61e617081b30ca05f595ec51408e33" +ajv@^5.0.0, ajv@^5.1.5: + version "5.2.0" + resolved "http://registry.npm.taobao.org/ajv/download/ajv-5.2.0.tgz#c1735024c5da2ef75cc190713073d44f098bf486" dependencies: co "^4.6.0" + fast-deep-equal "^0.1.0" + json-schema-traverse "^0.3.0" json-stable-stringify "^1.0.1" align-text@^0.1.1, align-text@^0.1.3: @@ -71,9 +77,9 @@ amdefine@>=0.0.4: version "1.0.1" resolved "http://registry.npm.taobao.org/amdefine/download/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" -ansi-escapes@^1.1.0: - version "1.4.0" - resolved "http://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" +ansi-escapes@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" ansi-html@0.0.7: version "0.0.7" @@ -225,7 +231,7 @@ aws4@^1.2.1: version "1.6.0" resolved "http://registry.npm.taobao.org/aws4/download/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" -babel-code-frame@^6.11.0, babel-code-frame@^6.16.0, babel-code-frame@^6.22.0: +babel-code-frame@^6.11.0, babel-code-frame@^6.22.0: version "6.22.0" resolved "http://registry.npm.taobao.org/babel-code-frame/download/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" dependencies: @@ -883,11 +889,11 @@ clap@^1.0.9: dependencies: chalk "^1.1.3" -cli-cursor@^1.0.1: - version "1.0.2" - resolved "http://registry.npm.taobao.org/cli-cursor/download/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" +cli-cursor@^2.1.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/cli-cursor/download/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" dependencies: - restore-cursor "^1.0.1" + restore-cursor "^2.0.0" cli-width@^2.0.0: version "2.1.0" @@ -1004,7 +1010,7 @@ concat-map@0.0.1: version "0.0.1" resolved "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@^1.5.2: +concat-stream@^1.6.0: version "1.6.0" resolved "http://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" dependencies: @@ -1458,47 +1464,52 @@ eslint-loader@^1.7.1: object-hash "^1.1.4" rimraf "^2.6.1" -eslint@^3.19.0: - version "3.19.0" - resolved "http://registry.npm.taobao.org/eslint/download/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc" +eslint-scope@^3.7.1: + version "3.7.1" + resolved "http://registry.npm.taobao.org/eslint-scope/download/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" dependencies: - babel-code-frame "^6.16.0" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint@^4.1.0: + version "4.1.0" + resolved "http://registry.npm.taobao.org/eslint/download/eslint-4.1.0.tgz#bbb55a28220ee08b69da9554d45a6b2ebfd7d913" + dependencies: + babel-code-frame "^6.22.0" chalk "^1.1.3" - concat-stream "^1.5.2" - debug "^2.1.1" + concat-stream "^1.6.0" + debug "^2.6.8" doctrine "^2.0.0" - escope "^3.6.0" - espree "^3.4.0" + eslint-scope "^3.7.1" + espree "^3.4.3" esquery "^1.0.0" estraverse "^4.2.0" esutils "^2.0.2" file-entry-cache "^2.0.0" - glob "^7.0.3" - globals "^9.14.0" - ignore "^3.2.0" + glob "^7.1.2" + globals "^9.17.0" + ignore "^3.3.3" imurmurhash "^0.1.4" - inquirer "^0.12.0" - is-my-json-valid "^2.10.0" + inquirer "^3.0.6" + is-my-json-valid "^2.16.0" is-resolvable "^1.0.0" - js-yaml "^3.5.1" - json-stable-stringify "^1.0.0" + js-yaml "^3.8.4" + json-stable-stringify "^1.0.1" levn "^0.3.0" - lodash "^4.0.0" - mkdirp "^0.5.0" + lodash "^4.17.4" + minimatch "^3.0.2" + mkdirp "^0.5.1" natural-compare "^1.4.0" optionator "^0.8.2" - path-is-inside "^1.0.1" - pluralize "^1.2.1" - progress "^1.1.8" - require-uncached "^1.0.2" - shelljs "^0.7.5" - strip-bom "^3.0.0" + path-is-inside "^1.0.2" + pluralize "^4.0.0" + progress "^2.0.0" + require-uncached "^1.0.3" strip-json-comments "~2.0.1" - table "^3.7.8" + table "^4.0.1" text-table "~0.2.0" - user-home "^2.0.0" -espree@^3.4.0: +espree@^3.4.3: version "3.4.3" resolved "http://registry.npm.taobao.org/espree/download/espree-3.4.3.tgz#2910b5ccd49ce893c2ffffaab4fd8b3a31b82374" dependencies: @@ -1509,6 +1520,10 @@ esprima@^2.6.0: version "2.7.3" resolved "http://registry.npm.taobao.org/esprima/download/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" +esprima@^3.1.1: + version "3.1.3" + resolved "http://registry.npm.taobao.org/esprima/download/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + esquery@^1.0.0: version "1.0.0" resolved "http://registry.npm.taobao.org/esquery/download/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" @@ -1565,10 +1580,6 @@ evp_bytestokey@^1.0.0: dependencies: create-hash "^1.1.1" -exit-hook@^1.0.0: - version "1.1.1" - resolved "http://registry.npm.taobao.org/exit-hook/download/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" - expand-brackets@^0.1.4: version "0.1.5" resolved "http://registry.npm.taobao.org/expand-brackets/download/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" @@ -1625,6 +1636,14 @@ extend@~3.0.0: version "3.0.1" resolved "http://registry.npm.taobao.org/extend/download/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" +external-editor@^2.0.4: + version "2.0.4" + resolved "http://registry.npm.taobao.org/external-editor/download/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972" + dependencies: + iconv-lite "^0.4.17" + jschardet "^1.4.2" + tmp "^0.0.31" + extglob@^0.3.1: version "0.3.2" resolved "http://registry.npm.taobao.org/extglob/download/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" @@ -1644,6 +1663,10 @@ extsprintf@1.0.2: version "1.0.2" resolved "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" +fast-deep-equal@^0.1.0: + version "0.1.0" + resolved "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-0.1.0.tgz#5c6f4599aba6b333ee3342e2ed978672f1001f8d" + fast-levenshtein@~2.0.4: version "2.0.6" resolved "http://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" @@ -1664,12 +1687,11 @@ faye-websocket@~0.11.0: dependencies: websocket-driver ">=0.5.1" -figures@^1.3.5: - version "1.7.0" - resolved "http://registry.npm.taobao.org/figures/download/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" +figures@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/figures/download/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" dependencies: escape-string-regexp "^1.0.5" - object-assign "^4.1.0" file-entry-cache@^2.0.0: version "2.0.0" @@ -1860,7 +1882,7 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@~7.1.1: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@~7.1.1: version "7.1.2" resolved "http://registry.npm.taobao.org/glob/download/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: @@ -1871,7 +1893,7 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@~7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^9.0.0, globals@^9.14.0: +globals@^9.0.0, globals@^9.17.0: version "9.17.0" resolved "http://registry.npm.taobao.org/globals/download/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" @@ -2043,6 +2065,10 @@ https-browserify@0.0.1: version "0.0.1" resolved "http://registry.npm.taobao.org/https-browserify/download/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" +iconv-lite@^0.4.17: + version "0.4.18" + resolved "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" + icss-replace-symbols@^1.1.0: version "1.1.0" resolved "http://registry.npm.taobao.org/icss-replace-symbols/download/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" @@ -2051,7 +2077,7 @@ ieee754@^1.1.4: version "1.1.8" resolved "http://registry.npm.taobao.org/ieee754/download/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" -ignore@^3.2.0: +ignore@^3.3.3: version "3.3.3" resolved "http://registry.npm.taobao.org/ignore/download/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d" @@ -2096,21 +2122,22 @@ ini@~1.3.0: version "1.3.4" resolved "http://registry.npm.taobao.org/ini/download/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" -inquirer@^0.12.0: - version "0.12.0" - resolved "http://registry.npm.taobao.org/inquirer/download/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" +inquirer@^3.0.6: + version "3.1.1" + resolved "http://registry.npm.taobao.org/inquirer/download/inquirer-3.1.1.tgz#87621c4fba4072f48a8dd71c9f9df6f100b2d534" dependencies: - ansi-escapes "^1.1.0" - ansi-regex "^2.0.0" + ansi-escapes "^2.0.0" chalk "^1.0.0" - cli-cursor "^1.0.1" + cli-cursor "^2.1.0" cli-width "^2.0.0" - figures "^1.3.5" + external-editor "^2.0.4" + figures "^2.0.0" lodash "^4.3.0" - readline2 "^1.0.1" - run-async "^0.1.0" - rx-lite "^3.1.2" - string-width "^1.0.1" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.0.0" strip-ansi "^3.0.0" through "^2.3.6" @@ -2210,7 +2237,7 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-my-json-valid@^2.10.0: +is-my-json-valid@^2.16.0: version "2.16.0" resolved "http://registry.npm.taobao.org/is-my-json-valid/download/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" dependencies: @@ -2259,6 +2286,10 @@ is-primitive@^2.0.0: version "2.0.0" resolved "http://registry.npm.taobao.org/is-primitive/download/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" +is-promise@^2.1.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/is-promise/download/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + is-property@^1.0.0: version "1.0.2" resolved "http://registry.npm.taobao.org/is-property/download/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" @@ -2319,17 +2350,28 @@ js-tokens@^3.0.0: version "3.0.1" resolved "http://registry.npm.taobao.org/js-tokens/download/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" -js-yaml@^3.4.3, js-yaml@^3.5.1, js-yaml@~3.7.0: +js-yaml@^3.4.3, js-yaml@~3.7.0: version "3.7.0" resolved "http://registry.npm.taobao.org/js-yaml/download/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" dependencies: argparse "^1.0.7" esprima "^2.6.0" +js-yaml@^3.8.4: + version "3.8.4" + resolved "http://registry.npm.taobao.org/js-yaml/download/js-yaml-3.8.4.tgz#520b4564f86573ba96662af85a8cafa7b4b5a6f6" + dependencies: + argparse "^1.0.7" + esprima "^3.1.1" + jsbn@~0.1.0: version "0.1.1" resolved "http://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" +jschardet@^1.4.2: + version "1.4.2" + resolved "http://registry.npm.taobao.org/jschardet/download/jschardet-1.4.2.tgz#2aa107f142af4121d145659d44f50830961e699a" + jsesc@^1.3.0: version "1.3.0" resolved "http://registry.npm.taobao.org/jsesc/download/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" @@ -2342,11 +2384,15 @@ json-loader@^0.5.4: version "0.5.4" resolved "http://registry.npm.taobao.org/json-loader/download/json-loader-0.5.4.tgz#8baa1365a632f58a3c46d20175fc6002c96e37de" +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + json-schema@0.2.3: version "0.2.3" resolved "http://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" -json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: +json-stable-stringify@^1.0.1: version "1.0.1" resolved "http://registry.npm.taobao.org/json-stable-stringify/download/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" dependencies: @@ -2435,7 +2481,7 @@ loader-runner@^2.3.0: version "2.3.0" resolved "http://registry.npm.taobao.org/loader-runner/download/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" -loader-utils@^0.2.16, loader-utils@^0.2.6: +loader-utils@^0.2.6: version "0.2.17" resolved "http://registry.npm.taobao.org/loader-utils/download/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" dependencies: @@ -2444,7 +2490,7 @@ loader-utils@^0.2.16, loader-utils@^0.2.6: json5 "^0.5.0" object-assign "^4.0.1" -loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.x: +loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.x: version "1.1.0" resolved "http://registry.npm.taobao.org/loader-utils/download/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" dependencies: @@ -2480,7 +2526,7 @@ lodash.uniq@^4.5.0: version "4.5.0" resolved "http://registry.npm.taobao.org/lodash.uniq/download/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" -lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.2.0, lodash@^4.3.0: +lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0: version "4.17.4" resolved "http://registry.npm.taobao.org/lodash/download/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -2601,6 +2647,10 @@ mime@1.3.x, mime@^1.3.4: version "1.3.6" resolved "http://registry.npm.taobao.org/mime/download/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0" +mimic-fn@^1.0.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + minimalistic-assert@^1.0.0: version "1.0.0" resolved "http://registry.npm.taobao.org/minimalistic-assert/download/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" @@ -2644,9 +2694,9 @@ ms@2.0.0: version "2.0.0" resolved "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" -mute-stream@0.0.5: - version "0.0.5" - resolved "http://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" +mute-stream@0.0.7: + version "0.0.7" + resolved "http://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" nan@^2.3.0, nan@^2.3.2: version "2.6.2" @@ -2840,9 +2890,11 @@ once@^1.3.0, once@^1.3.3: dependencies: wrappy "1" -onetime@^1.0.0: - version "1.1.0" - resolved "http://registry.npm.taobao.org/onetime/download/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" +onetime@^2.0.0: + version "2.0.1" + resolved "http://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" opn@4.0.2: version "4.0.2" @@ -2882,7 +2934,7 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: version "1.0.2" resolved "http://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -2940,14 +2992,10 @@ path-is-absolute@^1.0.0: version "1.0.1" resolved "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" -path-is-inside@^1.0.1: +path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" resolved "http://registry.npm.taobao.org/path-is-inside/download/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" -path-parse@^1.0.5: - version "1.0.5" - resolved "http://registry.npm.taobao.org/path-parse/download/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" - path-to-regexp@0.1.7: version "0.1.7" resolved "http://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -2994,9 +3042,9 @@ pkg-dir@^1.0.0: dependencies: find-up "^1.0.0" -pluralize@^1.2.1: - version "1.2.1" - resolved "http://registry.npm.taobao.org/pluralize/download/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" +pluralize@^4.0.0: + version "4.0.0" + resolved "http://registry.npm.taobao.org/pluralize/download/pluralize-4.0.0.tgz#59b708c1c0190a2f692f1c7618c446b052fd1762" portfinder@^1.0.9: version "1.0.13" @@ -3308,9 +3356,9 @@ process@^0.11.0: version "0.11.10" resolved "http://registry.npm.taobao.org/process/download/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" -progress@^1.1.8: - version "1.1.8" - resolved "http://registry.npm.taobao.org/progress/download/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" +progress@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/progress/download/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" proxy-addr@~1.1.4: version "1.1.4" @@ -3436,20 +3484,6 @@ readdirp@^2.0.0: readable-stream "^2.0.2" set-immediate-shim "^1.0.1" -readline2@^1.0.1: - version "1.0.1" - resolved "http://registry.npm.taobao.org/readline2/download/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - mute-stream "0.0.5" - -rechoir@^0.6.2: - version "0.6.2" - resolved "http://registry.npm.taobao.org/rechoir/download/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - dependencies: - resolve "^1.1.6" - redent@^1.0.0: version "1.0.0" resolved "http://registry.npm.taobao.org/redent/download/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" @@ -3577,7 +3611,7 @@ require-main-filename@^1.0.1: version "1.0.1" resolved "http://registry.npm.taobao.org/require-main-filename/download/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" -require-uncached@^1.0.2: +require-uncached@^1.0.3: version "1.0.3" resolved "http://registry.npm.taobao.org/require-uncached/download/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" dependencies: @@ -3592,18 +3626,12 @@ resolve-from@^1.0.0: version "1.0.1" resolved "http://registry.npm.taobao.org/resolve-from/download/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" -resolve@^1.1.6: - version "1.3.3" - resolved "http://registry.npm.taobao.org/resolve/download/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" +restore-cursor@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/restore-cursor/download/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" dependencies: - path-parse "^1.0.5" - -restore-cursor@^1.0.1: - version "1.0.1" - resolved "http://registry.npm.taobao.org/restore-cursor/download/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" - dependencies: - exit-hook "^1.0.0" - onetime "^1.0.0" + onetime "^2.0.0" + signal-exit "^3.0.2" right-align@^0.1.1: version "0.1.3" @@ -3624,15 +3652,21 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^2.0.0" inherits "^2.0.1" -run-async@^0.1.0: - version "0.1.0" - resolved "http://registry.npm.taobao.org/run-async/download/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" +run-async@^2.2.0: + version "2.3.0" + resolved "http://registry.npm.taobao.org/run-async/download/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" dependencies: - once "^1.3.0" + is-promise "^2.1.0" -rx-lite@^3.1.2: - version "3.1.2" - resolved "http://registry.npm.taobao.org/rx-lite/download/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "http://registry.npm.taobao.org/rx-lite-aggregates/download/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "http://registry.npm.taobao.org/rx-lite/download/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" safe-buffer@^5.0.1: version "5.0.1" @@ -3756,15 +3790,7 @@ shallow-clone@^0.1.2: lazy-cache "^0.2.3" mixin-object "^2.0.1" -shelljs@^0.7.5: - version "0.7.7" - resolved "http://registry.npm.taobao.org/shelljs/download/shelljs-0.7.7.tgz#b2f5c77ef97148f4b4f6e22682e10bba8667cff1" - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -signal-exit@^3.0.0: +signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "http://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -3810,9 +3836,9 @@ source-list-map@^0.1.7, source-list-map@~0.1.7: version "0.1.8" resolved "http://registry.npm.taobao.org/source-list-map/download/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" -source-list-map@^1.1.1: - version "1.1.2" - resolved "http://registry.npm.taobao.org/source-list-map/download/source-list-map-1.1.2.tgz#9889019d1024cce55cdc069498337ef6186a11a1" +source-list-map@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/source-list-map/download/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" source-map-support@^0.4.2: version "0.4.15" @@ -3958,10 +3984,6 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" -strip-bom@^3.0.0: - version "3.0.0" - resolved "http://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - strip-indent@^1.0.1: version "1.0.1" resolved "http://registry.npm.taobao.org/strip-indent/download/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" @@ -4007,9 +4029,9 @@ svgo@^0.7.0: sax "~1.2.1" whet.extend "~0.9.9" -table@^3.7.8: - version "3.8.3" - resolved "http://registry.npm.taobao.org/table/download/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" +table@^4.0.1: + version "4.0.1" + resolved "http://registry.npm.taobao.org/table/download/table-4.0.1.tgz#a8116c133fac2c61f4a420ab6cdf5c4d61f0e435" dependencies: ajv "^4.7.0" ajv-keywords "^1.0.0" @@ -4057,6 +4079,12 @@ timers-browserify@^2.0.2: dependencies: setimmediate "^1.0.4" +tmp@^0.0.31: + version "0.0.31" + resolved "http://registry.npm.taobao.org/tmp/download/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" + dependencies: + os-tmpdir "~1.0.1" + to-arraybuffer@^1.0.0: version "1.0.1" resolved "http://registry.npm.taobao.org/to-arraybuffer/download/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -4114,9 +4142,9 @@ typedarray@^0.0.6: version "0.0.6" resolved "http://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -uglify-js@^2.8.27: - version "2.8.27" - resolved "http://registry.npm.taobao.org/uglify-js/download/uglify-js-2.8.27.tgz#47787f912b0f242e5b984343be8e35e95f694c9c" +uglify-js@^2.8.29: + version "2.8.29" + resolved "http://registry.npm.taobao.org/uglify-js/download/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" dependencies: source-map "~0.5.1" yargs "~3.10.0" @@ -4127,6 +4155,14 @@ uglify-to-browserify@~1.0.0: version "1.0.2" resolved "http://registry.npm.taobao.org/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" +uglifyjs-webpack-plugin@^0.4.4: + version "0.4.6" + resolved "http://registry.npm.taobao.org/uglifyjs-webpack-plugin/download/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309" + dependencies: + source-map "^0.5.6" + uglify-js "^2.8.29" + webpack-sources "^1.0.1" + uid-number@^0.0.6: version "0.0.6" resolved "http://registry.npm.taobao.org/uid-number/download/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" @@ -4177,12 +4213,6 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" -user-home@^2.0.0: - version "2.0.0" - resolved "http://registry.npm.taobao.org/user-home/download/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" - dependencies: - os-homedir "^1.0.0" - util-deprecate@~1.0.1: version "1.0.2" resolved "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -4284,37 +4314,38 @@ webpack-sources@^0.1.0: source-list-map "~0.1.7" source-map "~0.5.3" -webpack-sources@^0.2.3: - version "0.2.3" - resolved "http://registry.npm.taobao.org/webpack-sources/download/webpack-sources-0.2.3.tgz#17c62bfaf13c707f9d02c479e0dcdde8380697fb" +webpack-sources@^1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/webpack-sources/download/webpack-sources-1.0.1.tgz#c7356436a4d13123be2e2426a05d1dad9cbe65cf" dependencies: - source-list-map "^1.1.1" + source-list-map "^2.0.0" source-map "~0.5.3" -webpack@^2.6.1: - version "2.6.1" - resolved "http://registry.npm.taobao.org/webpack/download/webpack-2.6.1.tgz#2e0457f0abb1ac5df3ab106c69c672f236785f07" +webpack@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/webpack/download/webpack-3.0.0.tgz#ee9bcebf21247f7153cb410168cab45e3a59d4d7" dependencies: acorn "^5.0.0" acorn-dynamic-import "^2.0.0" - ajv "^4.7.0" - ajv-keywords "^1.1.1" + ajv "^5.1.5" + ajv-keywords "^2.0.0" async "^2.1.2" enhanced-resolve "^3.0.0" + escope "^3.6.0" interpret "^1.0.0" json-loader "^0.5.4" json5 "^0.5.1" loader-runner "^2.3.0" - loader-utils "^0.2.16" + loader-utils "^1.1.0" memory-fs "~0.4.1" mkdirp "~0.5.0" node-libs-browser "^2.0.0" source-map "^0.5.3" supports-color "^3.1.0" tapable "~0.2.5" - uglify-js "^2.8.27" + uglifyjs-webpack-plugin "^0.4.4" watchpack "^1.3.1" - webpack-sources "^0.2.3" + webpack-sources "^1.0.1" yargs "^6.0.0" websocket-driver@>=0.5.1: