u-Youtube

make Youtube under ur control

目前為 2022-03-29 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name u-Youtube
  3. // @name:zh-CN 功夫制霸YouTube
  4. // @name:ua u-Youtube
  5. // @name:ja カンフー支配YouTube
  6. // @name:ko 쿵푸 지배YouTube
  7. // @name:it u-Youtube
  8. // @name:de u-Youtube
  9. // @name:fr u-Youtube
  10. // @namespace https://github.com/rasso1/u-Youtube
  11. // @version 0.98
  12. // @description make Youtube under ur control
  13. // @description:ja あなたのコントロール下でYouTubeを作る
  14. // @description:ko 유튜브를 당신의 통제하에 두십시오
  15. // @description:it rendi youtube sotto il tuo controllo
  16. // @description:de Machen Sie YouTube unter Ihrer Kontrolle
  17. // @description:fr faire de youtube sous votre contrôle
  18. // @author ok!
  19. // @match https://www.youtube.com/*
  20. // @run-at document-start
  21. // @contributionURL https://paypal.me/kongfuY
  22.  
  23. // ==/UserScript==
  24. (function() {
  25. 'use strict';
  26.  
  27. var sec_sub,sec_fwd,wheel_sec,buffer_time,dark_mode,video_quality,video_speed,english_mode;
  28. var expand_description = 1;
  29.  
  30. var youtube_hand = {
  31. dark_eye:function (){
  32. if(localStorage.getItem('dark_mode')==1){
  33. document.querySelector("html").setAttribute("dark",true);
  34. //document.querySelector("html").setAttribute("contentEditable",true);
  35. }
  36. else if(document.querySelector("html").hasAttribute("dark"))
  37. {document.querySelector("html").removeAttribute("dark")}
  38. },
  39. dark_eye1:function (){
  40. if(localStorage.getItem('dark_mode')==1){
  41. var style_type = document.createElement("style");style_type.id = "style_type";
  42. style_type.innerHTML = `#end > div.dropdown-hover > div{font-size:12px;color:#bbb !important;background-color:#202020 !important;}
  43. #end > div.dropdown-hover > button{background-color:#222 !important;} #end > div.dropdown-hover path{fill:transparent !important;stroke:white !important;}
  44. #end > div.dropdown-hover > div > div{color:#aaa !important;background-color:#202020 !important;}
  45. #end > div.dropdown-hover > div > div p{font-size:12px;color:#bbb !important;background-color:#202020 !important;}
  46. .dropdown-hover button div{font-size:12px;color:#aaa !important;background-color:#333 !important;}
  47. #sec_sub,#sec_fwd,#wheel_sec,#buffer_time{font-size:12px;color:#bbb !important;background-color:#333 !important;border-radius:5px;}`;
  48. document.head.appendChild(style_type);
  49. }
  50. },
  51.  
  52. //播放设置
  53. play_menu:function(){
  54.  
  55.  
  56. var html_app = document.createElement("div");
  57. html_app.innerHTML = `
  58. <button style="border:none;outline:none;background-color:#fff;height:37px;width:37px;margin-right:10px;" aria-label="缓存/速度设置"><svg viewBox="0 0 24 24" preserveAspectRatio="xMidYMid meet" focusable="false" style="pointer-events: none; display: block; width: 100%; height: 100%;"><g class="style-scope yt-icon">
  59. <path d="M19.43 12.98c.04-.32.07-.64.07-.98s-.03-.66-.07-.98l2.1-1.65c.2-.15.25-.42.13-.64l-2-3.46c-.12-.22-.4-.3-.6-.22l-2.5 1c-.52-.4-1.08-.73-1.7-.98l-.37-2.65c-.06-.24-.27-.42-.5-.42h-4c-.27 0-.48.18-.5.42l-.4 2.65c-.6.25-1.17.6-1.7.98l-2.48-1c-.23-.1-.5 0-.6.22l-2 3.46c-.14.22-.08.5.1.64l2.12 1.65c-.04.32-.07.65-.07.98s.02.66.06.98l-2.1 1.65c-.2.15-.25.42-.13.64l2 3.46c.12.22.4.3.6.22l2.5-1c.52.4 1.08.73 1.7.98l.37 2.65c.04.24.25.42.5.42h4c.25 0 .46-.18.5-.42l.37-2.65c.6-.25 1.17-.6 1.7-.98l2.48 1c.23.1.5 0 .6-.22l2-3.46c.13-.22.08-.5-.1-.64l-2.12-1.65zM12 15.5c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5z" fill="transparent" stroke="black"></path>
  60. </g></svg>
  61. </button>
  62.  
  63. <div style="background:#fff;border-radius: 10px;left: -160px;right: 0;margin-left: 0;margin-right: -100px;padding-top: 10px;" class="dropdown-box fadeInDown"><div class="item clearfix" style="border-radius:10px;"><p style="margin:10px auto;font-size:18px;"><span class="mandarin invisible">播放设置&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="english">Playback Setting&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><font size=2>Chs </font><input style="margin:auto" id="english_mode" class="switch switch-anim" type="checkbox" checked></p>
  64. <div style="margin:10px auto;font-size:12px;"><hr /><hr /></div>
  65. <p style="margin:10px auto;font-size:16px;"><span class="mandarin invisible" style="margin:10px auto;font-size:16px;">当前速度:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="english">current speed:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="speed_display"></span></p>
  66. <p style="margin:10px auto;font-size:16px;"><span class="mandarin invisible">选择播放速度:&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="english">specify speed:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><button id="speed_button" style="background-color: #5bb7fe;border-radius:5px;color:white;font-size:12px;"> &nbsp; 1x&nbsp; </button></p><input type="range" min="0" max="100" value="25" class="slider" id="speed_slider"><br /><br />
  67. <p style="margin:10px auto;font-size:16px;"><span class="mandarin invisible">跳过片头秒数:&nbsp;&nbsp;&nbsp;</span><span class="english">skip the title:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><input type="text" id="sec_fwd" style="width:40px;height:12px;vertical-align: middle;padding: 5px;background-color:#fff;border: 2px solid #ddd;border-radius:5px;font-size:12px;" placeholder="seconds">
  68. <p style="margin:10px auto;font-size:16px;"><span class="mandarin invisible">跳过片尾秒数:&nbsp;&nbsp;&nbsp;</span><span class="english">skip the end:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><input type="text" id="sec_sub" style="width:40px;height:12px;vertical-align: middle;padding: 5px;background-color: #fff;border: 2px solid #ddd;border-radius:5px;font-size:12px;" placeholder="seconds"></p>
  69. <p style="margin:10px auto;font-size:16px;"><span class="mandarin invisible">鼠标滚动秒数:&nbsp;&nbsp;&nbsp;</span><span class="english">mouse scroll:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><input type="text" id="wheel_sec" style="width:40px;height:12px;vertical-align: middle;padding: 5px;background-color: #fff;border: 2px solid #ddd;border-radius:5px;font-size:12px;" placeholder="seconds"></p>
  70. <p style="margin:10px auto;font-size:16px;"><span class="mandarin invisible">暂停缓存秒数:&nbsp;&nbsp;&nbsp;</span><span class="english">pause n cashing:&nbsp;&nbsp;&nbsp;&nbsp;</span><input type="text" id="buffer_time" style="width:40px;height:12px;vertical-align: middle;padding: 5px;background-color: #fff;border: 2px solid #ddd;border-radius:5px;font-size:12px;" placeholder="seconds"></p>
  71. <p style="margin:10px auto;font-size:16px;"><span class="mandarin invisible">播放质量:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span class="english">specify resolution&nbsp;</span> <select id="video_quality" style="border-radius:5px;"><option value="auto">auto</option><option value="hd2160">4K 2160p</option><option value="hd1440">HD 1440p</option><option value="hd1080">HD 1080p</option><option value="hd720">720p</option> <option value="large">480p</option><option value="medium">360p</option><option value="small">240p</option><option value="tiny">144p</option> </select></p>
  72. <p style="margin:10px auto 20px auto;font-size:16px;"><span class="mandarin invisible">暗夜模式 :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="english">dark mode:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><input style="margin:auto" id="dark_mode" class="switch switch-anim" type="checkbox" checked></p>
  73. <p style="margin:10px auto 20px auto;font-size:16px;"><span class="mandarin invisible">心意捐赠:&nbsp; </span><span class="english">donate:&nbsp;&nbsp;</span><a href="https://paypal.me/kongfuY" style="color:#5bb7fe;">paypal.me/kongfuY</a></p></div></div>
  74.  
  75. <style>#speed_slider {width: 175px;}.invisible {display: none;}.ytd-feed-filter-chip-bar-renderer.style-scope{z-index:999 !important;}.fadeInDown{-webkit-animation:fadeInDown .5s .2s ease both;-moz-animation:fadeInDown .5s .2s ease both}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-10px)}100%{opacity:1;-webkit-transform:translateY(0)}}@-moz-keyframes fadeInDown{0%{opacity:0;-moz-transform:translateY(-10px)}100%{opacity:1;-moz-transform:translateY(0)}}.dropdown{position:relative}.dropdown-box{display:none;position:absolute;z-index:9999999999}.dropdown-box.top{bottom:100%;padding-bottom:10px;left:50%;margin-left:-80px}.dropdown-box.bottom{top:100%;padding-top:10px;left:50%;margin-left:-80px}.dropdown-box.left{left:100%;padding-left:10px;bottom:0}.dropdown-box.right{right:100%;padding-right:10px;bottom:0}.dropdown-box .item{padding:10px;width:250px;border-radius:2px}.dropdown-hover{position:relative}.dropdown-hover:hover .dropdown-box{display:block}</style>
  76. <style>a {color: #670000;}.switch {width: 26px;height: 13px;position: relative;border: 1px solid #dfdfdf;background-color: #fdfdfd;box-shadow: #dfdfdf 0 0 0 0 inset; border-radius: 18px;background-clip: content-box;display: inline-block;-webkit-appearance: none;user-select: none;outline: none;} .switch:before { content: '';width: 13px;height: 13px;position: absolute;top: 0;left: 0;border-radius: 12px;background-color: #fff;box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);}.switch:checked {border-color: #5bb7fe;box-shadow: #5bb7fe 0 0 0 16px inset;background-color: #5bb7fe;}.switch:checked:before {left: 15px;}.switch.switch-anim {transition: border cubic-bezier(0, 0, 0, 1) 0.4s, box-shadow cubic-bezier(0, 0, 0, 1) 0.4s;}.switch.switch-anim:before {transition: left 0.3s;}.switch.switch-anim:checked {box-shadow: #5bb7fe 0 0 0 14px inset;background-color: #5bb7fe;transition: border ease 0.4s, box-shadow ease 0.4s, background-color ease 1.2s;}.switch.switch-anim:checked:before {transition: left 0.3s;}.text-red {color: #aaa;}</style>
  77. `;
  78. html_app.classList.add('dropdown-hover');
  79. document.querySelector("#end").appendChild(html_app);
  80.  
  81. //
  82. var speed_display=document.getElementById("speed_display"),speed_slider=document.getElementById("speed_slider"),speed_button=document.getElementById("speed_button"),
  83. y=document.getElementById("sec_sub"),z=document.getElementById("wheel_sec"),x=document.getElementById("buffer_time"),w=document.getElementById("dark_mode"),
  84. s=document.getElementById("video_quality"),v=document.getElementById("sec_fwd"),t=document.getElementById("english_mode");
  85. dark_mode = localStorage.getItem('dark_mode');var english_mode = localStorage.getItem('english_mode');
  86. const mandarins = document.querySelectorAll('.mandarin');const englishs = document.querySelectorAll('.english');
  87.  
  88.  
  89. video_speed = localStorage.getItem('speed');sec_fwd = localStorage.getItem('sec_fwd');sec_sub = localStorage.getItem('sec_sub');
  90. wheel_sec = localStorage.getItem('wheel_sec');buffer_time = localStorage.getItem('buffer_time');video_quality = localStorage.getItem('video_quality');
  91.  
  92. english_mode = localStorage.getItem('english_mode');
  93. //判读英文菜单
  94. if(localStorage.getItem('english_mode')==1){
  95. for (const mandarin of mandarins) {
  96. mandarin.className -= ' invisible';
  97. }
  98. for (const english of englishs) {
  99. english.className += ' invisible';
  100. }
  101. }
  102.  
  103. video_speed?speed_display.innerHTML=video_speed+"x":speed_display.innerHTML="1x";
  104.  
  105. setTimeout(function (){
  106. if(video_speed&&document.querySelector('#movie_player'))
  107. document.querySelector("#movie_player > div.html5-video-container > video").playbackRate = video_speed;},4000);
  108.  
  109. speed_slider.value = localStorage.getItem('speed')*25;
  110.  
  111. speed_slider.oninput=function(){localStorage.setItem('speed',this.value/25);video_speed = localStorage.getItem('speed');video_speed?speed_display.innerHTML=video_speed+"x":speed_display.innerHTML="1x";
  112. document.querySelector("#movie_player > div.html5-video-container > video").playbackRate = video_speed;
  113. }
  114.  
  115. speed_button.onclick=function(){localStorage.setItem('speed',1);video_speed = localStorage.getItem('speed');video_speed?speed_display.innerHTML=video_speed+"x":speed_display.innerHTML="1x";
  116. document.querySelector("#movie_player > div.html5-video-container > video").playbackRate = video_speed;
  117. speed_slider.value = localStorage.getItem('speed')*25;
  118. }
  119.  
  120. sec_fwd?v.value=sec_fwd:v.value="";
  121. v.onchange=function(){localStorage.setItem('sec_fwd',this.value);sec_fwd = localStorage.getItem('sec_fwd');sec_fwd?v.value=sec_fwd:v.value="";
  122. }
  123. sec_sub?y.value=sec_sub:y.value="";
  124. y.onchange=function(){localStorage.setItem('sec_sub',this.value);sec_sub = localStorage.getItem('sec_sub');sec_sub?y.value=sec_sub:y.value="";
  125. }
  126.  
  127. wheel_sec?z.value=wheel_sec:z.value="";
  128. z.onchange=function(){localStorage.setItem('wheel_sec',this.value);wheel_sec = localStorage.getItem('wheel_sec');wheel_sec?z.value=wheel_sec:z.value="";
  129. }
  130. buffer_time?x.value=buffer_time:x.value="";
  131. x.onchange=function(){localStorage.setItem('buffer_time',this.value);buffer_time = localStorage.getItem('buffer_time');buffer_time?x.value=buffer_time:x.value="";
  132. }
  133. w.checded=dark_mode; if(dark_mode!=1){document.getElementById("dark_mode").removeAttribute('checked');}
  134. w.onchange=function(){if(w.checked){localStorage.setItem('dark_mode','1');youtube_hand.dark_eye();youtube_hand.dark_eye1();}
  135. else{localStorage.setItem('dark_mode',0);
  136. document.querySelector("html").removeAttribute("dark");
  137. document.querySelector('#style_type').remove();
  138. }
  139. dark_mode = localStorage.getItem('dark_mode');
  140. }
  141. t.checded=english_mode; if(english_mode!=1){document.getElementById("english_mode").removeAttribute('checked');}
  142. t.onchange=function(){if(t.checked){localStorage.setItem('english_mode','1');
  143. for (const mandarin of mandarins) {
  144. mandarin.className -= ' invisible';}
  145. for (const english of englishs) {
  146. english.className += ' invisible';}
  147. }
  148. else{localStorage.setItem('english_mode',0);
  149. for (const mandarin of mandarins) {
  150. mandarin.className += ' invisible';}
  151. for (const english of englishs) {
  152. english.className -= ' invisible';}
  153. }
  154. english_mode = localStorage.getItem('english_mode');
  155. }
  156.  
  157. if(video_quality){
  158. for(var i=0;i<s.length;i++){
  159. if(s.options[i].value==video_quality){
  160. s.options[i].selected=true;
  161. }
  162. }
  163. }
  164. s.onchange=function (){
  165. var quality_value = s[s.selectedIndex].getAttribute("value");
  166. localStorage.setItem('video_quality',quality_value);
  167. video_quality = localStorage.getItem('video_quality');
  168. var avail_quali;var v_elem = document.querySelector("#movie_player");
  169. if((avail_quali = v_elem.getAvailableQualityLevels())&&avail_quali.indexOf(video_quality) == -1){
  170. v_elem.setPlaybackQualityRange(avail_quali[0],avail_quali[0]);
  171. }
  172. else{v_elem.setPlaybackQualityRange(video_quality,video_quality);}
  173. }
  174.  
  175. },
  176.  
  177. play_main:function (){
  178.  
  179. sec_fwd = localStorage.getItem('sec_fwd');
  180. sec_sub = localStorage.getItem('sec_sub');
  181. wheel_sec = localStorage.getItem('wheel_sec');
  182. buffer_time = localStorage.getItem('buffer_time');
  183.  
  184. var video_speed = localStorage.getItem('speed');
  185.  
  186. var video_elem,v_elem;
  187.  
  188.  
  189. //每3秒试执行主应用操作
  190. var main_timer = setInterval(function () {
  191. video_elem = document.querySelector("#movie_player > div.html5-video-container > video");
  192. v_elem = document.querySelector("#movie_player");
  193. if (video_elem){
  194. main_opr();
  195. video_elem.ondurationchange = main_opr;
  196.  
  197. clearInterval(main_timer);}
  198. },500)
  199.  
  200. //主应用操作
  201. function main_opr() {
  202. //视频质量选择
  203.  
  204. var avail_quali;var current_time;
  205. if((avail_quali = v_elem.getAvailableQualityLevels())&&avail_quali.indexOf(video_quality) == -1){
  206. v_elem.setPlaybackQualityRange(avail_quali[0],avail_quali[0]);
  207. }
  208. else{v_elem.setPlaybackQualityRange(video_quality,video_quality);}
  209. //点开视频介绍
  210. if(expand_description){
  211.  
  212. if(document.getElementById("action-panel-details")) {
  213. document.getElementById("action-panel-details").classList.remove("yt-uix-expander-collapsed");
  214. }
  215.  
  216. if(document.querySelector("#more > .more-button.style-scope.ytd-video-secondary-info-renderer")) {
  217. document.querySelector("#more > .more-button.style-scope.ytd-video-secondary-info-renderer").click();
  218. }
  219. }
  220.  
  221. //前跳过秒数+速度+播放质量设定
  222. video_elem.oncanplay = function(){
  223. if(video_speed&&video_elem){
  224. video_elem.playbackRate = video_speed;}
  225. // if(current_time>200){current_time=0}
  226. if(sec_fwd&&(video_elem.currentTime < sec_fwd/1)){
  227. video_elem.currentTime += sec_fwd/1;
  228. video_elem.oncanplay = "";
  229. }
  230. // video_elem.currentTime += 1;
  231.  
  232. }
  233.  
  234. //暂停缓存
  235. sec_sub = localStorage.getItem('sec_sub');
  236. video_elem.onpause = function(){
  237. if(!buffer_time||buffer_time == 0){return;}
  238. if(parseInt(video_elem.currentTime)==parseInt(video_elem.duration)){current_time=0;video_elem.onpause = "";video_elem.onplay = "";video_elem.oncanplaythrough ="";}
  239. else{current_time = parseInt(video_elem.currentTime);
  240. video_elem.oncanplaythrough = function(){
  241. if(parseInt(video_elem.currentTime)==parseInt(video_elem.duration)){current_time=0;video_elem.onpause = "";video_elem.onplay = "";video_elem.oncanplaythrough ="";}
  242. else{video_elem.currentTime +=2;
  243. if(sec_sub){
  244. if((video_elem.currentTime-current_time)>(buffer_time?buffer_time:0)||(video_elem.duration<(video_elem.currentTime+parseInt(sec_sub)+10)))
  245. {video_elem.currentTime = current_time;
  246. console.log(current_time);console.log(video_elem.currentTime);
  247. video_elem.oncanplaythrough='';current_time=0;}
  248. }
  249. else{
  250. if((video_elem.currentTime-current_time)>(buffer_time?buffer_time:0)||(video_elem.duration<(video_elem.currentTime+30)))
  251. {video_elem.currentTime = current_time;
  252. video_elem.oncanplaythrough='';}
  253. }
  254. }
  255. }
  256. video_elem.currentTime += 1;
  257. }
  258. }
  259. video_elem.onplay = function(){
  260.  
  261. if(parseInt(video_elem.currentTime)==parseInt(video_elem.duration-1)){current_time = 0;video_elem.onpause = "";video_elem.onplay = "";video_elem.oncanplaythrough ="";} // new
  262. else if(current_time){video_elem.currentTime = current_time;
  263. video_elem.oncanplaythrough = "";
  264. //current_time=0;console.log("onplay ok2")
  265. }
  266. }
  267. video_elem.onended = function(){current_time = 0;video_elem.onpause = "";video_elem.onplay = "";video_elem.oncanplaythrough ="";
  268.  
  269. }
  270. //中键全屏
  271.  
  272. video_elem.addEventListener("mouseup", function(e) {
  273. e.preventDefault();
  274. if(e.button==1){
  275. //video_elem.webkitRequestFullscreen();
  276.  
  277. document.querySelector("#movie_player > div.ytp-chrome-bottom > div.ytp-chrome-controls > div.ytp-right-controls > button.ytp-fullscreen-button.ytp-button").click();
  278. //document.webkitCancelFullScreen();
  279.  
  280. }
  281. }, false);
  282.  
  283. //中键全屏
  284.  
  285. // v_big.addEventListener("mouseup", function(e) {
  286. // e.preventDefault();
  287. // if(e.button==1){
  288. //video_elem.webkitRequestFullscreen();
  289. // if (!document.fullscreenElement) {
  290. // document.querySelector("#movie_player > div.ytp-chrome-bottom > div.ytp-chrome-controls > div.ytp-right-controls > button.ytp-fullscreen-button.ytp-button").click();
  291. /*
  292. if(video_elem.requestFullscreen){
  293. return video_elem.requestFullscreen();
  294. }else if(video_elem.webkitRequestFullScreen){
  295. return video_elem.webkitRequestFullScreen();
  296. }else if(video_elem.mozRequestFullScreen){
  297. return video_elem.mozRequestFullScreen();
  298. }else{
  299. return video_elem.msRequestFullscreen();
  300. }
  301. */
  302. // }
  303. // else{
  304. // document.querySelector("#movie_player > div.ytp-chrome-bottom > div.ytp-chrome-controls > div.ytp-right-controls > button.ytp-fullscreen-button.ytp-button").click();
  305. //document.webkitCancelFullScreen();
  306. // }
  307. // }
  308. // }, false);
  309.  
  310. /*
  311. video_elem.onauxclick = function(e){e.preventDefault()};
  312. video_elem.onauxclick = function(event) {event.preventDefault();video_elem.webkitRequestFullscreen();}
  313.  
  314. video_elem.onauxclick = video_elem.addEventListener("mouseup", mid_key, true);
  315. function mid_key(e) {
  316. // e.preventDefault();
  317. if(e.button==1){
  318. //video_elem.webkitRequestFullscreen();
  319. if (!document.fullscreenElement) {
  320. if(video_elem.requestFullscreen){
  321. video_elem.removeEventListener("mouseup", mid_key, true);
  322. return video_elem.requestFullscreen();
  323. }else if(video_elem.webkitRequestFullScreen){
  324. video_elem.removeEventListener("mouseup", mid_key, true);
  325. return video_elem.webkitRequestFullScreen();
  326. }else if(video_elem.mozRequestFullScreen){
  327. return video_elem.mozRequestFullScreen();
  328. }else{
  329. return video_elem.msRequestFullscreen();
  330. }
  331.  
  332. }
  333. else{document.webkitCancelFullScreen();}
  334. }
  335. }*/
  336.  
  337.  
  338. // 滚轮前进后退
  339. video_elem.onwheel = function(e){e.preventDefault()};
  340. v_elem.onwheel = wheel_e;
  341.  
  342. function wheel_e (event) {
  343. event.preventDefault();
  344.  
  345. //console.log(event.deltaY);
  346. // event.deltaY = Math.min(Math.max(.125,event.deltaY), 4);
  347. //console.log(wheel_sec);
  348. video_elem.currentTime += parseInt(event.deltaY>0?wheel_sec/1:-wheel_sec) ;
  349.  
  350. v_elem.onwheel="";
  351. setTimeout(function(){v_elem.onwheel= wheel_e;},300);
  352.  
  353. //同时重设播放速度
  354. video_speed = localStorage.getItem('speed');
  355. document.querySelector("#movie_player > div.html5-video-container > video").playbackRate = video_speed;
  356.  
  357. }
  358. /*
  359. // 在视频框内按键ctrl或鼠标右键,直接跳到下一集
  360. v_elem.addEventListener("keydown", function(e) {
  361. if (e.keyCode == 17) {
  362. e.preventDefault();
  363. next_exec();
  364. }
  365. }, false);
  366.  
  367. v_elem.addEventListener("contextmenu", function(e) {
  368. e.preventDefault();
  369. next_exec();
  370. }, false);
  371. */
  372. //每隔25秒获取播放剩余时间,如在25秒内则执行主程序
  373. if(sec_sub !== ""&&sec_sub !=0){
  374. const sec_sub2=sec_sub/1+12;
  375. setInterval(function(){
  376. let left_duration = get_dura(),sel_part = document.querySelector("#movie_player > div.html5-video-container > video");
  377. if((left_duration < sec_sub) && (left_duration !== 0) && sel_part)
  378. {
  379. next_exec();
  380. // clearInterval(auto_play);
  381.  
  382. }
  383. }, 1000);
  384. }
  385.  
  386. //next part 执行
  387. function next_exec(){
  388. const sel_part2 = document.querySelector("#movie_player > div.ytp-chrome-bottom > div.ytp-chrome-controls > div.ytp-left-controls > a.ytp-next-button.ytp-button");
  389. if (sel_part2)
  390. {console.log("clicked next---");sel_part2.click();current_time=0;}
  391. }
  392.  
  393. //获取播放剩余时间
  394. function get_dura() {
  395. const sel_start = document.querySelector("#movie_player > div.html5-video-container > video").currentTime;
  396. const sel_fin = document.querySelector("#movie_player > div.html5-video-container > video").duration;
  397. if (sel_fin) {
  398. return sel_fin-sel_start;
  399. }
  400. return 0;
  401. }
  402.  
  403. }
  404.  
  405. },
  406.  
  407. move_menu:function (){
  408. //点开显示其余items
  409. document.querySelector("#sections > ytd-guide-section-renderer:nth-child(2) > #items > ytd-guide-collapsible-entry-renderer > #expander-item > #endpoint").click();
  410. //移动频道到左顶部
  411. document.querySelector("#sections > ytd-guide-section-renderer:nth-child(1)").parentNode.append(document.querySelector("#sections > ytd-guide-section-renderer:nth-child(1)"))
  412.  
  413.  
  414. //页面写入script和style
  415. var a_bug = document.createElement("script");
  416. a_bug.innerHTML = `// 监听draggable的相关事件
  417. function dragstart_handler(ev) {
  418. console.log("dragStart");
  419. // Add the target element's id to the data transfer object
  420. ev.dataTransfer.setData("text", ev.target.id);
  421. ev.dataTransfer.setData("text1", ev.target);
  422. console.log(ev.dataTransfer.getData("text1"));
  423. ev.dataTransfer.dropEffect = "move";
  424. }
  425. function dragEnter(ev) {
  426. console.log("dragenter");
  427. ev.preventDefault();
  428. ev.target.className += ' drag-over';
  429. }
  430. function dragLeave(e) {
  431. ev.preventDefault();
  432. this.className = 'droppable';
  433. }
  434. function dragover_handler(ev) {
  435. ev.preventDefault();
  436. //ev.dataTransfer.dropEffect = "move"
  437. }
  438. function drop_handler(ev) {
  439. ev.preventDefault();
  440. // Get the id of the target and add the moved element to the target's DOM
  441. var data = ev.dataTransfer.getData("text");
  442. var first=ev.target.firstChild; //得到第一个元素
  443. ev.target.insertBefore(document.getElementById(data),first); //在第原来的第一个元素之前插入
  444. //ev.target.appendChild(document.getElementById(data));
  445. }
  446. function dragend_handler(ev) {
  447. console.log("dragEnd");
  448. // Remove all of the drag data
  449. ev.dataTransfer.clearData();
  450. //localStorage.setItem("itemstate",document.querySelector("#sections > ytd-guide-section-renderer:nth-child(1) #items").outerHTML);
  451.  
  452. //itemdetail写入localStorage
  453. var json = [];
  454. var data = {};
  455. var items_length=document.querySelectorAll("#sections > ytd-guide-section-renderer:nth-child(1) > #items > ytd-guide-entry-renderer").length
  456. for(var i=0;i<items_length-1;i++){
  457. data = {};
  458. //data.id = document.querySelectorAll("#sections > ytd-guide-section-renderer:nth-child(1) > #items > ytd-guide-entry-renderer")[i].id;
  459. //data.imgsrc = document.querySelectorAll("#sections > ytd-guide-section-renderer:nth-child(1) > #items > ytd-guide-entry-renderer #img")[i].src;
  460. data.text =document.querySelectorAll("#sections > ytd-guide-section-renderer:nth-child(1) > #items > ytd-guide-entry-renderer")[i].innerText;
  461. //data.href = document.querySelectorAll("#sections > ytd-guide-section-renderer:nth-child(1) > #items > ytd-guide-entry-renderer > #endpoint")[i].href;
  462.  
  463. json.push(data);
  464.  
  465. }
  466. var jsonString = JSON.stringify(json);//[{"id":1,"imgsrc":"test1","text":2}]
  467. localStorage.setItem("itemdetail",jsonString);
  468. //localStorage.setItem("item_new","");
  469. }
  470. function noAllowDrop(ev) {
  471. console.log("stopPropagation");
  472. ev.stopPropagation();
  473. }
  474.  
  475. //点击订阅或退订时,删除localStorage内已有相同item
  476. if(document.querySelector("#inner-header-container #subscribe-button")){var subscribe_button = document.querySelector("#inner-header-container #subscribe-button")}
  477. else if(document.querySelector("#meta-contents #top-row > #subscribe-button")){var subscribe_button = document.querySelector("#meta-contents #top-row > #subscribe-button");}
  478. // var subscribe_button = document.querySelector("#inner-header-container #subscribe-button")?document.querySelector("#inner-header-container #subscribe-button"):document.querySelector("#meta-contents #top-row > #subscribe-button");
  479.  
  480. if(subscribe_button){
  481.  
  482. subscribe_button.onclick=function(){
  483.  
  484. //localStorage.setItem("item_new",document.querySelector("#text > a").innerText);
  485. //localStorage.removeItem("itemdetail",document.querySelector("#channel-name #text").innerText);
  486. let obj = JSON.parse(localStorage.itemdetail);
  487. for(let j=obj.length-1;j>-1;j--){
  488. if(obj[j]&&obj[j].text==document.querySelector("#channel-name #text").innerText){
  489. let items_down = document.querySelectorAll("#sections > ytd-guide-section-renderer:nth-child(1) > #items > ytd-guide-entry-renderer");
  490.  
  491. items_down.forEach(function(element,index,array) {
  492.  
  493. if(element.firstElementChild.title==document.querySelector("#channel-name #text").innerText){
  494.  
  495. document.querySelector("#sections > ytd-guide-section-renderer:nth-child(1) #items").append(element);
  496. return false;
  497. }
  498. })
  499.  
  500. delete obj[j];}
  501. }
  502. localStorage.setItem("itemdetail",JSON.stringify(obj));
  503. console.log("delete suc");
  504. }
  505. }
  506. `;
  507. document.body.appendChild(a_bug);
  508.  
  509. var style_type2 = document.createElement("style");style_type2.id = "style_type";
  510. style_type2.innerHTML = `#sections > ytd-guide-section-renderer:nth-child(1) > #items > ytd-guide-entry-renderer{margin: 1em 0em 1em 0em !important;}
  511. .drag-over {
  512. border-style: dashed;
  513. }
  514. .droppable{}
  515. `;
  516. //#expandable-items > ytd-guide-entry-renderer{margin: 1.2em 0em 1.2em 0em !important;}
  517. document.head.appendChild(style_type2);
  518.  
  519. //开始操作
  520. var menu_opr = setInterval(function(){
  521.  
  522. /*
  523. const droppables = document.querySelectorAll("#sections > ytd-guide-section-renderer:nth-child(1) > #items > ytd-guide-entry-renderer");
  524. const draggable = document.querySelectorAll("#sections > ytd-guide-section-renderer:nth-child(1) > #items > ytd-guide-entry-renderer > #endpoint");
  525.  
  526. droppables.forEach(function(element,index,array) {
  527. element.setAttribute("ondrop","drop_handler(event);");
  528. element.setAttribute("ondragover","dragover_handler(event);");
  529. })
  530. */
  531. // const droppables = document.querySelector("#sections > ytd-guide-section-renderer:nth-child(1)");
  532. if(document.querySelector("#sections > ytd-guide-section-renderer:nth-child(1) #items > ytd-guide-entry-renderer")){
  533. const droppables = document.querySelector("#sections > ytd-guide-section-renderer:nth-child(1) > #items");
  534. const draggable = document.querySelectorAll("#sections > ytd-guide-section-renderer:nth-child(1) > #items > ytd-guide-entry-renderer");
  535. const no_draggable = document.querySelectorAll("#sections > ytd-guide-section-renderer:nth-child(1) > #items > ytd-guide-entry-renderer > #endpoint");
  536. // const no_droppable = document.querySelectorAll("#sections > ytd-guide-section-renderer:nth-child(1) > #items > ytd-guide-entry-renderer > #endpoint > tp-yt-paper-item");
  537. // const no_droppable = document.querySelectorAll("#sections > ytd-guide-section-renderer:nth-child(1) > #items > ytd-guide-entry-renderer > #endpoint *");
  538. const no_droppable = document.querySelectorAll("#sections > ytd-guide-section-renderer:nth-child(1) > #items *");
  539.  
  540. const draggable2 = document.querySelectorAll("#expandable-items > ytd-guide-entry-renderer");
  541. const no_draggable2 = document.querySelectorAll("#expandable-items > ytd-guide-entry-renderer > #endpoint");
  542. // const no_droppable2 = document.querySelectorAll("#expandable-items > ytd-guide-entry-renderer > #endpoint *");
  543.  
  544. droppables.setAttribute("ondrop","drop_handler(event);");
  545. droppables.setAttribute("ondragover","dragover_handler(event);");
  546. // droppables.setAttribute("ondragenter","dragEnter(event);");
  547. // droppables.setAttribute("ondragleave","dragLeave(event);");
  548. no_draggable.forEach(function(element,index,array) {
  549. element.setAttribute("draggable",false);
  550. });
  551. no_draggable2.forEach(function(element,index,array) {
  552. element.setAttribute("draggable",false);
  553. });
  554.  
  555. no_droppable.forEach(function(element,index,array) {
  556. element.setAttribute("ondragover","noAllowDrop(event);");
  557. });
  558. // no_droppable2.forEach(function(element,index,array) {
  559. // element.setAttribute("ondragover","noAllowDrop(event);");
  560. //});
  561.  
  562.  
  563. draggable.forEach(function(element,index,array) {
  564. if(index<array.length){
  565. element.setAttribute("draggable",true);
  566. element.setAttribute("ondragstart","dragstart_handler(event);");
  567. element.setAttribute("ondragend","dragend_handler(event);");
  568. if(!element.id){element.setAttribute("id","move"+index);}
  569. }
  570. });
  571. let index_x =0;
  572. draggable2.forEach(function(element,index,array) {
  573. index_x=index+7;
  574. element.setAttribute("draggable",true);
  575. element.setAttribute("ondragstart","dragstart_handler(event);");
  576. element.setAttribute("ondragend","dragend_handler(event);");
  577. element.setAttribute("id","move"+index_x);
  578.  
  579. });
  580.  
  581. //把隐藏内容拉出来,放入items
  582. const parent_item = document.querySelector("#sections > ytd-guide-section-renderer:nth-child(1) #items");
  583. let insert_sec = document.querySelector("#sections > ytd-guide-section-renderer:nth-child(1) #items > ytd-guide-collapsible-entry-renderer");
  584. let new_content2=document.querySelectorAll("#sections > ytd-guide-section-renderer:nth-child(1) #items > ytd-guide-collapsible-entry-renderer #expanded #expandable-items > ytd-guide-entry-renderer");
  585. new_content2.forEach(function(element){parent_item.insertBefore(element,insert_sec)});
  586.  
  587. // localStorage.setItem("itemstate",JSON.stringify(ddd));
  588. // localStorage.setItem("itemstate",ddd.outerHTML);
  589.  
  590. //取出保存在localStorage的itemstate,并还原回网页
  591. /*
  592. if(localStorage.getItem("itemstate")){
  593. document.querySelector("#sections > ytd-guide-section-renderer:nth-child(1) #items").outerHTML=localStorage.getItem("itemstate");
  594. }
  595. */
  596.  
  597. const obj = JSON.parse(localStorage.getItem("itemdetail"));
  598.  
  599. //getItem("itemdetail")然后写入网页列表
  600. if(localStorage.getItem("itemdetail")){
  601. /*
  602. //标记id-move
  603. draggable.forEach(function(element,index,array) {
  604. if(index<array.length){
  605. element.setAttribute("draggable",true);
  606. element.setAttribute("ondragstart","dragstart_handler(event);");
  607. element.setAttribute("ondragend","dragend_handler(event);");
  608.  
  609. if(localStorage.getItem("item_new")){
  610. if(element.firstElementChild.title==localStorage.getItem("item_new")){
  611. element.setAttribute("id","move"+draggable.length);
  612. parent_item.append(element);
  613. }
  614. }
  615. else{element.setAttribute("id","move"+index);}
  616.  
  617. }
  618. });
  619.  
  620. let index_x =0;
  621. draggable2.forEach(function(element,index,array) {
  622. index_x=index+7;
  623. element.setAttribute("draggable",true);
  624. element.setAttribute("ondragstart","dragstart_handler(event);");
  625. element.setAttribute("ondragend","dragend_handler(event);");
  626. element.setAttribute("id","move"+index_x);
  627.  
  628. });
  629. */
  630. var items_drag = document.querySelectorAll("#sections > ytd-guide-section-renderer:nth-child(1) > #items > ytd-guide-entry-renderer");
  631.  
  632. for(var j=obj.length-1;j>-1;j--){
  633. // if(j==0){
  634. items_drag.forEach(function(element,index,array) {
  635.  
  636. //console.log(element.firstElementChild.title);
  637. //console.log(obj[j].text);
  638. if(obj[j]&&element.firstElementChild.title==obj[j].text){
  639.  
  640. parent_item.prepend(element);
  641. return false;
  642. }
  643. })
  644. // }
  645. /*
  646. else if(j>0) {
  647.  
  648. items_drag.forEach(function(element,index,array) {
  649.  
  650. if(element.firstElementChild.title==obj[j].text){
  651. parent_item.insertBefore(element,parent_item.firstElementChild.nextSibling);
  652. console.log(element.firstElementChild.title);
  653. console.log(obj[j].text);
  654. return false;
  655. }
  656. })
  657. }
  658. */
  659. }
  660.  
  661. //document.querySelector("#"+obj[j].id+" yt-formatted-string").innerText=obj[j].text;
  662. //document.querySelector("#"+obj[j].id+" #img").src=obj[j].imgsrc;
  663. //document.querySelector("#"+obj[j].id+" #endpoint").href=obj[j].href;
  664. //ttt=j-1;
  665. /*
  666. if(j==0){
  667. parent_item.prepend(document.querySelector("#"+obj[j].id));
  668.  
  669. }
  670. else if(j>0) {
  671. //console.log(document.querySelector("#"+obj[j].id));
  672. //console.log(ttt);
  673. parent_item.insertBefore(document.querySelector("#"+obj[j].id),document.querySelector("#"+obj[j-1].id).nextSibling);
  674. }
  675. */
  676.  
  677.  
  678. //
  679. }
  680. //把当日订阅置顶
  681. document.querySelector("#sections > ytd-guide-section-renderer:nth-child(1) > #items").prepend(document.querySelector("#sections > ytd-guide-section-renderer:nth-child(2) #items > ytd-guide-entry-renderer:nth-child(4)"));
  682.  
  683. clearInterval(menu_opr);
  684. }
  685.  
  686. },100)
  687.  
  688. }
  689.  
  690.  
  691. }
  692.  
  693.  
  694.  
  695. //ev.dataTransfer.setData("text/html", ev.target.outerHTML);
  696. /*
  697. //点击订阅时记录频道名称
  698. var button_onclick = setInterval(function(){
  699.  
  700. console.log("okbutton");
  701. if(document.querySelector("#subscribe-button")){
  702. document.querySelector("#subscribe-button").onclick=function(){
  703. localStorage.setItem("item_new",document.querySelector("#text > a").innerText);
  704. localStorage.removeItem(document.querySelector("#text > a").innerText);
  705. }
  706.  
  707. // clearInterval(button_onclick);
  708. }
  709. },8000)
  710.  
  711.  
  712. */
  713.  
  714. var load_menu = setInterval(function(){
  715. //youtube_hand.dark_eye();
  716.  
  717. if(document.querySelector("#end")){
  718. youtube_hand.play_menu();
  719. youtube_hand.play_main();
  720. youtube_hand.dark_eye1();
  721.  
  722.  
  723. //document.querySelector("html").onpropertychange = youtube_hand.dark_eye;
  724.  
  725.  
  726. clearInterval(load_menu);
  727. }
  728. },100)
  729.  
  730.  
  731.  
  732. setInterval(function(){ youtube_hand.dark_eye();},200)
  733.  
  734.  
  735.  
  736. var move_ma=setInterval(function(){
  737. if(document.querySelector("#sections > ytd-guide-section-renderer:nth-child(2)"))
  738. {
  739. youtube_hand.move_menu();
  740. /*
  741. let ddd= document.querySelector("#sections > ytd-guide-section-renderer:nth-child(2) #items");
  742. let new_content1= document.querySelector("#sections > ytd-guide-section-renderer:nth-child(2) #items").innerHTML;
  743. let new_content2=document.querySelector("#sections > ytd-guide-section-renderer:nth-child(2) #items > ytd-guide-collapsible-entry-renderer #expanded #expandable-items").innerHTML;
  744. ddd.outerHTML ='<div id="items" class="style-scope ytd-guide-section-renderer" ondrop="drop_handler(event);" ondragover="dragover_handler(event);">'+new_content1+new_content2+'</div>';
  745. */
  746. clearInterval(move_ma);
  747. }
  748. },200)
  749.  
  750.  
  751.  
  752.  
  753.  
  754.  
  755. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址