No Embed Youtube

replace embed iframe, object with anchor link.

  1. // ==UserScript==
  2. // @name No Embed Youtube
  3. // @version 3.0.0
  4. // @description replace embed iframe, object with anchor link.
  5. // @homepageURL https://github.com/eight04/no-embed-youtube
  6. // @supportURL https://github.com/eight04/no-embed-youtube/issues
  7. // @license MIT
  8. // @author eight04 <eight04@gmail.com>
  9. // @namespace eight04.blogspot.com
  10. // @include http*
  11. // @exclude http://www.youtube.com/*
  12. // @exclude https://www.youtube.com/*
  13. // @exclude https://vimeo.com/*
  14. // @run-at document-start
  15. // @grant none
  16. // ==/UserScript==
  17.  
  18. "use strict";
  19.  
  20. var xpath = `(
  21. //iframe[
  22. contains(@src, 'youtube.com/embed/') or
  23. contains(@src, 'youtube.com/v/') or
  24. contains(@src, 'youtube-nocookie.com/embed/') or
  25. contains(@src, 'youtube-nocookie.com/v/') or
  26. contains(@data-src, 'youtube.com/embed/') or
  27. contains(@src, 'vimeo.com/video')
  28. ] |
  29. //object[./param[contains(@value, 'youtube.com/v/')]] |
  30. //embed[
  31. contains(@src, 'youtube.com/v/') and
  32. not(ancestor::object)
  33. ]
  34. )[not(ancestor::*[@id='YTLT-player'])]`;
  35.  
  36. const patterns = [
  37. {
  38. test: /youtube(-nocookie)?\.com\/(embed|v)\/(.+?)(\?|&|$)/,
  39. repl: match => `https://www.youtube.com/watch?v=${match[3]}`
  40. },
  41. {
  42. test: /vimeo\.com\/video\/(\d+)/,
  43. repl: match => `https://vimeo.com/${match[1]}`
  44. }
  45. ];
  46.  
  47. var unEmbed = function(node){
  48.  
  49. var result = document.evaluate(
  50. xpath, node, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  51.  
  52. var element = null;
  53. var i = 0, j;
  54.  
  55. while ((element = result.snapshotItem(i++))) {
  56.  
  57. // iframe or embed
  58. var url = element.src || element.dataset.src;
  59.  
  60. // object
  61. if(!url){
  62. for(j = 0; j < element.childNodes.length; j++){
  63. var pa = element.childNodes[j];
  64. if(pa.nodeName == "PARAM" && pa.getAttribute("name") == "movie"){
  65. url = pa.getAttribute("value");
  66. break;
  67. }
  68. }
  69. }
  70.  
  71. if(!url){
  72. continue;
  73. }
  74.  
  75. for (const pattern of patterns) {
  76. const match = url.match(pattern.test);
  77. if (!match) continue;
  78. const newUrl = pattern.repl(match);
  79. var a = document.createElement("a");
  80. a.textContent = newUrl;
  81. a.href = newUrl;
  82. a.target = "_blank";
  83. a.className = "unembed";
  84. element.parentNode.replaceChild(a, element);
  85. break;
  86. }
  87. }
  88. };
  89.  
  90. new MutationObserver(function(){
  91. if (document.body) {
  92. unEmbed(document.body);
  93. }
  94. }).observe(document, {
  95. childList: true,
  96. subtree: true
  97. });

QingJ © 2025

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