javdb添加跳转在线观看网站

在影片详情页显示跳转到在线观看网站的按钮,并检查对应是否存在资源,如果对应网站上存在该资源则为绿色,否则显示红色。

As of 2021-07-18. See the latest version.

// ==UserScript==
// @name         javdb添加跳转在线观看网站
// @version      0.00021.3
// @description  在影片详情页显示跳转到在线观看网站的按钮,并检查对应是否存在资源,如果对应网站上存在该资源则为绿色,否则显示红色。
// @author       misssion522
// @match        https://javdb.com/*
// @include      /^https:\/\/(\w*\.)?javdb(\d)*\.com.*$/
// @icon         https://www.google.com/s2/favicons?domain=javdb.com
// @license      MIT
// @connect      jable.tv
// @connect      javhhh.com
// @connect      netflav.com
// @connect      javbus.com
// @connect      avgle.com
// @connect      www2.bestjavporn.com
// @connect      translate.google.cn
// @connect      *
// @grant        GM_xmlhttpRequest
// @grant        GM_addStyle
// @require      https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js
// @require      https://cdn.bootcss.com/qs/6.7.0/qs.min.js
// @namespace http://tampermonkey.net/
// ==/UserScript==

'use strict';

// document.querySelectorAll('img').forEach((item) => {
//   item.style.display = 'none';
// });

// 网站列表
let site = [
  { id: 0, name: 'Jable', hostname: 'jable.tv', url: 'https://jable.tv/videos/(code)/', search: 'false', domQuery: { subQuery: '.header-right>h6' }, methods: temp },
  {
    id: 1,
    name: 'JAVHHH',
    hostname: 'javhhh.com',
    url: 'https://javhhh.com/v/?wd=(code)',
    search: 'search',
    domQuery: { linkQuery: '.typelist>.i-container>a[href]', titleQuery: '.typelist>.i-container>a[href]' },
    methods: temp,
  },
  {
    id: 2,
    name: 'NETFLAV',
    hostname: 'netflav.com',
    url: 'https://netflav.com/search?type=title&keyword=(code)',
    search: 'search',
    domQuery: { linkQuery: '.grid_cell>a', titleQuery: '.grid_cell>a>.grid_title' },
    methods: temp,
  },
  {
    id: 3,
    name: 'Avgle',
    hostname: 'avgle.com',
    url: 'https://avgle.com/search/videos?search_query=(code)&search_type=videos',
    search: 'search',
    domQuery: { linkQuery: '.container>.row .row .well>a[href]', titleQuery: '.container>.row .row .well .video-title' },
    methods: temp,
  },
  {
    id: 4,
    name: 'BestJavPorn',
    hostname: 'BestJavPorn.com',
    url: 'https://www2.bestjavporn.com/search/(code)/',
    search: 'search',
    domQuery: { linkQuery: 'article.thumb-block>a', titleQuery: 'article.thumb-block>a' },
    methods: temp,
  },
  // 未完成
  // { id: 5, name: 'javtrust', hostname: 'javtrust.com', url: 'https://javtrust.com/search/movie/(code).html', search: 'false', domQuery:null },
  { id: 6, name: 'JavBus', hostname: 'javbus.com', url: 'https://javbus.com/(code)', search: 'false', domQuery: null, methods: temp },
  // { id: '99', hostname: 'test.com', url: 'https://adgfajffkasj.com/', search: 'false', domQuery:null },
];

function addStyle() {
  GM_addStyle('.provide-sub::after {  position:absolute;  content:"字幕";  padding: 1px;  top:-5px;  left:-2px;  line-height:1;  color:white;  background: green;}');
}

// 查找字幕
function querySub(dom, button) {
  let queryString = '';
  if (this.domQuery != null) {
    queryString = this.domQuery.subQuery === undefined ? this.domQuery.titleQuery : this.domQuery.subQuery;
  }
  if (dom.querySelector(queryString).innerText.includes('字幕' || 'subtitle')) {
    button.classList.add('provide-sub');
  }
}

function temp() {}

//获取分数,   不写了
// function getScore(link) {
//   GM_xmlhttpRequest({
//     method: 'GET',
//     url: link,
//     headers: {
//       'Content-type': 'application/x-www-form-urlencoded',
//     },
//     onload: function (result) {
//       console.dir(result.responseText);
//     },
//   });
// }

//传入网站,处理网站

