您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
大白
// ==UserScript== // @name 大白百度网盘视频倍速播放器 // @namespace http://tampermonkey.net/ // @version 0.2.3 // @description 大白 // @author 大白 // @license 大白 // @match https://pan.baidu.com/s/* // @match https://pan.baidu.com/play/video* // @match https://pan.baidu.com/mbox/streampage* // @icon https://nd-static.bdstatic.com/business-static/pan-center/images/vipIcon/user-level2-middle_4fd9480.png // @grant unsafeWindow // ==/UserScript== (function() { 'use strict'; var obj = { video_page: { info: [], quality: [], adToken: "" } }; obj.fetchVideoInfoHomePage = function (callback) { var instanceForSystem = obj.require("system-core:context/context.js").instanceForSystem , router = instanceForSystem.router , uk = instanceForSystem.locals.get("uk") , path = router.query.get("path"); var jQuery = obj.getJquery() , target = jQuery.stringify([path]); jQuery.ajax({ url: "/api/filemetas", data: { target: target, dlink: 1 }, success: function(i) { if (i && 0 === i.errno && i.info && i.info[0]) { obj.video_page.info = i.info; callback && callback(i.info[0]); } else { obj.msg("视频加载失败,请刷新页面后重试", "failure"); callback && callback(""); } }, error: function(i) { obj.msg("视频加载失败,请刷新页面后重试", "failure"); callback && callback(""); } }) }; obj.playVideoHomePage = function () { var instanceForSystem = obj.require("system-core:context/context.js").instanceForSystem , router = instanceForSystem.router , uk = instanceForSystem.locals.get("uk") , path = router.query.get("path") , vip = obj.getVip(); function getUrl (i) { return location.protocol + "//" + location.host + "/api/streaming?path=" + encodeURIComponent(path) + "&app_id=250528&clienttype=0&type=" + i + "&vip=" + vip + "&jsToken=" + unsafeWindow.jsToken } var file = obj.video_page.info[0], resolution = file.resolution; obj.getAdToken(getUrl("M3U8_AUTO_480"), function () { obj.addQuality(getUrl, resolution); obj.useDPlayer(); }); }; obj.playVideoSharePage = function () { unsafeWindow.locals.get("file_list", "sign", "timestamp", "share_uk", "shareid", function(file_list, sign, timestamp, share_uk, shareid) { if (file_list.length > 1 || file_list[0].mediaType != "video") { return; } obj.video_page.info = file_list; var file = file_list[0], resolution = file.resolution, fid = file.fs_id, vip = obj.getVip(); function getUrl(i) { return location.protocol + "//" + location.host + "/share/streaming?channel=chunlei&uk=" + share_uk + "&fid=" + fid + "&sign=" + sign + "×tamp=" + timestamp + "&shareid=" + shareid + "&type=" + i + "&vip=" + vip + "&jsToken=" + unsafeWindow.jsToken } obj.getAdToken(getUrl("M3U8_AUTO_480"), function () { obj.addQuality(getUrl, resolution); obj.useDPlayer(); }); }); }; obj.playVideoStreamPage = function () { var getParam = obj.require("base:widget/tools/service/tools.url.js").getParam; var file = { from_uk: getParam("from_uk"), to: getParam("to"), fs_id: getParam("fs_id"), name: getParam("name") || "", type: getParam("type"), md5: getParam("md5"), msg_id: getParam("msg_id"), path: decodeURIComponent(decodeURIComponent(getParam("path"))) }; obj.video_page.info = [ file ]; function getUrl (i) { return location.protocol + "//" + location.host + "/mbox/msg/streaming?from_uk=" + file.from_uk + "&to=" + file.to + "&msg_id=" + file.msg_id + "&fs_id=" + file.fs_id + "&type=" + file.type + "&stream_type=" + i; } obj.getAdToken(getUrl("M3U8_AUTO_480"), function () { obj.addQuality(getUrl, "width:1920,height:1080"); obj.useDPlayer(); }); }; obj.getAdToken = function (url, callback) { var jQuery = obj.getJquery(); jQuery.ajax({ url: url, }).done(function(n) { if (133 === n.errno && 0 !== n.adTime) { obj.video_page.adToken = n.adToken; } callback && callback(); }).fail(function(n) { var t = jQuery.parseJSON(n.responseText); if (t && 133 === t.errno && 0 !== t.adTime) { obj.video_page.adToken = t.adToken; } callback && callback(); }); }; obj.addQuality = function (getUrl, resolution) { var r = { 1080: "超清 1080P", 720: "高清 720P", 480: "流畅 480P", 360: "省流 360P" }; var freeList = obj.freeList(resolution); freeList.forEach(function (a, index) { obj.video_page.quality.push({ name: r[a], url: getUrl("M3U8_AUTO_" + a) + "&isplayer=1&check_blue=1&adToken=" + encodeURIComponent(obj.video_page.adToken ? obj.video_page.adToken : ""), type: "hls" }); }); }; obj.freeList = function (e) { e = e || ""; var t = [480, 360] , a = e.match(/width:(\d+),height:(\d+)/) || ["", "", ""] , i = +a[1] * +a[2]; return i ? (i > 409920 && t.unshift(720), i > 921600 && t.unshift(1080), t) : t }; obj.useDPlayer = function () { obj.dPlayerSupport(function (result) { if (result) { obj.dPlayerStart(); } }); }; obj.dPlayerSupport = function (callback) { var urlArr = [ [ "https://cdn.staticfile.org/hls.js/1.1.5/hls.min.js", "https://cdn.staticfile.org/dplayer/1.26.0/DPlayer.min.js", ], [ "https://cdn.bootcdn.net/ajax/libs/hls.js/1.1.5/hls.min.js", "https://cdn.bootcdn.net/ajax/libs/dplayer/1.26.0/DPlayer.min.js", ], [ "https://cdn.jsdelivr.net/npm/hls.js/dist/hls.min.js", "https://cdn.jsdelivr.net/npm/dplayer/dist/DPlayer.min.js", ], ]; (function laodcdn(urlArr, index = 0) { var arr = urlArr[index]; if (arr) { var promises = []; arr.forEach(function (url, index) { promises.push(obj.loadScript(url)); }); Promise.all(promises).then(function(results) { setTimeout(function () { callback && callback(unsafeWindow.DPlayer); }, 0); }).catch(function(error) { console.error("laodcdn 发生错误!", index, error); laodcdn(urlArr, ++index); }); } else { callback && callback(unsafeWindow.DPlayer); } })(urlArr); }; obj.dPlayerStart = function () { var dPlayerNode, videoNode = document.getElementById("video-wrap"); if (videoNode) { dPlayerNode = document.getElementById("dplayer"); if (!dPlayerNode) { dPlayerNode = document.createElement("div"); dPlayerNode.setAttribute("id", "dplayer"); dPlayerNode.setAttribute("style", "width: 100%; height: 100%;"); videoNode.parentNode.replaceChild(dPlayerNode, videoNode); obj.getJquery()("#layoutMain").attr("style", "z-index: 42;"); obj.getJquery()(".header-box").remove(); } } else { console.warn("尝试再次获取播放器容器"); return setTimeout(obj.dPlayerStart, 500); } var quality = obj.video_page.quality, defaultQuality = function () { var name = localStorage.getItem("dplayer-quality"); if (name) { for (let i = 0; i < quality.length; i++) { if (quality[i].name == name) { return i; } } } return 0; }(); var options = { container: dPlayerNode, video: { quality: quality, defaultQuality: defaultQuality }, autoPosition: false, // 记忆播放 如需自动跳转至上次播放位置,值设为 true autoplay: true, screenshot: true, hotkey: true, airplay: true, volume: 1.0, playbackSpeed: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4], contextmenu: [ { text: "大白博客", link: "https://www.c1i.cn/", }, ], theme: "#b7daff" }; try { var dPlayer = new unsafeWindow.DPlayer(options); obj.getJquery()(dPlayerNode).nextAll().remove(); location.pathname == "/mbox/streampage" && obj.getJquery()(dPlayerNode).css("height", "480px"); dPlayer.on("loadstart", function () { if (this.hasDurationDisplay) return; this.hasDurationDisplay = true; setTimeout(function () { if (isNaN(dPlayer.video.duration)) { location.reload(); } }, 5000); }); dPlayer.on("durationchange", function () { obj.memoryPlay(dPlayer); }); dPlayer.speed(localStorage.getItem("dplayer-speed") || 1); dPlayer.on("ratechange", function () { dPlayer.notice("播放速度:" + dPlayer.video.playbackRate); localStorage.setItem("dplayer-speed", dPlayer.video.playbackRate); }); dPlayer.on("quality_end", function () { localStorage.setItem("dplayer-quality", dPlayer.quality.name); }); obj.resetPlayer(); obj.msg("大白播放器创建成功,感谢各位的使用 大白博客www.c1i.cn"); } catch (error) { obj.msg("播放器创建失败", "failure"); } }; obj.memoryPlay = function (player) { if (this.hasMemoryDisplay) return; this.hasMemoryDisplay = true; var duration = player.video.duration , file = obj.video_page.info[0] || {} , sign = file.md5 || file.fs_id , memoryTime = getFilePosition(sign); if (memoryTime && parseInt(memoryTime)) { var autoPosition = player.options.autoPosition; if (autoPosition) { player.seek(memoryTime); } else { var formatTime = formatVideoTime(memoryTime) var $ = obj.getJquery(); $(player.container).after('<div class="memory-play-wrap" style="display: block;position: absolute;left: 30px;bottom: 60px;font-size: 15px;padding: 7px;border-radius: 3px;color: #fff;z-index:100;background: rgba(0,0,0,.5);">上次播放到:' + formatTime + ' <a href="javascript:void(0);" class="play-jump" style="text-decoration: none;color: #06c;"> 跳转播放 </a><em class="close-btn" style="display: inline-block;width: 15px;height: 15px;vertical-align: middle;cursor: pointer;background: url(https://nd-static.bdstatic.com/m-static/disk-share/widget/pageModule/share-file-main/fileType/video/img/video-flash-closebtn_15f0e97.png) no-repeat;"></em></div>'); var memoryTimeout = setTimeout(function () { $(".memory-play-wrap").remove(); }, 15000); $(".memory-play-wrap .close-btn").click(function () { $(".memory-play-wrap").remove(); clearTimeout(memoryTimeout); }); $(".memory-play-wrap .play-jump").click(function () { player.seek(memoryTime); player.play(); $(".memory-play-wrap").remove(); clearTimeout(memoryTimeout); }); } } document.onvisibilitychange = function () { if (document.visibilityState === "hidden") { var currentTime = player.video.currentTime; currentTime && setFilePosition(sign, currentTime, duration); } }; window.onbeforeunload = function () { var currentTime = player.video.currentTime; currentTime && setFilePosition(sign, currentTime, duration); }; function getFilePosition (e) { return localStorage.getItem("video_" + e) || 0; } function setFilePosition (e, t, o) { e && t && (e = "video_" + e, t <= 60 || t + 60 >= o || 0 ? localStorage.removeItem(e) : localStorage.setItem(e, t)); } function formatVideoTime (seconds) { var secondTotal = Math.round(seconds) , hour = Math.floor(secondTotal / 3600) , minute = Math.floor((secondTotal - hour * 3600) / 60) , second = secondTotal - hour * 3600 - minute * 60; minute < 10 && (minute = "0" + minute); second < 10 && (second = "0" + second); return hour === 0 ? minute + ":" + second : hour + ":" + minute + ":" + second; } }; obj.resetPlayer = function () { obj.async("file-widget-1:videoPlay/context.js", function(c) { var count, id = count = setInterval(function() { var context = c.getContext() || {}, playerInstance = context.playerInstance; if (playerInstance && playerInstance.player) { clearInterval(id); playerInstance.player.dispose(); playerInstance.player = !1; } else if (++count - id > 60) { clearInterval(id); } }, 500); }); }; obj.loadScript = function (src) { if (!window.instances) { window.instances = {}; } if (!window.instances[src]) { window.instances[src] = new Promise((resolve, reject) => { const script = document.createElement("script") script.src = src; script.type = "text/javascript"; script.onload = resolve; script.onerror = reject; document.head.appendChild(script); }); } return window.instances[src]; }; obj.require = function (name) { return unsafeWindow.require(name); }; obj.async = function (name, callback) { unsafeWindow.require.async(name, callback); }; obj.getJquery = function () { return unsafeWindow.$ || unsafeWindow.jQuery || obj.require("base:widget/libs/jquerypacket.js"); }; obj.getVip = function () { return obj.require("base:widget/vip/vip.js").getVipValue(); }; obj.msg = function (msg, mode) { obj.require("system-core:system/uiService/tip/tip.js").show({ vipType: "svip", mode: mode || "success", msg: msg}); }; obj.run = function () { var url = location.href; if (url.indexOf(".baidu.com/s/") > 0) { obj.playVideoSharePage(); } else if (url.indexOf(".baidu.com/play/video#/video") > 0) { obj.fetchVideoInfoHomePage(function (info) { if (info) { obj.playVideoHomePage(); } }); window.onhashchange = function (e) { location.reload(); }; } else if (url.indexOf(".baidu.com/mbox/streampage") > 0) { obj.playVideoStreamPage(); } }(); console.log("=== 大白科技==="); // Your code here... })();