Makima 发表于 2025-8-12 18:02:32

【脚本】替换低端影视播放器

低端影视很不错的视频网站但是偶尔播放会卡顿https://img.gamemale.com/forum/202503/01/201327kuu2n342b8y84ff9.jpg找到了s0urcelab大佬的的脚本替换ddys播放器移除Adblock屏蔽,修复滚轮和全屏快捷键失效bug,优化选集和线路功能,自动记忆选集
我之前加了一个调倍速的功能新增:zxc调整倍速z 变回1xx 减低0.1xc 加快0.1x疗养院测试了一下,应该没什么问题{:4_89:}@Name @Match
// ==UserScript==
// @name         替换ddys(低端影视)播放器
// @version      1.6
// @description替换ddys播放器,移除Adblock屏蔽,修复滚轮和全屏快捷键失效bug,优化选集和线路功能,自动记忆选集(添加了倍速功能
// @author       s0urce
// @match      https://ddys.art/*
// @match      https://ddys.pro/*
// @icon         https://ddys.pro/favicon-16x16.png
// @grant      GM_addStyle
// @grant      GM_xmlhttpRequest
// @require      https://fastly.jsdelivr.net/npm/[email protected]/browser/index.min.js
// @run-at       document-end
// @downloadURL https://update.greasyfork.org/scripts/464925/%E6%9B%BF%E6%8D%A2ddys%EF%BC%88%E4%BD%8E%E7%AB%AF%E5%BD%B1%E8%A7%86%EF%BC%89%E6%92%AD%E6%94%BE%E5%99%A8.user.js
// @updateURL https://update.greasyfork.org/scripts/464925/%E6%9B%BF%E6%8D%A2ddys%EF%BC%88%E4%BD%8E%E7%AB%AF%E5%BD%B1%E8%A7%86%EF%BC%89%E6%92%AD%E6%94%BE%E5%99%A8.meta.js
// ==/UserScript==
const QS = (q) => document.querySelector(q)
const QSA = (q) => document.querySelectorAll(q)

const domain = window.location.hostname
const src4domain = `v.ddys.pro`

const globalStyle = `
.wp-playlist-tracks {
    display: none!important;
}
.wp-video-playlist {
    display: flex;
    padding: 0!important;
    border: none!important;
    background: none!important;
}
.entry > p {
    display: none;
}
.player-sider {
    width: 220px;
    display: flex;
    flex-direction: column;
    background-color: #2e2e2e;
    border-radius: 8px;
    margin-left: 10px;
    padding: 4px;
}
.tab-item {
    cursor: pointer;
    margin-bottom: 6px;
    padding: 8px;
    color: white;
    background-color: #5a5a5a;
    border-radius: 5px;
}
.tab-item.playing {
    font-weight: bold;
    color: #3a8fb7;
    background-color: #232323;
}
.tab-item:not(.playing):hover {
    background-color: #232323;
}
.tab-item > .indicator {
    height: 14px;
    width: 14px;
    font-size: 14px;
    margin-right: 5px;
}
.speed-display {
    position: absolute;
    top: 10px;
    left: 10px;
    background: rgba(0,0,0,0.7);
    color: white;
    padding: 5px 10px;
    border-radius: 4px;
    font-size: 14px;
    z-index: 100;
    display: none;
}
.xgplayer-playbackrate {
    display: none !important;
}
`

function parseResUrl(d) {
    return { ...d, url: `https://${src4domain}${d[`src${d.srctype - 1}`]}` }
}
class Tabs {
    constructor(init) {
      this.root = init.root
      this.data = init.data
      this.onSelect = init.onSelect
      this.selectedKey = init.data.key
    }

    render(key = this.selectedKey) {
      this.selectedKey = key
      this.root.innerHTML = this.data.reduce((acc, curr) => {
            const isTarget = key === curr.key
            return `${acc}
                <div class="tab-item ${isTarget ? 'playing' : ''}" data-tab-key="${curr.key}">
                ${isTarget ? '<img class="indicator" src="//s1.hdslb.com/bfs/static/jinkela/video/asserts/playing.gif"></img>' : ''}
                ${curr.label}
            </div>
            `
      }, '')
      const self = this
      for (const tabElment of this.root.children) {
            tabElment.onclick = function() {
                const tabKey = tabElment.dataset.tabKey
                const record = self.data.find(v => v.key === tabKey)
                self.render(tabKey)
                self.onSelect(tabKey, record)
            }
      }
    }
}

