🏠 Home 

Greasy Fork is available in English.

百度网盘视频倍速播放

简单的倍速播放脚本,小白作品,欢迎提意见


ติดตั้งสคริปต์นี้?
  1. // ==UserScript==
  2. // @name 百度网盘视频倍速播放
  3. // @description 简单的倍速播放脚本,小白作品,欢迎提意见
  4. // @version 1.6.2
  5. // @author Viki (or vikiboss) (https://github.com/vikiboss)
  6. // @create 2020/6/15
  7. // @lastmodified 2021/3/9
  8. // @feedback-url https://github.com/Vikiboss/baidupan-playspeed-control/issues
  9. // @icon https://i.loli.net/2020/06/19/eWDyG1RhCBkTINl.png
  10. // @homepageURL https://greasyfork.org/zh-CN/scripts/405388
  11. // @github https://github.com/vikiboss/baidupan-playspeed-control
  12. // @namespace baidupan-playspeed-control
  13. // @license MIT
  14. // @run-at document-end
  15. // @grant none
  16. // @include *://pan.baidu.com/s*
  17. // @include *://yun.baidu.com/s*
  18. // @include *://pan.baidu.com/m*
  19. // @include *://pan.baidu.com/play*
  20. // @include *://pan.baidu.com/disk/home*
  21. // @include *://yun.baidu.com/disk/home*
  22. // @require https://cdn.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js
  23. // @require https://cdn.jsdelivr.net/npm/sweetalert@2.1.2/dist/sweetalert.min.js
  24. // ==/UserScript==
  25. (function () {
  26. 'use strict';
  27. // === 随窗口加载后调用本方法 ===
  28. window.onload = function () {
  29. // === 按钮集 ===
  30. let options = [
  31. { str: 'x0.5', rate: 0.5 },
  32. { str: 'x1.0', rate: 1.0 },
  33. { str: 'x1.5', rate: 1.5 },
  34. { str: 'x2.0', rate: 2.0 },
  35. { str: '加速' },
  36. { str: '减速' },
  37. { str: '自定义' },
  38. { str: '设置' },
  39. { str: '关于' },
  40. ];
  41. let player; // 播放区节点
  42. let label; // 显示倍速label
  43. let vip_div; // svip提示框
  44. let btn_div; // 按钮容器
  45. let settings = {
  46. preRate: 1.0,
  47. curRate: 1.0,
  48. saveRate: true,
  49. showAlert: true,
  50. }; // 默认全局配置
  51. let cur_version = '1.6.2';
  52. let last_updated = '2021/3/9';
  53. // === 声明读取配置的函数 ===
  54. let getSettings = () => {
  55. settings.preRate = Number(
  56. localStorage.getItem('preRate') ? localStorage.getItem('preRate') : 1.0
  57. ).toFixed(1);
  58. settings.curRate = Number(
  59. localStorage.getItem('curRate') ? localStorage.getItem('curRate') : 1.0
  60. ).toFixed(1);
  61. settings.showAlert = JSON.parse(
  62. localStorage.getItem('showAlert')
  63. ? localStorage.getItem('showAlert')
  64. : true
  65. );
  66. settings.saveRate = JSON.parse(localStorage.getItem('saveRate'));
  67. };
  68. // === 页面加载完后读取配置 ===
  69. if (!localStorage.hasOwnProperty('saveRate')) {
  70. settings.saveRate = true;
  71. localStorage.setItem('saveRate', settings.saveRate);
  72. }
  73. getSettings();
  74. if (settings.saveRate) {
  75. settings.curRate = settings.preRate;
  76. localStorage.setItem('curRate', settings.preRate);
  77. } else {
  78. settings.curRate = 1.0;
  79. }
  80. // === 判断倍速是否为有效倍速的函数 ===
  81. let checkRate = (rate) => {
  82. if (rate === '' || rate === null) return false;
  83. rate = Number(rate);
  84. return rate <= 0 || rate > 5 || isNaN(rate) ? false : true;
  85. };
  86. // === 定义修改播放倍速的函数 ===
  87. let setRate = (rate, player) => {
  88. if (settings.saveRate) {
  89. settings.preRate = rate;
  90. localStorage.setItem('preRate', settings.preRate);
  91. }
  92. let curRate = player.playbackRate();
  93. rate = Number(rate || curRate);
  94. if (!checkRate(rate)) return false;
  95. label.innerText = `当前: ${Number(rate).toFixed(1)}${
  96. Number(settings.curRate) > 2 ? '(>2容易卡顿)' : ''
  97. }`;
  98. player.setPlaybackRate(rate);
  99. settings.curRate = rate;
  100. localStorage.setItem('curRate', settings.curRate);
  101. localStorage.setItem('showAlert', settings.showAlert);
  102. return true;
  103. };
  104. // === 定时器,定期检查倍速 === // 别问我为什么这么写,问就是我太菜了QAQ
  105. const check = () => {
  106. let player;
  107. if (window.videojs) {
  108. player = window.videojs.getPlayers('video-player').html5player;
  109. }
  110. if (player) {
  111. setRate(settings.curRate, player.tech_);
  112. }
  113. };
  114. setInterval(check, 1000);
  115. // === 定义生成"倍速按钮"的函数 ===
  116. let generateBtn = (rateStr, rate) => {
  117. let btn = $(`<a class="g-button" title=${rateStr}></a>`)[0];
  118. rate = rate || 1.0;
  119. btn.onclick = () => {
  120. if (rateStr === '关于') {
  121. // "关于"弹窗
  122. let about = $(`<div><a target="_blank" href="https://greasyfork.org/zh-CN/scripts/405388">检查更新🔨</a> |
  123. <a target="_blank" href="https://github.com/Vikiboss/baidupan-playspeed-control#%E6%9B%B4%E6%96%B0%E6%97%A5%E5%BF%97">更新日志📄</a><br />
  124. <a target="_blank" href="https://greasyfork.org/zh-CN/scripts/405388/feedback">去GreasyFork反馈🔗</a><br />
  125. <a target="_blank" href="https://vikiboss.top">作者菜#主页🏠</a> |
  126. <a target="_blank" href="https://www.multmax.top/images/2020/08/20/1.png">支持💰</a>`)[0];
  127. swal({
  128. title: '关于',
  129. text: `当前版本: ${cur_version}\n更新时间: ${last_updated}\n脚本作者: Viki`,
  130. content: about,
  131. });
  132. return;
  133. }
  134. if (!window.videojs.getPlayers('video-player').html5player) {
  135. swal({
  136. text: '视频控件还未初始化完成哦👀',
  137. icon: 'error',
  138. buttons: false,
  139. timer: 1000,
  140. });
  141. return;
  142. }
  143. player = window.videojs.getPlayers('video-player').html5player.tech_;
  144. let curRate = player.playbackRate();
  145. // 判断options提供的字符串并对rate进行相应操作
  146. if (rateStr === '设置') {
  147. // "设置"弹窗
  148. let set = $(
  149. `<div>
  150. <input id="saveRate" type="checkbox" ${
  151. settings.saveRate ? 'checked' : ''
  152. }><span> 记忆历史播放倍速</span><br />
  153. <input id="showAlert" type="checkbox" ${
  154. settings.showAlert ? 'checked' : ''
  155. }><span> 显示倍速提示弹窗</span>
  156. </div>`
  157. )[0];
  158. swal({
  159. title: '设置 - 百度网盘倍速播放',
  160. content: set,
  161. buttons: {
  162. cancel: '取消',
  163. save: { text: '保存', value: 'save' },
  164. },
  165. }).then((btn) => {
  166. if (btn === 'save') {
  167. settings.saveRate = $('#saveRate')[0].checked;
  168. settings.showAlert = $('#showAlert')[0].checked;
  169. localStorage.setItem('saveRate', $('#saveRate')[0].checked);
  170. localStorage.setItem('showAlert', $('#showAlert')[0].checked);
  171. settings.preRate = 1.0;
  172. localStorage.setItem('preRate', 1.0);
  173. swal({
  174. text: '保存成功',
  175. icon: 'success',
  176. buttons: false,
  177. timer: 1000,
  178. });
  179. }
  180. });
  181. return;
  182. } else if (rateStr === '自定义') {
  183. // "自定义"弹窗
  184. swal({
  185. title: '提示',
  186. content: {
  187. element: 'input',
  188. attributes: {
  189. placeholder: '选择一个自定义(0-5)的播放倍速叭(~ ̄▽ ̄)~',
  190. type: 'text',
  191. },
  192. },
  193. buttons: ['取消', '确认'],
  194. }).then((new_rate) => {
  195. if (checkRate(new_rate)) {
  196. settings.curRate = new_rate || curRate;
  197. localStorage.setItem('curRate', settings.curRate);
  198. const extraMsg =
  199. '\n由于网络原因等,大于两倍速可能会出现明显卡顿哦!';
  200. if (settings.showAlert) {
  201. swal({
  202. text: `成功设置播放速度为${Number(new_rate).toFixed(1)}${
  203. new_rate > 2 ? extraMsg : ''
  204. }`,
  205. icon: 'success',
  206. buttons: false,
  207. timer: new_rate > 2 ? 3000 : 1000,
  208. });
  209. }
  210. } else {
  211. if (new_rate === null) return;
  212. swal({
  213. text: `${
  214. new_rate || '你输入的'
  215. }不是一个指定范围内的有效数字哦>﹏<`,
  216. icon: 'error',
  217. buttons: false,
  218. timer: 1000,
  219. });
  220. }
  221. });
  222. } else if (rateStr === '加速') {
  223. settings.curRate = curRate + 0.1;
  224. check();
  225. } else if (rateStr === '减速') {
  226. settings.curRate = curRate - 0.1;
  227. check();
  228. } else {
  229. settings.curRate = rate;
  230. if (settings.showAlert) {
  231. swal({
  232. text: `成功设置播放速度为${Number(rate).toFixed(1)}`,
  233. icon: 'success',
  234. buttons: false,
  235. timer: 1000,
  236. });
  237. }
  238. }
  239. };
  240. // === 补充按钮内部文本与样式 ===
  241. let btnInnerHtml = `<span class="g-button-right">
  242. <em class="icon icon-speed"></em>
  243. <span class="text" style="width: auto;">${rateStr}</span>
  244. </span>`;
  245. btn.innerHTML = btnInnerHtml;
  246. btn.style.userSelect = 'none';
  247. return btn;
  248. };
  249. // === 插入倍速按钮集 ===
  250. if ($('.video-toolbar-buttonbox')[0]) {
  251. btn_div = $('.video-toolbar-buttonbox')[0];
  252. } else {
  253. btn_div = $('.ad-single-bottom')[0] || $('.dis-footer')[0];
  254. btn_div.innerHTML = '';
  255. btn_div.style.margin = '10px 6px';
  256. btn_div.style.width = '100%';
  257. }
  258. let btns = options.map((option) => generateBtn(option.str, option.rate));
  259. btn_div.append(...btns);
  260. // === 加入倍速显示 ===
  261. if (!settings.saveRate) settings.curRate = 1;
  262. label = $(
  263. `<span>当前: ${Number(settings.curRate).toFixed(1)}${
  264. Number(settings.curRate) > 2 ? '(>2容易卡顿)' : ''
  265. }</span>`
  266. )[0];
  267. label.style.color = '#09aaff';
  268. label.style.fontSize = '18px';
  269. label.style.display = 'inline-block';
  270. label.style.margin = '5px';
  271. label.style.fontFamily = 'Microsoft YaHei';
  272. btn_div.append(label);
  273. // === 去除多余元素 调整布局 ===
  274. let other_div;
  275. if ($('.video-other-video')[0]) {
  276. other_div = $('.video-other-video')[0];
  277. other_div.style.paddingTop = '50px';
  278. vip_div = $('.privilege-box')[0];
  279. vip_div.parentNode.removeChild(vip_div);
  280. btn_div.removeChild(btn_div.childNodes[1]);
  281. btn_div.removeChild(btn_div.childNodes[1]);
  282. btn_div.removeChild(btn_div.childNodes[1]);
  283. }
  284. };
  285. })();