video watch page URL

Display "https://www.youtube.com/watch?v=***********" of embedded YouTube videos.

当前为 2019-03-09 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name video watch page URL
  3. // @name:ja 埋め込み動画にURL表示
  4. // @namespace https://greasyfork.org/users/19523
  5. // @description Display "https://www.youtube.com/watch?v=***********" of embedded YouTube videos.
  6. // @description:ja ページに埋め込まれたYouTubeの動画の下に動画視聴ページのURLを付け加えます
  7. // @include *
  8. // @exclude http://www.youtube.com/*
  9. // @exclude https://www.youtube.com/*
  10. // @version 0.3.4
  11. // @grant none
  12. // ==/UserScript==
  13.  
  14.  
  15. (function () {
  16.  
  17. var style = document.createElement('style');
  18. style.type = 'text/css';
  19. style.appendChild(document.createTextNode('' +
  20. 'a.youtube-url {' +
  21. 'position: relative;' +
  22. 'display: table;' +
  23. 'font-size: initial;' +
  24. '}'));
  25. document.getElementsByTagName('head')[0].appendChild(style);
  26.  
  27. try {
  28. var target = document.body;
  29. var config = { childList: true, subtree: true };
  30. var observer = new MutationObserver(function (mutations) {
  31. insertVideoURL();
  32. });
  33. } catch(e) {
  34. if (window.top != window.self) {
  35. return;
  36. }
  37. var observer = { disconnect: function () {}, observe: function () {} };
  38. var elementCounts = document.querySelectorAll('*').length;
  39. function observeLength() {
  40. if (elementCounts != document.querySelectorAll('*').length) {
  41. elementCounts = document.querySelectorAll('*').length;
  42. insertVideoURL();
  43. }
  44. return;
  45. }
  46. setInterval(function () { observeLength(); }, 5000);
  47. }
  48.  
  49. window.addEventListener('load', insertVideoURL);
  50.  
  51. function insertVideoURL() {
  52. observer.disconnect();
  53.  
  54. var elements = document.querySelectorAll('iframe[src*="//www.youtube.com/embed/"]:not([class~="youtube-url"])');
  55. for (var i = 0, element; element = elements[i]; i++) {
  56. var a = document.createElement('a');
  57. if (element.src.indexOf('videoseries') >= 0) {
  58. a.href = element.src.replace(/embed\/videoseries/, 'playlist');
  59. } else {
  60. a.href = element.src.split('?')[0].replace(/embed\//, 'watch?v=');
  61. }
  62. a.appendChild(document.createTextNode(a.href));
  63. element.className += a.className = ' youtube-url';
  64.  
  65. if (element.parentElement.children.length <= 2 && element.parentElement != document.body && element.parentElement.parentElement) {
  66. element = element.parentElement;
  67. }
  68. element.parentElement.insertBefore(a, element.nextSibling);
  69. console.log('Detected URL: %s', elements[i].src);
  70. }
  71.  
  72. var elements = document.querySelectorAll('iframe[src*="//www.youtube-nocookie.com/embed/"]:not([class~="youtube-url"])');
  73. for (var i = 0, element; element = elements[i]; i++) {
  74. var a = document.createElement('a');
  75. if (element.src.indexOf('videoseries') >= 0) {
  76. a.href = element.src.replace(/-nocookie\.com\/embed\/videoseries/, '.com/playlist');
  77. } else {
  78. a.href = element.src.split('?')[0].replace(/-nocookie\.com\/embed\//, '.com/watch?v=');
  79. }
  80. a.appendChild(document.createTextNode(a.href));
  81. element.className += a.className = ' youtube-url';
  82.  
  83. if (element.parentElement.children.length <= 2 && element.parentElement != document.body && element.parentElement.parentElement) {
  84. element = element.parentElement;
  85. }
  86. element.parentElement.insertBefore(a, element.nextSibling);
  87. console.log('Detected URL: %s', elements[i].src);
  88. }
  89.  
  90. var elements = document.querySelectorAll('iframe[data-src*="//www.youtube.com/embed/"]:not([class~="youtube-url"])');
  91. for (var i = 0, element; element = elements[i]; i++) {
  92. var a = document.createElement('a');
  93. if (element.getAttribute('data-src').indexOf('videoseries') >= 0) {
  94. a.href = element.getAttribute('data-src').replace(/embed\/videoseries/, 'playlist');
  95. } else {
  96. a.href = element.getAttribute('data-src').split('?')[0].replace(/embed\//, 'watch?v=');
  97. }
  98. a.appendChild(document.createTextNode(a.href));
  99. element.className += a.className = ' youtube-url';
  100.  
  101. if (element.parentElement.children.length <= 2 && element.parentElement != document.body && element.parentElement.parentElement) {
  102. element = element.parentElement;
  103. }
  104. element.parentElement.insertBefore(a, element.nextSibling);
  105. console.log('Detected URL: %s', elements[i].getAttribute('data-src'));
  106. }
  107.  
  108. var elements = document.querySelectorAll('iframe[data-src*="//www.youtube-nocookie.com/embed/"]:not([class~="youtube-url"])');
  109. for (var i = 0, element; element = elements[i]; i++) {
  110. var a = document.createElement('a');
  111. if (element.getAttribute('data-src').indexOf('videoseries') >= 0) {
  112. a.href = element.getAttribute('data-src').replace(/-nocookie\.com\/embed\/videoseries/, '.com/playlist');
  113. } else {
  114. a.href = element.getAttribute('data-src').split('?')[0].replace(/-nocookie\.com\/embed\//, '.com/watch?v=');
  115. }
  116. a.appendChild(document.createTextNode(a.href));
  117. element.className += a.className = ' youtube-url';
  118.  
  119. if (element.parentElement.children.length <= 2 && element.parentElement != document.body && element.parentElement.parentElement) {
  120. element = element.parentElement;
  121. }
  122. element.parentElement.insertBefore(a, element.nextSibling);
  123. console.log('Detected URL: %s', elements[i].getAttribute('data-src'));
  124. }
  125.  
  126. // Flash-embedded videos
  127. var elements = document.querySelectorAll('embed[src*="//www.youtube.com/v/"]:not([class~="youtube-url"])');
  128. for (var i = 0, element; element = elements[i]; i++) {
  129. var a = document.createElement('a');
  130. a.href = element.src.split('?')[0].replace(/v\//, 'watch?v=');
  131. a.appendChild(document.createTextNode(a.href));
  132. element.className += a.className = ' youtube-url';
  133. element.parentElement.insertBefore(a, element.nextSibling);
  134. console.log('Detected URL: %s', elements[i].src);
  135. }
  136.  
  137. var elements = document.querySelectorAll('embed[src*="//www.youtube-nocookie.com/v/"]:not([class~="youtube-url"])');
  138. for (var i = 0, element; element = elements[i]; i++) {
  139. var a = document.createElement('a');
  140. a.href = element.src.split('?')[0].replace(/-nocookie\.com\/v\//, '.com/watch?v=');
  141. a.appendChild(document.createTextNode(a.href));
  142. element.className += a.className = ' youtube-url';
  143. element.parentElement.insertBefore(a, element.nextSibling);
  144. console.log('Detected URL: %s', elements[i].src);
  145. }
  146.  
  147. observer.observe(target, config);
  148. }
  149.  
  150. })();