nhentai Auto Scroller

Auto scroll doujinshi and manga on nhentai so you can jerk off all hands-free.

  1. // ==UserScript==
  2. // @name nhentai Auto Scroller
  3. // @namespace http://tampermonkey.net/
  4. // @version 2.0.0
  5. // @description Auto scroll doujinshi and manga on nhentai so you can jerk off all hands-free.
  6. // @author LoliEnjoyer
  7. // @include /^https:\/\/nhentai\.net\/g\/\d+\/\d+\/$/
  8. // ==/UserScript==
  9.  
  10. const ScrollHandler = {
  11. scrollIntervalID: null,
  12. turnPageIntervalID: null,
  13.  
  14. startReader() {
  15. const scrollDelay = 5; // Increase this value to make scrolling slower. Default nhentai value: 5
  16. const scrollSpeed = 1;
  17. const scrollLimit = document.body.scrollHeight - window.innerHeight;
  18.  
  19. if (this.scrollIntervalID === null) {
  20. this.scrollIntervalID = setInterval(() => {
  21. let scrollPos = window.scrollY;
  22. if (scrollPos < scrollLimit) {
  23. window.scrollTo(0, scrollPos + scrollSpeed);
  24. } else {
  25. clearInterval(this.scrollIntervalID);
  26. this.scrollIntervalID = null;
  27. this.turnPage(4500);
  28. }
  29. }, scrollDelay);
  30. }
  31. },
  32.  
  33. stopReader() {
  34. clearInterval(this.scrollIntervalID);
  35. clearInterval(this.turnPageIntervalID);
  36. this.scrollIntervalID = null;
  37. this.turnPageIntervalID = null;
  38. },
  39.  
  40. turnPage(timeout) {
  41. if (this.turnPageIntervalID === null) {
  42. this.turnPageIntervalID = setInterval(() => { unsafeWindow.reader.next_page() }, timeout);
  43. }
  44. }
  45. };
  46.  
  47. let isAutoScroll = false;
  48. let scrollTimeoutID = null;
  49.  
  50. const div = document.createElement('div');
  51. const button = document.createElement('button');
  52. const icon = document.createElement('i');
  53. button.setAttribute('class', 'btn btn-primary');
  54. icon.setAttribute('class', 'fa fa-lg fa-play');
  55. div.setAttribute('style', 'z-index: 100; right: 0; margin: 10px;')
  56. button.setAttribute('style', 'width: 46px; height: 46px;')
  57.  
  58. function buttonClickAction() {
  59. isAutoScroll = !isAutoScroll;
  60. icon.setAttribute('class', `fa fa-lg ${isAutoScroll ? 'fa-pause' : 'fa-play'}`);
  61. if (isAutoScroll) {
  62. ScrollHandler.startReader();
  63. } else {
  64. ScrollHandler.stopReader();
  65. clearTimeout(scrollTimeoutID);
  66. scrollTimeoutID = null;
  67. }
  68. }
  69.  
  70. function buttonPosition() {
  71. window.scrollY >= 90
  72. ? Object.assign(div.style, { position: 'fixed', top: 0 })
  73. : Object.assign(div.style, { position: 'absolute', top: "90px" });
  74. }
  75.  
  76. buttonPosition();
  77. button.appendChild(icon);
  78. div.appendChild(button);
  79. document.body.appendChild(div);
  80.  
  81. button.addEventListener('click', buttonClickAction);
  82. window.addEventListener('scroll', buttonPosition);
  83.  
  84. new MutationObserver(() => {
  85. if (isAutoScroll) {
  86. ScrollHandler.stopReader();
  87. clearTimeout(scrollTimeoutID);
  88. scrollTimeoutID = setTimeout(() => {
  89. ScrollHandler.startReader();
  90. scrollTimeoutID = null;
  91. }, 3000);
  92. }
  93. }).observe(document.body, { childList: true, subtree: true });