Youtube: Show related videos if missing

On pages of age-restricted videos, related videos are missing. This script re-adds the related videos.

当前为 2015-08-15 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Youtube: Show related videos if missing
  3. // @name:de Youtube: Zeige Videovorschläge an, falls sie fehlen
  4. // @namespace tfr
  5. // @description On pages of age-restricted videos, related videos are missing. This script re-adds the related videos.
  6. // @description:de Auf Seiten altersbeschränkter Videos fehlen die Videovorschläge. Dieses Skript fügt sie wieder hinzu.
  7. // @include http://www.youtube.com/watch?*
  8. // @include https://www.youtube.com/watch?*
  9. // @version 1
  10. // @grant GM_xmlhttpRequest
  11. // ==/UserScript==
  12.  
  13. /* This script is licensed under CC0 / Dieses Skript steht unter CC0:
  14. * http://creativecommons.org/publicdomain/zero/1.0/deed.de
  15. * http://creativecommons.org/publicdomain/zero/1.0/deed.en */
  16.  
  17. if (window.document.getElementById('watch7-sidebar-modules') && !window.document.getElementById('watch-related'))
  18. {
  19. var videoid = window.location.search.substr(window.location.search.indexOf('v=') + 2);
  20. if (videoid.indexOf('&') > - 1)
  21. {
  22. videoid = videoid.substr(0, videoid.indexOf('&'));
  23. }
  24. videoid = decodeURIComponent(videoid);
  25. GM_xmlhttpRequest({
  26. method: 'GET',
  27. url: '//www.youtube.com/get_video_info?asv=3&video_id=' + videoid,
  28. onload: function (response)
  29. {
  30. if (response.status == 200)
  31. {
  32. var relatedList = response.responseText.substr(response.responseText.indexOf('rvs=') + 4);
  33. if (relatedList.indexOf('&') > - 1)
  34. {
  35. relatedList = relatedList.substr(0, relatedList.indexOf('&'));
  36. }
  37. relatedList = decodeURIComponent(relatedList);
  38. relatedListS = relatedList.split(',');
  39. var sidebarModules = window.document.getElementById('watch7-sidebar-modules');
  40. var sidebarSection = window.document.createElement('div');
  41. sidebarSection.setAttribute('class', 'watch-sidebar-section');
  42. sidebarModules.appendChild(sidebarSection);
  43. var sidebarBody = window.document.createElement('div');
  44. sidebarBody.setAttribute('class', 'watch-sidebar-body');
  45. sidebarSection.appendChild(sidebarBody);
  46. var relatedVideoList = window.document.createElement('ul');
  47. relatedVideoList.setAttribute('id', 'watch-related');
  48. relatedVideoList.setAttribute('class', 'video-list');
  49. sidebarBody.appendChild(relatedVideoList);
  50. for (var i = 0; i < relatedListS.length; i++)
  51. {
  52. if (relatedListS[i].indexOf('id=') > - 1 && relatedListS[i].indexOf('title=') > - 1 && relatedListS[i].indexOf('author=') > - 1 && relatedListS[i].indexOf('length_seconds=') > - 1)
  53. {
  54. var relatedId = relatedListS[i].substr(relatedListS[i].indexOf('id=') + 3);
  55. if (relatedId.indexOf('&') > - 1)
  56. {
  57. relatedId = relatedId.substr(0, relatedId.indexOf('&'));
  58. }
  59. relatedId = relatedId.replace(/\+/g, ' ');
  60. relatedId = decodeURIComponent(relatedId);
  61. var relatedTitle = relatedListS[i].substr(relatedListS[i].indexOf('title=') + 6);
  62. if (relatedTitle.indexOf('&') > - 1)
  63. {
  64. relatedTitle = relatedTitle.substr(0, relatedTitle.indexOf('&'));
  65. }
  66. relatedTitle = relatedTitle.replace(/\+/g, ' ');
  67. relatedTitle = decodeURIComponent(relatedTitle);
  68. var relatedAuthor = relatedListS[i].substr(relatedListS[i].indexOf('author=') + 7);
  69. if (relatedAuthor.indexOf('&') > - 1)
  70. {
  71. relatedAuthor = relatedAuthor.substr(0, relatedAuthor.indexOf('&'));
  72. }
  73. relatedAuthor = relatedAuthor.replace(/\+/g, ' ');
  74. relatedAuthor = decodeURIComponent(relatedAuthor);
  75. var relatedLength = relatedListS[i].substr(relatedListS[i].indexOf('length_seconds=') + 15);
  76. if (relatedLength.indexOf('&') > - 1)
  77. {
  78. relatedLength = relatedLength.substr(0, relatedLength.indexOf('&'));
  79. }
  80. relatedLength = relatedLength.replace(/\+/g, ' ');
  81. relatedLength = decodeURIComponent(relatedLength);
  82. var relatedLengthRest = parseInt(relatedLength);
  83. var relatedLengthStr = ':' + ((relatedLengthRest % 60) < 10 ? '0' : '') + (relatedLengthRest % 60).toString();
  84. relatedLengthRest = Math.floor(relatedLengthRest / 60);
  85. relatedLengthStr = (relatedLengthRest >= 60 && (relatedLengthRest % 60) < 10 ? '0' : '') + (relatedLengthRest % 60).toString() + relatedLengthStr;
  86. relatedLengthRest = Math.floor(relatedLengthRest / 60);
  87. relatedLengthStr = (relatedLengthRest > 0 ? relatedLengthRest.toString() + ':' + relatedLengthStr : relatedLengthStr);
  88. var listElem = window.document.createElement('li');
  89. listElem.setAttribute('class', 'video-list-item related-list-item show-video-time related-list-item-compact-video');
  90. relatedVideoList.appendChild(listElem);
  91. var listElemCont = window.document.createElement('div');
  92. listElemCont.setAttribute('class', 'content-wrapper');
  93. listElem.appendChild(listElemCont);
  94. var listElemContLink = window.document.createElement('a');
  95. listElemContLink.setAttribute('class', 'yt-uix-sessionlink content-link');
  96. listElemContLink.setAttribute('title', relatedTitle);
  97. listElemContLink.setAttribute('href', 'https://www.youtube.com/watch?v=' + relatedId);
  98. listElemCont.appendChild(listElemContLink);
  99. var listElemContLinkSpan1 = window.document.createElement('span');
  100. listElemContLinkSpan1.setAttribute('class', 'title');
  101. listElemContLinkSpan1.setAttribute('aria-describedby', 'description-id-' + i);
  102. listElemContLinkSpan1.appendChild(window.document.createTextNode((navigator.language.toLowerCase().substr(0, 2) == 'de' ? 'von ' : 'by ') + relatedTitle));
  103. listElemContLink.appendChild(listElemContLinkSpan1);
  104. var listElemContLinkSpan2 = window.document.createElement('span');
  105. listElemContLinkSpan2.setAttribute('id', 'description-id-' + i);
  106. listElemContLinkSpan2.setAttribute('class', 'accessible-description');
  107. listElemContLinkSpan2.appendChild(window.document.createTextNode((navigator.language.toLowerCase().substr(0, 2) == 'de' ? '- Dauer: ' : '- Duration: ') + relatedLengthStr));
  108. listElemContLink.appendChild(listElemContLinkSpan2);
  109. var listElemContLinkSpan3 = window.document.createElement('span');
  110. listElemContLinkSpan3.setAttribute('class', 'stat attribution');
  111. listElemContLinkSpan3.appendChild(window.document.createTextNode((navigator.language.toLowerCase().substr(0, 2) == 'de' ? 'von ' : 'by ') + relatedAuthor));
  112. listElemContLink.appendChild(listElemContLinkSpan3);
  113. var listElemThum = window.document.createElement('div');
  114. listElemThum.setAttribute('class', 'thumb-wrapper');
  115. listElem.appendChild(listElemThum);
  116. var listElemThumLink = window.document.createElement('a');
  117. listElemThumLink.setAttribute('class', 'yt-uix-sessionlink thumb-link');
  118. listElemThumLink.setAttribute('aria-hidden', 'true');
  119. listElemThumLink.setAttribute('tabindex', '-1');
  120. listElemThumLink.setAttribute('href', 'https://www.youtube.com/watch?v=' + relatedId);
  121. listElemThum.appendChild(listElemThumLink);
  122. var listElemThumLinkSpan = window.document.createElement('span');
  123. listElemThumLinkSpan.setAttribute('class', 'yt-uix-simple-thumb-wrap yt-uix-simple-thumb-related');
  124. listElemThumLinkSpan.setAttribute('data-vid', relatedId);
  125. listElemThumLinkSpan.setAttribute('tabindex', '0');
  126. listElemThumLink.appendChild(listElemThumLinkSpan);
  127. var listElemThumImg = window.document.createElement('img');
  128. listElemThumImg.setAttribute('width', '120');
  129. listElemThumImg.setAttribute('height', '90');
  130. listElemThumImg.setAttribute('aria-hidden', 'true');
  131. listElemThumImg.setAttribute('alt', '');
  132. listElemThumImg.setAttribute('src', '//i.ytimg.com/vi/' + relatedId + '/default.jpg');
  133. listElemThumLinkSpan.appendChild(listElemThumImg);
  134. }
  135. }
  136. }
  137. }
  138. });
  139. }