Greasy Fork 还支持 简体中文。

FloatingPlayer

FloatingPlayer!悬浮窗

目前為 2022-09-14 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name FloatingPlayer
  3. // @namespace https://greasyfork.org/zh-CN/scripts/449323/
  4. // @version 0.9.3
  5. // @description FloatingPlayer!悬浮窗
  6. // @author Ylanty
  7. // @license GPLv3
  8. // @match http*://*/*
  9. // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgNzkuYTg3MzFiOSwgMjAyMS8wOS8wOS0wMDozNzozOCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIzLjAgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMi0wNy0yM1QyMTozMzo0MiswODowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjItMDctMjlUMTY6NTk6MjgrMDg6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjItMDctMjlUMTY6NTk6MjgrMDg6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmViNWUxNzAxLTIzNTYtYWI0NS1hNThhLWNjODA2NGRiZWQzYiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDplYjVlMTcwMS0yMzU2LWFiNDUtYTU4YS1jYzgwNjRkYmVkM2IiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDplYjVlMTcwMS0yMzU2LWFiNDUtYTU4YS1jYzgwNjRkYmVkM2IiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmViNWUxNzAxLTIzNTYtYWI0NS1hNThhLWNjODA2NGRiZWQzYiIgc3RFdnQ6d2hlbj0iMjAyMi0wNy0yM1QyMTozMzo0MiswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIzLjAgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PoBFavEAAAJ5SURBVEiJtZZNSFRRGIYfwyKYTSudJlfa2pkCEWtRlqFtLjZabkqkP9oEZRH9oQiVuIiMAhnMZeCNfsYxSTOTCSa1UjIqghJ/R8tQR0ObmWq+Fnab6XIdnTFfOHD4zj3vc97DOffeBBFhJbXKqLj5DvnX3/Dg3STf2r30nfRwzaqixEUQkX9aer0ot95Lq+jUNiJ9O5xyML1eFP2caM0QMB0IG/8Khfu+gMj5TnHEAjEEaIZnO6TGpkr+aY/cmPKHQW6vDOY0yOGlgKICNqmSr9WynVLSNix92thMUKSsS+qsi0CiAvQrTK8X5VyHOHwRW+gZE2+uS44ulMbwFC2k3iJcTYM02Zs55B5lAGCLGcu9PByFaRTYjE5aLAn0z13slNqZYDhN52cZ290oxyLnxZRAn8Y1QKP9EUc8Y4wAZCZjvptHTZaZrL/3Jt4E+jllXVKnnbSpgEi2U0qWlUCfxtlPQ8UrqgHWrYGcFHbBAq+KeBUSQlr/R4jgfwPYVJTCNAoqMigF8M5CyxAtAInLMbaqKBtMWGqzqchIIgnAF4Qzz7kw+5O5ZQFsKsq+jew9YWW/6Y/LkxE+Xenm8oSfyd4iXHEBrCqKxYTFsZ3yzGTMAJN+qOzh5uNhWjVjTTEBtL0utVGsrbpliA+VPVROBfDpzRcFJK6aH7eqKOtNmGu2UZ5lxgIw4YdL3VQ/HaHdyHhJAHsqe7beZ21BKrmnbBSbVs/XmwZ5W9VD1XSQmWjmgPFNjnz3R2p8TuT4M7kaywfH8B7c/shDfa2hn9f2Zg64R3EvuupoW9RbhMumgi+Ab2cKOV+/M+4awPXiCy9jMdaUICv82/IbKqHswvE0TmsAAAAASUVORK5CYII=
  10. // ==/UserScript==
  11. var run=1;
  12. //// @noframes
  13. (function() {
  14. 'use strict';
  15. if(run>1) return;
  16. run++;
  17. var zindex=999999999;
  18. var maxrect=5,minrect=0.25,steprect=0.05,maxrspeed=10,fastwinds=20;
  19. var findedVideoElement=false,touchedVideoElement=false,floatingFlag=false,isIframe=false,isRotate=false,isFloatingbtnContainDisplay=false;
  20. var rotate=0;
  21. var screenSize=1,screenSizeChange=0,screenPosition='default';
  22. var videoInfo={};
  23. var videoratio={width:0,height:0};
  24. var allElements={};
  25. var containSize={width:0,height:0};
  26. var cw,ch;
  27. var showSettingsT=null,showMsgT=null,onLongPress=null,doubleTouchT=null;
  28. var touchInfo={},mouseInfo={};
  29. var floatingPlayerData = {
  30. positionlefttop: {name: '◰'},
  31. rotate: {name: '↻',value: 90},
  32. positioncenter: {name: '⧈',colspan: 2},
  33. rotate_: {name: '↺',value: -90},
  34. positionrighttop: {name: '◳'},
  35.  
  36. videoratio34: {name: '3:4'},
  37. videoratio43: {name: '4:3'},
  38. videoratio916: {name: '9:16'},
  39. videoratio169: {name: '16:9'},
  40. videoratioauto: {name: '拉伸'},
  41. videoratiosource: {name: '原比'},
  42.  
  43. //display: {name: '背景黑色',colspan: 2},
  44. //time: {name: '时间',colspan: 6,nolistener:true},
  45.  
  46. videorect: {name: '🗔'},
  47. videorect_001: {name: -steprect*100+'%',value: -steprect},
  48. videorectrange: {name: '滑动',colspan: 2,buttontype: 'range'},
  49. videorect001: {name: '+'+steprect*100+'%',value: steprect},
  50. videorectshow: {name: '100%'},
  51.  
  52. volume: {name: '🔊'},
  53. volume_010: {name: '-10%',value: -0.1},
  54. volumerange: {name: '滑动',colspan: 2,buttontype: 'range'},
  55. volume010: {name: '+10%',value: 0.1},
  56. volumeshow: {name: '100%'},
  57.  
  58. speed: {name: '倍速'},
  59. speed_001: {name: '-x0.1',value: -0.1},
  60. speedrange: {name: '滑动',colspan: 2,buttontype: 'range'},
  61. speed001: {name: '+x0.1',value: 0.1},
  62. speedshow: {name: 'x1.0'},
  63.  
  64. progress: {name: '进度'},
  65. progress_001: {name: '-1%',value: -0.01},
  66. progressrange: {name: '滑动',colspan: 2,buttontype: 'range'},
  67. progress001: {name: '+1%',value: 0.01},
  68. progressshow: {name: '100%'},
  69.  
  70. positionleftbottom: {name: '◱'},
  71. rewind: {name: '⏪ '+fastwinds+'s',value: -fastwinds},
  72. play: {name: '⏯',colspan: 2},
  73. fastwind: {name: '⏩ '+fastwinds+'s',value: fastwinds},
  74. positionrightbottom: {name: '◲'}
  75. };
  76.  
  77. findVideoElement();
  78. function findVideoElement(){
  79. //alert(document.querySelector('iframe').contentWindow.document.querySelectorAll('video'));
  80. var k=0;
  81. var findVideoElementInterval = setInterval(function(){
  82. if(document.querySelector('video')){
  83. //alert(1);
  84. allElements.videoElement=document.querySelector('video');
  85. if(allElements.videoElement.readyState >= 2){
  86. //alert(window.top===window.self);
  87. if(window.top===window.self){
  88. allElements.floatElement=allElements.videoElement;
  89. }else{
  90. allElements.floatElement=window.top.document.querySelector('iframe');
  91. isIframe=true;
  92. }
  93. allElements.floatElementContain=allElements.floatElement.parentElement;
  94. findedVideoElement=true;
  95. //clearInterval(findVideoElementInterval);
  96. if(window.top.document.querySelector('#fptlh')) window.top.document.querySelector('#fptlh').remove();
  97. window.top.document.body.insertAdjacentHTML('beforeend','<input id="fptlh" value="'+window.top.location.href+'" style="display:none;">');
  98. showFloatingBtn();
  99. }
  100. }
  101. //k++;
  102.  
  103. if(window.top.document.querySelector('#fptlh')){
  104. var fptlh=window.top.document.querySelector('#fptlh');
  105. if(fptlh.value==window.top.location.href) clearInterval(findVideoElementInterval);
  106. }
  107. }, 1000);
  108. }
  109. function isF(){
  110. window.top.document.setValue('fptlh',window.top.location.href);
  111. }
  112. /*function findVideoElement(){
  113. //alert(document.querySelector('iframe').contentWindow.document.querySelectorAll('video'));
  114. if(document.querySelector('video')){
  115. //alert(1);
  116. allElements.videoElement=document.querySelector('video');
  117. if(allElements.videoElement.readyState >= 2 && allElements.videoElement.duration>=20){
  118. allElements.floatElement=allElements.videoElement;
  119. allElements.floatElementContain=allElements.floatElement.parentElement;
  120. findedVideoElement=true;
  121. }
  122. }else if(document.querySelector('iframe').contentWindow.document.querySelector('video')){
  123. //alert(2);
  124. allElements.videoElement=document.querySelector('iframe').contentWindow.document.querySelector('video');
  125. if(allElements.videoElement.readyState >= 2 && allElements.videoElement.duration>=20){
  126. allElements.floatElement=document.querySelector('iframe');
  127. //allElements.floatElement=allElements.videoElement;
  128. allElements.floatElementContain=allElements.floatElement.parentElement;
  129. findedVideoElement=true;
  130. isIframe=true;
  131. }
  132. }
  133. }*/
  134. function showFloatingBtn(){
  135. var btnCss=`<style type="text/css">.fixedscroll{position: fixed;overflow:hidden;width:100%;}
  136. .floatingvideo{object-fit: fill!important;}div.dplayer-menu{display:none!important;}
  137. #floatingshowmsg{z-index: `+(zindex+4)+`!important;position: fixed;text-align:center;line-height:1;font-size:30px;color: #717171;}
  138. .floatingbtnContain_display{position:fixed;z-index:`+(zindex-1)+`;background:black;width:100%;height:100%;left:0px;top:0px;}
  139. #floatingplayer_setting{border-collapse: separate;z-index: `+(zindex+2)+`!important;position: fixed;text-align:center;background: rgba(30, 29, 32, 0.5);}
  140. .tablecss{border-spacing:0;}
  141. .cellcss{width:100%;heght:100%;color: #fff;text-shadow: 1px 1px 0 rgb(0 0 0 / 70%);}</style>`;
  142. document.head.insertAdjacentHTML('beforeend',btnCss);
  143. //&#9771;&#x21BB;
  144. //var floatingbtnstr='<a id="floatingbtn" title="打开/关闭悬浮窗" target="_blank" class="floatingbtn" style="right:12px;bottom:40px;">&#1422;</a>';
  145. //var floatingvideostr='<video id="floatingvideo" class="floatingvideo" style="position: fixed;"></video>';
  146. var floatingshowmsgstr='<span id="floatingshowmsg" class="floatingshowmsg" style="left:40px;top:40px;display:none;">floatingshowinfo</span>';
  147. var floatingbtnContainstr='<div id="floatingbtnContain">'+floatingshowmsgstr+create_table()+'</div>';
  148. allElements.floatElementRect=allElements.floatElement.getBoundingClientRect();
  149. document.body.insertAdjacentHTML('beforeend',floatingbtnContainstr);
  150. //allElements.floatingbtnContain.append(allElements.floatElement);
  151. allElements.floatingbtnContain=document.getElementById('floatingbtnContain');
  152. //allElements.floatingbtnContain.append(allElements.floatElement);
  153. floating();
  154. if(isIframe){
  155. //allElements.floatingbtnContain=window.top.document.getElementById('floatingbtnContain');
  156. window.top.document.querySelector('head').insertAdjacentHTML('beforeend','<style type="text/css">.fixedscroll{position: fixed;overflow:hidden;width:100%;}</style>');
  157. }else{
  158. allElements.floatingbtnContain.append(allElements.floatElement);
  159. }
  160. allElements.floatingshowmsg=document.getElementById('floatingshowmsg');
  161. allElements.floatingplayer_setting=document.getElementById('floatingplayer_setting');
  162. allElements.floatingplayer_setting_table=document.getElementById('floatingplayer_setting_table');
  163. allElements.floatingbtnContain=document.getElementById('floatingbtnContain');
  164.  
  165. if(allElements.videoElement.paused) allElements.videoElement.play();
  166. setEventListener();
  167. //showFloatingInfo();
  168. }
  169. function create_table() {
  170. const rows = 6;
  171. var htmlTable = `<div id="floatingplayer_setting" style="display:none;overflow: auto;"><table id="floatingplayer_setting_table" border="1" cellspacing="0" class="tablecss">`;
  172. let htmlTbody = ``;
  173. var datavalue='';
  174. var tdInfo='';
  175. var trEnd=0;
  176. for (let index in floatingPlayerData) {
  177. if (trEnd == 0) {
  178. htmlTbody += `<tr>`;
  179. }
  180. trEnd+=floatingPlayerData[index].colspan?floatingPlayerData[index].colspan:1;
  181. datavalue='undefined';
  182. tdInfo='';
  183. if(floatingPlayerData[index].value) datavalue=floatingPlayerData[index].value;
  184. if(floatingPlayerData[index].colspan) tdInfo+=`colspan="${floatingPlayerData[index].colspan}"`;
  185. //if(floatingPlayerData[index].rowspan) tdInfo+=`rowspan="${floatingPlayerData[index].rowspan}"`;
  186. //console.log('tableData[index].value',floatingPlayerData[index].value);
  187. if(floatingPlayerData[index].buttontype){
  188. htmlTbody += `<td ${tdInfo}><input id="floatingplayer_${index}" type="range" class="cellcss range" dataname="${index}" datavalue="${datavalue}" datatitle="${floatingPlayerData[index].name}"></td>`;
  189. }else{
  190. htmlTbody += `<td ${tdInfo}><div id="floatingplayer_${index}" class="cellcss" dataname="${index}" datavalue="${datavalue}" datatitle="${floatingPlayerData[index].name}">${floatingPlayerData[index].name}</div></td>`;
  191. }
  192. if (trEnd >= rows) {
  193. htmlTbody += `</tr>`;
  194. trEnd=0;
  195. }
  196. }
  197. htmlTable += `${htmlTbody}</table></div>`;
  198. return htmlTable;
  199. }
  200. function floating(){
  201. floatingFlag=floatingFlag?false:true;
  202. if(floatingFlag){
  203. videoratio.width=allElements.videoElement.videoWidth;
  204. videoratio.height=allElements.videoElement.videoHeight;
  205. //var fw=cw<ch*vw/vh?cw:ch*vw/vh;
  206. //var fh=ch<cw*vh/vw?ch:cw*vh/vw;
  207. //screenSize=vrfw/cw>vrfh/ch?vrfw/cw:vrfh/ch;
  208. //alert([cw,ch,vw,vh,vr,vrw,vrh,vrl,vrt,vrfw,vrfh,top,floatElement.querySelector('video')]);
  209. //allElements.floatingbtnContain.append(allElements.floatElementContain);
  210. //if(!isIframe) allElements.floatingbtnContain.append(allElements.floatElement);
  211. allElements.floatElement.className='';
  212. allElements.videoElement.classList.add('floatingvideo');
  213. /*if(!isIframe){
  214. //allElements.videoElement.removeAttribute('controls');
  215. //allElements.videoElement.className='floatingvideo';
  216. allElements.videoElement.style='';
  217. allElements.videoElement.id='';
  218. //allElements.videoElement.controlsList='nofullscreen';
  219. }*/
  220. allElements.floatElement.style='';
  221. allElements.floatElement.style.position='fixed';
  222. allElements.floatElement.style.zIndex=zindex;
  223. if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {
  224. screenSize=1;
  225. screenPosition='lefttop';
  226. setFloatingVidooRect();
  227. }else{
  228. cw=window.top.document.documentElement.clientWidth;
  229. ch=window.top.document.documentElement.clientHeight;
  230. var vw=allElements.videoElement.videoWidth;
  231. var vh=allElements.videoElement.videoHeight;
  232. var vr=allElements.floatElementRect;
  233. var vrw=vr.width;
  234. var vrh=vr.height;
  235. var vrl=vr.left;
  236. var vrt=vr.top;
  237. var vrfw=vrw<vrh*vw/vh?vrw:vrh*vw/vh;
  238. var vrfh=vrh<vrw*vh/vw?vrh:vrw*vh/vw;
  239. var top=vrt+(vrh-vrfh)/2<0?0:(vrt+(vrh-vrfh)/2>ch-vrfh?ch-vrfh:vrt+(vrh-vrfh)/2);
  240. screenSize=vrfw/cw>vrfh/ch?vrfw/cw:vrfh/ch;
  241. //screenPosition='default';
  242. allElements.floatElement.style.width=vrfw+'px';
  243. allElements.floatElement.style.height=vrfh+'px';
  244. allElements.floatElement.style.left=vrl+(vrw-vrfw)/2+'px';
  245. allElements.floatElement.style.top=top+'px';
  246. }
  247. }/*else{
  248. allElements.videoElement.classList.remove('floatingvideo');
  249. //floatElement.style='';
  250. //if(!isIframe) allElements.floatElementContain.prepend(allElements.floatElement);
  251. allElements.floatElement.style.position=null;
  252. allElements.floatElement.style.zIndex=null;
  253. allElements.floatElement.style.width=null;
  254. allElements.floatElement.style.height=null;
  255. allElements.floatElement.style.left=null;
  256. allElements.floatElement.style.top=null;
  257.  
  258. allElements.floatElement.removeEventListener("touchstart",touchStartHandler,true);
  259. allElements.floatElement.removeEventListener("mousedown",mouseDownHandler,true);
  260. }*/
  261. }
  262. function setSettings(){
  263. var vr=allElements.videoElement.getBoundingClientRect();
  264. //cw=document.documentElement.clientWidth;
  265. allElements.floatingplayer_setting.style.left=vr.left+'px';
  266. allElements.floatingplayer_setting.style.top=vr.top+vr.height/2+'px';
  267. var fer=allElements.floatingplayer_setting.getBoundingClientRect();
  268. if(fer.top+fer.height>ch){
  269. ch=document.documentElement.clientHeight;
  270. allElements.floatingplayer_setting.style.top=ch-fer.height+'px';
  271. }
  272. //allElements.floatingplayer_setting.style.maxWidth=vr.width+'px';
  273. //allElements.floatingplayer_setting.style.maxHeight=vr.height/2+'px';
  274. allElements.floatingplayer_setting_table.style.width=vr.width+'px';
  275. allElements.floatingplayer_setting_table.style.height=vr.height/2+'px';
  276. }
  277. function showSettings(){
  278. if(showSettingsT!=null) clearTimeout(showSettingsT);
  279. allElements.floatingplayer_setting.style.display='block';
  280. setSettings();
  281. showFloatingInfo();
  282. showSettingsT = setTimeout(function() {
  283. showSettingsT=null;
  284. allElements.floatingplayer_setting.style.display='none';
  285. }, 3000);
  286. }
  287. function showFloatingInfo(){
  288. var showFloatingInfoInterval = setInterval(function(){
  289. var ct=allElements.videoElement.currentTime;
  290. var dt=allElements.videoElement.duration;
  291. //allElements.floatingplayer_time.textContent=secondsToTimeStr(ct)+'/'+secondsToTimeStr(dt);
  292.  
  293. allElements.floatingplayer_videorectrange.value=(screenSize*100/maxrect).toFixed(0);
  294. allElements.floatingplayer_videorectshow.textContent=(screenSize*100).toFixed(0)+'%';
  295.  
  296. var progressbarvalue=ct/dt*100;
  297. allElements.floatingplayer_progressrange.value=(progressbarvalue).toFixed(0);
  298. //allElements.floatingplayer_progressshow.textContent=(progressbarvalue).toFixed(0)+'%';
  299. allElements.floatingplayer_progress.textContent=secondsToTimeStr(ct);
  300. allElements.floatingplayer_progressshow.textContent=secondsToTimeStr(dt);
  301.  
  302. var speedanyvalue=allElements.videoElement.playbackRate;
  303. allElements.floatingplayer_speedrange.value=(speedanyvalue*100/maxrspeed).toFixed(0);
  304. allElements.floatingplayer_speedshow.textContent='x'+speedanyvalue.toFixed(1);
  305.  
  306. var volumeanyvalue=allElements.videoElement.volume;
  307. allElements.floatingplayer_volumerange.value=(volumeanyvalue*100).toFixed(0);
  308. allElements.floatingplayer_volumeshow.textContent=(volumeanyvalue*100).toFixed(0)+'%';
  309. if(allElements.floatingplayer_setting.style.display=='none'){
  310. clearInterval(showFloatingInfoInterval);
  311. }
  312. }, 1000);
  313. }
  314.  
  315. function showMsg(msg){
  316. if(showMsgT!=null) clearTimeout(showMsgT);
  317. //setMsg();
  318. var vr=allElements.videoElement.getBoundingClientRect();
  319. allElements.floatingshowmsg.style.left=vr.left+'px';
  320. allElements.floatingshowmsg.style.top=vr.top+'px';
  321. allElements.floatingshowmsg.textContent=msg;
  322. allElements.floatingshowmsg.style.display='block';
  323. showMsgT = setTimeout(function() {
  324. showMsgT=null;
  325. allElements.floatingshowmsg.style.display='none';
  326. }, 2000);
  327. }
  328.  
  329. function floatingVidooAttr(e){
  330. //if(isIframe) videoElement=videoElementContain.querySelector('video');
  331. var ele=e.target;
  332. var value=ele.value;
  333. var dataname=ele.getAttribute('dataname');
  334. var datavalue=ele.getAttribute('datavalue');
  335. var datatitle=ele.getAttribute('datatitle');
  336. //alert([dataname,datavalue]);
  337. if(datavalue!='undefined') datavalue=parseFloat(datavalue);
  338. if(dataname=='display'){
  339. isFloatingbtnContainDisplay=isFloatingbtnContainDisplay?false:true;
  340. if(isFloatingbtnContainDisplay){
  341. allElements.floatingbtnContain.classList.add('floatingbtnContain_display');
  342. }else{
  343. allElements.floatingbtnContain.classList.remove('floatingbtnContain_display');
  344. }
  345. }else if(dataname.substring(0,9)=='videorect'){
  346. setVideoRect(dataname,datavalue,value);
  347. }else if(dataname.substring(0,8)=='progress'){
  348. setProcess(dataname,datavalue,value);
  349. }else if(dataname.substring(0,5)=='speed'){
  350. setSpeed(dataname,datavalue,value);
  351. }else if(dataname.substring(0,6)=='volume'){
  352. setVolume(dataname,datavalue,value);
  353. }else if(dataname=='rewind' || dataname=='fastwind'){
  354. allElements.videoElement.currentTime=allElements.videoElement.currentTime+datavalue;
  355. }else if(dataname=='play'){
  356. allElements.videoElement.paused?allElements.videoElement.play():allElements.videoElement.pause();
  357. }else if(dataname=='rotate' || dataname=='rotate_'){
  358. screenSizeChange=0;
  359. rotate+=datavalue;
  360. if(rotate>=360) rotate-=360;
  361. else if(rotate<0) rotate+=360;
  362. allElements.floatElement.style.transform='rotate('+rotate+'deg)';
  363. //allElements.floatingcontrols.style.transform='rotate('+rotate+'deg)';
  364. /*floatingplayer_setting.style.transform='rotate('+rotate+'deg)';}*/
  365. }else if(dataname.substring(0,8)=='position'){
  366. screenPosition=dataname.substring(8);
  367. //setPosition(dataname);
  368. }else if(dataname.substring(0,10)=='videoratio'){
  369. setVideoRatio(dataname);
  370. }
  371. if(dataname=='rotate' || dataname=='rotate_' || dataname.substring(0,5)=='video' || dataname.substring(0,8)=='position'){
  372. setFloatingVidooRect();
  373. }
  374. showSettings();
  375. showMsg(datatitle);
  376. }
  377. function setVideoRect(dataname,datavalue,value){
  378. if(dataname=='videorect'){
  379. //setVideoRect();
  380. }else if(dataname=='videorect_001' || dataname=='videorect001'){
  381. var tempScreenSize=screenSize;
  382. screenSize+=datavalue;
  383. screenSize=screenSize>maxrect?maxrect:(screenSize<minrect?minrect:screenSize);
  384. screenSizeChange=screenSize-tempScreenSize;
  385. }else if(dataname=='videorectrange'){
  386. value=value<minrect*100/maxrect?minrect*100/maxrect:value;
  387. screenSizeChange=value/100*maxrect-screenSize;
  388. screenSize=value/100*maxrect;
  389. }else if(dataname=='videorectshow'){
  390. screenSizeChange=1-screenSize;
  391. screenSize=1;
  392. screenPosition='center';
  393. }
  394. }
  395. function setProcess(dataname,datavalue,value){
  396. if(dataname=='progress'){
  397. //screenSize=1;
  398. }else if(dataname=='progress_001' || dataname=='progress001'){
  399. allElements.videoElement.currentTime+=allElements.videoElement.duration*datavalue;
  400. }else if(dataname=='progressrange'){
  401. allElements.videoElement.currentTime=allElements.videoElement.duration*value/100;
  402. }else if(dataname=='progressshow'){
  403. //screenSize=1;
  404. }
  405. }
  406. function setSpeed(dataname,datavalue,value){
  407. if(dataname=='speed' || dataname=='speedshow'){
  408. allElements.videoElement.playbackRate=1;
  409. }else if(dataname=='speed_001' || dataname=='speed001'){
  410. if(allElements.videoElement.playbackRate+datavalue>maxrspeed){
  411. allElements.videoElement.playbackRate=maxrspeed;
  412. }else if(allElements.videoElement.playbackRate+datavalue<=0){
  413. allElements.videoElement.playbackRate=0.1;
  414. }else{
  415. allElements.videoElement.playbackRate+=datavalue;
  416. }
  417. }else if(dataname=='speedrange'){
  418. allElements.videoElement.playbackRate=(value/100*maxrspeed).toFixed(1);
  419. }
  420. }
  421. function setVolume(dataname,datavalue,value){
  422. if(dataname=='volume'){
  423. allElements.videoElement.muted=allElements.videoElement.muted?false:true;
  424. }else if(dataname=='volume_010' || dataname=='volume010'){
  425. if(allElements.videoElement.volume+datavalue>1) allElements.videoElement.volume=1;
  426. else if(allElements.videoElement.volume+datavalue<0) allElements.videoElement.volume=0;
  427. else allElements.videoElement.volume+=datavalue;
  428. }else if(dataname=='volumerange'){
  429. allElements.videoElement.volume=value/100;
  430. }else if(dataname=='volumeshow'){
  431. allElements.videoElement.muted=false;
  432. allElements.videoElement.volume=1;
  433. }
  434. }
  435. function setVideoRatio(dataname){
  436. if(dataname=='videoratiosource'){
  437. videoratio.width=allElements.videoElement.videoWidth;
  438. videoratio.height=allElements.videoElement.videoHeight;
  439. }else if(dataname=='videoratio34'){
  440. videoratio.width=3;
  441. videoratio.height=4;
  442. }else if(dataname=='videoratio43'){
  443. videoratio.width=4;
  444. videoratio.height=3;
  445. }else if(dataname=='videoratio916'){
  446. videoratio.width=9;
  447. videoratio.height=16;
  448. }else if(dataname=='videoratio169'){
  449. videoratio.width=16;
  450. videoratio.height=9;
  451. }else if(dataname=='videoratioauto'){
  452. if(rotate==90||rotate==270){
  453. videoratio.width=window.top.document.documentElement.clientHeight;
  454. videoratio.height=window.top.document.documentElement.clientWidth;
  455. }else{
  456. videoratio.width=window.top.document.documentElement.clientWidth;
  457. videoratio.height=window.top.document.documentElement.clientHeight;
  458. }
  459. }
  460. }
  461.  
  462. function setFloatingVidooRect(){
  463. var left,top;
  464. cw=window.top.document.documentElement.clientWidth;
  465. ch=window.top.document.documentElement.clientHeight;
  466.  
  467. var vw=videoratio.width;
  468. var vh=videoratio.height;
  469. var fw,fh;
  470. isRotate=rotate==90||rotate==270;
  471. if(isRotate){
  472. fw=(ch<cw/vh*vw?ch:cw/vh*vw);
  473. fh=(cw<ch/vw*vh?cw:ch/vw*vh);
  474. }else{
  475. fw=(cw<ch*vw/vh?cw:ch*vw/vh);
  476. fh=(ch<cw*vh/vw?ch:cw*vh/vw);
  477. }
  478. var sfw=fw*screenSize;
  479. var sfh=fh*screenSize;
  480. if(isIframe){
  481. allElements.videoElement.style.width=sfw+'px';
  482. allElements.videoElement.style.height=sfh+'px';
  483. }
  484. allElements.floatElement.style.width=sfw+'px';
  485. allElements.floatElement.style.height=sfh+'px';
  486. //var vr=floatElement.getBoundingClientRect();
  487. var fel=allElements.floatElement.offsetLeft;
  488. var fet=allElements.floatElement.offsetTop;
  489. var sfwh=-(sfw-sfh)/2;
  490. if(screenPosition=='lefttop'){
  491. left=isRotate?sfwh:0;
  492. top=isRotate?-sfwh:0;
  493. }else if(screenPosition=='righttop'){
  494. left=isRotate?cw-sfw-sfwh:cw-sfw;
  495. top=isRotate?-sfwh:0;
  496. }else if(screenPosition=='leftbottom'){
  497. left=isRotate?sfwh:0;
  498. top=isRotate?ch-sfh+sfwh:ch-sfh;
  499. }else if(screenPosition=='rightbottom'){
  500. left=isRotate?cw-sfw-sfwh:cw-sfw;
  501. top=isRotate?ch-sfh+sfwh:ch-sfh;
  502. }else if(screenPosition=='center'){
  503. left=(cw-sfw)/2;
  504. top=(ch-sfh)/2;
  505. }else if(screenPosition=='mousewheel'){
  506. left=fel-(fw*screenSizeChange)*videoInfo.cx/videoInfo.ew;
  507. top=fet-(fh*screenSizeChange)*videoInfo.cy/videoInfo.eh;
  508. }else if(screenPosition=='mousemove'){
  509. left=fel-(fw*screenSizeChange)/2;
  510. top=fet-(fh*screenSizeChange)/2;
  511. }else{
  512. left=fel;
  513. top=fet;
  514. }
  515. allElements.floatElement.style.left=left+'px';
  516. allElements.floatElement.style.top=top+'px';
  517. }
  518. function secondsToTimeStr(secs){
  519. secs=secs.toFixed(0);
  520. var hour=parseInt(secs/3600);
  521. var min=parseInt(secs/60)-60*hour;
  522. var sec=secs%60;
  523. var ret='';
  524. ret+=(hour>0?hour+':':'')+(min < 10? '0' + min : min) + ':' + (sec < 10? '0' + sec : sec);
  525. return ret;
  526. }
  527.  
  528. function setEventListener(){
  529. if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {
  530. allElements.videoElement.addEventListener("touchstart",videoEvent,true);
  531. }else{
  532. allElements.videoElement.addEventListener("mouseover",videoEvent,true);
  533. allElements.videoElement.addEventListener("mousedown",videoEvent,true);
  534. }
  535.  
  536. for (let index in floatingPlayerData) {
  537. allElements['floatingplayer_'+index]=document.getElementById('floatingplayer_'+index);
  538. if(!floatingPlayerData[index].nolistener){
  539. allElements['floatingplayer_'+index].addEventListener(floatingPlayerData[index].buttontype?'input':'click', floatingVidooAttr,true);
  540. }
  541. }
  542. }
  543. function videoEvent(e){
  544. var self=e;
  545. var ele=e.target;
  546. var etype=e.type;
  547. //ele.paused?ele.play():ele.play();
  548. if(etype=='mouseover'){
  549. videoInfo.scrollY=null;
  550. ele.addEventListener("mousewheel",videoEvent,true);
  551. ele.addEventListener("mouseleave",videoEvent,true);
  552. showSettings();
  553. }else if(etype=='mousewheel'){
  554. if(videoInfo.scrollY==null){
  555. videoInfo.scrollY=window.top.scrollY;
  556. videoInfo.dw=window.top.document.documentElement.clientWidth;
  557. window.top.document.body.classList.add('fixedscroll');
  558. window.top.document.body.style.top = `-${videoInfo.scrollY}px`;
  559. window.top.document.body.style.width = `${videoInfo.dw}px`;
  560. }
  561. var deltaY=self.deltaY;
  562. videoInfo.cx=self.clientX-ele.offsetLeft;
  563. videoInfo.cy=self.clientY-ele.offsetTop;
  564. videoInfo.ew=ele.offsetWidth;
  565. videoInfo.eh=ele.offsetHeight;
  566. var tempScreenSize=screenSize;
  567. var tempSizeChange=deltaY<0?-steprect:(deltaY>0?steprect:0);
  568. screenSize+=screenSize>2?tempSizeChange*2:tempSizeChange;
  569. screenSize=screenSize>maxrect?maxrect:(screenSize<minrect?minrect:screenSize);
  570. screenSizeChange=screenSize-tempScreenSize;
  571. screenPosition='mousewheel';
  572. if(screenSizeChange!=0) setFloatingVidooRect();
  573. setSettings();
  574. showMsg((screenSize*100).toFixed(0)+'%');
  575. }else if(etype=='touchstart' || etype=='mousedown'){
  576. cw=document.documentElement.clientWidth;
  577. ch=document.documentElement.clientHeight;
  578. videoInfo.self=etype=='touchstart'?self.touches[0]:self;
  579. videoInfo.originalPlaybackRate=ele.playbackRate;
  580. if (onLongPress == null){
  581. onLongPress = setTimeout(function() {
  582. if (doubleTouchT != null){
  583. clearTimeout(doubleTouchT);
  584. doubleTouchT = null;
  585. }
  586. ele.playbackRate=5.0;
  587. showMsg('倍速x'+ele.playbackRate);
  588. }, 400);
  589. }
  590. if (doubleTouchT == null) {
  591. doubleTouchT = setTimeout(function () {
  592. doubleTouchT = null;
  593. showSettings();
  594. //alert("single");
  595. }, 500)
  596. }else{
  597. clearTimeout(doubleTouchT);
  598. doubleTouchT = null;
  599. var cx=ele.offsetLeft+ele.offsetWidth/2;
  600. var cy=ele.offsetTop+ele.offsetHeight/2;
  601. var isfastwinds=false;
  602. if((rotate==0 && videoInfo.self.clientX>cx)||(rotate==90 && videoInfo.self.clientY>cy)||(rotate==180 && videoInfo.self.clientX<cx)||(rotate==270 && videoInfo.self.clientY<cy)){
  603. isfastwinds=true;
  604. }
  605. ele.currentTime+=isfastwinds?fastwinds:-fastwinds;
  606. showMsg(String.fromCodePoint(isfastwinds?'0x23E9':'0x23EA')+fastwinds+'s');
  607. }
  608. videoInfo.x=allElements.floatElement.offsetLeft-videoInfo.self.clientX;
  609. videoInfo.y=allElements.floatElement.offsetTop-videoInfo.self.clientY;
  610. if(etype=='touchstart'){
  611. //videoInfo.startTouchFingers=e.touches.length;
  612. ele.addEventListener("touchend",videoEvent,true);
  613. ele.addEventListener("touchmove",videoEvent,true);
  614. }else{
  615. ele.addEventListener("mouseleave",videoEvent,true);
  616. ele.addEventListener("mouseup",videoEvent,true);
  617. ele.addEventListener("mousemove",videoEvent,true);
  618. }
  619. }else if(etype=='touchmove' || etype=='mousemove'){
  620. if(onLongPress!=null){
  621. clearTimeout(onLongPress);
  622. onLongPress=null;
  623. ele.playbackRate=videoInfo.originalPlaybackRate;
  624. //showMsg(ele.playbackRate+'倍速播放');
  625. }
  626. if (doubleTouchT != null){
  627. clearTimeout(doubleTouchT);
  628. doubleTouchT = null;
  629. }
  630. //showSettings(e);
  631. screenPosition='mousemove';
  632. videoInfo.self=etype=='touchmove'?self.touches[0]:self;
  633. allElements.floatElement.style.left=videoInfo.x+videoInfo.self.clientX+'px';
  634. allElements.floatElement.style.top=videoInfo.y+videoInfo.self.clientY+'px';
  635. setSettings();
  636. }else if(etype=='touchend' || etype=='mouseup' || etype=='mouseleave'){
  637. if(videoInfo.scrollY!=null){
  638. window.top.document.body.classList.remove('fixedscroll');
  639. window.top.document.body.style.top = `0px`;
  640. window.top.scrollTo({top:videoInfo.scrollY});
  641. window.top.document.body.style.width = null;
  642. }
  643. if(onLongPress!=null){
  644. clearTimeout(onLongPress);
  645. onLongPress=null;
  646. ele.playbackRate=videoInfo.originalPlaybackRate;
  647. //showMsg(ele.playbackRate+'倍速播放');
  648. }
  649. videoInfo.self=null;
  650. videoInfo.x=null;
  651. videoInfo.y=null;
  652. if(etype=='touchend'){
  653. ele.removeEventListener("touchmove",videoEvent,true);
  654. ele.removeEventListener("touchend",videoEvent,true);
  655. }else{
  656. ele.removeEventListener("mousemove",videoEvent,true);
  657. ele.removeEventListener("mouseleave",videoEvent,true);
  658. ele.removeEventListener("mouseup",videoEvent,true);
  659. ele.removeEventListener("mousewheel",videoEvent,true);
  660. }
  661. }
  662.  
  663. }
  664.  
  665. // Your code here...
  666. })();