EH Endless

Endless EH Page

  1. // ==UserScript==
  2. // @name EH Endless
  3. // @description Endless EH Page
  4. // @author Couchy
  5. // @version 130814
  6. // @include http://g.e-hentai.org/*
  7. // @include http://exhentai.org/*
  8. // @grant none
  9. // @noframes
  10. // @namespace https://greasyfork.org/users/5303
  11. // ==/UserScript==
  12.  
  13.  
  14. if(document.getElementById("wcr_btnsettings"))
  15. return;
  16.  
  17. var g = {};
  18.  
  19. function safeArray(a, i){
  20. try{return a[i];}
  21. catch(e){return "";}
  22. }
  23.  
  24. function pause(){
  25. g.ready = false;
  26. document.body.style.cursor = "wait";
  27. }
  28.  
  29. function resume(){
  30. g.ready = true;
  31. document.body.style.cursor = "default";
  32. }
  33.  
  34. function html2dom(html){
  35. var container = (g.type == 3) ? document.createElement("div") : document.createElement("tbody");
  36. container.innerHTML = html.replace(/<script(.|\s)*?\/script>/gi,"").replace(/<iframe(.|\s)*?\/iframe>/gi,"");
  37. if(g.type == 3)
  38. galleryStyle(container, true);
  39. return container;
  40. }
  41.  
  42. function htmlDecode(input){
  43. if(typeof input === "undefined")
  44. return undefined;
  45. var e = document.createElement('div');
  46. e.innerHTML = input;
  47. return e.childNodes.length === 0 ? "" : e.childNodes[0].nodeValue;
  48. }
  49.  
  50. function get(){
  51. var xhr = new XMLHttpRequest();
  52. xhr.open("GET", g.currentPage.nextURL, true);
  53. xhr.ontimeout = function(){resume();};
  54. xhr.onerror = function(){resume();};
  55. xhr.onload = function(){
  56. g.currentPage = new page(xhr.responseText);
  57. var DOMContent = html2dom(g.currentPage.content);
  58. g.appendTo.appendChild(DOMContent);
  59. //if(g.type == 3){document.images[document.images.length-1].scrollIntoView();}
  60. g.currentPage.content = "";
  61. if(g.auto && g.currentPage.nextURL)
  62. g.autoTimeout = setTimeout(function(){get();}, g.wait);
  63. else if(g.currentPage.nextURL)
  64. setTimeout(function(){resume();}, g.wait);
  65. else{
  66. resume();
  67. g.ready = false;
  68. }
  69. };
  70. xhr.send();
  71. }
  72.  
  73. function page(html){
  74. this.content =
  75. /*Search*/safeArray(html.match(/(<div class="itg[^]*?)<table/i),1) || safeArray(html.match(/(<tr class="gtr[^]*?)<\/table>/i),1) ||
  76. /*Thumbs*/safeArray(html.match(/<div id="gdt">([^]*?)<\/div><table/i),1) ||
  77. /*Images*/safeArray(html.match(/<a onclick="[^>]*?" href="[^>]*?">(<img id="img" src="[^>]{150,}?"[^>]*?>)/i), 0).replace(/>$/i, " onerror=\"imageError(this);\" onabort=\"imageError(this);\">") + "<br/><br/><br/><br/><br/>";
  78. this.nextURL = htmlDecode(
  79. /*Search*/safeArray(html.match(/<a href="(http[^"]*)"[^>]*>&gt;<\/a>/i),1) ||
  80. /*Thumbs*/function(){var thumbURL=document.location.href.match(/^http:\/\/e(x|-)hentai\.org\/g\/.*\//i);var str=safeArray(html.match(/<td onclick="sp\(([0-9]*)\)"><a href="#" onclick="return false">&gt;<\/a>/i),1);return str?thumbURL+"?p="+str:undefined;}() ||
  81. /*Images*/function(){var str=safeArray(html.match(/<a onclick="([^>]*?)" href="([^>]*?)"><img id="img" src="([^>]{150,}?)"/i),2);return(str&&str!=g.currentPage.nextURL)?str:"";}()
  82. );
  83. // console.log(JSON.stringify(this));
  84. }
  85.  
  86. function galleryStyle(target, initial){
  87. var imgs = target.getElementsByTagName("img");
  88. for(var i = 0; i < imgs.length; i++){
  89. if(initial){
  90. imgs[i].setAttribute("oldwidth", imgs[i].style.width);
  91. imgs[i].setAttribute("oldheight", imgs[i].style.height);
  92. }
  93. imgs[i].style.width = (parseInt(imgs[i].getAttribute("oldwidth"))*g.resize/100)+"px";
  94. imgs[i].style.height = (parseInt(imgs[i].getAttribute("oldheight"))*g.resize/100)+"px";
  95. }
  96. }
  97.  
  98. g.appendTo =
  99. /*1-Search*/safeArray(document.getElementsByClassName("itg"),0) ||
  100. /*2-Thumbs*/document.getElementById("gdt") ||
  101. /*3-Images*/document.getElementById("i1");
  102. g.type = (g.appendTo==safeArray(document.getElementsByClassName("itg"),0))?1:(g.appendTo==document.getElementById("gdt"))?2:(g.appendTo==safeArray(document.getElementsByClassName("sni"),0))?3:0; if(g.type==0){return}
  103. g.currentPage = new page("");
  104. g.currentPage = new page(document.body.innerHTML);
  105. if(g.type == 3){
  106. g.appendTo = document.body;
  107. document.body.setAttribute("style", "text-align:center;");
  108. g.appendTo.innerHTML = g.currentPage.content;
  109. galleryStyle(document, true);
  110.  
  111. function imageError(brokeImg){
  112. brokeImg.setAttribute("brokesrc", (brokeImg.getAttribute("brokesrc") || brokeImg.getAttribute("src")));
  113. brokeImg.setAttribute("title", "Click to reload!");
  114. brokeImg.setAttribute("onclick", "this.setAttribute('src', this.getAttribute('brokesrc')+'?v='+(new Date).getTime()); this.removeAttribute('onclick'); this.removeAttribute('title')");
  115. brokeImg.setAttribute("src", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE4AAACXBAMAAABJtXDJAAAAJFBMVEUAAAAAAAD/zMxmZpkzMzNmZmYzM2bMmZmZZmaZmZnMzMz////Ur+RNAAAAAXRSTlMAQObYZgAAAmtJREFUWMPtmM9r2zAUx9ORMppdqs12u2NNS7bbhiFnG5QxdnJKBLuGDN8bFrxrSqE+79Y/YP/n9Cz5RbKk1KNN5EG/FyHy4cVP0vshDQaoP2yrwQ5lBBX0jBtSLoUjMP9mckfEorAvnO6C1H25pjR3LchWq/iSkLQjlz+FoygSUFpzU5ab3CqWuiTnYmg57YuDdQ6qKo7HJZebg30L8JdVD7nX8Pnox7jkrq/Z3ORexYZmtkPoi5Px8bbZt0a5PY48cAFj36t7sco/kUtNThjiw0YJpt5xRM81bk7XwTmZ11Mjox5rdqKE65OtMvSBi4paPyid0nwH9y6ZOIvDobj3HbmA5SYXKcA1bOTGqNkeuS/FMknkgaL0N3C/qrsWNyJkmUh9FqdR5gbDngeO56uiAGQCuM6paYtzwpRvTtQnriveLWzbBOSkv82+1STMTn1yc0rlKjfDQuE+gienot+I0BC6fa3UuqwnnPQjEWFy5uRQB+SaTzO5slS4iRIfOneF5cEnx/3Qua/VrZVrr8ttsygfMI68cMdYz2Rg6DrbF3fSkau7dllJF5AG6wF1Xq6lPa0Diqxmn5tL/8HeCDrIG5iBC0s4OAsSQgO/hgv4rOHewN5cwEyeK/A2xBC6aP63KzfqyJ105AYPD/VMCQydC/A14REOq9teOHFiCtHxhphabtp1Vbv4hpioSC+4obhvZ6Kg8utexXUHhSigU9tzgyzQ412PEj3ipizvxKX255+9cXFVZZ04Gfy5J879fYwhF1DqtLd9NtnYt+yFc3PDTDzU1Zq5uaNH3wlrzbNuXEZeuP+RYy1pQfkXeY0Mew9Lp6wAAAAASUVORK5CYII=");
  116. }
  117. var script = document.createElement("script");
  118. script.textContent = imageError.toString();
  119. document.head.appendChild(script);
  120. }
  121. g.currentPage.content = "";
  122. g.ready = true;
  123. g.wait = (g.type == 2) ? 0 : 3500;
  124. g.resize = 100;
  125. g.auto = false;
  126. g.autoTimeout = setTimeout(function(){},0);
  127. g.eventHandler = function(e){
  128. if(e.keyCode == 39){
  129. if(!e.shiftKey && !e.ctrlKey && g.currentPage.nextURL && g.ready && !g.auto){
  130. pause();
  131. get();
  132. }
  133. else if(e.ctrlKey && !e.shiftKey && g.type == 3){
  134. var input = parseInt(prompt("Image Scale","100"));
  135. if(input){
  136. g.resize = input;
  137. galleryStyle(document, false);
  138. }
  139. }
  140. else if(e.shiftKey && !e.ctrlKey && g.currentPage.nextURL && g.ready){
  141. var input = parseInt(prompt("Enter time delay in ms or click cancel to stop. (WARNING: short delays may cause errors/bans!)", "10000"));
  142. if(input){
  143. g.auto = true;
  144. g.wait = parseInt(input);
  145. get();
  146. }
  147. else{
  148. clearTimeout(g.autoTimeout);
  149. g.auto = false;
  150. g.wait = (g.type == 2) ? 0 : 3500;
  151. resume();
  152. }
  153. }
  154. }
  155. };
  156. g.eventListener = document.addEventListener("keydown", g.eventHandler, false);
  157. document.onkeydown = null;
  158. if(g.wait > 0){
  159. pause();
  160. document.body.style.cursor = "default";
  161. setTimeout(function(){resume();}, g.wait);
  162. }