Greasy Fork is available in English.

资源网助手

最大资源网、172资源网、1977资源网、ok资源网、高清电影资源站、永久资源网、酷云资源、酷播资源网、非凡资源网[MP4][m3u8]视频直接播放,分类页面改进翻页功能。

// ==UserScript==
// @name         资源网助手
// @namespace    https://greasyfork.org/zh-CN/users/104201
// @version      2.5
// @description  最大资源网、172资源网、1977资源网、ok资源网、高清电影资源站、永久资源网、酷云资源、酷播资源网、非凡资源网[MP4][m3u8]视频直接播放,分类页面改进翻页功能。
// @author       黄盐
// 影视作品介绍页面
// @match        */?m=vod-*
// 分类页面
// @match        */detail/*
// ╮(╯▽╰)╭  好尴尬啊~我都忘记这个站点是用来做什么的了。最初添加好像是有些资源用这个网址开头的。
// @match        http://bobo.okokbo.com*
// @resource     playercss   https://cdn.bootcss.com/dplayer/1.25.0/DPlayer.min.css
// @require      https://cdn.bootcss.com/hls.js/0.12.4/hls.min.js
// @require      https://cdn.bootcss.com/dplayer/1.25.0/DPlayer.min.js
// @require      https://cdn.bootcss.com/zepto/1.2.0/zepto.min.js
// @noframes
// @run-at       document-end
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_addStyle
// @grant        GM_getResourceText
// @grant        unsafeWindow
// ==/UserScript==
;/* jshint esversion: 6 */
(function () {

  GM_addStyle(`
    span.zPlayButton{color:orange;font-size:1.2em;padding:2px 5px}
    span.played{color:gray}
    span.zPlayButton:hover{cursor:pointer;font-size:1.5em;background:#00000010;padding:3px 10px}
    /* 不是 m3u8 或者 MP4 的链接,直接打开另外的网页就可以 */
    span[data-url]{display:none}
    span[data-url*=m3u8],span[data-url*=mp4]{display:inline-block}
    table a{font-family:"微软雅黑"}
    #playerContainer{width:60%;position:fixed;display:block;z-index:9000;right:0;top:5em;}
    #playerControls{position:absolute;width:100%;cursor:move;top:0;z-index:10000;visibility:hidden;}
    #playerContainer:hover #playerControls{visibility:visible;}
    #playerControls i{display:inline-block;max-height:40px;width:25px;padding:2px 5px;margin-left:5px;color:#fff;text-align:center;font-size: 16px;cursor:pointer;background:#ffff0080}
    #playerControls i:hover{color:red}
    #playerTitle{margin-left:10px;color:cyan}
  `);
  GM_addStyle(GM_getResourceText("playercss"));

  let tempElement, tempText;
  // 链接转化,添加播放按钮
  Zepto('input[name*=copy_]').forEach(elm => {
    // 链接转化为真链接
    if (Zepto(elm).parent().find('a').length) {
      // 有 <a> 元素的情况
      Zepto(elm).parent().find('a').attr({
        href: Zepto(elm).val(),
        target: '_blank'
      }).after(`<span class="zPlayButton" data-url='${Zepto(elm).val()}'>▶</span>`);
    } else {
      // 没有 <a> 元素的情况
      tempElement = elm; tempText = Zepto(elm).parent().text();
      Zepto(elm).parent().empty().append(tempElement).append(`<a href="${Zepto(tempElement).val()}" target="_blank">${tempText}</a>`)
        .append(`<span class="zPlayButton" data-url='${Zepto(tempElement).val()}'>▶</span>`);
    }
  });
  // 元素全屏
  function fullScreen(elm) {
    if (elm.requestFullscreen) {
      elm.requestFullscreen();
    } else if (elm.webkitRequestFullScreen) {
      elm.webkitRequestFullScreen();
    } else if (elm.mozRequestFullScreen) {
      elm.mozRequestFullScreen();
    } else {
      elm.msRequestFullscreen();
    }
  }
  // 播放器拖动位置
  function move(e) {
    let left, top;
    let div = Zepto('#playerContainer')[0];
    let disX = e.clientX - div.offsetLeft;
    let disY = e.clientY - div.offsetTop;
    document.onmousemove = (e) => {
      left = e.clientX - disX;
      top = e.clientY - disY;
      Zepto(div).css({ left: left + 'px', top: top + 'px' });
    };
    document.onmouseup = (e) => {
      // 在left或者top有值才更新
      if(left&&top){GM_setValue('position', { left: left, top: top })}
      document.onmousemove = null;
      document.onmouseup = null;
    };
  }

  // 页面添加播放器,按需初始化
  function initPlayer(videoUrl = "") {
    // 添加播放器容器
    Zepto('body').append(`
      <div id="playerContainer">
        <div id="playerControls">
          <i data-size="small">🗕</i>
          <i data-size="medium">🗗</i>
          <i data-size="big">🗖</i>
          <i data-size="full">🡧🡥</i>
          <i data-size="close">🗙</i>
          <b id="playerTitle"></b>
        </div>
        <div id="zplayer"></div>
      </div>`);
    unsafeWindow.dp = new DPlayer({
      container: Zepto('#zplayer')[0],
      volume: 1,
      video: { url: videoUrl }
    });
    // 播放器调整尺寸或者关闭按钮功能
    function spanClick(e) {
      let sizes = {
        small: { width: '35%', height: 'auto' },
        medium: { width: '70%', height: 'auto' },
        big: { width: '100%', height: 'auto' }
      };
      console.log(unsafeWindow.dp.url)
      let size = e.target.dataset.size;
      switch (size) {
        case 'small':
        case 'medium':
        case 'big':
          Zepto('#playerContainer').css(sizes[size]);
          break;
        case 'full':
          fullScreen(Zepto('#playerContainer')[0]);
          break;
        case 'close':
          unsafeWindow.dp.switchVideo({ url: '' }); // 不用 dp.destroy(), 免得重新渲染
          setTimeout(() => {unsafeWindow.dp.notice('关闭', 100)}, 100); // 避免出现“视频加载失败”
          unsafeWindow.dp.pause();
          Zepto('#playerContainer').hide();
          break;
        default:
          break;
      }
    }
    let position = GM_getValue('position', { left: 200, top: 100 });
    Zepto('#playerContainer').css({ left: position.left + 'px', top: position.top + 'px' });
    Zepto("#playerControls").on('mousedown', move);
    Zepto('#playerControls i').on('click', (e) => { spanClick(e); });

  }

  // 切换播放链接,点击播放按钮的时候生效
  function switchVideo(e) {
    // 还没有播放器的话,就初始化
    if (unsafeWindow.dp == undefined) { initPlayer(); }
    $('#playerContainer').show();
    let title = Zepto(e.target).prev().text().split('$')[0];
    Zepto('#playerTitle').text(title);

    console.log(title, "新视频地址:", e.target.dataset.url);  // 这一行不要删除

    unsafeWindow.dp.switchVideo({ url: e.target.dataset.url });
    unsafeWindow.dp.play();
  }
  Zepto('.zPlayButton').on('click', e => {
    Zepto(e.target).addClass('played');
    switchVideo(e);
  });


})();