GameMale
登陆 / 注册 搜索

USERCENTER

SEARCHSITE

搜索

查看: 2231|回复: 34
收起左侧

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

[复制链接] |关注本帖

GM活动员

Lvl. 0

炙热的格拉迪欧拉斯『林中过夜』Futūrum(未来)守卫: 坚守眼位果体76永远的克叔【夏日限定】夏日的泰凯斯亭亭如盖

     楼主| Makima 发表于 2025-3-1 20:14:41 | 显示全部楼层 |阅读模式 <
    本帖最后由 Makima 于 2025-3-1 20:16 编辑

    很不错的视频网站
    但是偶尔播放会卡顿

    找到了s0urcelab大佬的的脚本
    替换ddys播放器移除Adblock屏蔽,修复滚轮和全屏快捷键失效bug,优化选集和线路功能,自动记忆选集

    我加了一个调倍速的功能

    @Name

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

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

    21. const globalStyle = `
    22. .wp-playlist-tracks {
    23.     display: none!important;
    24. }
    25. .wp-video-playlist {
    26.     display: flex;
    27.     padding: 0!important;
    28.     border: none!important;
    29.     background: none!important;
    30. }
    31. .entry > p {
    32.     display: none;
    33. }
    34. .player-sider {
    35.     width: 220px;
    36.     display: flex;
    37.     flex-direction: column;
    38.     background-color: #2e2e2e;
    39.     border-radius: 8px;
    40.     margin-left: 10px;
    41.     padding: 4px;
    42. }
    43. .tab-item {
    44.     cursor: pointer;
    45.     margin-bottom: 6px;
    46.     padding: 8px;
    47.     color: white;
    48.     background-color: #5a5a5a;
    49.     border-radius: 5px;
    50. }
    51. .tab-item.playing {
    52.     font-weight: bold;
    53.     color: #3a8fb7;
    54.     background-color: #232323;
    55. }
    56. .tab-item:not(.playing):hover {
    57.     background-color: #232323;
    58. }
    59. .tab-item > .indicator {
    60.     height: 14px;
    61.     width: 14px;
    62.     font-size: 14px;
    63.     margin-right: 5px;
    64. }
    65. `
    66. function parseResUrl(d) {
    67.     return { ...d, url: `https://${src4domain}${d[`src${d.srctype - 1}`]}` }
    68. }
    69. class Tabs {
    70.     constructor(init) {
    71.         this.root = init.root
    72.         this.data = init.data
    73.         this.onSelect = init.onSelect
    74.         this.selectedKey = init.data[0].key
    75.     }

    76.     render(key = this.selectedKey) {
    77.         // update selectedKey
    78.         this.selectedKey = key
    79.         // render dom
    80.         this.root.innerHTML = this.data.reduce((acc, curr) => {
    81.             const isTarget = key === curr.key
    82.             return `${acc}
    83.                 <div class="tab-item ${isTarget ? 'playing' : ''}" data-tab-key="${curr.key}">
    84.                 ${isTarget ? '<img class="indicator" src="//s1.hdslb.com/bfs/static/jinkela/video/asserts/playing.gif"></img>' : ''}
    85.                 ${curr.label}
    86.             </div>
    87.             `
    88.         }, '')
    89.         // bind click
    90.         const self = this
    91.         for (const tabElment of this.root.children) {
    92.             tabElment.onclick = function() {
    93.                 const tabKey = tabElment.dataset.tabKey
    94.                 const record = self.data.find(v => v.key === tabKey)
    95.                 self.render(tabKey)
    96.                 self.onSelect(tabKey, record)
    97.             }
    98.         }
    99.     }
    100. }

    101. ; (async function () {
    102.     'use strict';

    103.     const originContainer = QS('.wp-video-playlist')
    104.     // cannot found Player, quit
    105.     if (!originContainer) return;

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

    112.     // append container for xgplayer
    113.     originContainer.innerHTML += `
    114.     <div id="xgplayer"></div>
    115.     <div class="player-sider">
    116.         <div class="tabs-root"></div>
    117.         <select id="playbackRate">
    118.             <option value="0.75">0.75x</option>
    119.             <option value="1" selected>1x</option>
    120.             <option value="1.25">1.25x</option>
    121.             <option value="1.5">1.5x</option>
    122.             <option value="2">2x</option>
    123.         </select>
    124.     </div>
    125.     `
    126.     // get video resource from page data
    127.     const res = JSON.parse(QS('.wp-playlist-script').textContent)
    128.     const resPromise = res.tracks
    129.         .map((track, idx) => ({ ...track, key: `${idx + 1}`, label: track.caption }))
    130.         .map(parseResUrl)
    131.     const resGroups = await Promise.all(resPromise)

    132.     // init xgplayer
    133.     const initVolume = window.localStorage['volume'] ? parseFloat(window.localStorage['volume']) : 1
    134.     const isWatched = window.localStorage[location.pathname]
    135.     const initEp = isWatched ? JSON.parse(isWatched).ep : '1'
    136.     const initPlayUrl = resGroups.find(v => v.key === initEp).url

    137.     console.warn(`当前播放资源url:${initPlayUrl}`)
    138.     const player = new window.Player({
    139.         id: 'xgplayer',
    140.         url: initPlayUrl,
    141.         volume: initVolume,
    142.         fluid: true,
    143.         videoInit: true,
    144.         lastPlayTimeHideDelay: 3,
    145.         ...isWatched && {lastPlayTime: JSON.parse(isWatched).seek},
    146.     })

    147.     // init tabs
    148.     const tabs = new Tabs({
    149.         root: QS('.tabs-root'),
    150.         data: resGroups,
    151.         onSelect: (key, record) => {
    152.             console.warn(`切换选集:【${key}】${record.label}`)
    153.             player.src = record.url
    154.             console.warn(`当前播放资源url:${record.url}`)
    155.             player.play()
    156.         }
    157.     })
    158.     // render tabs
    159.     tabs.render(initEp)

    160.     // update video progress
    161.     player.on('timeupdate', function({ currentTime }) {
    162.         window.localStorage[location.pathname] = JSON.stringify({
    163.             seek: currentTime,
    164.             ep: tabs.selectedKey,
    165.         })
    166.     })
    167.     // update volume
    168.     player.on('volumechange', function({ volume }) {
    169.         window.localStorage['volume'] = volume
    170.     })

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

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

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

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

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

    188. })();
    复制代码



    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x

    评分

    参与人数 6血液 +16 追随 +6 堕落 +3 收起 理由
    月半逢肉丸 + 1 很给力!
    提尔特 + 3 + 1 + 1 很给力!
    abba + 5 + 1 赞一个!
    you9632587 + 5 + 1
    PURO_ + 3 + 1 + 1 很给力!
    lostorage + 1 + 1

    查看全部评分

    回复

    使用道具 举报

    诺克史黛拉之月男用贞操带无光余烬40x43 隐形➀16x43 隐形➀『道具超市』40x43 隐形➁『落樱缤纷』遗留之人的城堡

      lostorage 发表于 2025-3-1 20:25:42 | 显示全部楼层 <
      回复

      举报

      蒂法·洛克哈特龙腾世纪:审判男用贞操带漂洋小船不曾寄出的信件雪王的心脏黑神话:悟空荒野大镖客:救赎 II

        Daddy控 发表于 2025-3-1 20:32:53 | 显示全部楼层 <
        哇哦,可以在线看阿,还以为是那种网盘链接分享的,而且广告几乎没有,感谢了
        回复

        举报

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

          凯诺斯 发表于 2025-3-1 20:37:27 | 显示全部楼层 <
          回复

          举报

          『林中过夜』守卫: 不可选中『住在GM村』阿努比斯信徒

            野生阿努厨 发表于 2025-3-1 20:39:59 | 显示全部楼层 <
            回复

            举报

            守卫: 坚守眼位裸体克里斯虚空之海的鲸黄粱一梦【新春限定】果体 隆新神的赐福都市:天际线2永远的克叔業火死鬥实现梦想

              娱乐法师火布偶 发表于 2025-3-1 20:45:32 | 显示全部楼层 <
              回复

              举报

              冒险用指南针『林中过夜』敖蜃星夏日柯基漂洋小船雪王的心脏男用贞操带夜魔护符

                百变小阴 发表于 2025-3-1 20:46:11 | 显示全部楼层 <
                回复

                举报

                【夏日限定】夏日的泰凯斯自定义男从Homunculus猫咪点唱机守卫: 坚守眼位『林中过夜』和你一起飞行的皮卡丘天灾骑士阿努比斯信徒卡利亚权杖

                  PURO_ 发表于 2025-3-1 20:51:12 | 显示全部楼层 <
                  回复

                  举报

                  【夏日限定】夏日的泰凯斯『冰雕马拉橇』裸体克里斯亭亭如盖暗影烈焰『搓粉团珠』人鱼之泪蒂法·洛克哈特

                    Kaicneg 发表于 2025-3-1 21:32:39 | 显示全部楼层 <
                    回复

                    举报

                    業火死鬥我的天使GM吸血伯爵吃饱金币的Doge阿拉喵?神灯苏格兰圆脸胖鸡小小舞台永浴爱河肉垫手套御医神兔

                      毛茸茸兽兽 发表于 2025-3-1 21:55:00 | 显示全部楼层 <
                      吼吼~全是电影的视频网站咩~搜了搜没最新的那个哪吒电影欸(´×ω×`)有点小可惜
                      回复

                      举报

                      瑞雪兆丰年,生灵万物新森林羊男

                        小耳朵 发表于 2025-3-1 21:57:00 | 显示全部楼层 <
                        回复

                        举报

                        阿拉贡·王者归来守卫: 不可选中最终幻想XVI飞渡轻舟夏日柯基沙漠鸵鸟预知水晶球龙血指环木精灵短弓

                          CooperAlbort 发表于 2025-3-1 22:05:48 | 显示全部楼层 <
                          这样太好啦,b站会员过期后一直没充,感觉没怎么看需要vip的,但是想看的时候又不方便,现在有了个直接看的平台了
                          回复

                          举报

                          特工里昂的奇幻漂流混血王子阿不思·邓布利多艾吉奥自定义男从Homunculus璀璨闪蝶『不败之花』『搓粉团珠』

                            fujiji 发表于 2025-3-1 22:48:58 | 显示全部楼层 <
                            回复

                            举报

                            男色时代达拉然骑兽之子月亮提灯夏之歌最终幻想XVI荒野大镖客:救赎 II黑神话:悟空

                              zhnlwwdzz 发表于 2025-3-1 23:32:29 | 显示全部楼层 <
                              回复

                              举报

                              守卫: 坚守眼位自定义男从Homunculus极·龙の意新神的赐福官复原职实现梦想冰原史莱姆牧场传奇虚空之海的鲸

                                2297988 发表于 2025-3-1 23:37:31 | 显示全部楼层 <
                                回复

                                举报

                                泰比里厄斯追忆Zootopia官复原职实现梦想perritoGM吸血伯爵夏日柯基守卫: 不可选中

                                  桀桀桀 发表于 2025-3-1 23:58:20 | 显示全部楼层 <
                                  回复

                                  举报

                                  女巫之路传说岛田半藏英雄联盟守护者三角头王者之盾传说的黑道-桐生一马霍格沃兹特快列车开心到旋转的罗罗禽兽扒手

                                    Raven_gambler 发表于 2025-3-2 00:11:22 | 显示全部楼层 <
                                    回复

                                    举报

                                    黑神话:悟空驯化红龙幼崽铁牛神奇宝贝图鉴石鬼面神奇宝贝大师球GM論壇進階勛章

                                      Ce-Fp 发表于 2025-3-2 00:25:46 | 显示全部楼层 <
                                      哈哈,原来是这个网站叫低端影视,光看标题还以为是什么特别low的视频播放器
                                      回复

                                      举报

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

                                        2302594 发表于 2025-3-2 00:37:47 | 显示全部楼层 <
                                        回复

                                        举报

                                        牧羊人GM論壇勛章最终幻想XIV龙腾世纪:审判瑞雪兆丰年,生灵万物新

                                          一页 发表于 2025-3-2 00:40:28 | 显示全部楼层 <
                                          回复

                                          举报

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

                                          本版积分规则

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

                                          GMT+8, 2025-5-12 22:14 , Processed in 0.189597 second(s), 146 queries , Redis On.

                                          Copyright © 2013-2025 GameMale

                                          All Rights Reserved.

                                          快速回复 返回列表