Greasy Fork

Greasy Fork is available in English.

解锁b站vip视频并附带弹幕

test

目前为 2021-07-01 提交的版本,查看 最新版本

// ==UserScript==
// @name         解锁b站vip视频并附带弹幕
// @icon         data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACS0lEQVRYR8WXz2oTURTGv3MnpqhNKy1UWmxRTGdaiLSQRKkKIoK4FVrRPoHu7BMYn0B3+gQquuiuiC6kaFVsAhGEZkKqG/+Vrtp0YWsyR27KlEwz0xnnT3LgwjB37vl+97tzz9whdDiow/pwBCjofN0AJohwKQgkMxYF8Dmt0bxdnhaAQoWTXMczENJBhFvGMgqk4GY6SZXmPgvAmy/cnYijGqrwvmTVHSQup2jLvG0ByJf5EYDbUQIAeJxR6U4LQHGV1VodesTijfQxBdrkaSrL6z0Hlst8i4An7QBgYDar0lMrgM45ItxrCwDjflajnC+AtR8Gvn8zGpz9xwVOjor/Zma/ANt/GIsLNWxt8p7o4IiAmlLQP+C9pvkG+FoyUPxYs52xhFDPKIh3uRviG2ClWIdsTpHoJYymFNdliQzABBsaEZg4p+DwUftliRxAggwOC0xdidma1RaAI92Ea9OHOgcwPqlANruI1AElhsa2dBKXQJEBnDglGlvxWN/BNcE3gKyCS69b64AUlMISwEv4BpDJ3778i/Xfu5XQtFtaLq+9RiCA6gZj/dcuQN8Audod6kvodYZuz9k7UOK7JPDAbXAY/WxgLjtGDy2f408VPi8MLIUh4JbDELhwNknvLQDyQNoTh87AkFuCIP0E/NzcgWYeTC0bdrkNp6Lm9bc4YM4qr/NzEGaCzNJxLONFRqMbzf22JSu/wlcphhwzpsIAIcIHriGXGadX+/MdWDPflTjRxcH+kLYJhYtj5Piz4/0gF4YVNjk6DvAPDb0aMEr8/nEAAAAASUVORK5CYII=    
// @version      1.11.4
// @description  test
// @author       p7
// @match        https://www.bilibili.com/*
// @match        https://vip.parwix.com:4433/*
// @match        https://z1.m1907.cn/*
// @match        https://api.yueliangjx.com/*
// @match        https://showxi.xyz/*
// @match        https://okjx.cc/*
// @run-at       document-end
// @grant             GM_openInTab
// @grant             GM.openInTab
// @grant             GM_getValue
// @grant             GM.getValue
// @grant             GM_setValue
// @grant             GM.setValue
// @grant         GM_addStyle
// @require     https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js

// @namespace http://greasyfork.icu/users/789132
// ==/UserScript==

