Sleazy Fork is available in English.

E-Hentai Load More Thumbnails

On an e-hentai gallery page, click "Load more" next to the page numbers and enter how many pages' worth of additional thumbnails you want to load onto the current page.

  1. // ==UserScript==
  2. // @name E-Hentai Load More Thumbnails
  3. // @namespace e-hentai.org
  4. // @description On an e-hentai gallery page, click "Load more" next to the page numbers and enter how many pages' worth of additional thumbnails you want to load onto the current page.
  5. // @match *://*.exhentai.org/g/*
  6. // @match *://*.e-hentai.org/g/*
  7. // @version 0.2.1
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. console.log('Hi load more thumbs');
  12.  
  13. const MAX_PAGES = 20;
  14. const START_PAGES = 0;
  15. const DEFAULT_PAGES = 2;
  16. var last_loaded = 0;
  17. var base_url = '';
  18.  
  19. var container_div = document.querySelector('#gdt');
  20. var c_div = document.querySelector('#gdt .c');
  21. var top_row = document.querySelector('.ptt tr');
  22. var bottom_row = document.querySelector('.ptb tr');
  23. var new_td = document.createElement('td');
  24. var a = document.createElement('a');
  25. a.onclick = "return false";
  26. a.innerHTML = 'Load more';
  27. new_td.appendChild(a);
  28. new_td.style.width = '72px';
  29. new_td2 = new_td.cloneNode(true);
  30. new_td.onclick = new_td2.onclick = pop_up;
  31.  
  32. top_row.appendChild(new_td);
  33. bottom_row.appendChild(new_td2);
  34.  
  35. var m = document.location.href.match(/^([^?]+)(?:\??.*p=(\d+))?/);
  36. if (m) {
  37. base_url = m[1];
  38. if (m[2]) {
  39. last_loaded = Math.max(last_loaded, m[2]);
  40. }
  41. }
  42.  
  43. var page_links = Array.from(document.querySelectorAll('.ptt a'));
  44. const last_page = Math.max.apply(null, page_links.map((el) => {
  45. var m = el.href && el.href.match(/p=(\d+)/);
  46. return parseInt(m && m[1]);
  47. })
  48. .filter((num) => num));
  49.  
  50. START_PAGES > 0 && start_load(START_PAGES);
  51.  
  52. function pop_up() {
  53. if (last_loaded >= last_page) {
  54. alert('No more pages to load');
  55. console.log('No more pages to load');
  56. } else {
  57. var desired_pages = parseInt(prompt('Load how many pages', localStorage.getItem('eh_desired_pages') || DEFAULT_PAGES));
  58. if (desired_pages > 0) {
  59. localStorage.setItem('eh_desired_pages', desired_pages);
  60. start_load(desired_pages);
  61. }
  62. }
  63. }
  64.  
  65. function start_load(desired_pages) {
  66. if (last_loaded >= last_page) {
  67. console.log('No more pages to load');
  68. return;
  69. }
  70. var number_wanted = Math.min(desired_pages, MAX_PAGES);
  71. var end = Math.min(last_loaded + number_wanted, last_page);
  72.  
  73. if (!document.querySelector('#marker' + (last_loaded + 1))) {
  74. add_marker(last_loaded + 1);
  75. }
  76. for (var i = last_loaded + 1; i <= end; i++) {
  77. var marker_div = add_marker(i + 1);
  78. var url = base_url + '?p=' + i;
  79. console.log('loading thumbs from', url)
  80. var oReq = new XMLHttpRequest();
  81. oReq.addEventListener('load', page_load(marker_div));
  82. oReq.open('GET', url);
  83. oReq.responseType = 'document';
  84. oReq.send();
  85. last_loaded = i;
  86. }
  87. adjust_page_links();
  88. }
  89.  
  90. function add_marker(i) {
  91. var marker_div = document.createElement('div');
  92. marker_div.innerHTML = 'Page ' + i;
  93. marker_div.id = 'marker' + i;
  94. marker_div.style.clear = 'both';
  95. container_div.appendChild(marker_div);
  96. return marker_div;
  97. }
  98.  
  99. function page_load(marker) {
  100. return function() {
  101. console.log(marker.id, 'response', this.response);
  102. const thumb_divs = Array.from(this.response.querySelectorAll('.gdtl, .gdtm, .gdts'));
  103. thumb_divs.forEach((el) => {
  104. container_div.insertBefore(el, marker);
  105. });
  106. increase_image_number(thumb_divs.length);
  107. }
  108. }
  109.  
  110. function increase_image_number(num) {
  111. let image_count_p = document.querySelector('.gpc');
  112. image_count_p.textContent = image_count_p.textContent.replace(/Showing (\d+) - (\d+)/i, (m, p1, p2) => `Showing ${p1} - ${parseInt(p2) + num}`);
  113. }
  114.  
  115. function adjust_page_links() {
  116. let current_page_tds = document.querySelectorAll('.ptds');
  117. let m = current_page_tds[0].textContent.trim().match(/(\d+)(?: - (\d+))?/);
  118. const current = parseInt(m && m[1]);
  119. const old_last_loaded = parseInt(m && m[2]) || current;
  120. for (let td of current_page_tds) {
  121. td.style.width = 'auto';
  122. td.style.padding = '0px 6px';
  123. let a = td.firstElementChild;
  124. a.textContent = `${current} - ${last_loaded + 1}`;
  125. }
  126. let gtbs = document.querySelectorAll('.gtb');
  127. for (let gtb of gtbs) {
  128. let tds = gtb.querySelectorAll('td');
  129. let prev_num = 0;
  130. let increment = last_loaded - old_last_loaded + 1;
  131. for (let td of tds) {
  132. let m = td.textContent.trim().match(/^\d+$/);
  133. let num = m && parseInt(m[0]);
  134. if (num > current && num < last_page + 1) {
  135. let new_num = num + increment;
  136. if (new_num < last_page + 1) {
  137. let a = td.firstElementChild;
  138. a.textContent = new_num;
  139. a.href = a.href.replace(/\?p=\d+/, `?p=${new_num - 1}`);
  140. } else {
  141. td.parentNode.removeChild(td);
  142. }
  143. } else if ( ( td.textContent.trim() === '...'
  144. && prev_num > current
  145. && prev_num + increment >= last_page ) ||
  146. ( num === last_page + 1
  147. && last_loaded >= last_page ) ) {
  148. td.parentNode.removeChild(td);
  149. }
  150. prev_num = num;
  151. }
  152. }
  153. }