GameMale
登陆 / 注册 搜索

USERCENTER

SEARCHSITE

搜索

查看: 2132|回复: 27
收起左侧

[技术交流] 【脚本】替换低端影视播放器

[复制链接] |关注本帖

GM活动员

Futūrum(未来)神奇宝贝大师球果体76呆猫永远的克叔炙热的格拉迪欧拉斯亭亭如盖光之少女の魔法书圣甲虫秘典死灵之书

     楼主| Makima 发表于 2025-8-12 18:02:32 | 显示全部楼层 |阅读模式 <
    很不错的视频网站
    但是偶尔播放会卡顿
    找到了s0urcelab大佬的的脚本
    替换ddys播放器移除Adblock屏蔽,修复滚轮和全屏快捷键失效bug,优化选集和线路功能,自动记忆选集

    我之前加了一个调倍速的功能
    新增:
    zxc调整倍速
    z 变回1x
    x 减低0.1x
    c 加快0.1x
    疗养院测试了一下,应该没什么问题

    1. // ==UserScript==
    2. // @name         替换ddys(低端影视)播放器
    3. // @version      1.6
    4. // @description  替换ddys播放器,移除Adblock屏蔽,修复滚轮和全屏快捷键失效bug,优化选集和线路功能,自动记忆选集(添加了倍速功能
    5. // @author       s0urce
    6. // @match        https://ddys.art/*
    7. // @match        https://ddys.pro/*
    8. // [url=home.php?mod=space&uid=682785]@icon[/url]         https://ddys.pro/favicon-16x16.png
    9. // @grant        GM_addStyle
    10. // @grant        GM_xmlhttpRequest
    11. // @require      https://fastly.jsdelivr.net/npm/[email protected]/browser/index.min.js
    12. // @run-at       document-end
    13. // @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
    14. // @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
    15. // ==/UserScript==
    16. const QS = (q) => document.querySelector(q)
    17. const QSA = (q) => document.querySelectorAll(q)

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

    20. const globalStyle = `
    21. .wp-playlist-tracks {
    22.     display: none!important;
    23. }
    24. .wp-video-playlist {
    25.     display: flex;
    26.     padding: 0!important;
    27.     border: none!important;
    28.     background: none!important;
    29. }
    30. .entry > p {
    31.     display: none;
    32. }
    33. .player-sider {
    34.     width: 220px;
    35.     display: flex;
    36.     flex-direction: column;
    37.     background-color: #2e2e2e;
    38.     border-radius: 8px;
    39.     margin-left: 10px;
    40.     padding: 4px;
    41. }
    42. .tab-item {
    43.     cursor: pointer;
    44.     margin-bottom: 6px;
    45.     padding: 8px;
    46.     color: white;
    47.     background-color: #5a5a5a;
    48.     border-radius: 5px;
    49. }
    50. .tab-item.playing {
    51.     font-weight: bold;
    52.     color: #3a8fb7;
    53.     background-color: #232323;
    54. }
    55. .tab-item:not(.playing):hover {
    56.     background-color: #232323;
    57. }
    58. .tab-item > .indicator {
    59.     height: 14px;
    60.     width: 14px;
    61.     font-size: 14px;
    62.     margin-right: 5px;
    63. }
    64. .speed-display {
    65.     position: absolute;
    66.     top: 10px;
    67.     left: 10px;
    68.     background: rgba(0,0,0,0.7);
    69.     color: white;
    70.     padding: 5px 10px;
    71.     border-radius: 4px;
    72.     font-size: 14px;
    73.     z-index: 100;
    74.     display: none;
    75. }
    76. .xgplayer-playbackrate {
    77.     display: none !important;
    78. }
    79. `

    80. function parseResUrl(d) {
    81.     return { ...d, url: `https://${src4domain}${d[`src${d.srctype - 1}`]}` }
    82. }
    83. class Tabs {
    84.     constructor(init) {
    85.         this.root = init.root
    86.         this.data = init.data
    87.         this.onSelect = init.onSelect
    88.         this.selectedKey = init.data[0].key
    89.     }

    90.     render(key = this.selectedKey) {
    91.         this.selectedKey = key
    92.         this.root.innerHTML = this.data.reduce((acc, curr) => {
    93.             const isTarget = key === curr.key
    94.             return `${acc}
    95.                 <div class="tab-item ${isTarget ? 'playing' : ''}" data-tab-key="${curr.key}">
    96.                 ${isTarget ? '<img class="indicator" src="//s1.hdslb.com/bfs/static/jinkela/video/asserts/playing.gif"></img>' : ''}
    97.                 ${curr.label}
    98.             </div>
    99.             `
    100.         }, '')
    101.         const self = this
    102.         for (const tabElment of this.root.children) {
    103.             tabElment.onclick = function() {
    104.                 const tabKey = tabElment.dataset.tabKey
    105.                 const record = self.data.find(v => v.key === tabKey)
    106.                 self.render(tabKey)
    107.                 self.onSelect(tabKey, record)
    108.             }
    109.         }
    110.     }
    111. }

    112. ; (async function () {
    113.     'use strict';

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

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

    120.     originContainer.innerHTML += `
    121.     <div id="xgplayer">
    122.         <div class="speed-display"></div>
    123.     </div>
    124.     <div class="player-sider">
    125.         <div class="tabs-root"></div>
    126.         <select id="playbackRate">
    127.             <option value="0.75">0.75x</option>
    128.             <option value="1" selected>1x</option>
    129.             <option value="1.25">1.25x</option>
    130.             <option value="1.5">1.5x</option>
    131.             <option value="2">2x</option>
    132.         </select>
    133.     </div>
    134.     `

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

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

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

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

    166.     player.on('timeupdate', function({ currentTime }) {
    167.         window.localStorage[location.pathname] = JSON.stringify({
    168.             seek: currentTime,
    169.             ep: tabs.selectedKey,
    170.         })
    171.     })

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

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

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

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

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

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

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

    199.         switch(e.key.toLowerCase()) {
    200.             case 'z':
    201.                 newRate = 1;
    202.                 break;
    203.             case 'x':
    204.                 newRate = Math.max(0.1, currentRate - 0.1);
    205.                 break;
    206.             case 'c':
    207.                 newRate = Math.min(5, currentRate + 0.1);
    208.                 break;
    209.             default:
    210.                 return;
    211.         }

    212.         if (newRate !== currentRate) {
    213.             player.playbackRate = newRate;
    214.             playbackRateSelect.value = newRate;
    215.             showSpeed(newRate);
    216.         }
    217.     });

    218. })();
    复制代码


    评分

    参与人数 4血液 +9 追随 +4 堕落 +3 收起 理由
    sumoyys + 1 + 1
    万俟 + 5 + 1 + 1 三连献上
    blitzcrank + 3 + 1 喜翻儿
    凯诺斯 + 1 + 1 + 1 三连献上

    查看全部评分

    回复

    使用道具 举报

    GM活动员

    弗雷迪玩偶发条八音盒桂花米糕鎏彩万幢女巫之路虚空之海的鲸【新春限定】果体 隆『召唤好运的角笛』永远的克叔業火死鬥

      娱乐法师火布偶 发表于 2025-8-12 18:10:33 | 显示全部楼层 <
      回复

      使用道具 举报

      Lvl. 10 · I

      GM活动员

      漂洋小船冒险用指南针破损的旧书人鱼之泪雪王的心脏苏格兰圆脸胖鸡[Pro Max]丛林的鸟飞走了不曾寄出的信件幽灵竹筒『随时随地开启!』

        凯诺斯 发表于 2025-8-12 18:31:15 | 显示全部楼层 <
        回复

        使用道具 举报

        弗雷迪玩偶呆猫『搓粉团珠』炽焰咆哮虎虚空之海的鲸官复原职传奇亚瑟‧摩根

          克莱因蓝 发表于 2025-8-12 19:00:45 | 显示全部楼层 <
          回复

          使用道具 举报

          传奇卡利亚权杖虚空之海的鲸官复原职JokerGM吸血伯爵弗雷迪玩偶发条八音盒勋章空位插槽

            飞扬fox 发表于 2025-8-12 19:04:59 | 显示全部楼层 <
            回复

            使用道具 举报

            業火死鬥传奇检定场弗雷迪玩偶桂花米糕虚空之海的鲸【圣诞限定】心心念念小雪人吃饱金币的Doge缘起星空鎏彩万幢

              柏芸 发表于 2025-8-12 19:21:38 | 显示全部楼层 <
              回复

              使用道具 举报

              没有梦想的咸鱼苏格兰圆脸胖鸡安德鲁·库珀雄躯的昇格桂花米糕弗雷迪玩偶发条八音盒萨赫的蛋糕召唤古代战士水泡术

                赴约波波 发表于 2025-8-12 19:30:44 | 显示全部楼层 <
                很有用的脚本呢,这样就不用忍受网页自带的播放器带来的糟糕体验了,操控性也变好了
                回复

                使用道具 举报

                【新春限定】果体 隆里昂‧S‧甘乃迪Futūrum(未来)检定场诺克提斯·路西斯·伽拉姆未来的黎明普隆普特·阿金塔姆卡洛斯·奥利维拉仇恋虚空之海的鲸

                  诺鸦cc 发表于 2025-8-12 20:02:13 | 显示全部楼层 <
                  回复

                  使用道具 举报

                    离群的鱼 发表于 2025-8-12 21:07:46 | 显示全部楼层 <
                    回复

                    使用道具 举报

                    萨勒芬妮女巫之路传说岛田半藏英雄联盟守护者三角头王者之盾传说的黑道-桐生一马野兽之子开心到旋转的罗罗禽兽扒手

                      Raven_gambler 发表于 2025-8-12 22:09:55 | 显示全部楼层 <
                      回复

                      使用道具 举报

                      虚空之海的鲸『钜鲸』守卫: 坚守眼位御医神兔哀恸魔蝶镜中小鸟孔明灯菀叶狸猫猪庇特小狮欢舞

                        cdcai 发表于 2025-8-12 22:44:18 | 显示全部楼层 <
                        回复

                        使用道具 举报

                        我的天使GM吸血伯爵吃饱金币的Doge苏格兰圆脸胖鸡小小舞台守卫: 坚守眼位永浴爱河肉垫手套御医神兔『搓粉团珠』

                          毛茸茸兽兽 发表于 2025-8-12 23:19:12 | 显示全部楼层 <
                          回复

                          使用道具 举报

                          鎏彩万幢Zootopia都市:天际线2叶卡捷琳娜大帝传奇实现梦想官复原职丹雀衔五穗,人间始丰登丹妮莉丝·坦格利安刀锋女王 - 归宿

                            威风妖怪麒麟 发表于 2025-8-13 00:47:06 | 显示全部楼层 <
                            回复

                            使用道具 举报

                            You Can Pet Blaidd泰比里厄斯铁牛BIG BOSS亚瑟‧摩根杰森‧斯坦森性感男神GM

                              呆到自然蠢 发表于 2025-8-13 04:02:51 | 显示全部楼层 <
                              回复

                              使用道具 举报

                              辐射:新维加斯符文披风嗜血斩首斧重磅手环一只小鹿新手蛋One Ring

                                polkpi 发表于 2025-8-13 05:39:35 | 显示全部楼层 <
                                回复

                                使用道具 举报

                                百相千面-戏艾吉奥岛田半藏诺克提斯·路西斯·伽拉姆萨菲罗斯岛田源氏BIG BOSS康纳/ConnorDoc普隆普特·阿金塔姆

                                  2302594 发表于 2025-8-13 06:41:47 | 显示全部楼层 <
                                  回复

                                  使用道具 举报

                                  缘起星空虚空之海的鲸

                                    you9632587 发表于 2025-8-13 07:05:46 | 显示全部楼层 <
                                    回复

                                    使用道具 举报

                                    萨赫的蛋糕桂花米糕冒险用指南针苏格兰圆脸胖鸡“半狼”布莱泽里昂‧S‧甘乃迪万众瞩目火斑喵

                                      MacVasion 发表于 2025-8-13 11:30:18 | 显示全部楼层 <
                                      好强,这个网站上的资源还是挺多的,就是播放器总是一卡一卡,能改善真是太好了
                                      回复

                                      使用道具 举报

                                      永远的克叔金钱马车月影狼睡着的小伯苏醒的格罗姆青鸾幸福的小阿尔纯真护剑 · 这把剑守护每个孩子无论他有没有被神选中『厢庭望远』Dante

                                        小晨风 发表于 2025-8-13 17:06:31 | 显示全部楼层 <
                                        回复

                                        使用道具 举报

                                        变骚喷雾水泡术杀意人偶咆哮诅咒

                                          万俟 发表于 2025-8-13 18:28:07 | 显示全部楼层 <
                                          回复

                                          使用道具 举报

                                          您需要登录后才可以回帖 登录 | 立即注册

                                          本版积分规则

                                          关闭

                                          站长公告上一条 /1 下一条

                                          文字版|手机版|小黑屋|GameMale

                                          GMT+8, 2025-12-6 03:52 , Processed in 0.199856 second(s), 147 queries , Redis On.

                                          Copyright © 2013-2025 GameMale

                                          All Rights Reserved.

                                          快速回复 返回列表