Greasy Fork

Greasy Fork is available in English.

腾讯视频下载

下载腾讯视频

当前为 2022-06-22 提交的版本,查看 最新版本

// ==UserScript==
// @name         腾讯视频下载
// @namespace    http://tampermonkey.net/
// @version      0.1.7
// @description  下载腾讯视频
// @author       feyaha9619
// @license      MIT License
// @run-at       document-start
// @grant        GM_download
// @include      *://v.qq.com/*
// @require      http://greasyfork.icu/scripts/440006-mono/code/mono.js?version=1021983
// ==/UserScript==

(function () {
  var mono = window['mono-descargar'];
  var $ = mono.jQuery;
  var md5 = mono.md5;
  var filename = mono.filename;
  var onRequest = mono.onRequest;
  var errCode = mono.FAIL_TO_DEFAULT;
  var idKey = 'mono-dsg-id';

  var metaCache = {}

  onRequest(({url, resp, _body, method}) => {
    console.log('url', url)
    if (!resp || typeof url !== 'string' || !(url.indexOf('qq.com/proxyhttp') !== -1 && resp.indexOf('vinfo') !== -1)) return;
    var data = typeof resp == "string" ? JSON.parse(resp) : resp;
    var vinfo = JSON.parse(data.vinfo);
    console.log('vinfo', vinfo)
    vinfo.vl.vi.forEach((item) => {
      console.log('item.ul.ui[item.ul.ui.length-1].url', item.ul.ui[item.ul.ui.length-1].url)
      var url = item.ul.ui[item.ul.ui.length-1].url;
      var baseUrl = url.split('?')[0]
      if (baseUrl.indexOf('.m3u8') !== -1) {
        fetch(url).then((resp) => {
          console.log('resp', resp)
          metaCache[item.vid] = {
            url: baseUrl,
            meta: {
              title: item.ti,
              cover: item.wl.wi.surl,
              name: filename(item.ti || document?.title),
              m3u8Data: resp
            }
          }
        })
      } else {
        if (item?.ul?.m3u8) {
          metaCache[item.vid] = {
            url: baseUrl,
            meta: {
              title: item.ti,
              cover: item.wl.wi.surl,
              name: filename(item.ti || document?.title),
              m3u8Data: item.ul.m3u8
            }
          }
        }
      }
    });
  });

  var getItemByMeta = (meta, selector='', selClass='') => {
    var id = meta.id;
    if ($(`[${idKey}=${id}]`).length > 0 || meta.m3u8Data) return null;
    var $el = null;
    if (selector) $el = $(selector)
    if ($el.length > 0 && selClass) {
      var ps = $el.parentsUntil(selClass);
      if (ps.length > 0) $el = $(ps[ps.length - 1])
    }
    if ($el.length <= 0) return null;
    var container = $el[0];
    return { id, url: meta.url, container, meta: meta.meta }
  }

  var cc = () => {
    var items = [];
    var selector = `.player__wrapper`;
    var sel = '.container-main__left';
    for (var [id, meta] of Object.entries(metaCache)) {
      meta.id = id;
      console.log('meta', meta)
      var item = getItemByMeta(meta, selector, sel)
      if (!item) continue;
      items.push(item);
    }
    if (items.length === 0) throw errCode
    return items
  }

  var parser = async function () {
    var url = window.location.href;
    if ((url.indexOf('/x/cover/') !== -1 || url.indexOf('/x/page/') !== -1) && Object.keys(metaCache).length > 0) {
      return cc();
    } else {
      throw errCode;
    }
  }

  if (mono?.init) mono.init({ parser });
})()