youtube继续播放

当出现"影片已暂停,要继续观赏吗?"时忽略它继续播放

当前为 2020-03-20 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name youtube continue play
  3. // @name:en youtube continue play
  4. // @name:zh-CN youtube继续播放
  5. // @name:zh-TW youtube繼續播放
  6. // @name:ja youtube履歴書再生
  7. // @description When "Video paused, do you want to continue watching?" Appears, ignore it and continue playing automatically
  8. // @description:en When "Video paused, do you want to continue watching?" Appears, ignore it and continue playing automatically
  9. // @description:zh-TW 當出現"影片已暫停,要繼續觀賞嗎?"時忽略它繼續播放
  10. // @description:zh-CN 当出现"影片已暂停,要继续观赏吗?"时忽略它继续播放
  11. // @description:ja 「ビデオが一時停止しましたが、引き続き視聴しますか?」が表示されたら無視して再生を続けます
  12. // @namespace https://greasyfork.org/zh-TW/users/461233-jack850628
  13. // @version 1.16
  14. // @author jack850628
  15. // @include /^https?:\/\/(:?.*?\.)*youtube.com\/.*$/
  16. // @noframes
  17. // @run-at document-end
  18. // @license MIT
  19. // ==/UserScript==
  20.  
  21. (function() {
  22. let pausedF = function({target: videoPlay}){
  23. setTimeout(function(){
  24. let ytConfirmDialog = document.querySelector('yt-confirm-dialog-renderer');
  25. if(
  26. ytConfirmDialog &&
  27. (
  28. ytConfirmDialog.parentElement.style.display != 'none' ||
  29. (
  30. document.hidden &&
  31. videoPlay.getCurrentTime() < videoPlay.getDuration()
  32. )
  33. )
  34. ){
  35. videoPlay.play();
  36. }
  37. }, 500);
  38. }
  39. function listenerVideoPlayer(){
  40. let videoPlay = document.querySelector('video');
  41. if(!videoPlay){
  42. return false;
  43. }
  44. videoPlay.addEventListener('pause', pausedF);
  45. return true;
  46. }
  47. let scriptBlocks = document.getElementsByTagName('script')[0];
  48. let ycpScript = document.createElement('script');
  49. ycpScript.setAttribute('id','ycp-script');
  50. ycpScript.setAttribute('ycp-data','wait');
  51. ycpScript.innerHTML = `
  52. window.spf._request = window.spf.request;
  53. Object.defineProperty(window.spf, 'request', {
  54. value: function(){
  55. if(arguments[1]){
  56. if(arguments[1].onDone){
  57. let onDone = arguments[1].onDone;
  58. arguments[1].onDone = function(){
  59. let result = onDone.apply(this,arguments);
  60. document.querySelector('#ycp-script').setAttribute('ycp-data','ok');
  61. return result;
  62. }
  63. }else{
  64. arguments[1].onDone = () => document.querySelector('#ycp-script').setAttribute('ycp-data','ok');
  65. }
  66. }
  67. return window.spf._request.apply(this,arguments);
  68. },
  69. writable: true,
  70. configurable: true
  71. });
  72. document.querySelector('#ycp-script').setAttribute('ycp-data','ok');
  73. `;
  74. let ycpScriptObserver = new MutationObserver(([{target: ycpScript}], observer) => {
  75. if(ycpScript.getAttribute('ycp-data') == 'ok'){
  76. if(!listenerVideoPlayer()) ycpScript.setAttribute('ycp-data','wait')
  77. else ycpScriptObserver.disconnect();
  78. }
  79. });
  80. if(scriptBlocks){
  81. ycpScriptObserver.observe(
  82. ycpScript,
  83. {
  84. attributes: true
  85. }
  86. );
  87. scriptBlocks.parentNode.insertBefore(ycpScript,scriptBlocks);
  88. }
  89. })();