click_to_play@youtube

disable autoplay and unload player

目前为 2015-05-15 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name click_to_play@youtube
  3. // @namespace click_to_play@youtube
  4. // @namespace https://greasyfork.org/ja/scripts/9886
  5. // @homepageURL https://greasyfork.org/ja/scripts/9886
  6. // @license http://creativecommons.org/licenses/by-nc-sa/4.0/
  7. // @description disable autoplay and unload player
  8. // @include http://*
  9. // @include https://*
  10. // @exclude https://www.youtube.com/*
  11. // @author noi
  12. // @version 1.03
  13. // @grant GM_log
  14. // ==/UserScript==
  15.  
  16.  
  17. /**************************************************************
  18. [about]
  19. Stop youtube video autoplay, and unload the players.
  20. It will display a thumbnail image instead.
  21.  
  22. youtubeの埋め込み動画を読みこまないように変更し、
  23. 代わりにサムネイル画像を表示します。
  24.  
  25. Firefoxのプラグイン「click-to-play」はHTML5をブロックしないので、
  26. スクリプトを作成。
  27.  
  28. ****************************
  29. References
  30.  
  31. No Embed Youtube @author eight
  32. https://greasyfork.org/ja/scripts/1590
  33.  
  34. ****************************
  35. history
  36.  
  37. 05/15/2015 - v1.03 サムネ画像のサイズ修正
  38. 05/15/2015 - v1.02 v1.01のバグ修正
  39. 05/15/2015 - v1.01 再生ボタンを変更
  40. 05/15/2015 - v1.00 release
  41. **************************************************************/
  42.  
  43. "use strict";
  44. var number = 0;
  45.  
  46. var xpath = [
  47. '//iframe[contains(@src,"youtube.com/embed/")]|',
  48. '//iframe[contains(@src,"youtube.com/v/")]|',
  49. '//embed[contains(@src,"youtube.com/v/") and not(ancestor::object)]|',
  50. '//object[./param[contains(@value,"youtube.com/v/")]]',
  51. ].join('');
  52.  
  53. var playButton = '<div style="width:100%;height:100%;background:url(\'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAA8CAMAAADG+c2+AAAAsVBMVEUAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApKSnOzs47OzsAAAD8/Pytra0aGhqSkpKHh4cDAwPh4eFcXFzGxsYxMTH7+/ukpKQSEhLv7+99fX0CAgLb29tQUFD+/v6+vr7m5ub5+fmbm5sNDQ3r6+tycnLV1dVGRkb///+2trYICAj29vZmZmYhISEAAADz8/MgICDz8/P///91kYKsAAAAOnRSTlOZACQBgkZyiwSRTzGHU1Rko+GoiP3Rn8bCmeyy3aX7zZ30vpnpr/7Z7/rKnPK65av+1Zv4tqEy96H2cK1dPgAAARxJREFUeF7N2OlOwkAUR/E/XZdpi4oLKOAGuIGKu/P+D6aN6YifjOkxmd8DnISktPde9VphUCdRrj/Lo6QKQpdpg1mcqoM0zn4GXwbqqDSbwUKA4jvYF6LfBgtBiq+gEcY0wawUpsw+g7FAcU9hKlAaKhAqUC1UpUSoRJFQkXKRfs1t74hld/f22aC1r8MRGWwcHqHBxngCB+30+AQKOqdn51DQmc3hoL2/2IKCztX1DRR0lisq6NzewUG7WD9DQefx4AEKOpdPeNDnn7xYv/n82CxX9F/P55fDbE6/YH3+BIwnPn9G34cjD0YRcFjCxzl84ORH4kqoCl8r8MWHXs3w5ZFfb/kFnD8R8EeMhinV0cD80yEIOVXVG6eqD/g5Xi0pxQ0LAAAAAElFTkSuQmCC\') no-repeat center center;"></div>';
  54.  
  55. var blockEmbed = function(node){
  56.  
  57. var result = document.evaluate(xpath, node, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  58.  
  59. for(var i=0,j=result.snapshotLength;i<j;i++){
  60. var ele = result.snapshotItem(i);
  61. if(ele.hasAttribute('c2p')) continue;
  62.  
  63. var url = ele.src; //iframe or embed
  64. //object
  65. if(!url){
  66. for(var x=0,y=ele.childNodes.length; x<y; x++){
  67. var param = ele.childNodes[x];
  68. if(param.nodeName == "PARAM" && param.getAttribute("name") == "movie"){
  69. url = param.getAttribute("value");
  70. break;
  71. }
  72. }
  73. }
  74. if(!url) continue;
  75.  
  76. var parent = ele.parentNode;
  77.  
  78. var id = url.match(/(embed|v)\/(.+?)(\?|&|$)/)[2];
  79. var movieUrl = "https://www.youtube.com/watch?v=" + id;
  80.  
  81. var src = location.protocol + '//img.youtube.com/vi/' + id + '/mqdefault.jpg';
  82.  
  83. var eleW = ele.style.width || ele.width;
  84. var eleH = ele.style.height || ele.height;
  85. var thumbnail = document.createElement("div");
  86. thumbnail.className = 'c2p_thumbnail';
  87. thumbnail.setAttribute('num',number);
  88. thumbnail.innerHTML = playButton;
  89. thumbnail.style = 'min-width:320px;min-height:180px;width:'+ eleW +'px;height:'+ eleH +'px;background:url(' + src + ') no-repeat center center ; background-size: 100% 100%;';
  90. thumbnail.title = 'click to play!';
  91. var block = document.createElement("div");
  92. block.id = 'c2p_' + number;
  93. block.className = 'c2p_block';
  94. block.appendChild(ele);
  95. block.innerHTML = '<!-- ' + block.innerHTML + ' -->';
  96.  
  97. var unBlock = function(e){
  98. var thumb = e.target;
  99. if(!thumb.id.match(/^c2p_/)) thumb = thumb.parentNode;
  100. thumb.removeEventListener('click',unBlock,false);
  101.  
  102. thumb.parentNode.removeChild(thumb);
  103.  
  104. var num = thumb.getAttribute('num');
  105. var blocked = document.getElementById('c2p_' + num);
  106. var strTxt = blocked.innerHTML.replace(/(^\<\!\-\- | \-\-\>$)/g,'').replace(/(.*?)\>/,'$1 c2p="done">');
  107. var addObj = document.createElement("div");
  108. blocked.parentNode.replaceChild(addObj,blocked);
  109. addObj.innerHTML = strTxt;
  110. };
  111. thumbnail.addEventListener('click',unBlock,false);
  112.  
  113. parent.appendChild(thumbnail);
  114. // thumbnail.insertAdjacentHTML('beforebegin','<a class="c2p_embedUrl" href="' + movieUrl + '" target="_blank">' + movieUrl + '</a>');
  115. //parent.appendChild(block);
  116. number++;
  117. }
  118. };
  119. blockEmbed(document.documentElement);
  120.  
  121.  
  122. var observer = new MutationObserver(function(mutations){
  123. for(var i=0,j=mutations.length;i<j;i++){
  124. var m = mutations[i];
  125. if(m.type != "childList") return;
  126.  
  127. for(var x=0,y=m.addedNodes.length;x<y;x++){
  128. blockEmbed(m.addedNodes[x]);
  129. }
  130. }
  131. });
  132. observer.observe(document.body, {childList: true,subtree: true});
  133.  
  134.  
  135. var onEventUnload = function(){
  136. window.removeEventListener("beforeunload", onEventUnload,false);
  137.  
  138. observer.disconnect();
  139. observer = xpath = blockEmbed = null;
  140. };
  141. window.addEventListener('beforeunload',onEventUnload, false);