function getWebsite(site) {
  let videoCode = document.querySelector('[data-clipboard-text]').attributes[2].value;
  let xhrResult = '';
  let siteUrl = site.url.replace('(code)', videoCode);
  // let siteReg = site.reg;
  // let siteReg = new RegExp(site.reg.replace('(code)', videoCode), 'gim');

  const buttonG = document.createElement('a');
  document.querySelectorAll('.panel-block div.buttons')[1].appendChild(buttonG);
  buttonG.classList.add('button', 'is-info', 'is-outlined', 'button-g');
  buttonG.innerHTML = site.name;
  buttonG.setAttribute('target', '_blank');
  buttonG.href = siteUrl;
  function setbuttonGColor(color) {
    buttonG.style.color = color;
    buttonG.style.borderColor = color;
  }

  // 获取xhr状态函数,立即执行
  (function xhr() {
    GM_xmlhttpRequest({
      method: 'GET',
      url: siteUrl,
      onload: function (result) {
        xhrResult = result.status;
        console.log(`---${site.name} onload,${xhrResult},-${siteUrl}`);
        let domNew = new DOMParser().parseFromString(result.responseText, 'text/html');

        // 默认search=’false‘,不用任何搜索,直接200 显示绿色
        if (site.search == 'search') {
          let linkElement = domNew.querySelectorAll(site.domQuery.linkQuery)[0];
          let titleElement = domNew.querySelectorAll(site.domQuery.titleQuery)[0];
          // console.dir(titleElement);
          // console.dir(linkElement);

          if (linkElement != undefined && titleElement.outerHTML.includes(videoCode)) {
            // buttonG.href = `https://${site.hostname}${element.pathname}${element.search}`;
            buttonG.href = linkElement.href.replace(linkElement.hostname, site.hostname);
          } else {
            console.log('undefined');
            xhrResult = 404;
          }
        }
        xhrResult == 404 ? setbuttonGColor('red') : setbuttonGColor('green');

        //找字幕,绑定对象
        if (xhrResult != 404) {
          querySub.call(site, domNew, buttonG);
        }
        console.log(`---${site.name} xhrEnd---`);
      },
      onerror: function (result) {
        // xhrResult = false;
        console.log(`---${site.hostname} onerror`, xhrResult);
        console.log(result);
        setbuttonGColor('red');
      },
    });
  })();
}

//谷歌翻译
function translateTitle(query) {
  const ButtonT = document.createElement('h2');
  let h2title = document.querySelector('h2.title.is-4');
  h2title.appendChild(ButtonT);
  ButtonT.classList.add('title', 'is-6', 'button_t');
  ButtonT.innerHTML = '翻译';
  ButtonT.style.display = 'none';
  ButtonT.style.background = '#EEEEEB';
  ButtonT.style.padding = '.5em 0';
  ButtonT.style.cursor = 'pointer';

  h2title.addEventListener('mouseover', () => {
    ButtonT.style.display = 'block';
  });
  h2title.addEventListener('mouseout', () => {
    ButtonT.style.display = 'none';
  });

  ButtonT.addEventListener('click', getTranslate);

  let data = {
    client: 'gtx',
    dt: 't',
    dj: 1,
    ie: 'UTF-8',
    sl: 'auto', //目的类型
    tl: 'zh-CN', //目标语言
    q: query,
  };
  // https://translate.google.cn/translate_a/single?client=gtx&dt=t&dj=1&ie=utf-8&sl=auto&tl=auto&q=''
  let requestUrl = 'https://translate.google.cn/translate_a/single?' + Qs.stringify(data);
  let flag = true;
  function getTranslate() {
    if (!flag) {
      return;
    }
    GM_xmlhttpRequest({
      method: 'GET',
      url: requestUrl,
      onload: function (res) {
        console.log('tarnslateXHR');
        let json = JSON.parse(res.responseText);
        // console.log(json.sentences[0].trans);
        ButtonT.innerHTML = json.sentences[0].trans;
        flag = false;
      },
    });
  }
}

// 执行
let curLocation = location.pathname;
if (document.querySelector('.tabs.is-boxed')) {
  console.log('mainPage');
  // mainPage();
} else if (curLocation.includes('/v/') && document.querySelector('h2')) {
  console.log('vPage');
  vPage();
  addStyle();
}

// function mainPage() {
//   let items = document.querySelectorAll('.grid-item.column>a');
//   items.forEach((item) => {
//     getScore(item.href);
//   });
// }

function vPage() {
  translateTitle(document.querySelector('h2.title.is-4').innerHTML);
  site.forEach((item) => {
    getWebsite(item);
  });
}