Clone Turning Page Button in nicovideo

Also shows the pagination on the top of Nico Live search result, Lives by Category page, and Nico Video user page.

当前为 2017-11-15 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Clone Turning Page Button in nicovideo
  3. // @name:ja niconico ページャーを上部にも表示
  4. // @description Also shows the pagination on the top of Nico Live search result, Lives by Category page, and Nico Video user page.
  5. // @description:ja ニコニコ生放送の検索結果、「放送中の番組」ページ、およびニコニコ動画のユーザーページにおいて、ページャー (ページ送りボタン) を上部にも表示します。
  6. // @namespace http://pc12.2ch.net/test/read.cgi/streaming/1275642556/
  7. // @version 4.0.2
  8. // @include http://www.nicovideo.jp/user/*/video
  9. // @include http://www.nicovideo.jp/user/*/video/*
  10. // @include http://www.nicovideo.jp/user/*/video?*
  11. // @include http://www.nicovideo.jp/user/*/video#*
  12. // @include http://www.nicovideo.jp/user/*/stamp
  13. // @include http://www.nicovideo.jp/user/*/stamp/*
  14. // @include http://www.nicovideo.jp/user/*/stamp?*
  15. // @include http://www.nicovideo.jp/user/*/stamp#*
  16. // @include http://www.nicovideo.jp/my/video
  17. // @include http://www.nicovideo.jp/my/video/*
  18. // @include http://www.nicovideo.jp/my/video?*
  19. // @include http://www.nicovideo.jp/my/video#*
  20. // @include http://www.nicovideo.jp/my/stamp
  21. // @include http://www.nicovideo.jp/my/stamp/*
  22. // @include http://www.nicovideo.jp/my/stamp?*
  23. // @include http://www.nicovideo.jp/my/stamp#*
  24. // @include http://live.nicovideo.jp/search/*
  25. // @include http://live.nicovideo.jp/search?*
  26. // @include http://live.nicovideo.jp/recent
  27. // @include http://live.nicovideo.jp/recent/*
  28. // @include http://live.nicovideo.jp/recent?*
  29. // @include http://live.nicovideo.jp/recent#*
  30. // @include http://watch.live.nicovideo.jp/search/*
  31. // @include http://watch.live.nicovideo.jp/search?*
  32. // @include https://www.nicovideo.jp/user/*/video
  33. // @include https://www.nicovideo.jp/user/*/video/*
  34. // @include https://www.nicovideo.jp/user/*/video?*
  35. // @include https://www.nicovideo.jp/user/*/video#*
  36. // @include https://www.nicovideo.jp/user/*/stamp
  37. // @include https://www.nicovideo.jp/user/*/stamp/*
  38. // @include https://www.nicovideo.jp/user/*/stamp?*
  39. // @include https://www.nicovideo.jp/user/*/stamp#*
  40. // @include https://www.nicovideo.jp/my/video
  41. // @include https://www.nicovideo.jp/my/video/*
  42. // @include https://www.nicovideo.jp/my/video?*
  43. // @include https://www.nicovideo.jp/my/video#*
  44. // @include https://www.nicovideo.jp/my/stamp
  45. // @include https://www.nicovideo.jp/my/stamp/*
  46. // @include https://www.nicovideo.jp/my/stamp?*
  47. // @include https://www.nicovideo.jp/my/stamp#*
  48. // @include https://live.nicovideo.jp/search/*
  49. // @include https://live.nicovideo.jp/search?*
  50. // @include https://live.nicovideo.jp/recent
  51. // @include https://live.nicovideo.jp/recent/*
  52. // @include https://live.nicovideo.jp/recent?*
  53. // @include https://live.nicovideo.jp/recent#*
  54. // @include https://watch.live.nicovideo.jp/search/*
  55. // @include https://watch.live.nicovideo.jp/search?*
  56. // @require https://greasyfork.org/scripts/17895/code/polyfill.js?version=114170
  57. // @require https://greasyfork.org/scripts/17896/code/start-script.js?version=112958
  58. // @license Mozilla Public License Version 2.0 (MPL 2.0); https://www.mozilla.org/MPL/2.0/
  59. // @compatible Firefox
  60. // @compatible Opera
  61. // @compatible Chrome
  62. // @grant dummy
  63. // @run-at document-start
  64. // @icon data:image/vnd.microsoft.icon;base64,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
  65. // @author 100の人
  66. // @homepage https://greasyfork.org/scripts/275
  67. // ==/UserScript==
  68.  
  69. (function () {
  70. 'use strict';
  71.  
  72. if (location.pathname.startsWith('/search')) {
  73. // ニコニコ生放送 検索結果
  74. startScript(
  75. function () {
  76. let pager = document.getElementsByClassName('result-pager-area')[0];
  77. console.log(pager);
  78. if (pager) {
  79. // 41件以上ヒットしていれば
  80. // ページャーの複製
  81. document.getElementsByClassName('result-list')[0].before(pager.cloneNode(true));
  82. }
  83. },
  84. parent => parent.localName === 'main',
  85. target => target.classList.contains('search-result-context-area'),
  86. () => document.getElementsByClassName('search-result-context-area')[0]
  87. );
  88. } else if (location.pathname.startsWith('/recent')) {
  89. // ニコニコ生放送 放送中の番組
  90. startScript(
  91. function () {
  92. clonePager();
  93. new MutationObserver(function (mutations) {
  94. if (mutations[0].addedNodes.length > 1) {
  95. // ページャーの複製でなければ
  96. clonePager();
  97. }
  98. }).observe(document.getElementById('onair_stream_list'), { childList: true });
  99. function clonePager() {
  100. document.getElementsByClassName('user-programs')[0].before(document.getElementById('pager-block').cloneNode(true));
  101. }
  102. },
  103. parent => parent.id === 'onair_stream_list',
  104. target => target.id === 'pager-block',
  105. () => document.getElementById('pager-block')
  106. );
  107. } else if (/^\/(?:user\/[0-9]+|my)\/video(?:\/|\?|#|$)/.test(location.pathname)) {
  108. // ニコニコ動画 ユーザーページ 投稿動画
  109. startScript(
  110. function () {
  111. let pager = document.getElementsByClassName('pager')[0];
  112. if (pager) {
  113. document.head.insertAdjacentHTML('beforeend', `<style>
  114. .outer .pager {
  115. position: absolute;
  116. bottom: 0;
  117. right: 0;
  118. }
  119. </style>`);
  120. document.getElementsByClassName('outer')[0].append(pager.cloneNode(true));
  121. }
  122. },
  123. parent => parent.classList.contains('wrapper'),
  124. target => target.localName === 'script',
  125. () => document.querySelector('.wrapper > script')
  126. );
  127. } else if (/^\/(?:user\/[0-9]+|my)\/stamp(?:\/|\?|#|$)/.test(location.pathname)) {
  128. // ニコニコ動画 ユーザーページ スタンプ帳
  129. document.addEventListener('load', function (event) {
  130. if (event.target.localName === 'script' && event.target.src.includes('jquery')) {
  131. let script = document.createElement('script');
  132. script.text = '(' + function () {
  133. jQuery.prototype.html = new Proxy(jQuery.prototype.html, {
  134. apply(target, thisArg, argumentsList) {
  135. var returnValue = target.apply(thisArg, argumentsList);
  136. if (thisArg.selector === '#stamp_list') {
  137. var pager = document.getElementsByClassName('pager')[0];
  138. if (pager) {
  139. thisArg[0].insertBefore(pager.parentElement.cloneNode(true), thisArg[0].firstChild);
  140. }
  141. }
  142. return returnValue;
  143. }
  144. });
  145. }.toString() + ')()';
  146. document.head.appendChild(script).remove();
  147. }
  148. }, true);
  149. }
  150.  
  151. })();