Danbooru-Image-Adder

Add images to posts

  1. // ==UserScript==
  2. // @name Danbooru-Image-Adder
  3. // @namespace http://tampermonkey.net/
  4. // @version 3.2
  5. // @description Add images to posts
  6. // @author ECHibiki /qa/
  7. // @match *://boards.4chan.org/*
  8. // @grant GM_xmlhttpRequest
  9. // @run-at document-start
  10. // ==/UserScript==
  11.  
  12. function alert4ChanX(message, type, time){
  13. if(time == undefined) time = 10;
  14. var detail = {type: type, content: message, lifetime: time};
  15. if (typeof cloneInto === 'function') {
  16. detail = cloneInto(detail, document.defaultView);
  17. }
  18. var event = new CustomEvent('CreateNotification', {bubbles: true, detail: detail});
  19. document.dispatchEvent(event);
  20. }
  21.  
  22. var number_of_posts = 0;
  23. var page_number;
  24. var json_page;
  25. var json_tag;
  26. var smallest_tag_size;
  27.  
  28. var top_page_max = 10000000;
  29. var top_page = top_page_max;
  30. var maximum_attempts = 20;
  31. var number_of_attempts = maximum_attempts ;
  32.  
  33. var img_URL = "";
  34. var send_URL = "";
  35. var old_tags_before_change = "";
  36.  
  37. var timeout = false;
  38. var failed_to_find_required_tags_state = false;
  39. var tag_incorrect_state = false;
  40. var tool_top_visible = false;
  41.  
  42. var time_max = 10;
  43. var time = time_max;
  44. var intervalFunction;
  45. var timeout_functions = [];
  46. var json_page_numbers_used = Array();
  47. var previous_images = [];
  48. var taggingFunction;
  49.  
  50. window_displayed = false;
  51.  
  52. var help_icon_source = " data:image/jpeg;base64,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"
  53.  
  54.  
  55. //set listeners to build interface in 4chanX
  56. var loaded = false;
  57. document.addEventListener("QRDialogCreation", function(e){
  58. //create custom interface
  59. enhance4ChanX();
  60. //ENHANCE DUMP TABS (COVER, 482PX - 482PX)
  61. //DUMP LIST MAX-HEIGHT TO 490
  62. var width = parseInt(localStorage.getItem("width_DIA"));
  63. var qr_width = parseInt(localStorage.getItem("qr_width_DIA"));
  64. var height = parseInt(localStorage.getItem("height_DIA"));
  65. if(width === null) width = 400;
  66. if(qr_width === null) width = 480;
  67. if(height === null) height = 400;
  68.  
  69. document.getElementById("fourchanx-css").textContent += ".qr-preview { height:" + height + "px; width: " + width + "px; left:8%;background-size: cover;}";
  70. document.getElementById("fourchanx-css").textContent += "#dump-list { min-height: " + (width - 20) + "px; width: " + (qr_width) + "px;}";
  71.  
  72. }, false);
  73.  
  74. document.addEventListener("4chanXInitFinished", imageAdderButton);
  75.  
  76. //Alter 4chanX interface
  77. var enhance4ChanX = function(){
  78. var qr_window = document.getElementById("qr");
  79.  
  80. //check if elements already exist
  81. /*Probably Depreciated*/
  82. // if(document.getElementById("qrImages") !== null){
  83. // qr_window.removeChild(document.getElementById("qrImages"));
  84. // clearInterval(taggingFunction);
  85. // //4chanx autodeletes images
  86. // clearImage();
  87. // }
  88. var imagedump_opener = document.getElementById("dump-button");
  89. if(imagedump_opener !== null){imagedump_opener.click();}
  90. else{return;}
  91.  
  92. var imagedump_file_list = document.getElementById("dump-list");
  93. var filename_container = document.getElementById("qr-filename-container");
  94.  
  95. //used for setting and unsetting high resolution thumbs for dump list.
  96. var dumplist_image = "";
  97. var previous_dumplist_image = "";
  98. var observer = new MutationObserver(function(mutate){
  99. dumplist_image = imagedump_file_list.firstChild.style.backgroundImage;
  100. if(dumplist_image !== previous_dumplist_image && img_URL !== ""){
  101. imagedump_file_list.firstChild.style.backgroundImage = "url(" + img_URL + ")";
  102. previous_dumplist_image = imagedump_file_list.firstChild.style.backgroundImage;
  103. }
  104. else if (img_URL == ""){
  105. }
  106. });
  107. observer.observe(imagedump_file_list , {attributes: true,subtree:true, chilimagedump_file_list: true, characterData: true });
  108. //make the image clear button clear images;
  109. document.getElementById("qr-filerm").addEventListener("click", clearImage);
  110.  
  111. //image setting html elements.
  112. var qr_image_adder_table = document.createElement("TABLE");
  113. qr_image_adder_table.setAttribute("id", "qrImages");
  114. qr_image_adder_table.setAttribute("style", "text-align:center");
  115. qr_window.appendChild(qr_image_adder_table);
  116.  
  117. var options_row = document.createElement("TR");
  118. options_row.setAttribute("ID", "or");
  119. options_row.setAttribute("style", "margin:5px;");
  120. qr_image_adder_table.appendChild(options_row);
  121. var checkbox_safe = document.createElement("INPUT");
  122. checkbox_safe.setAttribute("id", "safe");
  123. checkbox_safe.setAttribute("type", "checkbox");
  124. var checkbox_safe_text = document.createTextNode("Safe");
  125. var checkbox_questionable= document.createElement("INPUT");
  126. checkbox_questionable.setAttribute("id", "questionable");
  127. checkbox_questionable.setAttribute("type", "checkbox");
  128. var checkbox_questionable_text= document.createTextNode("Questionable");
  129. var checkbox_explicit = document.createElement("INPUT");
  130. checkbox_explicit.setAttribute("id", "explicit");
  131. checkbox_explicit.setAttribute("type", "checkbox");
  132. var checkbox_explicit_text = document.createTextNode("Explicit");
  133.  
  134. options_row.appendChild(checkbox_safe_text);
  135. options_row.appendChild(checkbox_safe);
  136. options_row.appendChild(checkbox_questionable_text);
  137. options_row.appendChild(checkbox_questionable);
  138. options_row.appendChild(checkbox_explicit_text);
  139. options_row.appendChild(checkbox_explicit);
  140.  
  141. option_text_size = "18";
  142.  
  143. var image_tagging_row = document.createElement("TR");
  144. var help_icon_container = document.createElement("A");
  145. help_icon_container.href = "javascript:void(0)";
  146. help_icon_container.title = "Click to View Help!";
  147. var help_icon = document.createElement("IMG");
  148. help_icon.setAttribute("style", "height:" + option_text_size * 1.25 + "px;margin:-4px 10px");
  149. help_icon.src = help_icon_source;
  150.  
  151. help_icon_container.appendChild(help_icon);
  152. image_tagging_row.appendChild(help_icon_container);
  153.  
  154. var tooltip_div = document.createElement("DIV");
  155. tooltip_div.innerHTML = "Insert Tags to search from danbooru in the text box to the side.<br/>The URL for the image will be bellow. Some browsers such as chrome allow you to select this text<br/>Do Not Use \"order:\" tags<br/>Do Not Use \"rating:\" tags<br/>For more speed uncheck all boxes!<hr/>Submit bugs to <a href='https://github.com/ECHibiki/4chan-UserScripts'>my Github</a>";
  156. tooltip_div.setAttribute("style", "z-index:9;padding:5px;border:1px solid black;background-color:white;word-wrap:break-word;display:none;position:absolute;");
  157. help_icon_container.addEventListener("click", function(ev){
  158. if(tool_top_visible)
  159. tooltip_div.setAttribute("style", "z-index:9;padding:5px;border:1px solid black;background-color:white;word-wrap:break-word;display:none;position:absolute;");
  160. else
  161. tooltip_div.setAttribute("style", "z-index:9;padding:5px;border:1px solid black;background-color:white;word-wrap:break-word;display:block;position:absolute;"
  162. + "left:" + (ev.clientX - qr_window.getBoundingClientRect().x) +
  163. "px;top:" + (ev.clientY - qr_window.getBoundingClientRect().y ) + "px;");
  164. tool_top_visible = !tool_top_visible;
  165. });
  166. qr_window.appendChild(tooltip_div);
  167.  
  168. var second_row_nodes = [
  169. document.createTextNode("Tags: "),
  170. document.createElement("INPUT"),
  171. document.createElement("INPUT"),
  172. document.createElement("A"),
  173. document.createElement("INPUT"),
  174. ];
  175. second_row_nodes.forEach(
  176. function(node){
  177. image_tagging_row.appendChild(node);
  178. });
  179. qr_image_adder_table.appendChild(image_tagging_row);
  180.  
  181. var auto_complete_row = document.createElement("TR");
  182. auto_complete_row.setAttribute("ID", "acr");
  183. auto_complete_row.setAttribute("style", "margin:5px;");
  184. qr_image_adder_table.appendChild(auto_complete_row);
  185.  
  186. second_row_nodes[1].setAttribute("ID", "tags");
  187. second_row_nodes[1].setAttribute("style", "width:44.9%;"+"font-size:" + option_text_size + "px");
  188. second_row_nodes[3].setAttribute("ID", "timer");
  189. second_row_nodes[3].setAttribute("style", "width:20%;margin:0 5px");
  190. second_row_nodes[4].setAttribute("ID", "urlContainer");
  191. second_row_nodes[4].setAttribute("style", "width:75%;margin:5px -25px");
  192. second_row_nodes[4].setAttribute("disabled", "");
  193.  
  194. var tag_input_node = second_row_nodes[1];
  195.  
  196. second_row_nodes[2].setAttribute("ID", "imageButton");
  197. second_row_nodes[2].setAttribute("type", "button");
  198. second_row_nodes[2].setAttribute("value", "Set Image");
  199.  
  200. //event listener logic
  201. second_row_nodes[2].addEventListener("click", buttonClickFunction);
  202.  
  203. //textarea expansion;
  204. qr_window.getElementsByTagName("TEXTAREA")[0].style.width = "110%";
  205. //ping every 0.5s for changes
  206. taggingFunction = setInterval(
  207. function(){setTagInterface(tag_input_node, auto_complete_row, second_row_nodes);},
  208. 500);
  209. qr_window.appendChild(document.createElement("hr"));
  210. };
  211.  
  212. //settings for time expiration on image hiding
  213. function imageAdderWindow(){
  214. var style = document.createElement('style');
  215. style.innerHTML = ".inputs{background-color:rgb(200,200,200);margin:5px 7px;width:100px;}";
  216. document.body.appendChild(style);
  217.  
  218. var background_div = document.createElement("div");
  219. background_div.setAttribute("style", "border:solid 1px black;position:fixed;width:100%;height:100%;background-color:rgba(200,200,200,0.3);top:0;left:0;display:none; z-index:9");
  220. background_div.setAttribute("id", "image_adder_Background");
  221. document.body.appendChild(background_div);
  222. background_div.addEventListener("click", imageAdderToggle);
  223.  
  224. var window_div = document.createElement("div");
  225. window_div.setAttribute("style", "border:solid 1px black;position:fixed;width:400px;background-color:rgb(200,200,200);left:40%;top:20%;margin-bottom:0; display:none; z-index:10");
  226. window_div.setAttribute("id", "image_adder_Window");
  227.  
  228. var close_div = document.createElement("div");
  229. close_div.setAttribute("style", "border:solid 1px black;position:absolute;width:25px;height:25px;background-color:rgba(255,100,90,0.9); right:3px;top:3px; z-index:10");
  230. close_div.addEventListener("click", imageAdderToggle);
  231. window_div.appendChild(close_div);
  232.  
  233. var title_para = document.createElement("p");
  234. title_para.setAttribute("style", "margin-left:5px;margin-top:5px");
  235. var title_text = document.createTextNode("Image Adder Settings");
  236. title_para.appendChild(title_text);
  237. window_div.appendChild(title_para);
  238.  
  239. var container_div = document.createElement("div");
  240. container_div.setAttribute("style","background-color:white;margin:auto;padding:5px;");
  241. window_div.appendChild(container_div);
  242. var radio_table = document.createElement("TABLE")
  243. radio_table.setAttribute("style", "text-align:center;margin-left:5px");
  244.  
  245. var v_large_row = document.createElement("TR");
  246. var v_large_label_col = document.createElement("TD");
  247. var v_large_label = document.createElement("label");
  248. var v_large_text = document.createTextNode("Very Large: ");//489
  249. v_large_label.appendChild(v_large_text);
  250. v_large_label_col.appendChild(v_large_label);
  251. v_large_row.appendChild(v_large_label_col);
  252. var v_large_radio_col = document.createElement("TD");
  253. var v_large_input = document.createElement("input");
  254. v_large_input.setAttribute("id", "v_large");
  255. v_large_input.setAttribute("type", "radio");
  256. v_large_input.setAttribute("name", "preivew-size");
  257. v_large_input.setAttribute("style", "display:inline");
  258. v_large_radio_col.appendChild(v_large_input);
  259. v_large_row.appendChild(v_large_radio_col);
  260. v_large_input.addEventListener("click", function(){
  261. document.getElementById("width_DIA").value = 489;
  262. document.getElementById("height_DIA").value = 489;
  263. });
  264.  
  265. radio_table.appendChild(v_large_row);
  266. var large_row = document.createElement("TR");
  267. var large_label_col = document.createElement("TD");
  268. var large_label = document.createElement("label");
  269. var large_text = document.createTextNode("Large: ");//400
  270. large_label.appendChild(large_text);
  271. large_label_col.appendChild(large_label);
  272. large_row.appendChild(large_label_col);
  273. var large_radio_col = document.createElement("TD");
  274. var large_input = document.createElement("input");
  275. large_input.setAttribute("id", "large");
  276. large_input.setAttribute("type", "radio");
  277. large_input.setAttribute("name", "preivew-size");
  278. large_input.setAttribute("style", "display:inline");
  279. large_radio_col.appendChild(large_input);
  280. large_row.appendChild(large_radio_col);
  281. large_input.addEventListener("click", function(){
  282. document.getElementById("width_DIA").value = 400;
  283. document.getElementById("height_DIA").value = 400;
  284. });
  285. radio_table.appendChild(large_row);
  286. var medium_row = document.createElement("TR");
  287. var medium_label_col = document.createElement("TD");
  288. var medium_label = document.createElement("label");
  289. var medium_text = document.createTextNode("Medium: ");//300
  290. medium_label.appendChild(medium_text);
  291. medium_label_col.appendChild(medium_label);
  292. medium_row.appendChild(medium_label_col);
  293. var medium_radio_col = document.createElement("TD");
  294. var medium_input = document.createElement("input");
  295. medium_input.setAttribute("id", "medium");
  296. medium_input.setAttribute("type", "radio");
  297. medium_input.setAttribute("name", "preivew-size");
  298. medium_input.setAttribute("style", "display:inline");
  299. medium_radio_col.appendChild(medium_input);
  300. medium_row.appendChild(medium_radio_col);
  301. medium_input.addEventListener("click", function(){
  302. document.getElementById("width_DIA").value = 300;
  303. document.getElementById("height_DIA").value = 300;
  304. });
  305.  
  306. radio_table.appendChild(medium_row);
  307. var small_row = document.createElement("TR");
  308. var small_label_col = document.createElement("TD");
  309. var small_label = document.createElement("label");
  310. var small_text = document.createTextNode("Very Large: ");//200
  311. small_label.appendChild(small_text);
  312. small_label_col.appendChild(small_label);
  313. small_row.appendChild(small_label_col);
  314. var small_radio_col = document.createElement("TD");
  315. var small_input = document.createElement("input");
  316. small_input.setAttribute("id", "small");
  317. small_input.setAttribute("type", "radio");
  318. small_input.setAttribute("name", "preivew-size");
  319. small_input.setAttribute("style", "display:inline");
  320. small_radio_col.appendChild(small_input);
  321. small_row.appendChild(small_radio_col);
  322. small_input.addEventListener("click", function(){
  323. document.getElementById("width_DIA").value = 200;
  324. document.getElementById("height_DIA").value = 200;
  325. });
  326. radio_table.appendChild(small_row);
  327. var width_row = document.createElement("TR");
  328. var width_label_col = document.createElement("TD");
  329. var width_label = document.createElement("label");
  330. var width_text = document.createTextNode("Width: ");//W
  331. width_label.appendChild(width_text);
  332. width_label_col.appendChild(width_label);
  333. width_row.appendChild(width_label_col);
  334. var width_radio_col = document.createElement("TD");
  335. var width_input = document.createElement("input");
  336. width_input.setAttribute("id", "width_DIA");
  337. width_input.setAttribute("type", "text");
  338. width_input.setAttribute("name", "preivew-size");
  339. width_input.setAttribute("style", "width:20%");
  340. width_radio_col.appendChild(width_input);
  341. width_row.appendChild(width_radio_col);
  342. var width = localStorage.getItem("width_DIA");
  343. if(width === null) width = 400;
  344. width_input.setAttribute("value", width);
  345. radio_table.appendChild(width_row);
  346. var height_row = document.createElement("TR");
  347. var height_label_col = document.createElement("TD");
  348. var height_label = document.createElement("label");
  349. var height_text = document.createTextNode("Height: ");//H
  350. height_label.appendChild(height_text);
  351. height_label_col.appendChild(height_label);
  352. height_row.appendChild(height_label_col);
  353. var height_radio_col = document.createElement("TD");
  354. var height_input = document.createElement("input");
  355. height_input.setAttribute("id", "height_DIA");
  356. height_input.setAttribute("type", "text");
  357. height_input.setAttribute("name", "preivew-size");
  358. height_input.setAttribute("style", "width:20%");
  359. height_radio_col.appendChild(height_input);
  360. height_row.appendChild(height_radio_col);
  361. var height = localStorage.getItem("height_DIA");
  362. if(height === null) height = 400;
  363. height_input.setAttribute("value", height);
  364. radio_table.appendChild(height_row);
  365. container_div.appendChild(radio_table);
  366. container_div.appendChild(document.createElement("hr"));
  367. var qr_width_label = document.createElement("label");
  368. var qr_width_text = document.createTextNode("Quick Reply Min Width: ");//H
  369. qr_width_label.appendChild(qr_width_text);
  370. var qr_width_input = document.createElement("input");
  371. qr_width_input.setAttribute("id", "qr_width_DIA");
  372. qr_width_input.setAttribute("type", "text");
  373. qr_width_input.setAttribute("name", "preivew-size");
  374. qr_width_input.setAttribute("style", "width:20%");
  375. var qr_width = localStorage.getItem("qr_width_DIA");
  376. if(qr_width === null) qr_width = 480;
  377. qr_width_input.setAttribute("value", qr_width);
  378.  
  379. container_div.appendChild(qr_width_label);
  380. container_div.appendChild(qr_width_input);
  381. container_div.appendChild(document.createElement("hr"));
  382. var set_button = document.createElement("input");
  383. set_button.setAttribute("type", "button");
  384. set_button.setAttribute("id", "setTime");
  385. set_button.setAttribute("value", "Set Preview Size");
  386. set_button.addEventListener("click", function(){
  387. if (storageAvailable('localStorage')) {
  388. var width = parseInt(document.getElementById("width_DIA").value);
  389. localStorage.setItem("width_DIA", width);
  390. var qr_width = parseInt(document.getElementById("qr_width_DIA").value);
  391. localStorage.setItem("qr_width_DIA", qr_width);
  392. var height = parseInt(document.getElementById("height_DIA").value);
  393. localStorage.setItem("height_DIA", height);
  394. if(width === null) width = 400;
  395. if(qr_width === null) qr_width = 480;
  396. if(height === null) height = 400;
  397.  
  398. document.getElementById("fourchanx-css").textContent += ".qr-preview { height:" + height + "px; width: " + width + "px; left:8%;background-size: cover;}";
  399. document.getElementById("fourchanx-css").textContent += "#dump-list { min-height: " + (width - 20) + "px; width: " + (qr_width) + "px;}";
  400.  
  401. imageAdderToggle();
  402. }
  403. });
  404. container_div.appendChild(set_button);
  405.  
  406. document.body.appendChild(window_div);
  407.  
  408. if(document.getElementById("width_DIA").value == "489") v_large_input.checked = true;
  409. if(document.getElementById("width_DIA").value == "400") large_input.checked = true;
  410. if(document.getElementById("width_DIA").value == "300") medium_input.checked = true;
  411. if(document.getElementById("width_DIA").value == "200") small_input.checked = true;
  412. }
  413.  
  414.  
  415. //is storage possible
  416. function storageAvailable(type) {
  417. try {
  418. var storage = window[type],
  419. x = '__storage_test__';
  420. storage.setItem(x, x);
  421. storage.removeItem(x);
  422. return true;
  423. }
  424. catch(e) {
  425. //From https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API
  426. return e instanceof DOMException && (
  427. // everything except Firefox
  428. e.code === 22 ||
  429. // Firefox
  430. e.code === 1014 ||
  431. // test name field too, because code might not be present
  432. // everything except Firefox
  433. e.name === 'QuotaExceededError' ||
  434. // Firefox
  435. e.name === 'NS_ERROR_DOM_QUOTA_REACHED') &&
  436. // acknowledge QuotaExceededError only if there's something already stored
  437. storage.length !== 0;
  438. }
  439. }
  440.  
  441. function imageAdderToggle(){
  442. if(window_displayed){
  443. document.getElementById("image_adder_Window").style.display = "none";
  444. document.getElementById("image_adder_Background").style.display = "none";
  445. window_displayed = false;
  446. }
  447. else{
  448. document.getElementById("image_adder_Window").style.display = "inline-block";
  449. document.getElementById("image_adder_Background").style.display = "inline-block";
  450. window_displayed = true;
  451. }
  452. }
  453.  
  454. function imageAdderButton(){
  455. var image_adder__button = document.createElement("input");
  456. image_adder__button.setAttribute("Value", "Image Adder Settings");
  457. image_adder__button.setAttribute("type", "button");
  458. image_adder__button.setAttribute("style", "position:absolute;top:135px");
  459. imageAdderWindow();
  460. if(document.body === null){
  461. setTimeout(imageAdderButton, 30);
  462. }
  463. else{
  464. document.body.appendChild(image_adder__button);
  465. image_adder__button.addEventListener("click", imageAdderToggle);
  466. }
  467. }
  468.  
  469. //on setimage click clear flags, timers and start another search
  470. function buttonClickFunction(){
  471. json_page_numbers_used = Array();
  472. //reset a failed_to_find_required_tags boolean
  473. primed_for_fail = false;
  474. for(var i = 0 ; i < timeout_functions.length; i++){
  475. clearInterval(timeout_functions[i]);
  476. }
  477. tag_incorrect_state = false;
  478. timeout = false;
  479. //freeze interface to prevent mid opperation changes
  480. document.getElementById("tags").setAttribute("disabled", 1);
  481. document.getElementById("imageButton").setAttribute("disabled", 1);
  482. time = time_max;
  483. timeout_functions.push(setInterval(counterFunction, 1000));
  484. //start the search
  485. setImage();
  486. };
  487.  
  488. //remove the high quallity image from the dump list
  489. function clearImage(){
  490. var imagedump_file_list = document.getElementById("dump-list");
  491. imagedump_file_list.firstChild.style.backgroundImage = "url()";//trigger mutation event
  492. img_URL = ""; //get mutation to set to dead
  493. }
  494.  
  495. var setTagInterface = function(tag_input_node, auto_complete_row, second_row_nodes){
  496. tags = tag_input_node.value;
  497. if(old_tags_before_change !== tags){
  498. previous_images = [];
  499.  
  500. var tag_carat_position = tag_input_node.selectionStart - 1;
  501. var closest_tag = (function(){
  502. var current_chararcter = tags.charAt(tag_carat_position);
  503. var i = 0;
  504. right_most = tag_carat_position;
  505. while(current_chararcter != " " && current_chararcter != "" && current_chararcter !== undefined){
  506. i++;
  507. current_chararcter = tags.charAt(tag_carat_position + i);
  508. if(current_chararcter != " " && current_chararcter != "") right_most = tag_carat_position + i;
  509. }
  510. right_most += 1;
  511. current_chararcter = tags.charAt(tag_carat_position);
  512. i = 0;
  513. leftMost = tag_carat_position;
  514. while(current_chararcter != " " && current_chararcter != "" && current_chararcter !== undefined){
  515. i++;
  516. current_chararcter = tags.charAt(tag_carat_position - i);
  517. if(current_chararcter != " " && current_chararcter != "") leftMost = tag_carat_position - i;
  518. }
  519. return tags.substring(leftMost, right_most);
  520. })();
  521. var xhr = new GM_xmlhttpRequest(({
  522. method: "GET",
  523. url: "https://danbooru.donmai.us/tags.json?search[name_matches]=" + closest_tag + "*&search[order]=count",
  524. responseType : "json",
  525. onload: function(data){
  526. data = data.response;
  527. var tagArray = tags.split(" ");
  528. while (auto_complete_row.hasChildNodes()) {
  529. auto_complete_row.removeChild(auto_complete_row.lastChild);
  530. }
  531. var qr_width = document.getElementById("qr").offsetWidth;
  532.  
  533. var tag_table = document.createElement("TABLE");
  534. tag_table.setAttribute("style", "border:1px solid black;margin-top:5px");
  535. var tag_row = document.createElement("TR");
  536. for (var i = 0 ; i < 5 ; i++){
  537. var a = document.createElement("A");
  538. var tagText = data["" + i];
  539. if(tagText == "" || tagText === undefined) break;
  540. tagText = tagText["name"];
  541.  
  542. var a_txt = document.createTextNode(data[i]["name"]);
  543. var tag_data = document.createElement("TD");
  544. tag_data.setAttribute("style", "padding:5px;font-size:15px;font-weight:bold;border:1px solid black;");
  545. a.appendChild(a_txt);
  546. tag_data.appendChild(a);
  547. tag_row.appendChild(tag_data);
  548. tag_table.appendChild(tag_row);
  549. auto_complete_row.appendChild(tag_table);
  550.  
  551. if(tag_table.offsetWidth > qr_width - 10){
  552. tag_row.removeChild(tag_data);
  553. tag_table = document.createElement("TABLE");
  554. tag_row = document.createElement("TR");
  555.  
  556. tag_row.appendChild(tag_data);
  557. tag_table.appendChild(tag_row);
  558. tag_table.setAttribute("style", "border:1px solid black;");
  559. auto_complete_row.appendChild(tag_table);
  560.  
  561. }
  562. a.addEventListener("click", function(evt){
  563. tagArray[tagArray.indexOf(closest_tag)] = this.textContent;
  564. second_row_nodes[1].value = tagArray.join(" ");
  565. });
  566. }
  567. }}));
  568. }
  569. old_tags_before_change = tag_input_node.value;
  570. };
  571.  
  572. //a series of calls on other functions that leads to the image being searched for
  573. var setImage = function(){
  574. //Set image tags.
  575. var tags = document.getElementById("tags").value.trim();
  576.  
  577. if(tags.indexOf(":") > -1) {
  578. alert4ChanX("Character ':' not used for file characteristic searches", "warning");
  579. }
  580. tags = tags.split(" ");
  581.  
  582. var xhr_image_load = new GM_xmlhttpRequest(({
  583. method: "GET",
  584. //returns a list of all tags and their properties
  585. url: "https://danbooru.donmai.us/tags.json?search[name]=" + tags.join() + "&search[order]=count",
  586. responseType : "json",
  587. onload: function(data)
  588. {
  589. verifyTags(data, tags);
  590. if(failed_to_find_required_tags_state) return;
  591.  
  592. //set the end
  593. var end_URL = ratingURL(tags, json_tag);
  594.  
  595. var URL = setPostAndPage(end_URL, tags);
  596. send_URL = URL;
  597. //final check, sends final request after function or calls this function again
  598. getJSON(URL, checkPageFromDanbooru, tags);
  599. }}));
  600. };
  601. //make 4chanX alerts on issues, and account for error cases.
  602. function verifyTags(data, tags){
  603. data = data.response;
  604. //if data is blank, use a no-tag approach
  605. if(tags.length == 1 && tags[0] == "") json_tag = [{"name":""}];
  606. else json_tag = data;
  607. failed_to_find_required_tags_state = false;
  608. //if data has a null or undefined case, return an error
  609. if(data.length == 0){
  610. alert4ChanX("All tags incorrect", "error");
  611. failed_to_find_required_tags_state = true;
  612. document.getElementById("timer").textContent = "";
  613. document.getElementById("tags").removeAttribute("disabled");
  614. document.getElementById("imageButton").removeAttribute("disabled");
  615. return;
  616. }
  617. else if(data.length != tags.length && !tag_incorrect_state){
  618. tag_incorrect_state = true;
  619. if(document.getElementById("tags").value.trim() == "") alert4ChanX("No Tags", "info", 2);
  620. else alert4ChanX("One Tag Incorrect", "warning");
  621. }
  622. //tag size. Smallest tag is placed at bottom of JSON
  623. smallest_tag_size = parseInt(data[data.length-1]["post_count"]);
  624. }
  625.  
  626. //evaluate the rating restrictions to account for danbooru's tagging limitations
  627. var ratingURL = function(tags, data){
  628. var URL = "";
  629. //evaluate the 3! possible permutations
  630. if(document.getElementById("safe").checked){
  631. if(document.getElementById("questionable").checked){
  632. if(document.getElementById("explicit").checked){
  633. if(data.length > 1) URL = "&utf8=%E2%9C%93&tags=" + data[data.length-2]["name"] + "+" + data[data.length-1]["name"];
  634. else URL = "&utf8=%E2%9C%93&tags=" + data[data.length-1]["name"];
  635. }
  636. else{
  637. URL = "&utf8=%E2%9C%93&tags=" + "-rating%3Aexplicit" + "+" + data[data.length-1]["name"];
  638. }
  639. }
  640. else if(document.getElementById("explicit").checked){
  641. URL = "&utf8=%E2%9C%93&tags=" + "-rating%3Aquestionable" + "+" + data[data.length-1]["name"];
  642. }
  643. else{
  644. URL = "&utf8=%E2%9C%93&tags=" + "rating%3Asafe" + "+" + data[data.length-1]["name"];
  645. }
  646. }
  647. else if(document.getElementById("questionable").checked){
  648. if(document.getElementById("explicit").checked){
  649. URL = "&utf8=%E2%9C%93&tags=" + "-rating%3Asafe" + "+" + data[data.length-1]["name"];
  650. }
  651. else{
  652. URL = "&utf8=%E2%9C%93&tags=" + "rating%3Aquestionable" + "+" + data[data.length-1]["name"];
  653. }
  654. }
  655. else if(document.getElementById("explicit").checked){
  656. URL = "&utf8=%E2%9C%93&tags=" + "rating%3Aexplicit" + "+" + data[data.length-1]["name"];
  657. }
  658. else{
  659. if(data.length > 1) URL = "&utf8=%E2%9C%93&tags=" + data[data.length-2]["name"] + "+" + data[data.length-1]["name"];
  660. else URL = "&utf8=%E2%9C%93&tags=" + data[data.length-1]["name"];
  661. }
  662. return URL;
  663. };
  664.  
  665. //set where to search
  666. var setPostAndPage = function(end_URL, tags){
  667. //posts
  668. if(number_of_posts > 0)
  669. number_of_posts = 0;
  670. //page
  671. if(top_page != top_page_max) smallest_tag_size = top_page * 20;
  672. if(smallest_tag_size == 0) smallest_tag_size = 100;
  673. do{
  674. escape_cond = true;
  675. page_number = ((Math.floor(Math.random() * 10000)) % Math.ceil(smallest_tag_size / 20)) % 1000; //1000 is max page search limit
  676. json_page_numbers_used.forEach(function(page){
  677. if(page == 0){
  678. primed_for_fail = true; // no more pages to search and looped once
  679. escape_cond = true;
  680. return;
  681. }
  682. else if(page == page_number){
  683. escape_cond = false;
  684. return;
  685. }
  686. });
  687. } while(!escape_cond);
  688. json_page_numbers_used.push(page_number);
  689.  
  690. var URL = "https://danbooru.donmai.us/posts.json?page=" + page_number + end_URL;
  691. return URL;
  692. };
  693.  
  694. //check if valid url location
  695. var primed_for_fail = false;
  696. var checkPageFromDanbooru = function(err, data, tags){
  697. if (err != null) {
  698. console.log('Something went wrong: ' + err);
  699. alert4ChanX("Danbooru Server Did Not Perform request -- Error: " + err, "error");
  700. reset_search_timer_fields();
  701. page_number = 0;
  702. }
  703. else {
  704. do{
  705. var duplicate = false;
  706. //check for repeating images found
  707. previous_images.forEach(function(item){
  708. if(item[0] == page_number && item[1] == number_of_posts){
  709. duplicate = true;
  710. }
  711. number_of_posts++;
  712. });
  713. }while(duplicate == false && previous_images < number_of_posts);
  714.  
  715. if(primed_for_fail){
  716. alert4ChanX("No Results: All found for tags \"" + document.getElementById("tags").value + "\"", "error");
  717. reset_search_timer_fields();
  718. return;
  719. }
  720. //redo
  721. else if((data.length < number_of_posts+1) && number_of_attempts > 0) {
  722. if(top_page > page_number){
  723. top_page = page_number + number_of_posts / 20;
  724. }
  725. number_of_attempts--;
  726. document.getElementById("timer").textContent = number_of_attempts + "|" + time;
  727. setImage();
  728. }
  729. //process page
  730. else if (number_of_attempts > 0){
  731. //ALL PARAMETERS WILL BE RESET INSIDE JSON
  732. document.getElementById("timer").textContent = number_of_attempts + "|" + time;
  733. getJSON(send_URL, setImageFromDanbooru, tags);
  734. }
  735. else{
  736. alert4ChanX("Not found", "error");
  737. reset_search_timer_fields();
  738. return;
  739. }
  740. }
  741. };
  742.  
  743. function reset_search_timer_fields(){
  744. top_page = top_page_max;
  745. number_of_attempts = maximum_attempts;
  746. document.getElementById("timer").textContent = "";
  747. document.getElementById("tags").removeAttribute("disabled");
  748. document.getElementById("imageButton").removeAttribute("disabled");
  749. }
  750.  
  751. //finally draw from the JSON page to generate and place the post into the 4chanX dumplist
  752. var setImageFromDanbooru = function(err, data, tags){
  753. if (err != null) {
  754. console.log('Something went wrong: ' + err);
  755. alert4ChanX("Danbooru Server Did Not Perform request -- Error: " + err, "error");
  756. reset_search_timer_fields();
  757. }
  758. else {
  759. json_page = data;
  760. var image_found = false;
  761. for (number_of_posts = number_of_posts; number_of_posts < 20 ; number_of_posts++){
  762. if(timeout){
  763. //Case1: Took too long to scan the page.
  764. //Result: Kills search
  765. alert4ChanX("timeout after " + time +" seconds", "error");
  766. clearInterval(counterFunction);
  767. reset_search_timer_fields();
  768. return;
  769. }
  770. else if(json_page["" + number_of_posts] == undefined){
  771. //Case2: reaches an undefined page.
  772. //Result: Switches to a new page
  773. top_page = page_number;
  774. number_of_attempts--;
  775. setImage();
  776. return;
  777. }
  778.  
  779. //set the page to search
  780. var end_URL = json_page["" + number_of_posts].file_url;
  781. var URL = "https://danbooru.donmai.us" + end_URL;
  782. if(RegExp("(raikou|hijiribe)\d*\.").test(end_URL))
  783. URL = end_URL;
  784.  
  785. //place url in visible box
  786. urlContainterFunction(URL);
  787.  
  788. /*
  789.  
  790.  
  791. :{id: 3038118, created_at: "2018-03-02T15:27:56.469-05:00", uploader_id: 49091, score: 6,…}
  792. approver_id:null
  793. bit_flags:0
  794. children_ids:null
  795. created_at:"2018-03-02T15:27:56.469-05:00"
  796. down_score:0
  797. fav_count:10
  798. fav_string:"fav:553974 fav:467363 fav:455311 fav:490034 fav:505064 fav:482030 fav:351935 fav:66907 fav:467355 fav:519151"
  799. file_ext:"jpg"
  800. file_size:30492
  801. file_url:"/data/__miyuki_kantai_collection_drawn_by_kumadano__7a12a196cc1aa9f794bca81a2a14bb81.jpg"
  802. has_active_children:false
  803. has_children:false
  804. has_large:false
  805. has_visible_children:false
  806. id:3038118
  807. image_height:800
  808. image_width:450
  809. is_banned:false
  810. is_deleted:false
  811. is_flagged:false
  812. is_note_locked:false
  813. is_pending:false
  814. is_rating_locked:false
  815. is_status_locked:false
  816. large_file_url:"/data/__miyuki_kantai_collection_drawn_by_kumadano__7a12a196cc1aa9f794bca81a2a14bb81.jpg"
  817. last_comment_bumped_at:null
  818. last_commented_at:null
  819. last_noted_at:null
  820. md5:"7a12a196cc1aa9f794bca81a2a14bb81"
  821. parent_id:null
  822. pixiv_id:null
  823. pool_string:""
  824. preview_file_url:"/data/preview/7a12a196cc1aa9f794bca81a2a14bb81.jpg"
  825. rating:"s"
  826. score:6
  827. source:"https://twitter.com/kumadano/status/969629578137251840"
  828. tag_count:28
  829. tag_count_artist:1
  830. tag_count_character:1
  831. tag_count_copyright:1
  832. tag_count_general:24
  833. tag_count_meta:1
  834. tag_string:"1girl black_legwear blue_sailor_collar blue_skirt brown_eyes brown_hair commentary_request full_body grin kantai_collection kumadano miyuki_(kantai_collection) pleated_skirt ribbon sailor_collar school_uniform serafuku short_hair short_sleeves simple_background skirt smile socks solo standing wavy_hair white_background wrists_extended"
  835. tag_string_artist:"kumadano"
  836. tag_string_character:"miyuki_(kantai_collection)"
  837. tag_string_copyright:"kantai_collection"
  838. tag_string_general:"1girl black_legwear blue_sailor_collar blue_skirt brown_eyes brown_hair full_body grin pleated_skirt ribbon sailor_collar school_uniform serafuku short_hair short_sleeves simple_background skirt smile socks solo standing wavy_hair white_background wrists_extended"
  839. tag_string_meta:"commentary_request"
  840. up_score:6
  841. updated_at:"2018-03-03T09:09:32.357-05:00"
  842. uploader_id:49091
  843. uploader_name:"---"
  844.  
  845. */
  846.  
  847. var failed_to_find_required_tags = false;
  848. if(end_URL === undefined ||
  849. end_URL.indexOf(".mp4") > -1 || end_URL.indexOf(".webm") > -1 || end_URL.indexOf(".swf") > -1 || end_URL.indexOf(".zip") > -1){
  850. continue;
  851. }
  852. else{
  853. tags.forEach(function(tag){
  854. //if tag contains an order then whatever
  855. if(tag.indexOf("order:") > -1);
  856. //if it contains a raiting, check the rating character at the seventh index
  857. else if(tag.indexOf("rating:") > -1){
  858. if(tag.charAt(7) !== json_page["" + number_of_posts]["rating"]){
  859. failed_to_find_required_tags = true;
  860. }
  861. }
  862. //otherwise check if the tagstring contains the tags
  863. else if(json_page["" + number_of_posts]["tag_string"].indexOf(tag) == -1){
  864. failed_to_find_required_tags = true;
  865. }
  866. });
  867. }
  868. if(failed_to_find_required_tags){
  869. continue;
  870. }
  871. else{
  872. if(json_page["" + number_of_posts].file_size >= 4000000){
  873. var end_URL = json_page["" + number_of_posts].large_file_url;
  874. var URL = "https://danbooru.donmai.us" + end_URL;
  875. if(RegExp("(raikou|hijiribe)\d*\.").test(end_URL))
  876. URL = end_URL;
  877.  
  878. }
  879. document.getElementById("timer").textContent = "...";
  880. img_URL = URL;
  881. var xhr = new GM_xmlhttpRequest(({
  882. method: "GET",
  883. url: URL,
  884. responseType : "arraybuffer",
  885. onload: function(response)
  886. {
  887. //is it a non existent image?
  888. if(response.response.byteLength <= 387){
  889. alert4ChanX("Image Does Not Exist on Danbooru(404 error)", "error");
  890. }
  891. reset_search_timer_fields();
  892. clearInterval(intervalFunction);
  893. time = time_max;
  894. var counter = document.getElementById("timer");
  895. while(counter.hasChildNodes())
  896. document.getElementById("timer").removeChild(document.getElementById("timer").lastChild);
  897.  
  898. var blob;
  899. if(end_URL.indexOf(".jpg") > -1)
  900. blob = new Blob([response.response], {type:"image/jpeg"});
  901. else if(end_URL.indexOf(".png") > -1)
  902. blob = new Blob([response.response], {type:"image/png"});
  903. else if(end_URL.indexOf(".gif") > -1)
  904. blob = new Blob([response.response], {type:"image/gif"});
  905.  
  906.  
  907. var name = end_URL.replace(/(data|cached)/g, "");
  908. name = name.replace(/\//g, "");
  909.  
  910. //SEND RESULTING RESPONSE TO 4CHANX FILES === QRSetFile
  911. var detail = {file:blob, name:name};
  912. if (typeof cloneInto === 'function') {
  913. detail = cloneInto(detail , document.defaultView);
  914. }
  915. document.dispatchEvent(new CustomEvent('QRSetFile', {bubbles:true, detail}));
  916.  
  917. }
  918. }));
  919. //end function;
  920. image_found = true;
  921. //SET PAGE&POST AS FOUND
  922. previous_images.push([page_number, number_of_posts]);
  923. number_of_posts = 9001;
  924. }
  925. }
  926. if(!image_found){
  927. top_page = page_number;
  928. number_of_attempts--;
  929. setImage();
  930. }
  931. }
  932. };
  933.  
  934. var urlContainterFunction = function(url){
  935. var url_box = document.getElementById("urlContainer");
  936. url_box.value = url;
  937. };
  938.  
  939. var counterFunction = function(){
  940. if(!timeout){
  941. time--;
  942. if(time < 0){
  943. timeout = true;
  944. time = time_max;
  945. }
  946. }
  947. };
  948.  
  949. var getJSON = function(url, callback, extra) {
  950. var xhr = new XMLHttpRequest();
  951. xhr.open('GET', url, true);
  952. xhr.responseType = 'json';
  953. xhr.onload = function() {
  954. var status = xhr.status;
  955. if (status == 200) {
  956. callback(null, xhr.response, extra);
  957. } else {
  958. callback(status);
  959. }
  960. };
  961. xhr.send();
  962. };

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址