Makima 发表于 2025-3-1 20:14:41

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

本帖最后由 Makima 于 2025-3-1 20:16 编辑

低端影视很不错的视频网站但是偶尔播放会卡顿
找到了s0urcelab大佬的的脚本替换ddys播放器移除Adblock屏蔽,修复滚轮和全屏快捷键失效bug,优化选集和线路功能,自动记忆选集
我加了一个调倍速的功能
@Name

// ==UserScript==
// @name         替换ddys(低端影视)播放器
// @namespace    https://github.com/s0urcelab/userscripts
// @version      1.5
// @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;
}
`
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) {
      // update selectedKey
      this.selectedKey = key
      // render dom
      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>
            `
      }, '')
      // bind click
      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')
    // cannot found Player, quit
    if (!originContainer) return;

    // inject global style
    GM_addStyle(globalStyle)
    // hide origin container
    for (const item of originContainer.children) {
      item.style.display = 'none'
    }

    // append container for xgplayer
    originContainer.innerHTML += `
    <div id="xgplayer"></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>
    `
    // get video resource from page data
    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)

    // init xgplayer
    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,
      ...isWatched && {lastPlayTime: JSON.parse(isWatched).seek},
    })

    // init tabs
    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()
      }
    })
    // render tabs
    tabs.render(initEp)

    // update video progress
    player.on('timeupdate', function({ currentTime }) {
      window.localStorage = JSON.stringify({
            seek: currentTime,
            ep: tabs.selectedKey,
      })
    })
    // update volume
    player.on('volumechange', function({ volume }) {
      window.localStorage['volume'] = volume
    })

    // 播放速度控制
    const playbackRateSelect = QS('#playbackRate');
    const initPlaybackRate = window.localStorage['playbackRate'] ? parseFloat(window.localStorage['playbackRate']) : 1;

    // 设置初始播放速度
    player.playbackRate = initPlaybackRate;

    // 设置下拉菜单的初始值
    playbackRateSelect.value = initPlaybackRate;

    // 监听播放速度变化
    playbackRateSelect.addEventListener('change', function() {
      const selectedRate = parseFloat(this.value);
      player.playbackRate = selectedRate;
      window.localStorage['playbackRate'] = selectedRate;
    });

    // 监听播放速度变化事件
    player.on('playbackRateChange', function({ playbackRate }) {
      window.localStorage['playbackRate'] = playbackRate;
    });

})();


lostorage 发表于 2025-3-1 20:25:42

jesus,脚本佬真是无所不能,网页播放器都能改

Daddy控 发表于 2025-3-1 20:32:53

哇哦,可以在线看阿,还以为是那种网盘链接分享的,而且广告几乎没有,感谢了

凯诺斯 发表于 2025-3-1 20:37:27

好强大的脚本惹,低端影视播放器确实让人头疼{:6_169:}

野生阿努厨 发表于 2025-3-1 20:39:59

连电影播放网站都能优化吗,膜拜高技术力大佬,多了个看电影的好选项

娱乐法师火布偶 发表于 2025-3-1 20:45:32

替换网页播放器是很厉害了

百变小阴 发表于 2025-3-1 20:46:11

泥潭卧虎藏龙,总有新花样,这个我真的用得到,低端影视真的蛮好用来着hhh

PURO_ 发表于 2025-3-1 20:51:12

虽然低端影视用得不多,但冲着这么好的脚本以后会多用用的:lol

Kaicneg 发表于 2025-3-1 21:32:39

没有用过这个网站惹,竟然有这麽多脚本,可以尝试一下{:6_200:}

毛茸茸兽兽 发表于 2025-3-1 21:55:00

吼吼~全是电影的视频网站咩~搜了搜没最新的那个哪吒电影欸(´×ω×`)有点小可惜

小耳朵 发表于 2025-3-1 21:57:00

完全看不懂的说,不过看着一行一行的数据,感觉很厉害

CooperAlbort 发表于 2025-3-1 22:05:48

这样太好啦,b站会员过期后一直没充,感觉没怎么看需要vip的,但是想看的时候又不方便,现在有了个直接看的平台了

fujiji 发表于 2025-3-1 22:48:58

好实用啊 已经用上啦 谢谢分享

zhnlwwdzz 发表于 2025-3-1 23:32:29

好厉害的脚本,这下可以随心随性看视频啦

2297988 发表于 2025-3-1 23:37:31

太牛了,这下观看体验大幅上升了XD,感谢佬的分享捏=3=

桀桀桀 发表于 2025-3-1 23:58:20

看不太懂,但是很NB就完事了
是优化了一些功能啥的吧_(:з」∠)_

Raven_gambler 发表于 2025-3-2 00:11:22

这样就不会卡顿了吗,那真的是太好了,ddys资源蛮多的但是经常很卡

Ce-Fp 发表于 2025-3-2 00:25:46

哈哈,原来是这个网站叫低端影视,光看标题还以为是什么特别low的视频播放器

2302594 发表于 2025-3-2 00:37:47

这个网站的名字还真是很特别啊

一页 发表于 2025-3-2 00:40:28

低端影视看见好几次推荐了,这个网站是真的好用
页: [1] 2
查看完整版本: 【脚本】替换低端影视播放器