【自用】Youtube自动英文字幕

自动切换到英文字幕

  1. // ==UserScript==
  2. // @icon https://github.com/favicon.ico
  3. // @name 【自用】Youtube自动英文字幕
  4. // @namespace heckles
  5. // @match https://www.youtube.com/*
  6. // @grant none
  7. // @version v2022.01.13
  8. // @author heckles
  9. // @description 自动切换到英文字幕
  10. // ==/UserScript==
  11.  
  12.  
  13. //1.创建一个marker来终止
  14. markcontainer = document.createElement("div");
  15. document.body.appendChild(markcontainer);
  16. markcontainer.setAttribute("id", "markcontainer");
  17.  
  18. //2.设置interval监测
  19. if (document.getElementById("browser-app") || document.getElementById("masthead")) { //这两个元素,有一个是true,就往下执行
  20. var sx = setInterval(function () { //间隔执行
  21. if (window.location.href.indexOf("watch?v=") < 0) { //如果网址不匹配
  22. return false; //就不执行 【这里只能匹配域名,然后筛,直接用watch的网址,从首页点进去会不触发】
  23. } else {
  24. if (document.querySelector("div.html5-video-container video.video-stream.html5-main-video").src == document.getElementById("markcontainer").innerHTML) { //如果blob没变(每点一次哪怕重复点击视频,blob都会变)
  25. return false; //就不执行
  26. } else {
  27. if (!document.querySelector("div.html5-video-container video.video-stream.html5-main-video") || !document.querySelector("div#text-container #text") || !document.querySelector(".ytp-settings-button")) { //如果video、频道名、设置按钮有一个找不到,即还没加载
  28. return false; //就不执行
  29. } else {
  30. StartSub(); //执行函数
  31. }
  32. }
  33. }
  34. }, 1000); //间隔时间,毫秒
  35. //return;
  36. }
  37.  
  38. //3.开始执行
  39. function StartSub() {
  40. console.log(">>>>>>>>>>>>> Youtube自动英文字幕已运行 <<<<<<<<<");
  41. document.querySelector(".ytp-settings-button").click(); //点击设置按钮
  42. if (document.querySelector(".ytp-menuitem-label-count")) { //如果有字幕(通过字幕按钮不含"无法显示字幕")
  43. console.log(">>>>>>>>>>>>> 有字幕");
  44. document.querySelector(".ytp-menuitem-label-count").click(); //点击设置下面的字幕按钮
  45. //点开之后才能检测到字幕明细,加ID好在后面判断,别再遍历时判断
  46. var caps = document.querySelectorAll(".ytp-popup.ytp-settings-menu .ytp-menuitem-label");
  47. for (i = 0; i < caps.length; i++) {
  48. if (caps[i].innerHTML.indexOf("英语") == 0 && caps[i].innerHTML.indexOf("自动") == -1) { //不知道为啥必须有两个=才行,英语不含自动
  49. caps[i].setAttribute("id", "EngSub");
  50. }
  51. if (caps[i].innerHTML.indexOf("英语") == 0 && caps[i].innerHTML.indexOf("自动") > -1) { //不知道为啥必须有两个=才行,英语含自动
  52. caps[i].setAttribute("id", "EngSubAuto");
  53. }
  54. if (caps[i].innerHTML.indexOf("关闭") == 0) { //把关闭也标记一下
  55. caps[i].setAttribute("id", "closeSub");
  56. }
  57. }
  58. //开始判断,如果有英语字幕(再区分是否中文频道)
  59. if (document.querySelector("#ytp-id-17").innerHTML.indexOf("英语") > -1) { //如果有英语字幕
  60. console.log(">>>>>>>>>>>>> 有英文字幕 <<<<<<<<<");
  61. if (document.querySelector("#columns #text a").innerHTML.match(/[\u4e00-\u9fa5]/gi) === null) { //频道名不含中文 #columns #text a也能满足被针对修改后的界面
  62. if (document.getElementById("EngSub")) {
  63. document.getElementById("EngSub").click();
  64. } else { //否则选择英语(自动生成)
  65. document.getElementById("EngSubAuto").click();
  66. }
  67. } else { //频道名含中文,关闭字幕
  68. document.getElementById("closeSub").click();
  69. console.log(">>>>>>>>>>>>> 但中文频道 <<<<<<<<<");
  70. }
  71. } else {//没有有英语字幕,关闭字幕
  72. document.getElementById("closeSub").click();
  73. console.log(">>>>>>>>>>>>> 没有英文字幕 <<<<<<<<<");
  74. }
  75. markcontainer.innerHTML = document.querySelector("div.html5-video-container video.video-stream.html5-main-video").src; //标记一下已检查过
  76. document.body.click(); //关闭菜单
  77. } else { //没有字幕
  78. markcontainer.innerHTML = document.querySelector("div.html5-video-container video.video-stream.html5-main-video").src; //标记一下已检查过
  79. document.body.click(); //关闭菜单
  80. console.log(">>>>>>>>>>>>> 没字幕 <<<<<<<<<");
  81. }
  82. }
  83.  
  84.