百度网盘打开中文字幕(改)

百度网盘自动打开中文字幕

Versione datata 29/10/2024. Vedi la nuova versione l'ultima versione.

  1. // ==UserScript==
  2. // @name 百度网盘打开中文字幕(改)
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.9
  5. // @description 百度网盘自动打开中文字幕
  6. // @author woshilisisui
  7. // @match https://pan.baidu.com/pfile/video?path=*.mp4*
  8. // @icon https://th.bing.com/th?id=ODLS.039b3eb8-253e-4d80-8727-6e7d039c3891&w=32&h=32&qlt=90&pcl=fffffa&o=6&pid=1.2
  9. // @grant none
  10. // @license MIT
  11. // ==/UserScript==
  12.  
  13.  
  14. (function () {
  15. 'use strict';
  16.  
  17.  
  18. let interval
  19. // 等待页面完全加载完毕后执行脚本
  20. window.onload = function() {
  21. document.querySelector('.vjs-big-play-button').style.display = 'none';
  22. //document.querySelector('.vp-file-video-container__tools').style.display = 'none';
  23. var controlBar = document.querySelector('.video-js .vjs-control-bar');
  24. var controlBar2 = document.querySelector('.vp-video .vp-video__control-bar');
  25. var controlBar3 = document.querySelector('.vp-video .vp-video__control-bar--play-time-current');
  26. var controlBar4 = document.querySelector('.vp-video .vp-video__control-bar--play-time-all');
  27. var controlBar5 = document.querySelector('.vp-file-video-container__tools');
  28.  
  29.  
  30. var videoElement = document.querySelector('.video-js .vjs-tech');
  31. var videoElement2 = document.querySelector('.vp-video__player');
  32.  
  33. let timeout;
  34. function getElement() {
  35. console.log('getElement')
  36. controlBar = document.querySelector('.video-js .vjs-control-bar');
  37. controlBar2 = document.querySelector('.vp-video .vp-video__control-bar');
  38. controlBar3 = document.querySelector('.vp-video .vp-video__control-bar--play-time-current');
  39. controlBar4 = document.querySelector('.vp-video .vp-video__control-bar--play-time-all');
  40. controlBar5 = document.querySelector('.vp-file-video-container__tools');
  41. videoElement = document.getElementById('vjs_video_594_html5_api');
  42. videoElement2 = document.querySelector('.vp-video__player');
  43. }
  44.  
  45. function toggleControlBar(display) {
  46. if (!controlBar || !controlBar2 || !controlBar3 || !controlBar4 || !controlBar5) {
  47. getElement();
  48. return;
  49. }
  50. const displayValue = display ? 'block' : 'none';
  51. if (controlBar) controlBar.style.display = displayValue;
  52. if (controlBar2) controlBar2.style.display = display ? 'flex' : 'none';
  53. if (controlBar3) controlBar3.style.display = displayValue;
  54. if (controlBar4) controlBar4.style.display = displayValue;
  55. if (controlBar5) controlBar5.style.display = displayValue;
  56. }
  57.  
  58.  
  59. function controlB() {
  60. timeout = setTimeout(() => {
  61. toggleControlBar(false);
  62. }, 1000);
  63. }
  64.  
  65. function controlBDisplay() {
  66. clearTimeout(timeout);
  67. toggleControlBar(true);
  68. }
  69.  
  70.  
  71. let isMouseMoveBound = false;
  72. let isMouseLeaveBound = false;
  73. let isControlBarMouseOverBound = false;
  74. let isControlBarMouseLeave = false;
  75.  
  76. function bindEvents() {
  77. try {
  78.  
  79. // 先解绑之前的事件
  80. if (isMouseMoveBound) {
  81. videoElement.removeEventListener('mousemove', onMouseMove);
  82. isMouseMoveBound = false;
  83. }
  84. if (isMouseLeaveBound) {
  85. videoElement2.removeEventListener('mouseleave', onMouseLeave);
  86. isMouseLeaveBound = false;
  87. }
  88. if (isControlBarMouseOverBound) {
  89. controlBar.removeEventListener('mouseover', onControlBarMouseOver);
  90. controlBar5.removeEventListener('mouseover', onControlBarMouseOver);
  91. isControlBarMouseOverBound = false;
  92. }
  93. if (isControlBarMouseLeave) {
  94. controlBar5.removeEventListener('mouseleave', onControlBarMouseLeave);
  95. isControlBarMouseLeave = false;
  96. }
  97.  
  98. // 重新绑定事件
  99. videoElement.addEventListener('mousemove', onMouseMove);
  100. videoElement2.addEventListener('mouseleave', onMouseLeave);
  101. controlBar.addEventListener('mouseover', onControlBarMouseOver);
  102. controlBar5.addEventListener('mouseover', onControlBarMouseOver);
  103. controlBar5.addEventListener('mouseleave', onControlBarMouseLeave);
  104.  
  105. // 更新绑定状态
  106. isMouseMoveBound = true;
  107. isMouseLeaveBound = true;
  108. isControlBarMouseOverBound = true;
  109. isControlBarMouseLeave = true;
  110.  
  111. } catch (err) {
  112. console.error('绑定事件出错:', err);
  113. // 尝试重新绑定
  114. setTimeout(() => {
  115. getElement();
  116. bindEvents();
  117. }, 1000); // 等待1秒后重试
  118. }
  119. }
  120.  
  121.  
  122. function onMouseMove() {
  123. clearTimeout(timeout);
  124. controlBDisplay();
  125. controlB();
  126. }
  127.  
  128. function onMouseLeave() {
  129. clearTimeout(timeout);
  130. controlB();
  131. }
  132.  
  133. function onControlBarMouseOver() {
  134. clearTimeout(timeout);
  135. }
  136.  
  137. function onControlBarMouseLeave() {
  138. clearTimeout(timeout);
  139. controlB();
  140. }
  141.  
  142. // 添加事件绑定
  143. bindEvents();
  144.  
  145.  
  146. let lastUrl = '' // 存储上一个 URL
  147. // 监听 DOM 变化
  148. const observer = new MutationObserver(() => {
  149. const currentUrl = window.location.href;
  150.  
  151. // 检查 URL 是否发生变化
  152. if (currentUrl !== lastUrl) {
  153. console.log('URL发生变化');
  154. lastUrl = currentUrl; // 更新上一个 URL
  155. controlBDisplay();
  156. controlB();
  157. setTimeout(() => {
  158. simulateMouseHoverToButton();
  159. }, 0);
  160.  
  161. clearInterval(interval); // 停止当前轮询
  162. // URL 变化后稍微延迟一段时间再检测,确保 DOM 完全更新
  163. setTimeout(() => {
  164. waitForSubtitleButton();
  165. }, 0);
  166. }
  167. });
  168. // 开始观察 DOM 变化,监听整个页面的变化
  169. observer.observe(document.body, { childList: true, subtree: true });
  170.  
  171. function waitForSubtitleButton() {
  172. const maxAttempts = 100; // 设置最大尝试次数
  173. let attempts = 0;
  174. interval = setInterval(function () {
  175. attempts++;
  176. if (attempts >= maxAttempts) {
  177. console.log('尝试次数过多,停止轮询');
  178. console.log('不存在中文字幕');
  179. clearInterval(interval);
  180. }
  181. // 获取所有符合条件的元素
  182. const subtitleElements = document.querySelectorAll('li.vp-video__control-bar--video-subtitles-select-item');
  183. console.log(subtitleElements)
  184.  
  185. if (subtitleElements && subtitleElements.length > 0) {
  186. // 遍历所有符合条件的元素
  187. subtitleElements.forEach(element => {
  188. console.log(element.textContent);
  189. // 检查元素的文本内容是否为“中文字幕”
  190. if (element.textContent.trim() === '中文字幕') {
  191. clearInterval(interval); // 停止检测
  192. console.log('检测到中文字幕,进行点击...');
  193. element.click(); // 模拟点击操作
  194. setTimeout(() => {
  195. const subtitleText = document.querySelector('.vp-video .vp-video__subtitle-text.show')
  196. subtitleText.style.background = '#d6d6d6';
  197. subtitleText.style.color = '#ff0000';
  198. }, 1000);
  199. }
  200. });
  201. }
  202.  
  203. }, 2000);
  204. }
  205.  
  206. function simulateMouseHoverToButton() {
  207. // 获取需要悬停的按钮
  208. const buttonElement = document.querySelector('.vp-video__control-bar--button.is-text');
  209. console.log(buttonElement);
  210.  
  211. if (buttonElement) {
  212. // 创建一个鼠标事件
  213. const mouseOverEvent = new MouseEvent('mouseenter', {
  214. view: window,
  215. bubbles: true,
  216. cancelable: true
  217. });
  218.  
  219. // 触发鼠标悬停事件
  220. buttonElement.dispatchEvent(mouseOverEvent);
  221. console.log('鼠标悬停到按钮上');
  222.  
  223. setTimeout(() => {
  224.  
  225. // 创建一个鼠标移开事件
  226. const mouseLeaveEvent = new MouseEvent('mouseleave', {
  227. view: window,
  228. bubbles: true,
  229. cancelable: true
  230. });
  231.  
  232. // 触发鼠标移开事件
  233. buttonElement.dispatchEvent(mouseLeaveEvent);
  234. console.log('鼠标移开按钮');
  235. }, 1000);
  236. } else {
  237. console.log('未找到需要悬停的按钮');
  238. }
  239. }
  240. }
  241.  
  242. })();