video watch page url

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

  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.9
  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. '#colorbox {' +
  26. 'overflow: visible !important;' +
  27. '}' +
  28. '#cboxWrapper {' +
  29. 'overflow: visible !important;' +
  30. '}' +
  31. '#cboxContent {' +
  32. 'overflow: visible !important;' +
  33. '}' +
  34. ''));
  35. document.getElementsByTagName('head')[0].appendChild(style);
  36. })();
  37.  
  38. // IIFE to avoid circular reference by DOM and closure. (Narrow the scope.)
  39. (function () {
  40. try {
  41. var observer = new MutationObserver(function (mutations) {
  42. insertVideoURL(observer);
  43. });
  44. observer.observe(document.body, { childList: true, subtree: true });
  45. } catch (e) {
  46. if (window.top != window.self) {
  47. return;
  48. }
  49.  
  50. var elementCounts = document.querySelectorAll('*').length;
  51. function observeLength() {
  52. if (elementCounts != document.querySelectorAll('*').length) {
  53. elementCounts = document.querySelectorAll('*').length;
  54. insertVideoURL();
  55. }
  56. return;
  57. }
  58. setInterval(function () { observeLength(); }, 5000);
  59. }
  60. })();
  61.  
  62. window.addEventListener('load', insertVideoURL);
  63.  
  64. function insertVideoURL(observer) {
  65. try {
  66. observer.disconnect();
  67. } catch (e) {
  68. var event = observer;
  69. observer = { disconnect: function () {}, observe: function (target, options) {} };
  70. }
  71.  
  72. var elements = document.querySelectorAll('iframe[src*="//www.youtube.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(/embed\/videoseries/, 'playlist');
  77. } else {
  78. a.href = element.src.split('?')[0].replace(/embed\//, 'watch?v=');
  79. }
  80. a.appendChild(document.createTextNode(a.href));
  81. element.className += a.className = ' youtube-url';
  82.  
  83. var hasLittle, insertedElement;
  84. if (hasLittle && elements[i-1] && element.parentElement === elements[i-1].parentElement) {
  85. element = insertedElement.nextSibling;
  86. } else if (hasLittle = element.parentNode.children.length < element.parentNode.parentNode.children.length + element.parentNode.parentNode.parentNode.children.length) {
  87. element = element.parentElement;
  88. }
  89. insertedElement = element.parentElement.insertBefore(a, element.nextSibling);
  90. console.log('Detected URL: %s', elements[i].src);
  91. }
  92.  
  93. var elements = document.querySelectorAll('iframe[src*="//www.youtube-nocookie.com/embed/"]:not([class~="youtube-url"])');
  94. for (var i = 0, element; element = elements[i]; i++) {
  95. var a = document.createElement('a');
  96. if (element.src.indexOf('videoseries') >= 0) {
  97. a.href = element.src.replace(/-nocookie\.com\/embed\/videoseries/, '.com/playlist');
  98. } else {
  99. a.href = element.src.split('?')[0].replace(/-nocookie\.com\/embed\//, '.com/watch?v=');
  100. }
  101. a.appendChild(document.createTextNode(a.href));
  102. element.className += a.className = ' youtube-url';
  103.  
  104. var hasLittle, insertedElement;
  105. if (hasLittle && elements[i-1] && element.parentElement === elements[i-1].parentElement) {
  106. element = insertedElement.nextSibling;
  107. } else if (hasLittle = element.parentNode.children.length < element.parentNode.parentNode.children.length + element.parentNode.parentNode.parentNode.children.length) {
  108. element = element.parentElement;
  109. }
  110. element.parentElement.insertBefore(a, element.nextSibling);
  111. console.log('Detected URL: %s', elements[i].src);
  112. }
  113.  
  114. var elements = document.querySelectorAll('iframe[data-src*="//www.youtube.com/embed/"]:not([class~="youtube-url"])');
  115. for (var i = 0, element; element = elements[i]; i++) {
  116. var a = document.createElement('a');
  117. if (element.getAttribute('data-src').indexOf('videoseries') >= 0) {
  118. a.href = element.getAttribute('data-src').replace(/embed\/videoseries/, 'playlist');
  119. } else {
  120. a.href = element.getAttribute('data-src').split('?')[0].replace(/embed\//, 'watch?v=');
  121. }
  122. a.appendChild(document.createTextNode(a.href));
  123. element.className += a.className = ' youtube-url';
  124.  
  125. var hasLittle, insertedElement;
  126. if (hasLittle && elements[i-1] && element.parentElement === elements[i-1].parentElement) {
  127. element = insertedElement.nextSibling;
  128. } else if (hasLittle = element.parentNode.children.length < element.parentNode.parentNode.children.length + element.parentNode.parentNode.parentNode.children.length) {
  129. element = element.parentElement;
  130. }
  131. element.parentElement.insertBefore(a, element.nextSibling);
  132. console.log('Detected URL: %s', elements[i].getAttribute('data-src'));
  133. }
  134.  
  135. var elements = document.querySelectorAll('iframe[data-src*="//www.youtube-nocookie.com/embed/"]:not([class~="youtube-url"])');
  136. for (var i = 0, element; element = elements[i]; i++) {
  137. var a = document.createElement('a');
  138. if (element.getAttribute('data-src').indexOf('videoseries') >= 0) {
  139. a.href = element.getAttribute('data-src').replace(/-nocookie\.com\/embed\/videoseries/, '.com/playlist');
  140. } else {
  141. a.href = element.getAttribute('data-src').split('?')[0].replace(/-nocookie\.com\/embed\//, '.com/watch?v=');
  142. }
  143. a.appendChild(document.createTextNode(a.href));
  144. element.className += a.className = ' youtube-url';
  145.  
  146. var hasLittle, insertedElement;
  147. if (hasLittle && elements[i-1] && element.parentElement === elements[i-1].parentElement) {
  148. element = insertedElement.nextSibling;
  149. } else if (hasLittle = element.parentNode.children.length < element.parentNode.parentNode.children.length + element.parentNode.parentNode.parentNode.children.length) {
  150. element = element.parentElement;
  151. }
  152. element.parentElement.insertBefore(a, element.nextSibling);
  153. console.log('Detected URL: %s', elements[i].getAttribute('data-src'));
  154. }
  155.  
  156. // Flash-embedded videos
  157. var elements = document.querySelectorAll('embed[src*="//www.youtube.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(/v\//, '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. var elements = document.querySelectorAll('embed[src*="//www.youtube-nocookie.com/v/"]:not([class~="youtube-url"])');
  168. for (var i = 0, element; element = elements[i]; i++) {
  169. var a = document.createElement('a');
  170. a.href = element.src.split('?')[0].replace(/-nocookie\.com\/v\//, '.com/watch?v=');
  171. a.appendChild(document.createTextNode(a.href));
  172. element.className += a.className = ' youtube-url';
  173. element.parentElement.insertBefore(a, element.nextSibling);
  174. console.log('Detected URL: %s', elements[i].src);
  175. }
  176.  
  177. observer.observe(document.body, { childList: true, subtree: true });
  178. }