video watch page URL

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

目前为 2019-03-28 提交的版本,查看 最新版本

  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.7
  11. // @grant none
  12. // ==/UserScript==
  13.  
  14.  
  15. (function () {
  16. var style = document.createElement('style');
  17. style.type = 'text/css';
  18. style.appendChild(document.createTextNode('' +
  19. 'a.youtube-url {' +
  20. 'position: relative;' +
  21. 'display: table;' +
  22. 'font-size: initial;' +
  23. 'z-index: 2147483647;' +
  24. '}'));
  25. document.getElementsByTagName('head')[0].appendChild(style);
  26. })();
  27.  
  28. // IIFE to avoid circular reference by DOM and closures. (Narrow the scope.)
  29. (function () {
  30. try {
  31. var observer = new MutationObserver(function (mutations) {
  32. insertVideoURL(observer);
  33. });
  34. observer.observe(document.body, { childList: true, subtree: true });
  35. } catch (e) {
  36. if (window.top != window.self) {
  37. return;
  38. }
  39.  
  40. var elementCounts = document.querySelectorAll('*').length;
  41. function observeLength() {
  42. if (elementCounts != document.querySelectorAll('*').length) {
  43. elementCounts = document.querySelectorAll('*').length;
  44. insertVideoURL();
  45. }
  46. return;
  47. }
  48. setInterval(function () { observeLength(); }, 5000);
  49. }
  50. })();
  51.  
  52. window.addEventListener('load', insertVideoURL);
  53.  
  54. function insertVideoURL(observer) {
  55. try {
  56. observer.disconnect();
  57. } catch (e) {
  58. var event = observer;
  59. observer = { disconnect: function () {}, observe: function (target, options) {} };
  60. }
  61.  
  62. var elements = document.querySelectorAll('iframe[src*="//www.youtube.com/embed/"]:not([class~="youtube-url"])');
  63. for (var i = 0, element; element = elements[i]; i++) {
  64. var a = document.createElement('a');
  65. if (element.src.indexOf('videoseries') >= 0) {
  66. a.href = element.src.replace(/embed\/videoseries/, 'playlist');
  67. } else {
  68. a.href = element.src.split('?')[0].replace(/embed\//, 'watch?v=');
  69. }
  70. a.appendChild(document.createTextNode(a.href));
  71. element.className += a.className = ' youtube-url';
  72.  
  73. var conflict;
  74. if (conflict && conflict.previousSibling === element.parentElement) {
  75. element = conflict.nextSibling;
  76. } else if (element.parentNode.children.length < element.parentNode.parentNode.children.length + element.parentNode.parentNode.parentNode.children.length) {
  77. element = element.parentElement;
  78. }
  79. conflict = element.parentElement.insertBefore(a, element.nextSibling);
  80. console.log('Detected URL: %s', elements[i].src);
  81. }
  82.  
  83. var elements = document.querySelectorAll('iframe[src*="//www.youtube-nocookie.com/embed/"]:not([class~="youtube-url"])');
  84. for (var i = 0, element; element = elements[i]; i++) {
  85. var a = document.createElement('a');
  86. if (element.src.indexOf('videoseries') >= 0) {
  87. a.href = element.src.replace(/-nocookie\.com\/embed\/videoseries/, '.com/playlist');
  88. } else {
  89. a.href = element.src.split('?')[0].replace(/-nocookie\.com\/embed\//, '.com/watch?v=');
  90. }
  91. a.appendChild(document.createTextNode(a.href));
  92. element.className += a.className = ' youtube-url';
  93.  
  94. var conflict;
  95. if (conflict && conflict.previousSibling === element.parentElement) {
  96. element = conflict.nextSibling;
  97. } else if (element.parentNode.children.length < element.parentNode.parentNode.children.length + element.parentNode.parentNode.parentNode.children.length) {
  98. element = element.parentElement;
  99. }
  100. element.parentElement.insertBefore(a, element.nextSibling);
  101. console.log('Detected URL: %s', elements[i].src);
  102. }
  103.  
  104. var elements = document.querySelectorAll('iframe[data-src*="//www.youtube.com/embed/"]:not([class~="youtube-url"])');
  105. for (var i = 0, element; element = elements[i]; i++) {
  106. var a = document.createElement('a');
  107. if (element.getAttribute('data-src').indexOf('videoseries') >= 0) {
  108. a.href = element.getAttribute('data-src').replace(/embed\/videoseries/, 'playlist');
  109. } else {
  110. a.href = element.getAttribute('data-src').split('?')[0].replace(/embed\//, 'watch?v=');
  111. }
  112. a.appendChild(document.createTextNode(a.href));
  113. element.className += a.className = ' youtube-url';
  114.  
  115. var conflict;
  116. if (conflict && conflict.previousSibling === element.parentElement) {
  117. element = conflict.nextSibling;
  118. } else if (element.parentNode.children.length < element.parentNode.parentNode.children.length + element.parentNode.parentNode.parentNode.children.length) {
  119. element = element.parentElement;
  120. }
  121. element.parentElement.insertBefore(a, element.nextSibling);
  122. console.log('Detected URL: %s', elements[i].getAttribute('data-src'));
  123. }
  124.  
  125. var elements = document.querySelectorAll('iframe[data-src*="//www.youtube-nocookie.com/embed/"]:not([class~="youtube-url"])');
  126. for (var i = 0, element; element = elements[i]; i++) {
  127. var a = document.createElement('a');
  128. if (element.getAttribute('data-src').indexOf('videoseries') >= 0) {
  129. a.href = element.getAttribute('data-src').replace(/-nocookie\.com\/embed\/videoseries/, '.com/playlist');
  130. } else {
  131. a.href = element.getAttribute('data-src').split('?')[0].replace(/-nocookie\.com\/embed\//, '.com/watch?v=');
  132. }
  133. a.appendChild(document.createTextNode(a.href));
  134. element.className += a.className = ' youtube-url';
  135.  
  136. var conflict;
  137. if (conflict && conflict.previousSibling === element.parentElement) {
  138. element = conflict.nextSibling;
  139. } else if (element.parentNode.children.length < element.parentNode.parentNode.children.length + element.parentNode.parentNode.parentNode.children.length) {
  140. element = element.parentElement;
  141. }
  142. element.parentElement.insertBefore(a, element.nextSibling);
  143. console.log('Detected URL: %s', elements[i].getAttribute('data-src'));
  144. }
  145.  
  146. // Flash-embedded videos
  147. var elements = document.querySelectorAll('embed[src*="//www.youtube.com/v/"]:not([class~="youtube-url"])');
  148. for (var i = 0, element; element = elements[i]; i++) {
  149. var a = document.createElement('a');
  150. a.href = element.src.split('?')[0].replace(/v\//, 'watch?v=');
  151. a.appendChild(document.createTextNode(a.href));
  152. element.className += a.className = ' youtube-url';
  153. element.parentElement.insertBefore(a, element.nextSibling);
  154. console.log('Detected URL: %s', elements[i].src);
  155. }
  156.  
  157. var elements = document.querySelectorAll('embed[src*="//www.youtube-nocookie.com/v/"]:not([class~="youtube-url"])');
  158. for (var i = 0, element; element = elements[i]; i++) {
  159. var a = document.createElement('a');
  160. a.href = element.src.split('?')[0].replace(/-nocookie\.com\/v\//, '.com/watch?v=');
  161. a.appendChild(document.createTextNode(a.href));
  162. element.className += a.className = ' youtube-url';
  163. element.parentElement.insertBefore(a, element.nextSibling);
  164. console.log('Detected URL: %s', elements[i].src);
  165. }
  166.  
  167. observer.observe(document.body, { childList: true, subtree: true });
  168. }