├── .gitignore ├── README.md ├── backend ├── df_util │ ├── DPlayer.min.js │ ├── __init__.py │ ├── danmaku.min.js │ ├── flv.min.js │ └── hls.min.js ├── main.py ├── requirements.txt └── rules │ ├── __gen_cer │ ├── __init__.py │ ├── dfRootCA.key │ ├── dfRootCA.pem │ ├── localhost.key │ └── localhost.pem │ ├── __init__.py │ ├── acfun │ ├── __init__.py │ └── acfun_html5.js │ ├── bilive │ ├── __init__.py │ └── bilive_html5.js │ ├── not_match_script.js │ ├── sohu │ ├── __init__.py │ └── sohu_html5.js │ └── youku │ ├── __init__.py │ └── youku_html5.js ├── monkey_script.js └── show_pic ├── acfun.png ├── bilive.png ├── sohu.png ├── vqq.png ├── yinyuetai.png └── youku.png /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | *.pyc 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # disflash 2 | disflash —— 关掉 flash 计划 3 | 4 | ## 介绍 5 | disflash 计划是希望在关掉 flash 或者浏览器默认不再提供 flash 的时候还能浏览国内的视频网站的视频。 6 | 7 | *暂时只在 Chrome 里测试过。* 8 | 9 | 目前已支持: 10 | 11 | * 优酷 12 | * 腾讯视频 13 | * Bilibili 直播 14 | * AcFun 15 | * 音悦台 16 | * 搜狐视频 17 | * 正在添加各大视频网站…… 18 | 19 | ## 使用 20 | 21 | **需要 Python 3 。** 22 | 23 | ### ① 安装依赖 24 | 把 disflash clone 到本地,进入项目文件夹。 25 | ``` 26 | pip3 install -r backend/requirements.txt 27 | ``` 28 | 29 | ### ② 安装 Tampermonkey 脚本 30 | 31 | 在 Chrome 里安装 Tampermonkey 插件。在 Tampermonkey 里新建脚本, 32 | 把 [monkey_script.js](https://github.com/sljeff/disflash/blob/master/monkey_script.js) 的内容复制到代码框里,保存即可。 33 | 34 | ### ③ 运行 server 35 | 然后运行: 36 | 37 | ``` 38 | python3 backend/main.py 39 | ``` 40 | 41 | > 为了能在 https 的页面里执行脚本,server 是 https 的。所以需要把 `backend/rules/__gen_cer/dfRootCA.pem` 添加到浏览器受信任的机构的证书里。 42 | 43 | ### ④ 然后打开已支持的视频网站看看效果吧。 44 | 45 | ## 截图 46 | ![](show_pic/bilive.png) 47 | 48 | ![](show_pic/youku.png) 49 | 50 | ![](show_pic/acfun.png) 51 | 52 | ![](show_pic/sohu.png) 53 | 54 | ![](show_pic/yinyuetai.png) 55 | 56 | ![](show_pic/vqq.png) 57 | 58 | ## 如何扩展 disflash 59 | 比如,需要给优酷编写规则,那么需要: 60 | 61 | **① 在 `backend/rules/` 里新建一个文件夹**。 62 | 63 | 里面包含 `__init__.py` 文件。我把文件夹命名为 youku ,那么文件目录是: 64 | ``` 65 | backend/ 66 | --------rules/ 67 | --------------youku/ 68 | --------------------__init__.py 69 | ``` 70 | **② 然后编写 `__init__.py` 。** 71 | 72 | 需要实现两个方法:`script` `proxy`。 73 | 74 | `script` 方法需要是一个tornado 协程,所以必须: 75 | ```python 76 | from tornado.gen import coroutine, Return 77 | ``` 78 | 79 | **函数如下:** 80 | ```python 81 | @coroutine 82 | def script(url_path, request_handler): 83 | """ 84 | :type url_path: str 85 | :type request_handler: tornado.web.RequestHandler 86 | :rtype: bool 87 | """ 88 | if is_url_match_this_rule(url_path): # 如果 URL 是匹配的 89 | # 可以从 request_handler 得到需要的信息 90 | get_info_from_request_handler(request_handler) 91 | # 返回一个 js。浏览器端会执行这段 js 92 | request_handler.write(javascript) 93 | yield request_handler.flush() 94 | # 返回 True,告知程序已经匹配到了,不会再去匹配其他的规则。 95 | raise Return(True) 96 | else: 97 | # 返回 False,程序会继续遍历下一个规则 98 | raise Return(False) 99 | ``` 100 | 101 | `proxy` 函数会被运行在一个单独的线程里。 102 | 103 | **函数如下:** 104 | 105 | ```python 106 | def proxy(url_path, request_handler): 107 | """ 108 | :type url_path: str 109 | :type request_handler: tornado.web.RequestHandler 110 | :rtype: bool 111 | """ 112 | if is_url_match_this_rule(url_path): # 如果 URL 是匹配的 113 | # 可以从 request_handler 得到需要的信息 114 | get_info_from_request_handler(request_handler) 115 | # 可以修改要返回给浏览器的 HTTP 头 116 | request_handler.set_header('Content-Type', 'video/mpeg4') 117 | request_handler.set_header('Transfer-Encoding', 'chunked') 118 | # 通过一些办法拿到视频数据并且发送 119 | for chunk in video.iter_content(2048): 120 | if not chunk: 121 | break 122 | request_handler.write(chunk) 123 | request_handler.flush() 124 | request_handler.finish() 125 | # 返回 True,告知程序已经匹配到了,不会再去匹配其他的规则。 126 | return True 127 | else: 128 | # 返回 False,程序会继续遍历下一个规则 129 | return False 130 | ``` 131 | 132 | **③ 在 Tampermonkey 的内容,前面的注释里加入匹配规则** 133 | 134 | ``` 135 | // @match http://v.youku.com/v_show/* 136 | ``` 137 | 做完这一步就完成了一个规则的添加。 138 | 139 | **disflash 的逻辑是这样的:** 140 | 141 | * 打开 Tampermonkey 脚本里已经写好的匹配规则的页面,Tampermonkey 脚本被执行。它会尝试获取 `'https://localhost:9527/getscript/' + window.location.href`,然后执行返回的 js 脚本。 142 | 143 | * `'https://localhost:9527/getscript/***'` 让 server 遍历调用各个规则的 script 方法。然后匹配到的规则会返回一个 js 脚本给浏览器,浏览器会执行它。 144 | 145 | * 一些不算严格的网站只需要这个脚本就可以看到视频了;另一些网站需要用 server 作为代理获取视频。所以在可以给它们返回的 js 内容里包含对 `'http://localhost:9527/proxy/***'` 的请求。可能在获取了一些页面上的信息之后,让它对 `'https://localhost:9527/proxy/***'` 发起请求。 146 | 147 | * `'https://localhost:9527/proxy/***'` 让 server 遍历调用各个规则的 proxy 方法。(所以每个规则必须包含一个 proxy 方法,如果这个网站不需要用到,也要有一个 `return False`) 148 | 149 | * 对于所有的请求的返回,disflash 都会默认添加上各种 Access-* 的头让浏览器不会拒绝它;对于 OPTION 请求,disflash 会返回 200 OK;对于 `/getscript/***` 请求的返回,会把 Content-Type 设为 application/javascript。所以不需要在规则的 `script` `proxy`里修改这些头。 150 | 151 | ## 另 152 | 153 | 做 disflash 的想法是来源于 [MAMA2](https://github.com/zythum/mama2) 。 154 | > 为什么不用 MAMA2 或者给 MAMA2 写扩展? 155 | 156 | > ① MAMA2 已经有些时间没更新了,部分网站已经失效。 157 | 一些失效的原因,比如搜狐视频,其实不是视频地址爬取失败了,而是返回 HTTP 头的 `Access-Control-Allow-Origin` 没有包含 PC 页面, 158 | 浏览器安全机制拒绝了它。 159 | 还有一些是另外的安全机制,比如复杂请求前给跨域的地址发送 OPTION 的 preflight 请求,会被视频源拒绝。这需要一个运行的 server 来做 160 | (如果 MAMA2 没有缺省解析服务的话,是需要跑一个 server 的,而这个 server 只用来返回播放器和播放地址,功能比较受限)。 161 | 162 | > ② 一些网站比如音悦台/腾讯视频的 PC 版已经自带 HTML5 播放器了,而且音悦台只需要一个跳转即可。 163 | 不过腾讯视频需要在视频的部分载入前让浏览器的 UA 是 Mac 的 safari,这也是 MAMA2 做不到的(因为 MAMA2 就是给 Mac 用户用的……)。 164 | 165 | > ③ node 平台的各种包依赖问题让编写 MAMA2 变得很难受…… 166 | 167 | 所以 disflash 需要前后端共同配合来得到视频内容。对于比较严谨的网站(比如视频地址的`Access-Control-Allow-Origin`不是`*`的……), 168 | 浏览器端执行网页里的 JS ,并且加入 Tampermonkey 脚本用来做一些受浏览器限制的事; 169 | 服务端通过代理的方法可以模拟手机端以及解决跨域的问题。 170 | 171 | disflash 有一个 tornado 的简单 server ,而复杂的逻辑都交给规则(backend 里的 rules 文件夹)。 172 | 这些规则是 Python 文件,所以它可以做任何事情。 173 | -------------------------------------------------------------------------------- /backend/df_util/DPlayer.min.js: -------------------------------------------------------------------------------- 1 | !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(n){if(a[n])return a[n].exports;var r=a[n]={exports:{},id:n,loaded:!1};return e[n].call(r.exports,r,r.exports,t),r.loaded=!0,r.exports}var a={};return t.m=e,t.c=a,t.p="",t(0)}([function(e,t,a){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},l=function(){function e(e,t){for(var a=0;a\n \n \n \n '},this.option=t;var i=/mobile/i.test(window.navigator.userAgent);i&&(this.option.autoplay=!1);var s={element:document.getElementsByClassName("dplayer")[0],autoplay:!1,theme:"#b7daff",loop:!1,lang:navigator.language.indexOf("zh")!==-1?"zh":"en",screenshot:!1,hotkey:!0,preload:"auto"};for(var d in s)s.hasOwnProperty(d)&&!this.option.hasOwnProperty(d)&&(this.option[d]=s[d]);var p={"Danmaku is loading":"弹幕加载中",Top:"顶部",Bottom:"底部",Rolling:"滚动","Input danmaku, hit Enter":"输入弹幕,回车发送","About author":"关于作者","DPlayer feedback":"播放器意见反馈","About DPlayer":"关于 DPlay 播放器",Loop:"洗脑循环",Speed:"速度","Opacity for danmaku":"弹幕透明度",Normal:"正常","Please input danmaku!":"要输入弹幕内容啊喂!","Set danmaku color":"设置弹幕颜色","Set danmaku type":"设置弹幕类型",Danmaku:"弹幕"},m=function(e){return"en"===a.option.lang?e:"zh"===a.option.lang?p[e]:void 0};this.updateBar=function(e,t,a){t=t>0?t:0,t=t<1?t:1,w[e+"Bar"].style[a]=100*t+"%"};var c=["play","pause","canplay","playing","ended","error"];this.event={};for(var y=0;y\n
\n \n
\n
\n
\n
\n \n '+(this.option.danmaku?''+m("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 '+(this.option.screenshot?'\n "+this.getSVG("camera")+" \n ":"")+'\n
\n \n
\n \n
\n
\n
'+m("Set danmaku color")+'
\n \n \n \n \n \n \n
\n
\n
'+m("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 ");var u=this.element.offsetWidth<=500;if(u){var g=document.createElement("style");g.innerHTML=".dplayer .dplayer-danmaku{font-size:18px}",document.head.appendChild(g)}if(this.video=this.element.getElementsByClassName("dplayer-video")[0],this.option.video.url.match(/(m3u8)$/i)&&Hls.isSupported()&&!function(){a.element.getElementsByClassName("dplayer-time")[0].style.display="none";var e=new Hls;e.attachMedia(a.video),e.on(Hls.Events.MEDIA_ATTACHED,function(){e.loadSource(a.option.video.url),e.on(Hls.Events.MANIFEST_PARSED,function(e,t){console.log("manifest loaded, found "+t.levels.length+" quality level")})})}(),this.option.video.url.match(/(flv)$/i)&&flvjs.isSupported()){var f=flvjs.createPlayer({type:"flv",url:this.option.video.url});f.attachMediaElement(this.video),f.load()}this.bezel=this.element.getElementsByClassName("dplayer-bezel-icon")[0],this.bezel.addEventListener("animationend",function(){a.bezel.classList.remove("dplayer-bezel-transition")}),this.playButton=this.element.getElementsByClassName("dplayer-play-icon")[0],this.shouldpause=!0,this.playButton.addEventListener("click",function(){a.toggle()});var v=this.element.getElementsByClassName("dplayer-video-wrap")[0],b=this.element.getElementsByClassName("dplayer-controller-mask")[0];if(i){var h=function(){a.element.classList.contains("dplayer-hide-controller")?a.element.classList.remove("dplayer-hide-controller"):a.element.classList.add("dplayer-hide-controller")};v.addEventListener("click",h),b.addEventListener("click",h)}else v.addEventListener("click",function(){a.toggle()}),b.addEventListener("click",function(){a.toggle()});var x=function(e){var t=function(e){return e<10?"0"+e:""+e},a=parseInt(e/60),n=parseInt(e-60*a);return t(a)+":"+t(n)},k=function(e){var t=e.offsetLeft,n=e.offsetParent,r=void 0;if(document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement)for(;null!==n&&n!==a.element;)t+=n.offsetLeft,n=n.offsetParent;else for(;null!==n;)t+=n.offsetLeft,n=n.offsetParent;return r=document.body.scrollLeft+document.documentElement.scrollLeft,t-r},w={};w.playedBar=this.element.getElementsByClassName("dplayer-played")[0],w.loadedBar=this.element.getElementsByClassName("dplayer-loaded")[0];var Y=this.element.getElementsByClassName("dplayer-bar-wrap")[0],E=void 0;this.option.danmaku&&this.video.addEventListener("seeking",function(){for(var e=0;e=a.video.currentTime)return void(a.danIndex=e);a.danIndex=a.dan.length}});var L=0,z=0,B=!1,C=void 0;this.setTime=function(){a.playedTime=setInterval(function(){z=a.video.currentTime,!B&&zL+.01&&!a.video.paused&&(a.element.classList.remove("dplayer-loading"),B=!1),L=z,a.updateBar("played",a.video.currentTime/a.video.duration,"width"),a.element.getElementsByClassName("dplayer-ptime")[0].innerHTML=x(a.video.currentTime),a.trigger("playing")},100),a.option.danmaku&&(C=setInterval(function(){for(var e=a.dan[a.danIndex];e&&a.video.currentTime>=parseFloat(e.time);)re(e.text,e.color,e.type),e=a.dan[++a.danIndex]},0))},this.clearTime=function(){clearInterval(a.playedTime),a.option.danmaku&&clearInterval(C)},Y.addEventListener("click",function(e){var t=e||window.event;E=Y.clientWidth;var n=(t.clientX-k(Y))/E;n=n>0?n:0,n=n<1?n:1,a.updateBar("played",n,"width"),a.video.currentTime=parseFloat(w.playedBar.style.width)/100*a.video.duration});var T=function(e){var t=e||window.event,n=(t.clientX-k(Y))/E;n=n>0?n:0,n=n<1?n:1,a.updateBar("played",n,"width"),a.element.getElementsByClassName("dplayer-ptime")[0].innerHTML=x(n*a.video.duration)},N=function ke(){document.removeEventListener("mouseup",ke),document.removeEventListener("mousemove",T),a.video.currentTime=parseFloat(w.playedBar.style.width)/100*a.video.duration,a.setTime()};Y.addEventListener("mousedown",function(){E=Y.clientWidth,a.clearTime(),document.addEventListener("mousemove",T),document.addEventListener("mouseup",N)}),w.volumeBar=this.element.getElementsByClassName("dplayer-volume-bar-inner")[0];var S=this.element.getElementsByClassName("dplayer-volume")[0],M=this.element.getElementsByClassName("dplayer-volume-bar-wrap")[0],q=this.element.getElementsByClassName("dplayer-volume-bar")[0],A=this.element.getElementsByClassName("dplayer-volume-icon")[0],I=35;this.switchVolumeIcon=function(){var e=a.element.getElementsByClassName("dplayer-volume-icon")[0];a.video.volume>=.8?e.innerHTML=a.getSVG("volume-up"):a.video.volume>0?e.innerHTML=a.getSVG("volume-down"):e.innerHTML=a.getSVG("volume-off")};var D=function(e){var t=e||window.event,n=(t.clientX-k(q)-5.5)/I;a.volume(n)},R=function we(){document.removeEventListener("mouseup",we),document.removeEventListener("mousemove",D),S.classList.remove("dplayer-volume-active")};M.addEventListener("click",function(e){var t=e||window.event,n=(t.clientX-k(q)-5.5)/I;a.volume(n)}),M.addEventListener("mousedown",function(){document.addEventListener("mousemove",D),document.addEventListener("mouseup",R),S.classList.add("dplayer-volume-active")}),A.addEventListener("click",function(){a.video.muted?(a.video.muted=!1,a.switchVolumeIcon(),a.updateBar("volume",a.video.volume,"width")):(a.video.muted=!0,A.innerHTML=a.getSVG("volume-off"),a.updateBar("volume",0,"width"))});var H=0;if(!i){var F=function(){a.element.classList.remove("dplayer-hide-controller"),clearTimeout(H),H=setTimeout(function(){a.video.played.length&&(a.element.classList.add("dplayer-hide-controller"),j(),fe())},2e3)};this.element.addEventListener("mousemove",F),this.element.addEventListener("click",F)}var X=localStorage.getItem("DPlayer-opacity")||.7,P={original:'\n
\n '+m("Speed")+'\n
'+this.getSVG("right")+('
\n
\n
\n '+m("Loop")+'\n
\n \n \n
\n
\n
\n '+m("Danmaku")+'\n
\n \n \n
\n
\n
\n '+m("Opacity for danmaku")+'\n
\n
\n
\n \n
\n
\n
\n
'),speed:'\n
\n 0.5\n
\n
\n 0.75\n
\n
\n '+m("Normal")+'\n
\n
\n 1.25\n
\n
\n 1.5\n
\n
\n 2\n
'},O=this.element.getElementsByClassName("dplayer-setting-icon")[0],V=this.element.getElementsByClassName("dplayer-setting-box")[0],U=this.element.getElementsByClassName("dplayer-mask")[0];V.innerHTML=P.original;var j=function(){V.classList.contains("dplayer-setting-box-open")&&(V.classList.remove("dplayer-setting-box-open"),U.classList.remove("dplayer-mask-show"),setTimeout(function(){V.classList.remove("dplayer-setting-box-narrow"),V.innerHTML=P.original,$()},300))},G=function(){V.classList.add("dplayer-setting-box-open"),U.classList.add("dplayer-mask-show")};U.addEventListener("click",function(){j()}),O.addEventListener("click",function(){G()});var J=this.option.loop,W=this.element.getElementsByClassName("dplayer-danmaku")[0],Q=!0,$=function(){var e=a.element.getElementsByClassName("dplayer-setting-loop")[0],t=e.getElementsByClassName("dplayer-toggle-setting-input")[0];t.checked=J,e.addEventListener("click",function(){t.checked=!t.checked,t.checked?(J=!0,a.video.loop=J):(J=!1,a.video.loop=J),j()});var n=a.element.getElementsByClassName("dplayer-setting-showdan")[0],r=n.getElementsByClassName("dplayer-showdan-setting-input")[0];r.checked=Q,n.addEventListener("click",function(){if(r.checked=!r.checked,r.checked){if(Q=!0,a.option.danmaku){for(var e=0;e=a.video.currentTime){a.danIndex=e;break}a.danIndex=a.dan.length}C=setInterval(function(){for(var e=a.dan[a.danIndex];e&&a.video.currentTime>=parseFloat(e.time);)re(e.text,e.color,e.type),e=a.dan[++a.danIndex]},0)}}else Q=!1,a.option.danmaku&&(clearInterval(C),W.innerHTML='
',a.danTunnel={right:{},top:{},bottom:{}},a.itemDemo=a.element.getElementsByClassName("dplayer-danmaku-item")[0]);j()});var l=a.element.getElementsByClassName("dplayer-setting-speed")[0]; 2 | l.addEventListener("click",function(){V.classList.add("dplayer-setting-box-narrow"),V.innerHTML=P.speed;for(var e=V.getElementsByClassName("dplayer-setting-speed-item"),t=function(t){e[t].addEventListener("click",function(){a.video.playbackRate=e[t].dataset.speed,j()})},n=0;n0?l:0,l=l<1?l:1,a.updateBar("danmaku",l,"width");for(var o=a.element.getElementsByClassName("dplayer-danmaku-item"),i=0;i0?l:0,l=l<1?l:1,a.updateBar("danmaku",l,"width");for(var o=a.element.getElementsByClassName("dplayer-danmaku-item"),i=0;i=200&&e.status<300||304===e.status?!function(){var t=JSON.parse(e.responseText);1!==t.code?alert(t.msg):a.option.danmaku.addition?(e.onreadystatechange=function(){if(4===e.readyState)if(e.status>=200&&e.status<300||304===e.status){var n=JSON.parse(e.responseText);1!==n.code?alert(n.msg):(a.dan=t.danmaku.concat(n.danmaku).sort(function(e,t){return e.time-t.time}),a.element.getElementsByClassName("dplayer-danloading")[0].style.display="none",a.option.autoplay&&!i?a.play():i&&a.pause())}else console.log("Request was unsuccessful: "+e.status)},e.open("get",a.option.danmaku.addition[0],!0),e.send(null)):(a.dan=t.danmaku.sort(function(e,t){return e.time-t.time}),a.element.getElementsByClassName("dplayer-danloading")[0].style.display="none",a.option.autoplay&&!i?a.play():i&&a.pause())}():console.log("Request was unsuccessful: "+e.status))};var t=void 0;t=a.option.danmaku.maximum?a.option.danmaku.api+"?id="+a.option.danmaku.id+"&max="+a.option.danmaku.maximum:a.option.danmaku.api+"?id="+a.option.danmaku.id,e.open("get",t,!0),e.send(null)}():this.option.autoplay&&!i?this.play():i&&this.pause();var le=this.element.getElementsByClassName("dplayer-comment-input")[0],oe=this.element.getElementsByClassName("dplayer-comment-icon")[0],ie=this.element.getElementsByClassName("dplayer-comment-box")[0],se=this.element.getElementsByClassName("dplayer-comment-setting-icon")[0],de=this.element.getElementsByClassName("dplayer-comment-setting-box")[0],pe=this.element.getElementsByClassName("dplayer-send-icon")[0],me=function(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")},ce=function(){if(le.blur(),!le.value.replace(/^\s+|\s+$/g,""))return void alert(m("Please input danmaku!"));var e={token:a.option.danmaku.token,player:a.option.danmaku.id,author:"DIYgod",time:a.video.currentTime,text:le.value,color:a.element.querySelector(".dplayer-comment-setting-color input:checked").value,type:a.element.querySelector(".dplayer-comment-setting-type input:checked").value},t=new XMLHttpRequest;t.onreadystatechange=function(){if(4===t.readyState)if(t.status>=200&&t.status<300||304===t.status){var e=JSON.parse(t.responseText);1!==e.code?alert(e.msg):console.log("Post danmaku: ",JSON.parse(t.responseText))}else console.log("Request was unsuccessful: "+t.status)},t.open("post",a.option.danmaku.api,!0),t.send(JSON.stringify(e)),le.value="",fe(),a.dan.splice(a.danIndex,0,e),a.danIndex++;var n=re(me(e.text),e.color,e.type);n.style.border="2px solid "+a.option.theme},ye=function(){de.classList.contains("dplayer-comment-setting-open")&&de.classList.remove("dplayer-comment-setting-open")},ue=function(){de.classList.contains("dplayer-comment-setting-open")?de.classList.remove("dplayer-comment-setting-open"):de.classList.add("dplayer-comment-setting-open")},ge=0,fe=function(){ie.classList.contains("dplayer-comment-box-open")&&(ie.classList.remove("dplayer-comment-box-open"),U.classList.remove("dplayer-mask-show"),clearInterval(ge),a.element.classList.remove("dplayer-show-controller"),ye())},ve=function(){ie.classList.add("dplayer-comment-box-open"),U.classList.add("dplayer-mask-show"),ge=setInterval(function(){clearTimeout(H)},1e3),a.element.classList.add("dplayer-show-controller")};U.addEventListener("click",function(){fe()}),oe.addEventListener("click",function(){ve(),setTimeout(function(){le.focus()},300)}),se.addEventListener("click",function(){ue()}),this.element.getElementsByClassName("dplayer-comment-setting-color")[0].addEventListener("click",function(){var e=a.element.querySelector('input[name="dplayer-danmaku-color-${index}"]:checked+span');e&&(se.getElementsByClassName("dplayer-fill")[0].style.fill=a.element.querySelector('input[name="dplayer-danmaku-color-${index}"]:checked').value)}),le.addEventListener("click",function(){ye()}),le.addEventListener("keydown",function(e){var t=e||window.event;13===t.keyCode&&ce()}),pe.addEventListener("click",ce);var be=function(){Z=W.offsetWidth;for(var e=a.element.getElementsByClassName("dplayer-danmaku-item"),t=0;t0?e:0,e=e<1?e:1,this.updateBar("volume",e,"width"),this.video.volume=e,this.video.muted&&(this.video.muted=!1),this.switchVolumeIcon()}},{key:"toggle",value:function(){this.video.paused?this.play():this.pause()}},{key:"on",value:function(e,t){"function"==typeof t&&this.event[e].push(t)}},{key:"switchVideo",value:function(e,t){var a=this;this.video.src=e.url,this.video.poster=e.pic?e.pic:"",this.video.currentTime=0,this.pause(),t&&!function(){a.dan=[],a.danIndex=0,a.element.getElementsByClassName("dplayer-danloading")[0].style.display="block",a.updateBar("played",0,"width"),a.updateBar("loaded",0,"width"),a.element.getElementsByClassName("dplayer-ptime")[0].innerHTML="00:00",a.element.getElementsByClassName("dplayer-danmaku")[0].innerHTML='
',a.danTunnel={right:{},top:{},bottom:{}},a.itemDemo=a.element.getElementsByClassName("dplayer-danmaku-item")[0];var e=/mobile/i.test(window.navigator.userAgent);a.option.danmaku=t;var n=new XMLHttpRequest;n.onreadystatechange=function(){4===n.readyState&&(n.status>=200&&n.status<300||304===n.status?!function(){var t=JSON.parse(n.responseText);1!==t.code?alert(t.msg):a.option.danmaku.addition?(n.onreadystatechange=function(){if(4===n.readyState)if(n.status>=200&&n.status<300||304===n.status){var r=JSON.parse(n.responseText);1!==r.code?alert(r.msg):(a.danIndex=0,a.dan=t.danmaku.concat(r.danmaku).sort(function(e,t){return e.time-t.time}),a.element.getElementsByClassName("dplayer-danloading")[0].style.display="none",a.option.autoplay&&!e?a.play():e&&a.pause())}else console.log("Request was unsuccessful: "+n.status)},n.open("get",a.option.danmaku.addition[0],!0),n.send(null)):(a.danIndex=0,a.dan=t.danmaku.sort(function(e,t){return e.time-t.time}),a.element.getElementsByClassName("dplayer-danloading")[0].style.display="none",a.option.autoplay&&!e?a.play():e&&a.pause())}():console.log("Request was unsuccessful: "+n.status))};var r=void 0;r=a.option.danmaku.maximum?a.option.danmaku.api+"?id="+a.option.danmaku.id+"&max="+a.option.danmaku.maximum:a.option.danmaku.api+"?id="+a.option.danmaku.id,n.open("get",r,!0),n.send(null)}()}}]),e}();e.exports=i},function(e,t,a){var n=a(2);"string"==typeof n&&(n=[[e.id,n,""]]);a(4)(n,{});n.locals&&(e.exports=n.locals)},function(e,t,a){t=e.exports=a(3)(),t.push([e.id,'.dplayer{position:relative;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:1}.dplayer:-webkit-full-screen{width:100%;height:100%;background:#000}.dplayer:-webkit-full-screen .dplayer-danmaku .dplayer-danmaku-bottom.dplayer-danmaku-move,.dplayer:-webkit-full-screen .dplayer-danmaku .dplayer-danmaku-top.dplayer-danmaku-move{-webkit-animation:danmaku-center 6s linear;animation:danmaku-center 6s linear;-webkit-animation-play-state:paused;animation-play-state:paused}.dplayer:-webkit-full-screen .dplayer-danmaku .dplayer-danmaku-right.dplayer-danmaku-move{-webkit-animation:danmaku 8s linear;animation:danmaku 8s linear;-webkit-animation-play-state:paused;animation-play-state:paused}.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box{height:60px}.dplayer.dplayer-no-danmaku .dplayer-controller .dplayer-icons .dplayer-comment,.dplayer.dplayer-no-danmaku .dplayer-danmaku{display:none}.dplayer.dplayer-playing .dplayer-danmaku .dplayer-danmaku-move{-webkit-animation-play-state:running!important;animation-play-state:running!important}@media (min-width:900px){.dplayer.dplayer-playing .dplayer-controller,.dplayer.dplayer-playing .dplayer-controller-mask{opacity:0}.dplayer.dplayer-playing:hover .dplayer-controller,.dplayer.dplayer-playing:hover .dplayer-controller-mask{opacity:1}}.dplayer.dplayer-loading .dplayer-bezel .diplayer-loading-icon{display:block}.dplayer.dplayer-loading .dplayer-danmaku .dplayer-danmaku-move{-webkit-animation-play-state:paused!important;animation-play-state:paused!important}.dplayer.dplayer-hide-controller .dplayer-controller,.dplayer.dplayer-hide-controller .dplayer-controller-mask{opacity:0;-webkit-transform:translateY(100%);transform:translateY(100%)}.dplayer.dplayer-show-controller .dplayer-controller,.dplayer.dplayer-show-controller .dplayer-controller-mask{opacity:1}.dplayer .dplayer-mask{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1;display:none}.dplayer .dplayer-mask.dplayer-mask-show{display:block}.dplayer .dplayer-video-wrap{position:relative;background:#000;font-size:0;width:100%;height:100%}.dplayer .dplayer-video-wrap .dplayer-video{width:100%;height:100%}.dplayer .dplayer-danmaku{position:absolute;left:0;right:0;top:0;bottom:0;font-size:22px;color:#fff}.dplayer .dplayer-danmaku .dplayer-danmaku-item{display:inline-block;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;white-space:nowrap;font-weight:bolder;text-shadow:.5px .5px .5px rgba(0,0,0,.5)}.dplayer .dplayer-danmaku .dplayer-danmaku-item--demo{position:absolute;visibility:hidden}.dplayer .dplayer-danmaku .dplayer-danmaku-right{position:absolute;right:0;-webkit-transform:translateX(100%);transform:translateX(100%)}.dplayer .dplayer-danmaku .dplayer-danmaku-right.dplayer-danmaku-move{will-change:transform;-webkit-animation:danmaku 5s linear;animation:danmaku 5s linear;-webkit-animation-play-state:paused;animation-play-state:paused}@-webkit-keyframes danmaku{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes danmaku{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}}.dplayer .dplayer-danmaku .dplayer-danmaku-bottom,.dplayer .dplayer-danmaku .dplayer-danmaku-top{position:absolute;width:100%;text-align:center;visibility:hidden}.dplayer .dplayer-danmaku .dplayer-danmaku-bottom.dplayer-danmaku-move,.dplayer .dplayer-danmaku .dplayer-danmaku-top.dplayer-danmaku-move{will-change:visibility;-webkit-animation:danmaku-center 4s linear;animation:danmaku-center 4s linear;-webkit-animation-play-state:paused;animation-play-state:paused}@-webkit-keyframes danmaku-center{0%{visibility:visible}to{visibility:visible}}@keyframes danmaku-center{0%{visibility:visible}to{visibility:visible}}.dplayer .dplayer-bezel{position:absolute;left:0;right:0;top:0;bottom:0;font-size:22px;color:#fff;pointer-events:none}.dplayer .dplayer-bezel .dplayer-fill{fill:hsla(0,0%,100%,.8)}.dplayer .dplayer-bezel .dplayer-bezel-icon{position:absolute;top:50%;left:50%;margin:-26px 0 0 -26px;height:52px;width:52px;padding:12px;box-sizing:border-box;background:rgba(0,0,0,.5);border-radius:50%;opacity:0;pointer-events:none}.dplayer .dplayer-bezel .dplayer-bezel-icon.dplayer-bezel-transition{-webkit-animation:bezel-hide .5s linear;animation:bezel-hide .5s linear}@-webkit-keyframes bezel-hide{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform:scale(2);transform:scale(2)}}@keyframes bezel-hide{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform:scale(2);transform:scale(2)}}.dplayer .dplayer-bezel .dplayer-danloading{position:absolute;top:50%;margin-top:-7px;width:100%;text-align:center;font-size:14px;line-height:14px;-webkit-animation:my-face 5s infinite ease-in-out;animation:my-face 5s infinite ease-in-out}.dplayer .dplayer-bezel .diplayer-loading-icon{display:none;position:absolute;top:50%;left:50%;margin:-18px 0 0 -18px;height:36px;width:36px;pointer-events:none}.dplayer .dplayer-bezel .diplayer-loading-icon .diplayer-loading-hide{display:none}.dplayer .dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot{-webkit-animation:diplayer-loading-dot-fade .8s ease infinite;animation:diplayer-loading-dot-fade .8s ease infinite;opacity:0;fill:#fff;-webkit-transform-origin:4px 4px;transform-origin:4px 4px}.dplayer .dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-7{-webkit-animation-delay:.7s;animation-delay:.7s}.dplayer .dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-6{-webkit-animation-delay:.6s;animation-delay:.6s}.dplayer .dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-5{-webkit-animation-delay:.5s;animation-delay:.5s}.dplayer .dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-4{-webkit-animation-delay:.4s;animation-delay:.4s}.dplayer .dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-3{-webkit-animation-delay:.3s;animation-delay:.3s}.dplayer .dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-2{-webkit-animation-delay:.2s;animation-delay:.2s}.dplayer .dplayer-bezel .diplayer-loading-icon .diplayer-loading-dot.diplayer-loading-dot-1{-webkit-animation-delay:.1s;animation-delay:.1s}@-webkit-keyframes diplayer-loading-dot-fade{0%{opacity:.7;-webkit-transform:scale(1.2);transform:scale(1.2)}50%{opacity:.25;-webkit-transform:scale(.9);transform:scale(.9)}to{opacity:.25;-webkit-transform:scale(.85);transform:scale(.85)}}@keyframes diplayer-loading-dot-fade{0%{opacity:.7;-webkit-transform:scale(1.2);transform:scale(1.2)}50%{opacity:.25;-webkit-transform:scale(.9);transform:scale(.9)}to{opacity:.25;-webkit-transform:scale(.85);transform:scale(.85)}}.dplayer .dplayer-controller-mask{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==) repeat-x bottom;height:98px;width:100%}.dplayer .dplayer-controller,.dplayer .dplayer-controller-mask{position:absolute;bottom:0;-webkit-transition:all .3s ease;transition:all .3s ease}.dplayer .dplayer-controller{left:0;right:0;height:41px;padding:0 20px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.dplayer .dplayer-controller .dplayer-bar-wrap{padding:5px 0;cursor:pointer;position:absolute;bottom:33px;width:calc(100% - 40px);height:3px}.dplayer .dplayer-controller .dplayer-bar-wrap:hover .dplayer-thumb{-webkit-transform:scale(1)!important;transform:scale(1)!important}.dplayer .dplayer-controller .dplayer-bar-wrap .dplayer-bar{position:relative;height:3px;width:100%;background:hsla(0,0%,100%,.2);cursor:pointer!important}.dplayer .dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-loaded{position:absolute;left:0;top:0;bottom:0;background:hsla(0,0%,100%,.4);height:3px;-webkit-transition:all .5s ease;transition:all .5s ease;will-change:width}.dplayer .dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-played{position:absolute;left:0;top:0;bottom:0;height:3px;will-change:width}.dplayer .dplayer-controller .dplayer-bar-wrap .dplayer-bar .dplayer-played .dplayer-thumb{position:absolute;top:0;right:5px;margin-top:-4px;margin-right:-10px;height:11px;width:11px;border-radius:50%;cursor:pointer!important;-webkit-transition:all .3s ease-in-out;transition:all .3s ease-in-out;-webkit-transform:scale(0);transform:scale(0)}.dplayer .dplayer-controller .dplayer-icons{height:38px;position:absolute;bottom:0}.dplayer .dplayer-controller .dplayer-icons.dplayer-icons-left .dplayer-icon{padding:7px}.dplayer .dplayer-controller .dplayer-icons.dplayer-icons-right{right:20px}.dplayer .dplayer-controller .dplayer-icons.dplayer-icons-right .dplayer-icon{padding:8px}.dplayer .dplayer-controller .dplayer-icons #dplayer-menu{stroke:#ddd;stroke-width:1px}.dplayer .dplayer-controller .dplayer-icons .dplayer-time{line-height:38px;color:#eee;text-shadow:0 0 2px rgba(0,0,0,.5);vertical-align:middle;font-size:13px;cursor:default}.dplayer .dplayer-controller .dplayer-icons .dplayer-icon{width:46px;height:100%;border:none;background-color:transparent;outline:none;cursor:pointer;opacity:.8;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;vertical-align:middle;box-sizing:border-box;display:inline-block}.dplayer .dplayer-controller .dplayer-icons .dplayer-icon:hover{opacity:1}.dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-comment-icon{padding:10px 9px 9px}.dplayer .dplayer-controller .dplayer-icons .dplayer-icon.dplayer-setting-icon{padding-top:8.5px}.dplayer .dplayer-controller .dplayer-icons .dplayer-fill{fill:#fff}.dplayer .dplayer-controller .dplayer-icons .dplayer-volume{position:relative;display:inline-block;cursor:pointer!important;height:100%}.dplayer .dplayer-controller .dplayer-icons .dplayer-volume:hover .dplayer-volume-bar{width:45px!important}.dplayer .dplayer-controller .dplayer-icons .dplayer-volume:hover .dplayer-thumb{-webkit-transform:scale(1)!important;transform:scale(1)!important}.dplayer .dplayer-controller .dplayer-icons .dplayer-volume.dplayer-volume-active .dplayer-volume-bar{width:45px!important}.dplayer .dplayer-controller .dplayer-icons .dplayer-volume.dplayer-volume-active .dplayer-thumb{-webkit-transform:scale(1)!important;transform:scale(1)!important}.dplayer .dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap{display:inline-block;margin:0 5px 0 -5px;vertical-align:middle;height:100%}.dplayer .dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar{position:relative;top:17px;width:0;height:3px;background:#aaa;-webkit-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.dplayer .dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner{position:absolute;bottom:0;left:0;height:100%;-webkit-transition:all .1s ease;transition:all .1s ease;will-change:width}.dplayer .dplayer-controller .dplayer-icons .dplayer-volume .dplayer-volume-bar-wrap .dplayer-volume-bar .dplayer-volume-bar-inner .dplayer-thumb{position:absolute;top:0;right:5px;margin-top:-4px;margin-right:-10px;height:11px;width:11px;border-radius:50%;cursor:pointer!important;-webkit-transition:all .3s ease-in-out;transition:all .3s ease-in-out;-webkit-transform:scale(0);transform:scale(0)}.dplayer .dplayer-controller .dplayer-icons .dplayer-setting{display:inline-block;height:100%}.dplayer .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box{position:absolute;right:0;bottom:50px;-webkit-transform:translateX(170px);transform:translateX(170px);width:150px;height:120px;border-radius:2px;background:rgba(28,28,28,.9);padding:7px 0;-webkit-transition:all .3s ease-in-out;transition:all .3s ease-in-out;overflow:hidden;z-index:2}.dplayer .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box.dplayer-setting-box-open{-webkit-transform:translateX(0);transform:translateX(0)}.dplayer .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-box.dplayer-setting-box-narrow{width:70px;height:180px;text-align:center}.dplayer .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-item,.dplayer .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-speed-item{height:30px;padding:5px 10px;box-sizing:border-box;cursor:pointer}.dplayer .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-item:hover,.dplayer .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-speed-item:hover{background-color:hsla(0,0%,100%,.1)}.dplayer .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku{padding:5px 0}.dplayer .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-label{padding:0 10px;display:inline}.dplayer .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku:hover .dplayer-label{display:none}.dplayer .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku:hover .dplayer-danmaku-bar-wrap{display:inline-block}.dplayer .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku.dplayer-setting-danmaku-active .dplayer-label{display:none}.dplayer .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku.dplayer-setting-danmaku-active .dplayer-danmaku-bar-wrap{display:inline-block}.dplayer .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap{padding:0 10px;box-sizing:border-box;display:none;vertical-align:middle;height:100%;width:100%}.dplayer .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar{position:relative;top:8.5px;width:100%;height:3px;background:#fff;-webkit-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.dplayer .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar .dplayer-danmaku-bar-inner{position:absolute;bottom:0;left:0;height:100%;-webkit-transition:all .1s ease;transition:all .1s ease;background:#aaa;will-change:width}.dplayer .dplayer-controller .dplayer-icons .dplayer-setting .dplayer-setting-danmaku .dplayer-danmaku-bar-wrap .dplayer-danmaku-bar .dplayer-danmaku-bar-inner .dplayer-thumb{position:absolute;top:0;right:5px;margin-top:-4px;margin-right:-10px;height:11px;width:11px;border-radius:50%;cursor:pointer!important;-webkit-transition:all .3s ease-in-out;transition:all .3s ease-in-out;background:#aaa}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment{display:inline-block;height:100%}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment .dplayer-comment-box{position:absolute;right:0;bottom:50px;-webkit-transform:translateX(382px);transform:translateX(382px);border-radius:2px;-webkit-transition:all .3s ease-in-out;transition:all .3s ease-in-out;z-index:2}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment .dplayer-comment-box.dplayer-comment-box-open{-webkit-transform:translateX(0);transform:translateX(0)}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment .dplayer-comment-box .dplayer-comment-setting-icon{height:24px;width:24px;position:absolute;top:5px;left:7px;padding:0;opacity:1}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment .dplayer-comment-box .dplayer-comment-setting-icon:hover .dplayer-fill{fill:#aaa}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment .dplayer-comment-box .dplayer-comment-setting-icon .dplayer-fill{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;fill:#ddd}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment .dplayer-comment-box .dplayer-comment-setting-box{position:absolute;background:#fff;bottom:40px;left:-93px;box-shadow:0 0 25px rgba(0,0,0,.3);border-radius:4px;padding:10px 10px 16px;font-size:14px;width:204px;-webkit-transition:all .3s ease-in-out;transition:all .3s ease-in-out;-webkit-transform:scale(0);transform:scale(0)}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment .dplayer-comment-box .dplayer-comment-setting-box.dplayer-comment-setting-open{-webkit-transform:scale(1);transform:scale(1)}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment .dplayer-comment-box .dplayer-comment-setting-box:after{content:\'\';position:absolute;top:100%;left:50%;margin-left:-12px;background:url(\'data:image/svg+xml;utf8,\');width:24px;height:12px}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment .dplayer-comment-box .dplayer-comment-setting-box input[type=radio]{display:none}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment .dplayer-comment-box .dplayer-comment-setting-box label{cursor:pointer}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment .dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-title{font-size:14px;color:#555;padding:6px}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment .dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type{font-size:0}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment .dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type label:nth-child(2) span{border-radius:4px 0 0 4px}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment .dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type label:nth-child(4) span{border-radius:0 4px 4px 0}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment .dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type span{width:33%;padding:4px 6px;line-height:16px;display:inline-block;font-size:12px;color:#555;border:1px solid #e4e4e6;margin-right:-1px;box-sizing:border-box;text-align:center;cursor:pointer}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment .dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-type input:checked+span{background:#e4e4e6}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment .dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-color{font-size:0}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment .dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-color label{font-size:0;padding:6px;display:inline-block}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment .dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-color span{width:22px;height:22px;display:inline-block;border-radius:50%;box-sizing:border-box;cursor:pointer}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment .dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-color span:hover{-webkit-animation:my-face 5s infinite ease-in-out;animation:my-face 5s infinite ease-in-out;box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment .dplayer-comment-box .dplayer-comment-setting-box .dplayer-comment-setting-color input:checked+span{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12);border:none!important}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment .dplayer-comment-box .dplayer-comment-input{outline:none;border:none;padding:8px 31px;font-size:14px;line-height:18px;text-align:center;border-radius:4px;width:300px;background:#fff;margin:0;height:auto}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment .dplayer-comment-box .dplayer-send-icon{height:22px;width:22px;position:absolute;top:6px;right:7px;padding:0;opacity:1}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment .dplayer-comment-box .dplayer-send-icon:hover .dplayer-fill{fill:#aaa}.dplayer .dplayer-controller .dplayer-icons .dplayer-comment .dplayer-comment-box .dplayer-send-icon .dplayer-fill{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;fill:#ddd}.dplayer .dplayer-controller .dplayer-icons .dplayer-label{color:#eee;font-size:13px;display:inline-block;vertical-align:middle}.dplayer .dplayer-controller .dplayer-icons .dplayer-toggle{width:32px;height:100%;text-align:center;display:inline-block;font-size:0;vertical-align:middle;float:right}.dplayer .dplayer-controller .dplayer-icons .dplayer-toggle input{max-height:0;max-width:0;display:none}.dplayer .dplayer-controller .dplayer-icons .dplayer-toggle input+label{display:inline-block;position:relative;box-shadow:inset 0 0 0 0 #dfdfdf;border:1px solid #dfdfdf;height:20px;width:32px;border-radius:10px;box-sizing:border-box;cursor:pointer;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}.dplayer .dplayer-controller .dplayer-icons .dplayer-toggle input+label:after,.dplayer .dplayer-controller .dplayer-icons .dplayer-toggle input+label:before{content:"";position:absolute;display:block;height:18px;width:18px;top:0;left:0;border-radius:15px;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}.dplayer .dplayer-controller .dplayer-icons .dplayer-toggle input+label:after{background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.4)}.dplayer .dplayer-controller .dplayer-icons .dplayer-toggle input:checked+label{border-color:hsla(0,0%,100%,.5)}.dplayer .dplayer-controller .dplayer-icons .dplayer-toggle input:checked+label:before{width:30px;background:hsla(0,0%,100%,.5)}.dplayer .dplayer-controller .dplayer-icons .dplayer-toggle input:checked+label:after{left:12px}.dplayer .dplayer-menu{position:absolute;width:150px;border-radius:2px;background:rgba(28,28,28,.9);padding:5px 0;overflow:hidden;z-index:3;display:none}.dplayer .dplayer-menu.dplayer-menu-show{display:block}.dplayer .dplayer-menu .dplayer-menu-item{height:30px;padding:5px 10px;box-sizing:border-box;cursor:pointer}.dplayer .dplayer-menu .dplayer-menu-item:hover{background-color:hsla(0,0%,100%,.1)}.dplayer .dplayer-menu .dplayer-menu-item .dplayer-menu-label a{color:#eee;font-size:13px;display:inline-block;vertical-align:middle}@-webkit-keyframes my-face{2%{-webkit-transform:translateY(1.5px) rotate(1.5deg);transform:translateY(1.5px) rotate(1.5deg)}4%{-webkit-transform:translateY(-1.5px) rotate(-.5deg);transform:translateY(-1.5px) rotate(-.5deg)}6%{-webkit-transform:translateY(1.5px) rotate(-1.5deg);transform:translateY(1.5px) rotate(-1.5deg)}8%{-webkit-transform:translateY(-1.5px) rotate(-1.5deg);transform:translateY(-1.5px) rotate(-1.5deg)}10%{-webkit-transform:translateY(2.5px) rotate(1.5deg);transform:translateY(2.5px) rotate(1.5deg)}12%{-webkit-transform:translateY(-.5px) rotate(1.5deg);transform:translateY(-.5px) rotate(1.5deg)}14%{-webkit-transform:translateY(-1.5px) rotate(1.5deg);transform:translateY(-1.5px) rotate(1.5deg)}16%{-webkit-transform:translateY(-.5px) rotate(-1.5deg);transform:translateY(-.5px) rotate(-1.5deg)}18%{-webkit-transform:translateY(.5px) rotate(-1.5deg);transform:translateY(.5px) rotate(-1.5deg)}20%{-webkit-transform:translateY(-1.5px) rotate(2.5deg);transform:translateY(-1.5px) rotate(2.5deg)}22%{-webkit-transform:translateY(.5px) rotate(-1.5deg);transform:translateY(.5px) rotate(-1.5deg)}24%{-webkit-transform:translateY(1.5px) rotate(1.5deg);transform:translateY(1.5px) rotate(1.5deg)}26%{-webkit-transform:translateY(.5px) rotate(.5deg);transform:translateY(.5px) rotate(.5deg)}28%{-webkit-transform:translateY(.5px) rotate(1.5deg);transform:translateY(.5px) rotate(1.5deg)}30%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}32%{-webkit-transform:translateY(1.5px) rotate(-.5deg);transform:translateY(1.5px) rotate(-.5deg)}34%{-webkit-transform:translateY(1.5px) rotate(-.5deg);transform:translateY(1.5px) rotate(-.5deg)}36%{-webkit-transform:translateY(-1.5px) rotate(2.5deg);transform:translateY(-1.5px) rotate(2.5deg)}38%{-webkit-transform:translateY(1.5px) rotate(-1.5deg);transform:translateY(1.5px) rotate(-1.5deg)}40%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}42%{-webkit-transform:translateY(2.5px) rotate(-1.5deg);transform:translateY(2.5px) rotate(-1.5deg)}44%{-webkit-transform:translateY(1.5px) rotate(.5deg);transform:translateY(1.5px) rotate(.5deg)}46%{-webkit-transform:translateY(-1.5px) rotate(2.5deg);transform:translateY(-1.5px) rotate(2.5deg)}48%{-webkit-transform:translateY(-.5px) rotate(.5deg);transform:translateY(-.5px) rotate(.5deg)}50%{-webkit-transform:translateY(.5px) rotate(.5deg);transform:translateY(.5px) rotate(.5deg)}52%{-webkit-transform:translateY(2.5px) rotate(2.5deg);transform:translateY(2.5px) rotate(2.5deg)}54%{-webkit-transform:translateY(-1.5px) rotate(1.5deg);transform:translateY(-1.5px) rotate(1.5deg)}56%{-webkit-transform:translateY(2.5px) rotate(2.5deg);transform:translateY(2.5px) rotate(2.5deg)}58%{-webkit-transform:translateY(.5px) rotate(2.5deg);transform:translateY(.5px) rotate(2.5deg)}60%{-webkit-transform:translateY(2.5px) rotate(2.5deg);transform:translateY(2.5px) rotate(2.5deg)}62%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}64%{-webkit-transform:translateY(-.5px) rotate(1.5deg);transform:translateY(-.5px) rotate(1.5deg)}66%{-webkit-transform:translateY(1.5px) rotate(-.5deg);transform:translateY(1.5px) rotate(-.5deg)}68%{-webkit-transform:translateY(-1.5px) rotate(-.5deg);transform:translateY(-1.5px) rotate(-.5deg)}70%{-webkit-transform:translateY(1.5px) rotate(.5deg);transform:translateY(1.5px) rotate(.5deg)}72%{-webkit-transform:translateY(2.5px) rotate(1.5deg);transform:translateY(2.5px) rotate(1.5deg)}74%{-webkit-transform:translateY(-.5px) rotate(.5deg);transform:translateY(-.5px) rotate(.5deg)}76%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}78%{-webkit-transform:translateY(-.5px) rotate(1.5deg);transform:translateY(-.5px) rotate(1.5deg)}80%{-webkit-transform:translateY(1.5px) rotate(1.5deg);transform:translateY(1.5px) rotate(1.5deg)}82%{-webkit-transform:translateY(-.5px) rotate(.5deg);transform:translateY(-.5px) rotate(.5deg)}84%{-webkit-transform:translateY(1.5px) rotate(2.5deg);transform:translateY(1.5px) rotate(2.5deg)}86%{-webkit-transform:translateY(-1.5px) rotate(-1.5deg);transform:translateY(-1.5px) rotate(-1.5deg)}88%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}90%{-webkit-transform:translateY(2.5px) rotate(-.5deg);transform:translateY(2.5px) rotate(-.5deg)}92%{-webkit-transform:translateY(.5px) rotate(-.5deg);transform:translateY(.5px) rotate(-.5deg)}94%{-webkit-transform:translateY(2.5px) rotate(.5deg);transform:translateY(2.5px) rotate(.5deg)}96%{-webkit-transform:translateY(-.5px) rotate(1.5deg);transform:translateY(-.5px) rotate(1.5deg)}98%{-webkit-transform:translateY(-1.5px) rotate(-.5deg);transform:translateY(-1.5px) rotate(-.5deg)}0%,to{-webkit-transform:translate(0) rotate(0deg);transform:translate(0) rotate(0deg)}}@keyframes my-face{2%{-webkit-transform:translateY(1.5px) rotate(1.5deg);transform:translateY(1.5px) rotate(1.5deg)}4%{-webkit-transform:translateY(-1.5px) rotate(-.5deg);transform:translateY(-1.5px) rotate(-.5deg)}6%{-webkit-transform:translateY(1.5px) rotate(-1.5deg);transform:translateY(1.5px) rotate(-1.5deg)}8%{-webkit-transform:translateY(-1.5px) rotate(-1.5deg);transform:translateY(-1.5px) rotate(-1.5deg)}10%{-webkit-transform:translateY(2.5px) rotate(1.5deg);transform:translateY(2.5px) rotate(1.5deg)}12%{-webkit-transform:translateY(-.5px) rotate(1.5deg);transform:translateY(-.5px) rotate(1.5deg)}14%{-webkit-transform:translateY(-1.5px) rotate(1.5deg);transform:translateY(-1.5px) rotate(1.5deg)}16%{-webkit-transform:translateY(-.5px) rotate(-1.5deg);transform:translateY(-.5px) rotate(-1.5deg)}18%{-webkit-transform:translateY(.5px) rotate(-1.5deg);transform:translateY(.5px) rotate(-1.5deg)}20%{-webkit-transform:translateY(-1.5px) rotate(2.5deg);transform:translateY(-1.5px) rotate(2.5deg)}22%{-webkit-transform:translateY(.5px) rotate(-1.5deg);transform:translateY(.5px) rotate(-1.5deg)}24%{-webkit-transform:translateY(1.5px) rotate(1.5deg);transform:translateY(1.5px) rotate(1.5deg)}26%{-webkit-transform:translateY(.5px) rotate(.5deg);transform:translateY(.5px) rotate(.5deg)}28%{-webkit-transform:translateY(.5px) rotate(1.5deg);transform:translateY(.5px) rotate(1.5deg)}30%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}32%{-webkit-transform:translateY(1.5px) rotate(-.5deg);transform:translateY(1.5px) rotate(-.5deg)}34%{-webkit-transform:translateY(1.5px) rotate(-.5deg);transform:translateY(1.5px) rotate(-.5deg)}36%{-webkit-transform:translateY(-1.5px) rotate(2.5deg);transform:translateY(-1.5px) rotate(2.5deg)}38%{-webkit-transform:translateY(1.5px) rotate(-1.5deg);transform:translateY(1.5px) rotate(-1.5deg)}40%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}42%{-webkit-transform:translateY(2.5px) rotate(-1.5deg);transform:translateY(2.5px) rotate(-1.5deg)}44%{-webkit-transform:translateY(1.5px) rotate(.5deg);transform:translateY(1.5px) rotate(.5deg)}46%{-webkit-transform:translateY(-1.5px) rotate(2.5deg);transform:translateY(-1.5px) rotate(2.5deg)}48%{-webkit-transform:translateY(-.5px) rotate(.5deg);transform:translateY(-.5px) rotate(.5deg)}50%{-webkit-transform:translateY(.5px) rotate(.5deg);transform:translateY(.5px) rotate(.5deg)}52%{-webkit-transform:translateY(2.5px) rotate(2.5deg);transform:translateY(2.5px) rotate(2.5deg)}54%{-webkit-transform:translateY(-1.5px) rotate(1.5deg);transform:translateY(-1.5px) rotate(1.5deg)}56%{-webkit-transform:translateY(2.5px) rotate(2.5deg);transform:translateY(2.5px) rotate(2.5deg)}58%{-webkit-transform:translateY(.5px) rotate(2.5deg);transform:translateY(.5px) rotate(2.5deg)}60%{-webkit-transform:translateY(2.5px) rotate(2.5deg);transform:translateY(2.5px) rotate(2.5deg)}62%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}64%{-webkit-transform:translateY(-.5px) rotate(1.5deg);transform:translateY(-.5px) rotate(1.5deg)}66%{-webkit-transform:translateY(1.5px) rotate(-.5deg);transform:translateY(1.5px) rotate(-.5deg)}68%{-webkit-transform:translateY(-1.5px) rotate(-.5deg);transform:translateY(-1.5px) rotate(-.5deg)}70%{-webkit-transform:translateY(1.5px) rotate(.5deg);transform:translateY(1.5px) rotate(.5deg)}72%{-webkit-transform:translateY(2.5px) rotate(1.5deg);transform:translateY(2.5px) rotate(1.5deg)}74%{-webkit-transform:translateY(-.5px) rotate(.5deg);transform:translateY(-.5px) rotate(.5deg)}76%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}78%{-webkit-transform:translateY(-.5px) rotate(1.5deg);transform:translateY(-.5px) rotate(1.5deg)}80%{-webkit-transform:translateY(1.5px) rotate(1.5deg);transform:translateY(1.5px) rotate(1.5deg)}82%{-webkit-transform:translateY(-.5px) rotate(.5deg);transform:translateY(-.5px) rotate(.5deg)}84%{-webkit-transform:translateY(1.5px) rotate(2.5deg);transform:translateY(1.5px) rotate(2.5deg)}86%{-webkit-transform:translateY(-1.5px) rotate(-1.5deg);transform:translateY(-1.5px) rotate(-1.5deg)}88%{-webkit-transform:translateY(-.5px) rotate(2.5deg);transform:translateY(-.5px) rotate(2.5deg)}90%{-webkit-transform:translateY(2.5px) rotate(-.5deg);transform:translateY(2.5px) rotate(-.5deg)}92%{-webkit-transform:translateY(.5px) rotate(-.5deg);transform:translateY(.5px) rotate(-.5deg)}94%{-webkit-transform:translateY(2.5px) rotate(.5deg);transform:translateY(2.5px) rotate(.5deg)}96%{-webkit-transform:translateY(-.5px) rotate(1.5deg);transform:translateY(-.5px) rotate(1.5deg)}98%{-webkit-transform:translateY(-1.5px) rotate(-.5deg);transform:translateY(-1.5px) rotate(-.5deg)}0%,to{-webkit-transform:translate(0) rotate(0deg);transform:translate(0) rotate(0deg)}}',""]); 3 | },function(e,t){e.exports=function(){var e=[];return e.toString=function(){for(var e=[],t=0;t=0&&h.splice(t,1)}function i(e){var t=document.createElement("style");return t.type="text/css",l(e,t),t}function s(e){var t=document.createElement("link");return t.rel="stylesheet",l(e,t),t}function d(e,t){var a,n,r;if(t.singleton){var l=b++;a=v||(v=i(t)),n=p.bind(null,a,l,!1),r=p.bind(null,a,l,!0)}else e.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(a=s(t),n=c.bind(null,a),r=function(){o(a),a.href&&URL.revokeObjectURL(a.href)}):(a=i(t),n=m.bind(null,a),r=function(){o(a)});return n(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;n(e=t)}else r()}}function p(e,t,a,n){var r=a?"":n.css;if(e.styleSheet)e.styleSheet.cssText=x(t,r);else{var l=document.createTextNode(r),o=e.childNodes;o[t]&&e.removeChild(o[t]),o.length?e.insertBefore(l,o[t]):e.appendChild(l)}}function m(e,t){var a=t.css,n=t.media;if(n&&e.setAttribute("media",n),e.styleSheet)e.styleSheet.cssText=a;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(a))}}function c(e,t){var a=t.css,n=t.sourceMap;n&&(a+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(n))))+" */");var r=new Blob([a],{type:"text/css"}),l=e.href;e.href=URL.createObjectURL(r),l&&URL.revokeObjectURL(l)}var y={},u=function(e){var t;return function(){return"undefined"==typeof t&&(t=e.apply(this,arguments)),t}},g=u(function(){return/msie [6-9]\b/.test(window.navigator.userAgent.toLowerCase())}),f=u(function(){return document.head||document.getElementsByTagName("head")[0]}),v=null,b=0,h=[];e.exports=function(e,t){t=t||{},"undefined"==typeof t.singleton&&(t.singleton=g()),"undefined"==typeof t.insertAt&&(t.insertAt="bottom");var a=r(e);return n(a,t),function(e){for(var l=[],o=0;oa){return true}var r=e.duration+t.time-s;var o=e.duration*e.width/(e.width+i.width);return r>o}var a=i[t.mode];var r=0;var o=0;for(var d=1;d=m){o=d;break}if(h(u,t)){r=d}}var l=a[r].range;var c={range:l+t.height,time:this._hasMedia?t.time:t._utc,width:t.width,height:t.height};a.splice(r+1,o-r-1,c);if(t.mode==="bottom"){return this.height-t.height-l%this.height}return l%(this.height-t.height)};var n=function(t){var i=document.createElement("div");if(t.html===true){i.innerHTML=t.text}else{i.textContent=t.text}i.style.cssText="position:absolute;";if(t.style){for(var e in t.style){i.style[e]=t.style[e]}}return i};var h=function(){var t=["oTransform","msTransform","mozTransform","webkitTransform","transform"];var i=document.createElement("div").style;for(var e=0;ethis.duration){this.stage.removeChild(a.node);if(!this._hasMedia){a.node=null}this.runningList.splice(o,1)}}var d=[];var u=document.createDocumentFragment();while(this.position=i){break}a._utc=Date.now()/1e3;a.node=a.node||n(a);this.runningList.push(a);d.push(a);u.appendChild(a.node);++this.position}if(d.length){this.stage.appendChild(u)}for(o=0;o>1;a.node.style[h]="translate("+a.x+"px,"+a.y+"px)"}}for(o=0;o0&&n!==Infinity?Math.ceil(n):!!s.strokeStyle*1;e.font=s.font;t.width=t.width||Math.max(1,Math.ceil(e.measureText(t.text).width)+n*2);t.height=t.height||Math.ceil(m(s.font))+n*2;i.width=t.width;i.height=t.height;for(var h in s){e[h]=s[h]}var a=0;switch(s.textBaseline){case"top":case"hanging":a=n;break;case"middle":a=t.height>>1;break;default:a=t.height-n}if(s.strokeStyle){e.strokeText(t.text,n,a)}e.fillText(t.text,n,a);return i};var c=function(){this.stage.context.clearRect(0,0,this.width,this.height);var t=Date.now()/1e3;var i=this._hasMedia?this.media.currentTime:t;var e=this._hasMedia?this.media.playbackRate:1;var n=null;var h=0;var a=0;for(a=0;athis.duration){n.canvas=null;this.runningList.splice(a,1)}}while(this.position=i){break}n._utc=Date.now()/1e3;n.canvas=l(n);n.y=s.call(this,n);if(n.mode==="top"||n.mode==="bottom"){n.x=this.width-n.width>>1}this.runningList.push(n);++this.position}for(a=0;a>1;if(e>=t[s][i]){n=s}else{h=s}}if(t[n]&&e { 102 | return decodeURIComponent(window.escape(String.fromCharCode.apply(null, new Uint8Array(buf)))); 103 | } 104 | } 105 | } 106 | } 107 | 108 | function getEncoder () { 109 | if(window['TextEncoder']) { 110 | return new window['TextEncoder'](); 111 | } else { 112 | return { 113 | encode: (str) => { 114 | let buf = new ArrayBuffer(str.length); 115 | let bufView = new Uint8Array(buf); 116 | for (let i = 0, strlen = str.length; i < strlen; i++) { 117 | bufView[i] = str.charCodeAt(i); 118 | } 119 | return bufView; 120 | } 121 | } 122 | } 123 | } 124 | 125 | function mergeArrayBuffer(ab1, ab2) { 126 | var u81 = new Uint8Array(ab1), 127 | u82 = new Uint8Array(ab2), 128 | res = new Uint8Array(ab1.byteLength + ab2.byteLength); 129 | res.set(u81, 0); 130 | res.set(u82, ab1.byteLength); 131 | return res.buffer; 132 | } 133 | 134 | class DanmuSocket { 135 | 136 | constructor (roomid,domain,portobj) { 137 | const ws = window.location.protocol.indexOf('https') > -1 ? 'wss' : 'ws'; 138 | const port = portobj[ws]; 139 | this.connection = new WebSocket(ws + "://"+ domain +":"+ port +"/sub"); 140 | this.connection.binaryType = 'arraybuffer'; 141 | this.connection.onopen = this.firstConnection.bind(this); 142 | this.connection.onmessage = onMessage.bind(this); 143 | this.connection.onclose = onClose.bind(this); 144 | this.connection.onerror = onError.bind(this); 145 | this.roomid = roomid 146 | } 147 | 148 | firstConnection () { 149 | console.log("Danmu WebSocket Server Connected."); 150 | console.log("Handshaking..."); 151 | var token = JSON.stringify({ 152 | 'uid': 0, 153 | 'roomid': this.roomid 154 | }); 155 | var headerBuf = new ArrayBuffer(rawHeaderLen); 156 | var headerView = new DataView(headerBuf, 0); 157 | var bodyBuf = textEncoder.encode(token); 158 | headerView.setInt32(packetOffset, rawHeaderLen + bodyBuf.byteLength); 159 | headerView.setInt16(headerOffset, rawHeaderLen); 160 | headerView.setInt16(verOffset, 1); 161 | headerView.setInt32(opOffset, 7); 162 | headerView.setInt32(seqOffset, 1); 163 | this.connection.send(mergeArrayBuffer(headerBuf, bodyBuf)); 164 | } 165 | 166 | heartBeat () { 167 | var headerBuf = new ArrayBuffer(rawHeaderLen); 168 | var headerView = new DataView(headerBuf, 0); 169 | headerView.setInt32(packetOffset, rawHeaderLen); 170 | headerView.setInt16(headerOffset, rawHeaderLen); 171 | headerView.setInt16(verOffset, 1); 172 | headerView.setInt32(opOffset, 2); 173 | headerView.setInt32(seqOffset, 1); 174 | this.connection.send(headerBuf); 175 | } 176 | 177 | closeHeartBeat () { 178 | clearInterval(this.heartBeating); 179 | } 180 | 181 | send (data) { 182 | this.connection.send(data); 183 | } 184 | 185 | close () { 186 | this.connection.close(); 187 | } 188 | 189 | setListener (listener) { 190 | this._listener = listener; 191 | } 192 | 193 | } 194 | 195 | function onMessage (evt) { 196 | var data = evt.data; 197 | var dataView = new DataView(data, 0); 198 | var packetLen = dataView.getInt32(packetOffset); 199 | var headerLen = dataView.getInt16(headerOffset); 200 | var ver = dataView.getInt16(verOffset); 201 | var op = dataView.getInt32(opOffset); 202 | var seq = dataView.getInt32(seqOffset); 203 | 204 | switch(op) { 205 | case 8: 206 | this.heartBeat(); 207 | heartbeatInterval = setInterval(this.heartBeat.bind(this), 30 * 1000); 208 | break; 209 | case 3: 210 | // console.log("online: " + dataView.getInt32(16)); 211 | if (this._listener) this._listener('online', dataView.getInt32(16)); 212 | break; 213 | case 5: 214 | var packetView = dataView; 215 | var msg = data; 216 | var msgBody; 217 | for (var offset=0; offset')!==-1) {rank.replace('>', '>')} 285 | var msg = data.info[1]; 286 | // console.log(u_name,uid,lv,rank,msg); 287 | var comment_div = '
UL '+lv+'

用户等级:'+lv+'

排名:'+rank+'

'+u_name+' : '+msg+'
'; 288 | $(comment_div).appendTo('#chat-msg-list'); 289 | if($('#chat-msg-list').children().length>100) 290 | $('#chat-msg-list').children(':first').remove(); 291 | $("#chat-msg-list").scrollTop($("#chat-msg-list")[0].scrollHeight); 292 | } 293 | } 294 | 295 | function danmuListener(content_type, content){ 296 | if(content_type==='online'){ 297 | if(window.dom_changed===undefined){ 298 | $('#h5_player').prev().appendTo('#js-player-decorator'); 299 | window.dom_changed = true; 300 | } 301 | change_online(content) 302 | }else if(content_type==='msg'){ 303 | var content_obj = JSON.parse(content); 304 | emit_danmu(content_obj); 305 | append_danmu(content_obj); 306 | } 307 | } 308 | 309 | function init_danmaku() { 310 | window.df_danmaku = new Danmaku(); 311 | df_danmaku.init({ 312 | container: $('#js-player-decorator')[0], 313 | video: $("#h5_player")[0], 314 | engine:'canvas' 315 | }); 316 | $('canvas')[0].style.position = 'absolute'; 317 | 318 | // send danmu 319 | function send_danmu(){ 320 | var msg = $("#df-danmu-textbox").val(); 321 | var xhr = new XMLHttpRequest(); 322 | // xhr.open('get', 'https://localhost:9527/proxy/https://live.bilibili.com/msg/send/'+msg+'?roomid='+room_id); 323 | // xhr.setRequestHeader('X-Cookie', document.cookie); 324 | xhr.open('POST', 'http://live.bilibili.com/msg/send'); 325 | xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded') 326 | xhr.send($.param({ 327 | color: 16777215, 328 | fontsize: 25, 329 | mode: 1, 330 | msg: msg, 331 | rnd: Math.floor(Date.now() / 1000), 332 | roomid: room_id 333 | })); 334 | } 335 | $("#danmu-textbox").off('keypress'); 336 | $("#danmu-textbox").off('keyup'); 337 | $("#danmu-textbox").off('keydown'); 338 | $("#danmu-send-btn").off('click'); 339 | 340 | $("#danmu-textbox")[0].id = 'df-danmu-textbox'; 341 | $("#danmu-send-btn")[0].id = 'df-danmu-send-btn'; 342 | $("#df-danmu-textbox").on('keyup', function (e) { 343 | if(e.keyCode == 13){ 344 | e.preventDefault(); 345 | send_danmu(); 346 | $("#df-danmu-textbox").val(''); 347 | return false; 348 | } 349 | return true; 350 | }); 351 | $("#df-danmu-send-btn").on('click', function (e) { 352 | e.preventDefault(); 353 | send_danmu(); 354 | $("#df-danmu-textbox").val(''); 355 | }); 356 | } 357 | 358 | function set_danmu_control(){ 359 | if(location.pathname==='/'){ 360 | return; 361 | } 362 | 363 | var control_btn = $(""); 364 | control_btn.css('border-radius', '5px'); 365 | control_btn.css('font-size', '12px'); 366 | control_btn.height('21px'); 367 | control_btn.appendTo('.room-info.tag-ctnr.v-top'); 368 | control_btn.on('click', function () { 369 | if(control_btn.text()=='打开弹幕'){ 370 | control_btn.text('关闭弹幕'); 371 | $('canvas')[0].style.display = 'block'; 372 | }else{ 373 | $('canvas')[0].style.display = 'none'; 374 | control_btn.text('打开弹幕'); 375 | } 376 | }); 377 | } -------------------------------------------------------------------------------- /backend/rules/not_match_script.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by jeff on 17-2-17. 3 | */ 4 | alert('没有找到匹配的规则。'); -------------------------------------------------------------------------------- /backend/rules/sohu/__init__.py: -------------------------------------------------------------------------------- 1 | from tornado.gen import coroutine, Return 2 | import os 3 | 4 | __all__ = ['script', 'proxy'] 5 | _file_path = os.path.abspath(os.path.dirname(__file__)) 6 | 7 | 8 | @coroutine 9 | def script(url, request_handler): 10 | if url.find('tv.sohu.com') != -1: 11 | script_path = os.path.join(_file_path, 'sohu_html5.js') 12 | with open(script_path, 'r') as f: 13 | content = f.read() 14 | request_handler.write(content) 15 | yield request_handler.flush() 16 | raise Return(True) 17 | raise Return(False) 18 | 19 | 20 | def proxy(url, request_handler): 21 | if url.startswith('http://m.tv.sohu.com'): 22 | real_url = request_handler.request.uri.split('/proxy/')[1] 23 | headers = {} 24 | for n, v in request_handler.request.headers.items(): 25 | headers[n] = v 26 | headers['Host'] = url.split('/')[2] 27 | if headers.get('Origin') is not None: 28 | del headers['Origin'] 29 | 30 | import requests 31 | for _ in range(10): 32 | res = requests.get(real_url, headers=headers) 33 | if res.status_code == 200: 34 | break 35 | else: 36 | if _ == 10: 37 | break 38 | res.close() 39 | continue 40 | 41 | request_handler.set_header('Set-Cookie', res.headers.get('Set-Cookie')) 42 | request_handler.set_header('Content-Type', 'application/json') 43 | request_handler.write(res.text) 44 | request_handler.flush() 45 | return True 46 | 47 | if url.startswith('http://hot.vrs.sohu.com/'): 48 | real_url = request_handler.request.uri.split('/proxy/')[1] 49 | headers = {} 50 | for n, v in request_handler.request.headers.items(): 51 | headers[n] = v 52 | headers['Host'] = url.split('/')[2] 53 | headers['Origin'] = 'http://m.tv.sohu.com' 54 | 55 | import requests 56 | for _ in range(10): 57 | res = requests.get(real_url, headers=headers) 58 | if res.status_code == 200: 59 | break 60 | else: 61 | if _ == 10: 62 | break 63 | res.close() 64 | continue 65 | 66 | r_headers = {n: v for n, v in res.headers.items() if not n.startswith('Access') and n.find('Encoding') == -1} 67 | for n, v in r_headers.items(): 68 | request_handler.set_header(n, v) 69 | result = add_proxy_to_m3u8(res.text) 70 | request_handler.write(result) 71 | request_handler.finish() 72 | return True 73 | 74 | if url.startswith('sohum3u8/'): 75 | real_url = request_handler.request.uri.split('/sohum3u8/')[1] 76 | headers = {} 77 | for n, v in request_handler.request.headers.items(): 78 | headers[n] = v 79 | headers['Host'] = real_url.split('/')[2] 80 | headers['Origin'] = 'http://m.tv.sohu.com' 81 | if headers.get('X-Cookie') is not None: 82 | headers['Cookie'] = headers.get('X-Cookie') 83 | del headers['X-Cookie'] 84 | if headers.get('DNT') is not None: 85 | del headers['DNT'] 86 | headers['Referer'] = 'http://m.tv.sohu.com/v3357313.shtml?aid=9142496&channeled=1210010100&columnid=1' 87 | headers['X-Playback-Session-Id'] = '81548AAF-40DF-46F9-8FC1-D991E7B3C376' 88 | headers['User-Agent'] = 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_2_1 like Mac OS X) AppleWebKit/602.4.6 (KHTML, like Gecko) Version/10.0 Mobile/14D27 Safari/602.1' 89 | 90 | import requests 91 | for _ in range(10): 92 | res = requests.get(real_url, stream=True, headers=headers) 93 | if res.status_code == 200: 94 | break 95 | else: 96 | if _ == 9: 97 | break 98 | res.close() 99 | continue 100 | 101 | r_headers = {n: v for n, v in res.headers.items() if not n.startswith('Access')} 102 | if r_headers.get('Transfer-Encoding') is not None: 103 | del r_headers['Transfer-Encoding'] 104 | for n, v in r_headers.items(): 105 | request_handler.set_header(n, v) 106 | try: 107 | for chunk in res.iter_content(4096): 108 | if not chunk: 109 | break 110 | request_handler.write(chunk) 111 | request_handler.flush() 112 | finally: 113 | res.close() 114 | request_handler.finish() 115 | return True 116 | return False 117 | 118 | 119 | def add_proxy_to_m3u8(m3u8_content): 120 | import io 121 | buf = io.StringIO(m3u8_content) 122 | result = io.StringIO() 123 | while True: 124 | line = buf.readline() 125 | if not line: 126 | break 127 | if line.startswith('http://'): 128 | line = 'https://localhost:9527/proxy/sohum3u8/' + line 129 | result.write(line) 130 | result.seek(0) 131 | return result.read() 132 | -------------------------------------------------------------------------------- /backend/rules/sohu/sohu_html5.js: -------------------------------------------------------------------------------- 1 | var api_link = 'http://m.tv.sohu.com/phone_playinfo?'; 2 | var params = { 3 | vid: vid, 4 | site: 1, 5 | appid: 'tv', 6 | api_key: 'f351515304020cad28c92f70f002261c', 7 | plat: 17, 8 | sver: 1.0, 9 | partner: 1, 10 | uid: (new Date()).getTime() * 1000, 11 | muid: (new Date()).getTime() * 1000, 12 | _c: 1, 13 | pt: 3, 14 | qd: 680, 15 | src: 11050001, 16 | _: (new Date()).getTime() 17 | }; 18 | var url = api_link + $.param(params); 19 | 20 | var proxy_root = 'https://localhost:9527'; 21 | $.getScript(proxy_root + '/util/get_hlsjs/', function() { 22 | get_info_and_add_video(); 23 | }); 24 | 25 | function get_info_and_add_video(){ 26 | var xhr = new XMLHttpRequest(); 27 | xhr.open('GET', 'https://localhost:9527/proxy/' + url); 28 | xhr.onreadystatechange = function () { 29 | if(xhr.readyState===4 && xhr.status===200){ 30 | add_video(xhr.responseText); 31 | } 32 | } 33 | xhr.send(); 34 | } 35 | 36 | function add_video(data) { 37 | var video_data = JSON.parse(data).data; 38 | var w = $("#player").width(); 39 | var h = $("#player").height(); 40 | var h5_player = document.createElement('video'); 41 | $(h5_player).width(w); 42 | $(h5_player).height(h); 43 | $("#player").replaceWith(h5_player); 44 | h5_player.setAttribute('controls', 'controls'); 45 | h5_player.setAttribute('autoplay', 'true'); 46 | $('#phone-download').children().remove(); 47 | var video_urls = { 48 | 'blue': video_data.url_blue, 49 | 'super': video_data.urls.m3u8.sup[0], 50 | 'high': video_data.urls.m3u8.hig[0], 51 | 'low': video_data.urls.m3u8.nor[0] 52 | }; 53 | for (var index in video_urls) { 54 | if (video_urls[index] !== undefined) { 55 | var url = proxy_root + '/proxy/' + video_urls[index]; 56 | var btn = document.createElement('button'); 57 | btn.textContent = index; 58 | btn.className = 'ctl_btn'; 59 | btn.setAttribute('df-index', index); 60 | btn.setAttribute('df-url', url); 61 | $(btn).appendTo('#phone-download'); 62 | } 63 | } 64 | $('.ctl_btn').on('click', function() { 65 | if (Hls.isSupported()) { 66 | if (window.video_hls !== undefined) { 67 | window.video_hls.detachMedia(); 68 | window.video_hls.destroy(); 69 | } 70 | window.video_hls = new Hls(); 71 | video_hls.loadSource($(this).attr('df-url')); 72 | video_hls.config.xhrSetup = function(xhr, url){ 73 | xhr.setRequestHeader('X-Cookie', document.cookie); 74 | } 75 | video_hls.attachMedia(h5_player); 76 | video_hls.on(Hls.Events.MANIFEST_PARSED, function() { 77 | video.play(); 78 | }); 79 | } 80 | }); 81 | } -------------------------------------------------------------------------------- /backend/rules/youku/__init__.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | import os 3 | from tornado.gen import coroutine, Return 4 | from tornado.httpclient import HTTPClient, HTTPError 5 | 6 | __all__ = ['script', 'proxy'] 7 | _file_path = os.path.abspath(os.path.dirname(__file__)) 8 | 9 | 10 | @coroutine 11 | def script(url_path, request_handler): 12 | """ 13 | :type url_path: str 14 | :type request_handler: tornado.web.RequestHandler 15 | :rtype: bool 16 | """ 17 | if not url_path.startswith('http://v.youku.com/v_show/'): 18 | raise Return(False) 19 | 20 | script_path = os.path.join(_file_path, 'youku_html5.js') 21 | with open(script_path, 'r') as f: 22 | content = f.read() 23 | request_handler.write(content) 24 | yield request_handler.flush() 25 | raise Return(True) 26 | 27 | 28 | def proxy(url_path, request_handler): 29 | """ 30 | :type url_path: str 31 | :type request_handler: tornado.web.RequestHandler 32 | :rtype: bool 33 | """ 34 | if url_path.startswith('http://play-ali.youku.com/play/get.json'): 35 | real_url = request_handler.request.uri.split('/proxy/')[1] 36 | headers = {} 37 | for n, v in request_handler.request.headers.items(): 38 | headers[n] = v 39 | headers['Referer'] = 'http://m.youku.com/video/id_{}.html'.format(real_url[real_url.rfind('?vid=') + 5:-5]) 40 | headers['Origin'] = 'http://m.youku.com' 41 | headers['Host'] = url_path.split('/')[2] 42 | headers['Cookie'] = headers.get('X-Cookie') 43 | del headers['X-Cookie'] 44 | 45 | conn = HTTPClient() 46 | for _ in range(10): 47 | try: 48 | res = conn.fetch(real_url, headers=headers) 49 | except HTTPError: 50 | continue 51 | else: 52 | break 53 | request_handler.write(res.body) 54 | request_handler.flush() 55 | return True 56 | if url_path.startswith('http://k.youku.com/player/getFlvPath/'): 57 | real_url = request_handler.request.uri.split('/proxy/')[1] 58 | headers = {} 59 | for n, v in request_handler.request.headers.items(): 60 | headers[n] = v 61 | headers['Host'] = url_path.split('/')[2] 62 | headers['Origin'] = 'http://m.youku.com' 63 | 64 | import requests 65 | for _ in range(10): 66 | res = requests.get(real_url, stream=True, headers=headers) 67 | if res.status_code == 200: 68 | break 69 | else: 70 | if _ == 10: 71 | break 72 | res.close() 73 | continue 74 | 75 | r_headers = {n: v for n, v in res.headers.items() if not n.startswith('Access')} 76 | for n, v in r_headers.items(): 77 | request_handler.set_header(n, v) 78 | try: 79 | for chunk in res.iter_content(4096): 80 | if not chunk: 81 | break 82 | request_handler.write(chunk) 83 | request_handler.flush() 84 | finally: 85 | request_handler.finish() 86 | return True 87 | 88 | return False 89 | 90 | -------------------------------------------------------------------------------- /backend/rules/youku/youku_html5.js: -------------------------------------------------------------------------------- 1 | /**********************/ 2 | /*get info from iframe*/ 3 | /**********************/ 4 | var YKP_userCache; 5 | function add_iframe () { 6 | var page_name = location.pathname.split('/')[2]; 7 | var m_url = 'http://m.youku.com/video/' + page_name; 8 | var m_iframe = document.createElement('iframe'); 9 | m_iframe.id = 'mobile_iframe'; 10 | m_iframe.setAttribute('name', 'mobile_iframe'); 11 | m_iframe.src = m_url; 12 | document.body.appendChild(m_iframe); 13 | m_iframe.onload = function () { 14 | YKP_userCache = document.mobile_iframe.YKP.userCache; 15 | m_iframe.remove(); 16 | init_and_start(); 17 | } 18 | } 19 | 20 | add_iframe(); 21 | 22 | 23 | /**********************/ 24 | /* get video source */ 25 | /**********************/ 26 | function translate(a, b) { 27 | for (var c = [], d = 0; d < a.length; d++) { 28 | var e = 0; 29 | e = a[d] >= "a" && a[d] <= "z" ? a[d].charCodeAt(0) - "a".charCodeAt(0) : a[d] - "0" + 26; 30 | for (var f = 0; f < 36; f++) 31 | if (b[f] == e) { 32 | e = f; 33 | break 34 | } 35 | e > 25 ? c[d] = e - 26 : c[d] = String.fromCharCode(e + 97) 36 | } 37 | return c.join("") 38 | } 39 | 40 | function rc4(a, b) { 41 | for (var c, d = [], e = 0, f = "", g = 0; g < 256; g++) 42 | d[g] = g; 43 | for (g = 0; g < 256; g++) 44 | e = (e + d[g] + a.charCodeAt(g % a.length)) % 256, 45 | c = d[g], 46 | d[g] = d[e], 47 | d[e] = c; 48 | g = 0, 49 | e = 0; 50 | for (var h = 0; h < b.length; h++) 51 | g = (g + 1) % 256, 52 | e = (e + d[g]) % 256, 53 | c = d[g], 54 | d[g] = d[e], 55 | d[e] = c, 56 | f += String.fromCharCode(b.charCodeAt(h) ^ d[(d[g] + d[e]) % 256]); 57 | return f 58 | } 59 | 60 | function encode64 (a) { 61 | if (!a) 62 | return ""; 63 | a = a.toString(); 64 | var b, c, d, e, f, g, h = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 65 | for (d = a.length, 66 | c = 0, 67 | b = ""; c < d;) { 68 | if (e = 255 & a.charCodeAt(c++), 69 | c == d) { 70 | b += h.charAt(e >> 2), 71 | b += h.charAt((3 & e) << 4), 72 | b += "=="; 73 | break 74 | } 75 | if (f = a.charCodeAt(c++), 76 | c == d) { 77 | b += h.charAt(e >> 2), 78 | b += h.charAt((3 & e) << 4 | (240 & f) >> 4), 79 | b += h.charAt((15 & f) << 2), 80 | b += "="; 81 | break 82 | } 83 | g = a.charCodeAt(c++), 84 | b += h.charAt(e >> 2), 85 | b += h.charAt((3 & e) << 4 | (240 & f) >> 4), 86 | b += h.charAt((15 & f) << 2 | (192 & g) >> 6), 87 | b += h.charAt(63 & g) 88 | } 89 | return b 90 | } 91 | 92 | function xhr_with_callback(url, callback, xheader, method){ 93 | if(method===undefined) 94 | method = 'GET'; 95 | 96 | var xhr = new XMLHttpRequest(); 97 | xhr.onreadystatechange = function(){ 98 | if(xhr.readyState==4 && xhr.status==200){ 99 | callback(xhr.responseText); 100 | } 101 | }; 102 | xhr.open(method, url); 103 | for(var name in xheader) { 104 | xhr.setRequestHeader(name, xheader[name]); 105 | } 106 | xhr.send(); 107 | } 108 | 109 | var proxy_root = 'https://localhost:9527'; 110 | var get_stream_url= proxy_root+'/proxy/http://play-ali.youku.com/play/get.json?vid='+location.href.match(/id_.*html/)[0].slice(3,-5)+'&ct=10'; 111 | var get_ip_url = proxy_root+'/util/get_ip/'; 112 | var flvjs_url = proxy_root+'/util/get_flvjs/'; 113 | var stream_data, my_ip; 114 | 115 | function init_and_start(){ 116 | xhr_with_callback(get_ip_url, function(resText){ 117 | var data = JSON.parse(resText.toString()); 118 | var ip_arr = data.ip.split('.'); 119 | var result = ''; 120 | for (var i of ip_arr) { 121 | result += ("000000000"+parseInt(i, 10).toString(2)).slice(-8); 122 | } 123 | my_ip = parseInt(result, 2); 124 | 125 | xhr_with_callback(get_stream_url, function(resText){ 126 | var data = JSON.parse(resText.toString()); 127 | stream_data = data.data; 128 | //xhr_with_callback(flvjs_url, function(resText){ 129 | //eval(resText); 130 | add_video_into_arr(); 131 | //}); 132 | }, {'X-Cookie': document.cookie}); 133 | }); 134 | } 135 | 136 | function getVideoSrc(index_of_stream, index_of_segs, stream_data, stream_type, file_id, f, g) { 137 | var h = stream_data.stream[index_of_stream]; 138 | var i = stream_data.video.encodeid; 139 | if(!i || !stream_type) 140 | return; 141 | var j = { 142 | flv: 0, 143 | flvhd: 0, 144 | mp4hd: 1, 145 | mp4hd2: 2, 146 | mp4hd3: 3, 147 | "3gphd": 0, 148 | "3gp": 0 149 | }, 150 | k = j[stream_type], 151 | l = { 152 | flv: "flv", 153 | mp4hd: "mp4", 154 | mp4hd2: "flv", 155 | mp4hd3: "flv", 156 | "3gphd": "mp4", 157 | "3gp": "flv", 158 | flvhd: "flv" 159 | }, 160 | m = l[stream_type], 161 | n = index_of_segs.toString(16); 162 | 1 == n.length && (n = "0" + n); 163 | var o = h.segs[index_of_segs].total_milliseconds_video / 1e3; 164 | var a4 = 'boa4', e = file_id, p = h.segs[index_of_segs].key; 165 | "" != p && p != -1 || (p = h.key2 + h.key1); 166 | var q = ""; 167 | stream_data.show && (q = stream_data.show.pay ? "&ypremium=1" : "&ymovie=1"); 168 | var r = "/player/getFlvPath/sid/" + YKP_userCache.sid + "_" + n + "/st/" + m + "/fileid/" + e + "?K=" + p + "&hd=" + k + "&myp=0&ts=" + o + "&ypp=0" + q; 169 | 170 | var s = [19, 1, 4, 7, 30, 14, 28, 8, 24, 17, 6, 35, 34, 16, 9, 10, 13, 22, 32, 29, 31, 21, 18, 3, 2, 23, 25, 27, 11, 20, 5, 15, 12, 0, 33, 26]; 171 | var t = encodeURIComponent(encode64(rc4(translate(a4 + 'poz' + YKP_userCache.a2, s).toString(), YKP_userCache.sid + "_" + e + "_" + YKP_userCache.token))) 172 | r += "&ep=" + t; 173 | r += "&ctype=12"; 174 | r += "&ev=1"; 175 | r += "&token=" + YKP_userCache.token; 176 | r += "&oip=" + my_ip; 177 | r += (f ? "/password/" + f : "") + (g ? g : ""); 178 | r = "//k.youku.com" + r; 179 | return r; 180 | } 181 | 182 | 183 | var video_arr = []; 184 | 185 | function add_video_into_arr () { 186 | for(var stream_index in stream_data.stream){ 187 | var one_stream = stream_data.stream[stream_index]; 188 | var segs = one_stream.segs; 189 | 190 | var a_type_of_video = {} 191 | a_type_of_video.size = one_stream.size; 192 | a_type_of_video.audio_lang = one_stream.audio_lang; 193 | a_type_of_video.ms_v = one_stream.milliseconds_video; 194 | a_type_of_video.ms_a = one_stream.milliseconds_audio; 195 | a_type_of_video.width = one_stream.width; 196 | a_type_of_video.height = one_stream.height; 197 | a_type_of_video.protocol = one_stream.transfer_mode; 198 | a_type_of_video.stream_type = one_stream.stream_type; 199 | a_type_of_video.is_flv = segs[0].path.indexOf('/flv/')!==-1?true:false; 200 | a_type_of_video.segments = [] 201 | for(var seg_index in segs){ 202 | var one_seg = segs[seg_index]; 203 | var one_video = {}; 204 | one_video.duration = parseInt(one_seg.total_milliseconds_video); 205 | one_video.filesize = parseInt(one_seg.size); 206 | var real_url = getVideoSrc(stream_index, seg_index, stream_data, one_stream.stream_type, one_seg.fileid); 207 | one_video.url = proxy_root+'/proxy/http:' + real_url; 208 | a_type_of_video.segments.push(one_video); 209 | } 210 | video_arr.push(a_type_of_video); 211 | } 212 | set_video(); 213 | } 214 | 215 | 216 | 217 | /**********************/ 218 | /* set video area */ 219 | /**********************/ 220 | function set_video () { 221 | var btn_div = document.createElement('div'); 222 | var video_div = document.createElement('div'); 223 | var video_dom = document.createElement('video'); 224 | var player = document.getElementById('player'); 225 | btn_div.style.textAlign = 'center'; 226 | video_div.textAlign = 'center'; 227 | video_dom.id = 'modal_player'; 228 | video_dom.setAttribute('controls', 'controls'); 229 | video_dom.setAttribute('autoplay', 'autoplay'); 230 | document.querySelector('div.base_info').appendChild(btn_div); 231 | document.getElementById('vpactionv5_wrap').remove(); 232 | video_div.appendChild(video_dom); 233 | video_dom.style.width = player.clientWidth + 'px'; 234 | video_dom.style.height = player.clientHeight + 'px'; 235 | 236 | player.children[0].remove(); 237 | player.appendChild(video_div); 238 | 239 | for(var video_index in video_arr){ 240 | var stream_type = video_arr[video_index].stream_type; 241 | if(stream_type == 'mp4hd') 242 | continue; 243 | var btn_title; 244 | switch(stream_type){ 245 | case 'flvhd': 246 | btn_title='low'; break; 247 | case 'mp4hd2': 248 | btn_title='high'; break; 249 | case 'mp4hd3': 250 | btn_title='super'; break; 251 | } 252 | var btn = document.createElement('button'); 253 | btn.textContent = btn_title; 254 | btn.id = 'btn-' + video_index; 255 | btn.className = 'video-btn'; 256 | btn.style.marginLeft = '10px'; 257 | btn_div.appendChild(btn); 258 | } 259 | 260 | for(var btn of document.getElementsByClassName('video-btn')){ 261 | btn.onclick = function(){ 262 | if(window.currentPlayer!==undefined) 263 | window.currentPlayer.destroy(); 264 | var this_id = this.id; 265 | var video_index = parseInt(this_id.slice(this_id.indexOf('-')+1)); 266 | var current_stream = video_arr[video_index]; 267 | if (flvjs.isSupported()) { 268 | var videoElement = video_dom; 269 | window.currentPlayer = flvjs.createPlayer({ 270 | type: current_stream.is_flv?'flv':'mp4', 271 | filesize: parseInt(current_stream.size), 272 | duration: parseInt(current_stream.ms_v), 273 | segments: current_stream.segments 274 | }); 275 | currentPlayer.attachMediaElement(videoElement); 276 | currentPlayer.load(); 277 | currentPlayer.play(); 278 | } 279 | }; 280 | } 281 | } -------------------------------------------------------------------------------- /monkey_script.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name disflash——取代 flash 计划 3 | // @namespace https://www.kindjeff.com/ 4 | // @version 2017.2.21 5 | // @description disflash 计划:https://github.com/sljeff/disflash 6 | // @author kindJeff 7 | // @match http://v.youku.com/v_show/* 8 | // @match http://live.bilibili.com/* 9 | // @match https://live.bilibili.com/* 10 | // @match http://www.acfun.cn/* 11 | // @match http://m.acfun.cn/* 12 | // @match http://v.yinyuetai.com/video/* 13 | // @match http://tv.sohu.com/*.shtml* 14 | // @match http://my.tv.sohu.com/*.shtml* 15 | // @include *://v.qq.com/* 16 | // @include *://lol.qq.com/v/* 17 | // @include *://film.qq.com/* 18 | // @include *://view.inews.qq.com/* 19 | // @require https://localhost:9527/util/get_flvjs/ 20 | // run-at document-start 21 | // @grant none 22 | // ==/UserScript== 23 | 24 | function main(){ 25 | setTimeout(function(){ 26 | s=document.body.appendChild(document.createElement('script')); 27 | s.src='https://localhost:9527/getscript/' + location.href; 28 | }, 2000); 29 | } 30 | 31 | if(location.href.indexOf('.qq.com/')!==-1){ 32 | Object.defineProperty(navigator, 'plugins', { 33 | get: function () { 34 | return { length: 0 }; 35 | } 36 | }); 37 | Object.defineProperty(navigator,"userAgent",{ 38 | value:"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10; rv:48.0) Gecko/20100101 Firefox/48.0", 39 | writable:false, 40 | configurable:false, 41 | enumerable:true 42 | }); 43 | } 44 | 45 | else if(location.href.indexOf('.acfun.cn')!==-1){ 46 | //noinspection JSAnnotator 47 | document.domain = 'acfun.cn'; 48 | main(); 49 | } 50 | 51 | else if(location.href.indexOf('v.yinyuetai.com/')!==-1){ 52 | if(location.href.indexOf('/h5/')===-1){ 53 | var href_arr = location.href.split('/'); 54 | var vid = href_arr[href_arr.length-1] || href_arr[href_arr.length-2]; 55 | window.location = 'http://v.yinyuetai.com/video/h5/' + vid; 56 | } 57 | } 58 | 59 | else{ 60 | main(); 61 | } -------------------------------------------------------------------------------- /show_pic/acfun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sljeff/disflash/6d442971b8ebea179b5506a4aa32e70367b91aab/show_pic/acfun.png -------------------------------------------------------------------------------- /show_pic/bilive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sljeff/disflash/6d442971b8ebea179b5506a4aa32e70367b91aab/show_pic/bilive.png -------------------------------------------------------------------------------- /show_pic/sohu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sljeff/disflash/6d442971b8ebea179b5506a4aa32e70367b91aab/show_pic/sohu.png -------------------------------------------------------------------------------- /show_pic/vqq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sljeff/disflash/6d442971b8ebea179b5506a4aa32e70367b91aab/show_pic/vqq.png -------------------------------------------------------------------------------- /show_pic/yinyuetai.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sljeff/disflash/6d442971b8ebea179b5506a4aa32e70367b91aab/show_pic/yinyuetai.png -------------------------------------------------------------------------------- /show_pic/youku.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sljeff/disflash/6d442971b8ebea179b5506a4aa32e70367b91aab/show_pic/youku.png --------------------------------------------------------------------------------