(function () {
var player
var playerRect
var minpool=[]
//var minpoolout=[]
var domPool = [];
var domtopdownPool = [];
var listobj
  
var distance = 25
var fontSize = 25;


function xmlToJson(xml) {
	
	// Create the return object
	var obj = {};
 
	if (xml.nodeType == 1) { // element
		// do attributes
		if (xml.attributes.length > 0) {
		obj["@attributes"] = {};
			for (var j = 0; j < xml.attributes.length; j++) {
				var attribute = xml.attributes.item(j);
				obj["@attributes"][attribute.nodeName] = attribute.nodeValue;
			}
		}
	} else if (xml.nodeType == 3) { // text
		obj = xml.nodeValue;
	}
 
	// do children
	if (xml.hasChildNodes()) {
		for(var i = 0; i < xml.childNodes.length; i++) {
			var item = xml.childNodes.item(i);
			var nodeName = item.nodeName;
			if (typeof(obj[nodeName]) == "undefined") {
				obj[nodeName] = xmlToJson(item);
			} else {
				if (typeof(obj[nodeName].push) == "undefined") {
					var old = obj[nodeName];
					obj[nodeName] = [];
					obj[nodeName].push(old);
				}
				obj[nodeName].push(xmlToJson(item));
			}
		}
	}
	return obj;
};

function getBV(vipiframe) {
  let bv = $("a.av-link[target='_blank']")[0]
  if (bv) {
    console.log(bv.innerText)
    $.getJSON("https://api.bilibili.com/x/player/pagelist?bvid=" + bv.innerText,function(result) {

  var xmlhtml = `https://api.bilibili.com/x/v1/dm/list.so?oid=${result.data[0].cid}` //`https://api.bilibili.com/x/v1/dm/list.so?oid=283060255`
      //ajax解析xml文件
      $.ajax({
        url: xmlhtml,
        dataType: "xml",
        success: function (xml) {
           vipiframe.postMessage({obj:xmlToJson(xml),str:'xmllist'},'*'); 
      } 

})})

  } else {
    setTimeout(function () {
    getBV(vipiframe)}, 500)
  }
}


  function receiveInfoFromAnotherDomain(){ 
         
    //首先让window添加一个事件监听函数,表明它可以监听窗口对象的message事件 
    //它受到事件时,会先判断是否来自指定的Domain(不是所有Domain丢过来的事件它都处理的) 
    window.addEventListener("message",function(ev){
      switch (window.location.host) {
				case 'www.bilibili.com':
          if(ev.origin!='https://www.bilibili.com'&&ev.origin!='https://message.bilibili.com'){
              console.log(ev.origin,' message to',window.location.href,ev.data); 
             //window.postMessage({str:'test1'},ev.origin); 
            if(window.frames[0]&&ev.data.str!='来自iframe:'){
              //window.frames[0].postMessage({str:'test2'},'*');
              if(ev.data.str=='hasplayer'){
                getBV(window.frames[0])
              }
            }
            if(window.frames[0].frames[0]&&ev.data.str!='来自iframe:'){
              //window.frames[0].frames[0].postMessage({str:'test3'},'*');
              if(ev.data.str=='hasplayer'){
                getBV(window.frames[0].frames[0])
              }
            } 
          }
				break	
        default:
          //if(ev.origin=='https://www.bilibili.com'){
          //console.log(ev.origin,' message to',window.location.href,ev.data);  
          window.top.postMessage({web:window.location.href,obj:ev.data,str:'来自iframe:',from:ev.origin},'*');
          if(ev.data.str=='xmllist'){
            listobj=ev.data.obj            
          }
        }}) 

        //将json字符串转为json对象,然后从中分离出原始信息 
        //var personInfoJSON = JSON.parse(ev.data); 
       


    }

  function detecH5Player(findplayertime) {     
      
      player = document.querySelector('video')    
      if (player) {
        //console.log(window.location.href+'发现h5')
        receiveInfoFromAnotherDomain()
        window.top.postMessage({str:'hasplayer',web:window.location.href},'*');      
        playerRect = player.getBoundingClientRect()
        initcss()
          
        player.addEventListener('pause', function () {//暂停开始执行的函数
        //console.log('pause')
        //console.log($('video')[0].paused)
          
        $('.left').each(function(index,element){
          element.style.willChange='auto'
          let domRect = element.getBoundingClientRect()
          let domLeft = domRect.left-playerRect.left     
          $(element).css('transform',`translateX(${domLeft}px)`);
           $(element).css('transition',`transform 0s linear`);
          
          })
        });

        player.addEventListener('playing', function () {//暂停开始执行的函数
           playtime=(new Date()).getTime()
           $('.left').each(function(index,element){
          let domRect = element.getBoundingClientRect()
          let domLeft = domRect.left-playerRect.left      
          let oldS = element.clientWidth + player.clientWidth
          let newS = element.clientWidth + domLeft
          let oldT = 0.0074*(element.clientWidth+player.clientWidth)
          let newT = newS/oldS*oldT
          //console.log(element.clientWidth+','+player.clientWidth+','+oldS+','+newS+','+oldT+','+newT)
          $(element).css('transition',`transform ${newT}s linear`);
          $(element).addClass('left');
             
          element.style.willChange='transform'
          element.style.transform = `translateX(${-element.clientWidth}px)`;  
             })                
           })
        player.addEventListener('timeupdate', function () {
           if(minpool.length==0&&listobj){
              //window.top.postMessage({obj:'player.duration:'+player.duration,str:'来自iframe:',from:window.location.href},'*');
              minpool = new Array(parseInt(player.duration / 60));
              let minlen = minpool.length
              for(var a=0;a<=minlen;a++) {
                minpool[a]=[]
              }
              //minpoolout = new Array(minlen);
              //for(var b=0;b<=minlen;b++) {
              //  minpoolout[b]=[]
             //}      
          let len=listobj.i.d.length
          //window.top.postMessage({obj:'listobj.i.d.length:'+listobj.i.d.length,str:'来自iframe:',from:window.location.href},'*');
          for(var j=0;j<len;j++) {                            
            let strp = listobj.i.d[j]['@attributes'].p
            let arrp = strp.split(',');
   			    let arrpJson = {"time":arrp[0], "type":arrp[1],"size":arrp[2],"rgb":arrp[3],"pool":arrp[5],"text":listobj.i.d[j]['#text']};
            minpool[parseInt(arrp[0] / 60)].push(arrpJson) 
            window.top.postMessage({obj:'minpool push:'+minpool[parseInt(arrp[0] / 60)][minpool[parseInt(arrp[0] / 60)].length-1],str:'来自iframe:',from:window.location.href},'*');
          }}
        //window.top.postMessage({obj:'currentTime:'+player.currentTime+'  '+minpool.length+'  '+domPool.length,str:'来自iframe:',from:window.location.href},'*');  
          $('.topdown').each(function(index,element){
             if(element.innerText != ''){
               let nowtime = (new Date()).getTime()
               let lasttime = parseInt(nowtime)- parseInt($(element).prop("name"))
               //console.log('lasttime:'+lasttime+' '+typeof lasttime);
               if(lasttime >= 4500){
                 //console.log('lasttime2:'+lasttime+' '+typeof lasttime);
                 element.innerText = ''
                 element.name = ''
               }
             }           
             })                           
          if(minpool.length!=0 && domPool.length!=0){
            let channel;
            let nowlen = parseInt(player.currentTime / 60)
            //console.log('currentTime:'+player.currentTime); 
            //window.top.postMessage({obj:'currentTime:'+player.currentTime+'  '+minpool[nowlen].length,str:'来自iframe:',from:window.location.href},'*');  
            if (!$(player).paused) {              
              for (var j = minpool[nowlen].length -1; j>-1; j--) {
               //console.log('pool:'+minpool[nowlen][j].pool) 
               //window.top.postMessage({obj:minpool[nowlen][j],str:'来自iframe:',from:window.location.href},'*');  
               if(minpool[nowlen][j].time >= player.currentTime && minpool[nowlen][j].time <= player.currentTime+0.5&&minpool[nowlen][j].type=='1'){
                  channel = getChannel()
                  //console.log('channel:'+channel)
                  if(channel!=-1){                  
                  let arrpJson = minpool[nowlen][j]
                  //console.log(minpool[nowlen][j].time+','+player.currentTime+'  biu~ [' + minpool[nowlen][j].text + ']');                  
                  let dom = domPool[channel].shift()//把数组的第一个元素从其中删除
                  domPool[channel].push(dom);//向数组的末尾添加一个或多个元素                    
                  shootDanmu(dom, arrpJson, channel);
                  //minpoolout[nowlen].push(minpool[nowlen][j])                   
                  //minpool[nowlen].splice(j,1);
                  }
               }else if(minpool[nowlen][j].time >= player.currentTime && minpool[nowlen][j].time <= player.currentTime+0.5&&minpool[nowlen][j].type!='1') {
                  channel = gettopdownChannel(minpool[nowlen][j].type)
                  console.log('gettopdownChannel:'+channel)
                  if(channel!=-1){                  
                  let arrpJson = minpool[nowlen][j]
                  //console.log(minpool[nowlen][j].time+','+player.currentTime+'  biu~ [' + danmu + ']');
                  let dom = domtopdownPool[channel]                 
                  shoottopdownDanmu(dom, arrpJson, channel);
                  //minpoolout[nowlen].push(minpool[nowlen][j])                   
                  //minpool[nowlen].splice(j,1);
                  }
                  }            
             }                       
          }             
          }
  
})
       } else {
        // 轮询检测
        setTimeout(function () {
          console.log(window.location.href+'开始检测h5',findplayertime,new Date().getTime()-findplayertime)
          if(new Date().getTime()-findplayertime<=5000){
          detecH5Player(findplayertime)}
        }, 500)
      }
  }
        




let hasPosition = [];
var MAX_DM_COUNT = 8
var CHANNEL_COUNT = 0


function initcss() {
   let css = `
    .right {
      position: absolute;
      visibility: hidden;
      white-space: nowrap;
      /*left: 700px;
      transform: translateX(700px);*/
    }
    .left {
      position: absolute;
      white-space: nowrap;
      user-select: none;
      /* transition: transform 7s linear; 时间相同 越长的弹幕滑动距离越长 所以越快~ */
    }
    .topdown {
      position: absolute;
      white-space: nowrap;
      user-select: none;
      
    }
    `
  GM_addStyle(css) 
  refreshDom()
  }

function refreshDom(){  
  MAX_DM_COUNT = 10;
  CHANNEL_COUNT = Math.floor(player.clientHeight/fontSize);  
  // 先new一些span 重复利用这些DOM
  for (let j = 0; j < CHANNEL_COUNT; j++) {             
    let doms = [];   
    for (let i = 0; i < MAX_DM_COUNT; i++) {
      // 要全部放进player
      let dom = document.createElement('div');      
      //alert(fontSize)
      dom.style.fontSize = fontSize + 'px';
      dom.style.color='rgb(255,255,255)';
      dom.style.fontFamily='SimHei, "Microsoft JhengHei", Arial, Helvetica, sans-serif'
      dom.style.fontWeight='bold'
      dom.style.opacity='1'//不透明度
      dom.style.textShadow='rgb(0, 0, 0) 1px 0px 1px, rgb(0, 0, 0) 0px 1px 1px, rgb(0, 0, 0) 0px -1px 1px, rgb(0, 0, 0) -1px 0px 1px';
      dom.style.transform=`translateX(${player.clientWidth}px)`
      dom.style.willChange='auto'
      // 初始化dom的位置 通过设置className
      dom.className = 'right';
      // DOM的通道是固定的 所以设置好top就不需要再改变了
      dom.style.top = j * fontSize + 'px';
      player.parentNode.appendChild(dom);

      // 放入改通道的DOM池
      doms.push(dom);
      // 每次到transition结束的时候 就是弹幕划出屏幕了 将DOM位置重置 再放回DOM池
      dom.addEventListener('transitionend', () => {        
        dom.style.transition = null;
        dom.style.willChange='auto'
        dom.style.transform=`translateX(${player.clientWidth}px)`
        dom.innerText =''
        dom.className = 'right';
      });
    }    
    domPool.push(doms);
    
    let dom2 = document.createElement('div');      
    dom2.style.fontSize = fontSize + 'px';
    dom2.style.color='rgb(255,255,255)';
    dom2.style.fontFamily='SimHei, "Microsoft JhengHei", Arial, Helvetica, sans-serif'
    dom2.style.fontWeight='bold'
    dom2.style.opacity='1'//不透明度
    dom2.style.textShadow='rgb(0, 0, 0) 1px 0px 1px, rgb(0, 0, 0) 0px 1px 1px, rgb(0, 0, 0) 0px -1px 1px, rgb(0, 0, 0) -1px 0px 1px';
    dom2.style.willChange='auto'
    dom2.style.top = j * fontSize + 'px';
    dom2.className = 'topdown';
    player.parentNode.appendChild(dom2);    
    domtopdownPool.push(dom2);
  } 
}
/**
 * 获取一个可以发射弹幕的通道 没有则返回-1
 */

  
function getChannel() {
  for (let i = 0; i < CHANNEL_COUNT; i++) {
    //let channelArray = 
    let lastNumPos = domPool[i].length-1
    let lastDom = domPool[i][lastNumPos];
    //console.log('lastDom:'+lastDom)
    if (lastDom) {
        if(lastDom.className=='right'){
          //console.log('捷径')
          return i
        }
        let lastDomPos = lastDom.getBoundingClientRect();
        //console.log('lastDomPos.right:'+lastDomPos.right+'playerRect.right:'+playerRect.right)
        // 轨道中最后一个元素要求已经全部进入展示区域
        if (lastDomPos.right > playerRect.right) {
            continue
        }

       let occupyS = lastDomPos.right-playerRect.left
       //console.log('playerRect.left:'+occupyS+'player.clientWidth:'+player.clientWidth)
        // 追及问题
        if (player.clientWidth - occupyS< distance) {
            continue
        }
        for (let j = 0; j < domPool[i].length; j++) {
          if(domPool[i][j].className=='right'){
             return i
          }
        }
        
    }
  }
  return -1;
}

function gettopdownChannel(type) {
  for (let i = 0; i < CHANNEL_COUNT; i++) {
    if(type==4){
      let lastNumPos = domtopdownPool.length-i-1
      let downDom = domtopdownPool[lastNumPos];    
      if(downDom.innerText ==''){
          return i
      }
    }else if(type==5){
      let lastNumPos2 = i
      let topDom = domtopdownPool[lastNumPos2];    
      if(topDom.innerText ==''){
          return i
      }
    }
  }
   return -1; 
  }
 
/**
 * 根据DOM和弹幕信息 发射弹幕
 */
function shootDanmu(dom, arrpJson, channel) {  
  dom.innerText = arrpJson.text;
  console.log(' biu1~ [' + arrpJson.text + ']');
  
  let num16 = parseInt(arrpJson.rgb).toString(16)
  dom.style.color = '#' + (Array(6).join(0) + num16).slice(-6)
  dom.style.fontSize = arrpJson.size  + 'px'
  // 如果为每个弹幕设置 transition 可以保证每个弹幕的速度相同 这里没有保证速度相同
  dom.style.transition = `transform ${0.0074*(dom.clientWidth+player.clientWidth)}s linear`;
 
  // 设置弹幕的位置信息 性能优化 left -> transform
  dom.style.transform = `translateX(${-dom.clientWidth}px)`;
  dom.style.willChange='transform'
  dom.className = 'left';
}

function shoottopdownDanmu(dom, arrpJson, channel) {  
  dom.innerText = arrpJson.text;
  dom.name = new Date().getTime()
  console.log(' biu2~ [' + arrpJson.text + ']');
  let num16 = parseInt(arrpJson.rgb).toString(16)
  dom.style.fontSize = arrpJson.size  + 'px'
  dom.style.color = '#' + (Array(6).join(0) + num16).slice(-6)

  // 设置弹幕的位置信息 性能优化 left -> transform
  dom.style.transform = `translateX(${(player.clientWidth-dom.clientWidth)/2}px)`;
    
}

  



	var $ = $ || window.$;

	var originalInterfaceList = [
		{"name":"Parwix","category":"1","url":"https://vip.parwix.com:4433/player/?url="},
    {"name":"月亮","category":"1","url":"https://api.yueliangjx.com/?url="},
    {"name":"1907","category":"1","url":"https://z1.m1907.cn/?jx="}, 
    {"name":"showxi[多线]","category":"1","url":"https://showxi.xyz/mov/s/?sv=3&url="},
    {"name":"OK[多线]","category":"1","url":"https://okjx.cc/?url="},   
	];
	
	/**
	 * 共有方法
	 */
	function commonFunction(){
		this.GMgetValue = function (name, value) { //得到存在本地的数据
			if (typeof GM_getValue === "function") {
				return GM_getValue(name, value);
			} else {
				return GM.getValue(name, value);
			}
		};
		this.GMsetValue = function(name, value){ //设置存在本地的数据
			if (typeof GM_setValue === "function") {
				return GM_setValue(name, value);
			} else {
				return GM.setValue(name, value);
			}
		};
		this.GMaddStyle = function(css){ //插入css
			var myStyle = document.createElement('style');
			myStyle.textContent = css;
			var doc = document.head || document.documentElement;
			doc.appendChild(myStyle);
		};
		this.GMopenInTab = function(url, open_in_background){ //新标签页打开网址
			if (typeof GM_openInTab === "function") {
				GM_openInTab(url, open_in_background);
			} else {
				GM.openInTab(url, open_in_background);
			}
		};
		this.addScript = function(url){  //添加脚本
			var s = document.createElement('script');
			s.setAttribute('src',url);
			document.body.appendChild(s);
		};
	}
	
	//全局统一变量
	const commonFunctionObject = new commonFunction();
	
	/**
	 * 超级解析助手
	 * @param {Object} originalInterfaceList
	 * @param {Object} playerNodes
	 */
	function superVideoHelper(){
		this.originalInterfaceList = originalInterfaceList;
		this.node = "#player_module";
		this.elementId = Math.ceil(Math.random()*100000000);


		this.innerParse = function(url) { //内嵌解析
			$("#iframe-player").attr("src", url);
		};
		this.addHtmlElements = function(){
			var vipVideoImageBase64 =`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAC9klEQVRoQ+2ZPWgVQRDH/7/CWqOIYOFHFbRSjJhGMGDpByoIago70cqvUtQgdipWFqawMWghGIidhcHKQAJqEURBRfED1CCCjc3IPu4em31775J7d3m8cAtX3O7szP7nPzszx6EeH/T4+VUD6DaDTQbMbE+3D7MY+8Ckkw8BPFuMki7KDtUAuuh9Z3oZMtBljxY2X9eBwq4raWPNQEmOLKxm+TBgZqsknQ1dAVzNco+ZhWsm6ZakHZLC1mQyrZ5OX2RvzMxnSa8lzQJ/YwLzGDCze5JOeoI/gbVtAMxJ6vPW7wKnkr4qbEuaxccDcGWBsfNV0mjMmSGAg5LGA6XbgFehITPbLel5MN84ZAUAUjMPgWO+zZY7YGbvJW0OvRoB8EjSEW9+BhhIvOvCp0wGfPPbgZfpRAzATUnn56GEmJyLd39cBNxeF99FADTa42BskuQef4wDh9oB2CXpRbDpMPA4nTOz05LuBDLrgW+dAACGIkxfkHTDm/8DrMwEkBxgOskkqdwEcMAD4GLf3YF0PACOe+uFGMgA4Bj4EAAbAGbcXLQOmNklSdeCTRuBT2bWL+lNsLYfeFIRgH2SJgJ7GwCXYjMBrJb0K9jUiHEzG5F02VubA9b4skXvQMiAmW2VdFSSn24/As0kk1mJzeyppL3ewaaBnWY2K2mLNz8S5ueCAMLwz3q/DZxreweSe3BC0v1Ai7tkYXrsB96WwMBCAfQBv3MBJCD+SVrhaXaZ54z3PgUMhpYrZKCF7bbNnJk5BhwT6fghyW8thoGxigE4my6tXwemQlt5AGI1oamDSIFLmCuURiW5BOGPL8C7drGV206b2XdJ6yJKxoDhmPKCIeS61ZZClncxFgLAtcyxrnEwRmknDFQFIFYTWnJ/CVmoGgYSj7Z81OR86Lg7sOgPmnY6s0IpN4TyYrDb6zWAmoEOPVCHUIcO7Hh7/YemYxcWU7AMf3BkNGDF/FP9rkwGqjddkoWWv5Ql6V1yNXUdWHKXBwZ7noH/dP+HQNqheToAAAAASUVORK5CYII=`;
			var category_1_html = "";
      this.originalInterfaceList.forEach((item, index) => {
				if (item.category === "1") {
					category_1_html += "<li title='"+item.name+"' data-index='"+index+"'>" + item.name + "</li>";
				}
			});
			
			//获得自定义位置
			var left = 0;
			var top = 100;
			var Position = commonFunctionObject.GMgetValue("Position_" + window.location.host);
			if(!!Position){
				left = Position.left;
				top = Position.top;
			}
			var cssMould = `#vip_movie_box`+this.elementId+` {cursor:pointer; position:fixed; top:` + top + `px; left:` + left + `px; width:0px; z-index:2147483647; font-size:16px; text-align:left;}
							#vip_movie_box`+this.elementId+` .item_text {}
							#vip_movie_box`+this.elementId+` .item_text .img_box{width:26px; height:35px;line-height:35px;text-align:center;background-color:#E5212E;}
							#vip_movie_box`+this.elementId+` .item_text .img_box >img {width:20px; display:inline-block; vertical-align:middle;}
							#vip_movie_box`+this.elementId+` .vip_mod_box_action {display:none; position:absolute; left:26px; top:0; text-align:center; background-color:#272930; border:1px solid gray;}
							#vip_movie_box`+this.elementId+` .vip_mod_box_action li{border-radius:2px; font-size:12px; color:#DCDCDC; text-align:center; width:60px; line-height:21px; float:left; border:1px solid gray; padding:0 4px; margin:4px 2px;overflow:hidden;white-space: nowrap;text-overflow: ellipsis;-o-text-overflow:ellipsis;}
							#vip_movie_box`+this.elementId+` .vip_mod_box_action li:hover{color:#E5212E; border:1px solid #E5212E;}
							
							#vip_movie_box`+this.elementId+` li.selected{color:#E5212E; border:1px solid #E5212E;}
							
							
							#vip_movie_box`+this.elementId+` .selected_text {margin-top:5px;}
							#vip_movie_box`+this.elementId+` .selected_text .img_box{width:26px; height:35px;line-height:35px;text-align:center;background-color:#E5212E;}
							#vip_movie_box`+this.elementId+` .selected_text .img_box >img {width:20px; height:20px;display:inline-block; vertical-align:middle;}
							#vip_movie_box`+this.elementId+` .vip_mod_box_selected {display:none;position:absolute; left:26px; top:0; text-align:center; background-color:#F5F6CE; border:1px solid gray;}
							#vip_movie_box`+this.elementId+` .vip_mod_box_selected ul{overflow-y: auto;}
							#vip_movie_box`+this.elementId+` .vip_mod_box_selected li{border-radius:2px; font-size:12px; color:#393AE6; text-align:center; width:95px; line-height:27px; float:left; border:1px dashed gray; padding:0 4px; margin:4px 2px;display:block;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;}
							#vip_movie_box`+this.elementId+` .vip_mod_box_selected li:hover{color:#E5212E; border:1px solid #E5212E;}
														
							#vip_movie_box`+this.elementId+` .default-scrollbar-55678::-webkit-scrollbar{width:5px; height:1px;}
							#vip_movie_box`+this.elementId+` .default-scrollbar-55678::-webkit-scrollbar-thumb{box-shadow:inset 0 0 5px rgba(0, 0, 0, 0.2); background:#A8A8A8;}
							#vip_movie_box`+this.elementId+` .default-scrollbar-55678::-webkit-scrollbar-track{box-shadow:inset 0 0 5px rgba(0, 0, 0, 0.2); background:#F1F1F1;}
							`
			commonFunctionObject.GMaddStyle(cssMould);
			
			var htmlMould = `
      <div id='vip_movie_box`+this.elementId+`'>
					<div class='item_text'>
						<div class="img_box" id="img_box_6667897iio"><img src='`+ vipVideoImageBase64 +`' title='点击跳转到综合解析页面,线路随意选!'/></div>
							<div class='vip_mod_box_action' >
									<div style='display:flex;'>
											<div style='padding:10px 0px; width:380px; max-height:400px; overflow-y:auto;'  class="default-scrollbar-55678">
													<div>
														  <div style='font-size:16px; text-align:center; color:#E5212E; padding:5px 0px;'><b>线路</b></div>
														  <ul>
															` + category_1_html + `
															   <div style='clear:both;'></div>
														  </ul>
													</div>
											</div>
									</div>
							</div>	
					</div>
			</div>
							`;
			$("body").append(htmlMould);
		};
		this.mouseEvent = function(){
			$(".item_text").on("mouseover", () => {
				$(".vip_mod_box_action").show();
			});
			$(".item_text").on("mouseout", () => {
				$(".vip_mod_box_action").hide();
			});
			$(".vip_mod_box_action li").each((liIndex, item) => {
				item.addEventListener("click", () => {
					var videoPlayer = $("<div id='iframe-play-div' style='width:100%;height:100%;z-index:1000;'><iframe id='iframe-player' frameborder='0' allowfullscreen='true' width='100%' height='100%'></iframe></div>");
					var index = parseInt($(item).attr("data-index"));
					var url = this.originalInterfaceList[index].url + window.location.href;
						if (document.getElementById("iframe-player") == null) {
							var player = $(this.node);
							player.empty();
							player.append(videoPlayer);
						}
						this.innerParse(url);  //把播放链接加入到自定义的div
					//把点击过的标红
					$(".vip_mod_box_action li").removeClass("selected");
					$(item).addClass("selected");
          commonFunctionObject.GMsetValue("index",index);
				});
			});		
		};
		

		
		this.operatOther = function(){
      //console.log(window.location.host)
			switch (window.location.host) {
				case 'www.bilibili.com':
          receiveInfoFromAnotherDomain()
          
          this.addHtmlElements();
        //console.log("检测是否为vip视频");
        let findviptime= new Date().getTime()
				let waitlimit = setInterval(() => {
            let arr1=[$(".bpx-player-toast-confirm").text(),$(".twp-title").text()]
            let arr2=['成为大会员','付费观看','成为大会员抢先看']
            //let arr2=['成为大会员', '开通大会员观看','正在观看预览,大会员免费看全片', '正在观看预览,付费观看完整版']
            let intersection = arr1.filter(item => new Set(arr2).has(item))
            //console.log(arr1,arr2,intersection);
            if(intersection.length!=0){
              console.log("是vip视频");
              $(".player-limit-mask").remove();
              $(".player-limit-mask pay").remove();
              //$(".twp-container").hide() 
              //$(".twp-mask.twp-float").hide()
              this.videoreplace()
              clearInterval(waitlimit);
            }
            if(new Date().getTime()-findviptime>=5000){
              clearInterval(waitlimit)
            }
					}, 250);                       
				break	
        default:
          try{
            detecH5Player(new Date().getTime())
          }catch(err){
            console.log('h5:'+err)
          }
          
        break	      
		}}
    
    this.videoreplace = function(){
      let videoPlayer = $("<div id='iframe-play-div' style='width:100%;height:100%;z-index:1000;'><iframe id='iframe-player' frameborder='0' allowfullscreen='true' width='100%' height='100%'></iframe></div>");
      let index = commonFunctionObject.GMgetValue("index");      
      $(".vip_mod_box_action li").eq(index).addClass("selected");
      if(index==null){
        index=0
      }
			let url2 = this.originalInterfaceList[index].url + window.location.href;
      console.log(index,url2);
      //alert(url);
			if (document.getElementById("iframe-player") == null) {
					let player = $(this.node);
					player.empty();
					player.append(videoPlayer);
      }
      this.innerParse(url2); 
    }
		
		this.start = function(){
			this.operatOther();			
			this.mouseEvent();
			}
		};

	
	(new superVideoHelper()).start();
	//最后统一调用
/*	try{
    //let web = window.location.href
    //if(web.indexOf("bilibili") != -1){ 
	
    
	}catch(e){
		console.log("全网VIP解析:error:"+e);
	}*/
               



})()