Greasy Fork

Greasy Fork is available in English.

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

test

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

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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);
	}*/
               



})()