EHentai Auto Loader

Help you read comics smoothly with auto loading more pages

  1. // ==UserScript==
  2. // @name EHentai Auto Loader
  3. // @namespace https://e-hentai.org
  4. // @version 1.2
  5. // @description Help you read comics smoothly with auto loading more pages
  6. // @author Neal
  7. // @match https://e-hentai.org/s/*
  8. // @match https://exhentai.org/s/*
  9. // @grant none
  10. // ==/UserScript==
  11.  
  12. function AddGlobalStyle(css) {
  13. var head, style;
  14. head = document.getElementsByTagName('head')[0];
  15. if (!head) return;
  16. style = document.createElement('style');
  17. style.type = 'text/css';
  18. style.innerHTML = css;
  19. head.appendChild(style);
  20. }
  21.  
  22. var index = document.location.href;
  23. var all = document.getElementsByTagName('a');
  24. var next = all[2].href;
  25. var last = all[3].href;
  26. var src = all[4].children[0].src;
  27. var srcarray = [src];
  28. var fail = index.indexOf('exhentai.org') > -1 ? index + '?nl=' + String(all[11].onclick).match('[0-9].*[0-9]')[0] : index + '?nl=' + String(all[12].onclick).match('[0-9].*[0-9]')[0];
  29. var failarray = [fail];
  30.  
  31. var current = 1;
  32. var img = new Image();
  33. var span = document.createElement('span');
  34. var link = document.createElement('a');
  35.  
  36. function LoadManga() {
  37. AddGlobalStyle('body {background: black}');
  38. AddGlobalStyle('img {max-width: 1280px; margin: 0 auto; display: block}');
  39. AddGlobalStyle('span {color: white; text-align: center; font-size: 15px; font-weight: bold; margin: 10px auto; display: block}');
  40. AddGlobalStyle('a {color: white; text-decoration: none; text-align: center; font-size:15px; font-weight: bold; margin: 10px auto; display: block} a:hover {color: white; text-decoration: underline}');
  41.  
  42. img.src = src;
  43. img.onload = function () { window.scrollTo(0, 0); };
  44. document.body.innerHTML = '';
  45. document.body.appendChild(img);
  46.  
  47. span.innerHTML = 'Press Ctrl to Toggle between Auto Mode and Native Mode. Load Status: < 1 / 1 >.';
  48. document.body.appendChild(span);
  49.  
  50. link.href = fail;
  51. link.innerHTML = 'Press Enter or Click Here to Reload Current Image.';
  52. document.body.appendChild(link);
  53. }
  54.  
  55. function LoadStatus() {
  56. span.innerHTML = 'Press Ctrl to Toggle between Auto Mode and Native Mode. ' + 'Load Status: < ' + current + ' / ' + srcarray.length + ' >.';
  57. }
  58.  
  59. function LoadImage(url, callback) {
  60. var img = new Image();
  61. img.src = url;
  62. if (img.complete) {
  63. callback.call(img);
  64. return;
  65. }
  66. img.onload = function() {
  67. callback.call(img);
  68. };
  69. }
  70.  
  71. var end = 0;
  72. var count = 10;
  73. function PreloadImage() {
  74. var htm = document.implementation.createHTMLDocument('temp');
  75. var xhr = new XMLHttpRequest();
  76. xhr.onreadystatechange = function() {
  77. if (xhr.readyState == 4 && xhr.status == 200){
  78. htm.documentElement.innerHTML = xhr.responseText;
  79. all = htm.getElementsByTagName('a');
  80. src = all[4].children[0].src;
  81. LoadImage(src, LoadStatus);
  82. srcarray.push(src);
  83. var failstart = xhr.responseText.indexOf('nl') + 4;
  84. var failend = xhr.responseText.substr(failstart, 30).indexOf('\'');
  85. fail = next + '?nl=' + xhr.responseText.substr(failstart, failend);
  86. failarray.push(fail);
  87. next = all[2].href;
  88. if (next == last) {
  89. if (!end) {
  90. end = 1;
  91. PreloadImage();
  92. }
  93. }
  94. else {
  95. if (count > 0) PreloadImage(); else count = 10;
  96. }
  97. }
  98. };
  99. xhr.open('GET', next, true);
  100. xhr.send();
  101. count--;
  102. }
  103.  
  104. var reload = 0;
  105. function ReloadImage() {
  106. if (!reload) {
  107. var htm = document.implementation.createHTMLDocument('temp');
  108. var xhr = new XMLHttpRequest();
  109. xhr.onreadystatechange = function() {
  110. if (xhr.readyState == 4 && xhr.status == 200){
  111. htm.documentElement.innerHTML = xhr.responseText;
  112. srcarray[current - 1] = htm.getElementsByTagName('a')[4].children[0].src;
  113. img.src = srcarray[current - 1];
  114. var failstart = xhr.responseText.indexOf('nl') + 4;
  115. var failend = xhr.responseText.substr(failstart, 30).indexOf('\'');
  116. failarray[current - 1] = failarray[current - 1] + '&nl=' + xhr.responseText.substr(failstart, failend);
  117. link.href = failarray[current - 1];
  118. reload = 0;
  119. }
  120. };
  121. xhr.open('GET', failarray[current - 1], true);
  122. xhr.send();
  123. reload = 1;
  124. }
  125. }
  126.  
  127. function PrevImage() {
  128. if (current > 1) {
  129. img.src = srcarray[current-- - 2];
  130. link.href = failarray[current - 1];
  131. LoadStatus();
  132. }
  133. }
  134.  
  135. function NextImage() {
  136. if (current < srcarray.length) {
  137. img.src = srcarray[current++];
  138. link.href = failarray[current - 1];
  139. LoadStatus();
  140. }
  141. if (count == 10 && current == srcarray.length) PreloadImage();
  142. }
  143.  
  144. var preload = 0;
  145. document.onkeydown = function (event) {
  146. switch (event.which) {
  147. case 37:
  148. event.preventDefault();
  149. if (preload !== 0) PrevImage();
  150. break;
  151. case 38:
  152. event.preventDefault();
  153. window.scrollBy(0, -100);
  154. break;
  155. case 39:
  156. event.preventDefault();
  157. if (preload !== 0) NextImage();
  158. break;
  159. case 40:
  160. event.preventDefault();
  161. window.scrollBy(0, +100);
  162. break;
  163. case 13:
  164. event.preventDefault();
  165. if (preload !== 0) ReloadImage();
  166. break;
  167. case 17:
  168. event.preventDefault();
  169. if (preload === 0) {
  170. preload = 1;
  171. LoadManga();
  172. LoadStatus();
  173. PreloadImage();
  174. img.onclick = function (event) {
  175. event.preventDefault();
  176. if (event.clientX <= document.body.clientWidth / 2)
  177. PrevImage();
  178. else
  179. NextImage();
  180. };
  181. link.onclick = function (event) {
  182. event.preventDefault();
  183. ReloadImage();
  184. };
  185. }
  186. else {
  187. preload = 0;
  188. document.location.reload();
  189. }
  190. break;
  191. }
  192. };