; (async function () {
    'use strict';

    const originContainer = QS('.wp-video-playlist')
    if (!originContainer) return;

    GM_addStyle(globalStyle)
    for (const item of originContainer.children) {
      item.style.display = 'none'
    }

    originContainer.innerHTML += `
    <div id="xgplayer">
      <div class="speed-display"></div>
    </div>
    <div class="player-sider">
      <div class="tabs-root"></div>
      <select id="playbackRate">
            <option value="0.75">0.75x</option>
            <option value="1" selected>1x</option>
            <option value="1.25">1.25x</option>
            <option value="1.5">1.5x</option>
            <option value="2">2x</option>
      </select>
    </div>
    `

    const res = JSON.parse(QS('.wp-playlist-script').textContent)
    const resPromise = res.tracks
      .map((track, idx) => ({ ...track, key: `${idx + 1}`, label: track.caption }))
      .map(parseResUrl)
    const resGroups = await Promise.all(resPromise)

    const initVolume = window.localStorage['volume'] ? parseFloat(window.localStorage['volume']) : 1
    const isWatched = window.localStorage
    const initEp = isWatched ? JSON.parse(isWatched).ep : '1'
    const initPlayUrl = resGroups.find(v => v.key === initEp).url

    console.warn(`当前播放资源url:${initPlayUrl}`)
    const player = new window.Player({
      id: 'xgplayer',
      url: initPlayUrl,
      volume: initVolume,
      fluid: true,
      videoInit: true,
      lastPlayTimeHideDelay: 3,
      playbackRate: window.localStorage['playbackRate'] ? parseFloat(window.localStorage['playbackRate']) : 1,
      ...isWatched && {lastPlayTime: JSON.parse(isWatched).seek},
    })

    const tabs = new Tabs({
      root: QS('.tabs-root'),
      data: resGroups,
      onSelect: (key, record) => {
            console.warn(`切换选集:【${key}】${record.label}`)
            player.src = record.url
            console.warn(`当前播放资源url:${record.url}`)
            player.play()
      }
    })
    tabs.render(initEp)

    player.on('timeupdate', function({ currentTime }) {
      window.localStorage = JSON.stringify({
            seek: currentTime,
            ep: tabs.selectedKey,
      })
    })

    player.on('volumechange', function({ volume }) {
      window.localStorage['volume'] = volume
    })

    const playbackRateSelect = QS('#playbackRate');
    playbackRateSelect.value = player.playbackRate;

    playbackRateSelect.addEventListener('change', function() {
      const selectedRate = parseFloat(this.value);
      player.playbackRate = selectedRate;
      window.localStorage['playbackRate'] = selectedRate;
      showSpeed(selectedRate);
    });

    player.on('playbackRateChange', function({ playbackRate }) {
      window.localStorage['playbackRate'] = playbackRate;
      playbackRateSelect.value = playbackRate;
    });

    function showSpeed(speed) {
      const display = QS('.speed-display');
      display.textContent = `当前倍速: ${speed.toFixed(1)}x`;
      display.style.display = 'block';
      setTimeout(() => {
            display.style.display = 'none';
      }, 2000);
    }

    document.addEventListener('keydown', (e) => {
      if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') return;

      const currentRate = player.playbackRate;
      let newRate = currentRate;

      switch(e.key.toLowerCase()) {
            case 'z':
                newRate = 1;
                break;
            case 'x':
                newRate = Math.max(0.1, currentRate - 0.1);
                break;
            case 'c':
                newRate = Math.min(5, currentRate + 0.1);
                break;
            default:
                return;
      }

      if (newRate !== currentRate) {
            player.playbackRate = newRate;
            playbackRateSelect.value = newRate;
            showSpeed(newRate);
      }
    });

})();

娱乐法师火布偶 发表于 2025-8-12 18:10:33

替换播放器可以提高观看体验了

凯诺斯 发表于 2025-8-12 18:31:15

很有用的脚本惹,流畅的观看体验十分重要:loveliness:

克莱因蓝 发表于 2025-8-12 19:00:45

看到精彩部分卡一下真的影响体验呢 改善流畅度很棒呢

飞扬fox 发表于 2025-8-12 19:04:59

很有用的脚本,体现一下子就上来了

柏芸 发表于 2025-8-12 19:21:38

有了脚本之后确实感觉更方便流畅了呢,非常不错的脚本;P

赴约波波 发表于 2025-8-12 19:30:44

很有用的脚本呢,这样就不用忍受网页自带的播放器带来的糟糕体验了,操控性也变好了

诺鸦cc 发表于 2025-8-12 20:02:13

这个网站确实很好用,感谢分享jio本,等下去试试看来会非常好用(●´З`●)

离群的鱼 发表于 2025-8-12 21:07:46

感谢分享,我也喜欢用这个网站:lol

Raven_gambler 发表于 2025-8-12 22:09:55

太实用了,ddys资源很全但是广告还是很烦人的

cdcai 发表于 2025-8-12 22:44:18

优化播放的脚本,太强了吧

毛茸茸兽兽 发表于 2025-8-12 23:19:12

吼(´×ω×`)搜了搜想看的几部动漫都没有欸,有点可惜的

威风妖怪麒麟 发表于 2025-8-13 00:47:06

替换播放器让在这个网站观看的流畅度提升了很大啊

呆到自然蠢 发表于 2025-8-13 04:02:51

很棒的视频网站惹 要是番剧多点就好了

polkpi 发表于 2025-8-13 05:39:35

咦点进网站的一瞬间就屏掉2条暗链真的没问题吗

2302594 发表于 2025-8-13 06:41:47

脚本能够做到的事还真是非常的多啊

you9632587 发表于 2025-8-13 07:05:46

他原本那个播放器确实不怎么好用,能替换掉就很舒服了

MacVasion 发表于 2025-8-13 11:30:18

好强,这个网站上的资源还是挺多的,就是播放器总是一卡一卡,能改善真是太好了

小晨风 发表于 2025-8-13 17:06:31

虽然看不明白但是只能说楼主太强了QAQ

万俟 发表于 2025-8-13 18:28:07

这个太实用了!必须给很多很好评分,这种插件真的多多益善
页: [1] 2
查看完整版本: 【脚本】替换低端影视播放器