Danbooru Tags Select to Export (EDITED)

Select specified tags and copy to clipboard, for Stable Diffusion WebUI or NovelAI to use.

  1. // ==UserScript==
  2. // @name Danbooru Tags Select to Export (EDITED)
  3. // @version 0.2.12
  4. // @description Select specified tags and copy to clipboard, for Stable Diffusion WebUI or NovelAI to use.
  5. // @author FSpark/ScriptAnon
  6. // @require https://code.jquery.com/jquery-3.6.1.min.js
  7. // @match https://gelbooru.com/index.php?page=post&s=view&id=*
  8. // @match https://danbooru.donmai.us/posts/*
  9. // @match https://e621.net/posts/*
  10. // @match https://rule34.xxx/index.php?page=post&s=view&id=*
  11. // @match https://rule34.paheal.net/post/view/*
  12. // @match https://furry.booru.org/index.php?page=post&s=view&id=*
  13. // @match https://e926.net/posts/*
  14. // @match https://booru.allthefallen.moe/posts/*
  15. // @match https://tbib.org/index.php?page=post&s=view&id=*
  16. // @match https://aibooru.online/posts/*
  17. // @match https://lolibooru.moe/post/show/*
  18. // @grant GM_setClipboard
  19. // @grant GM_notification
  20. // @license AGPL-3.0/MIT
  21. // @namespace https://greasyfork.org/users/972837
  22. // ==/UserScript==
  23.  
  24. (function () {
  25. 'use strict';
  26.  
  27. let Container = document.createElement('div');
  28. Container.id = "tags-exporter-container";
  29. Container.innerHTML =`<button id="select_all">Select All</button>
  30. <button id="select_none">Select None</button>
  31. <button id="invert_select">Invert Select</button>
  32. <button id="export">Export</button>
  33. `;
  34.  
  35. function insertAfter(newNode, referenceNode) {
  36. referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
  37. }
  38.  
  39. let hot_key = "`"; // edit to change hotkey
  40. let remove_commas = false; // set to false to include commas
  41. let remove_underscores = true; // set to false to include underscore
  42. let remove_parentheses = true; // set to false to include parentheses
  43.  
  44. if (window.location.href.includes("/danbooru.donmai.us") || window.location.href.includes("/aibooru.online") || window.location.href.includes("/booru.allthefallen.moe"))
  45. {
  46. get_dan_tags();
  47. }
  48.  
  49. if (window.location.href.includes("/gelbooru.com"))
  50. {
  51. get_gel_tags();
  52. }
  53.  
  54. if (window.location.href.includes("/e621.net"))
  55. {
  56. get_e621_tags();
  57. }
  58.  
  59. if (window.location.href.includes("/e926.net"))
  60. {
  61. get_e926_tags();
  62. }
  63.  
  64. if (window.location.href.includes("/rule34.paheal.net"))
  65. {
  66. get_rule34paheal_tags();
  67. }
  68.  
  69. if (window.location.href.includes("/rule34.xxx")||(window.location.href.includes("/lolibooru.moe")))
  70. {
  71. get_rule34xxx_tags();
  72. };
  73.  
  74. if (window.location.href.includes("/furry.booru.org")||(window.location.href.includes("/tbib.org")))
  75. {
  76. get_furrybooru_tags();
  77. }
  78. function get_gel_tags() {
  79. insertAfter( Container, document.querySelector("#container > section"));
  80. let elms = ["tag-type-general", "tag-type-character", "tag-type-metadata", "tag-type-artist", "tag-type-copyright"];
  81. elms.forEach(tag => {
  82. Array.from(document.getElementsByClassName(tag)).forEach(e => {
  83. let chk = document.createElement('input');
  84. chk.type="checkbox";
  85. chk.name="general-tags";
  86. chk.value=e.children[1].textContent.replaceAll("_"," ");
  87. e.insertBefore(chk,e.children[0]);
  88. })
  89. });
  90. }
  91.  
  92. function get_dan_tags() {
  93. insertAfter( Container, document.querySelector("#tag-list"));
  94. let elms = ["general-tag-list", "character-tag-list", "meta-tag-list", "artist-tag-list", "copyright-tag-list"];
  95. elms.forEach(tag => {
  96. Array.from(document.getElementsByClassName(tag)).forEach(e => {
  97. if (e.tagName == "UL") {
  98. Array.from(e.getElementsByClassName("search-tag")).forEach(s => {
  99. let chk = document.createElement('input');
  100. chk.type="checkbox";
  101. chk.name="general-tags";
  102. console.log(s.parentNode);
  103. console.log(s.parentNode.dataset);
  104. chk.value=s.parentNode.dataset.tagName.replaceAll("_"," ");
  105. s.parentNode.insertBefore(chk,s.parentNode.firstChild);
  106. })
  107. }
  108. })
  109. });
  110. }
  111.  
  112. function get_e621_tags() {
  113. insertAfter( Container, document.querySelector("#tag-list"));
  114. let elms = ["artist-tag-list", "species-tag-list", "general-tag-list"];
  115. let iprompt = [];
  116. elms.forEach(tag => {
  117. Array.from(document.getElementsByClassName(tag)).forEach(e => {
  118. if (e.tagName == "UL") {
  119. Array.from(e.getElementsByClassName("search-tag")).forEach(s => {
  120.  
  121. let chk = document.createElement('input');
  122. chk.type="checkbox";
  123. chk.name="general-tags";
  124. chk.value=s.textContent.replaceAll("_"," ");
  125. s.parentNode.insertBefore(chk,s.parentNode.firstChild);
  126. })
  127. }
  128. })
  129. });
  130. }
  131.  
  132. function get_e926_tags() {
  133. insertAfter( Container, document.querySelector("#tag-list"));
  134. let elms = ["artist-tag-list", "copyright-tag-list", "character-tag-list", "species-tag-list", "general-tag-list","lore-tag-list"];
  135. let iprompt = [];
  136. elms.forEach(tag => {
  137. Array.from(document.getElementsByClassName(tag)).forEach(e => {
  138. if (e.tagName == "UL") {
  139. Array.from(e.getElementsByClassName("search-tag")).forEach(s => {
  140. let chk = document.createElement('input');
  141. chk.type="checkbox";
  142. chk.name="general-tags";
  143. chk.value=s.textContent.replaceAll("_"," ");
  144. s.parentNode.insertBefore(chk,s.parentNode.firstChild);
  145. })
  146. }
  147. })
  148. });
  149. }
  150.  
  151. function get_rule34paheal_tags() {
  152. insertAfter( Container, document.querySelector("#Post_Controlsleft > h3"));
  153. let elms = ["tag_name_cell"];
  154. elms.forEach(tag => {
  155. Array.from(document.getElementsByClassName(tag)).forEach(e => {
  156. Array.from(e.getElementsByClassName("tag_name")).forEach(s => {
  157. let elm = s.parentNode.parentNode.firstChild;
  158. let chk = document.createElement('input');
  159. chk.type="checkbox";
  160. chk.name="general-tags";
  161. chk.value=s.textContent.replaceAll("_"," ");
  162. s.parentNode.parentNode.insertBefore(chk,elm);
  163. })
  164. })
  165. });
  166. }
  167.  
  168. function get_furrybooru_tags() {
  169. insertAfter( Container, document.querySelector("#tag-sidebar"));
  170. let elms = ["tag-type-general", "tag-type-character", "tag-type-metadata", "tag-type-artist", "tag-type-copyright"];
  171. elms.forEach(tag => {
  172. Array.from(document.getElementsByClassName(tag)).forEach(e => {
  173. //console.log(e);
  174. let chk = document.createElement('input');
  175. chk.type="checkbox";
  176. chk.name="general-tags";
  177. console.log(e.children[0].textContent);
  178. chk.value=e.children[0].textContent.replaceAll("_"," ");
  179. e.insertBefore(chk,e.children[0]);
  180. })
  181. });
  182. }
  183. function get_rule34xxx_tags() {
  184. let elm = document.getElementById("tag-sidebar");
  185. let pattern = /(^\d)|(\s)|([[A-Za-z])/g;
  186. let iprompt = [];
  187. insertAfter( Container, elm);
  188. let children = elm.children;
  189. Array.from(children).forEach(li => {
  190. console.log(li);
  191.  
  192. if (li.innerText == "Character" || li.innerText == "Artist" || li.innerText == "General")
  193. {
  194. } else
  195. {
  196. var tag = li.innerText.replace("?", "").trim();
  197. var tagarray = tag.match(pattern).toString().replaceAll(",", "").trim();
  198. let chk = document.createElement('input');
  199. chk.type="checkbox";
  200. chk.name="general-tags";
  201. chk.value=tagarray.replaceAll("_"," ");
  202. li.insertBefore(chk,li.firstChild)
  203. }
  204. });
  205. }
  206.  
  207. document.getElementById("select_all").onclick=function(){
  208. var items=document.getElementsByName("general-tags");
  209. for(var i=0;i<items.length;i++){
  210. items[i].checked=true;
  211.  
  212. }
  213. };
  214.  
  215. document.getElementById("select_none").onclick=function(){
  216. var items=document.getElementsByName("general-tags");
  217. for(var i=0;i<items.length;i++){
  218. items[i].checked=false;
  219.  
  220. }
  221. };
  222.  
  223. document.getElementById("invert_select").onclick=function(){
  224. var items=document.getElementsByName("general-tags");
  225. for(var i=0;i<items.length;i++){
  226. items[i].checked==true?items[i].checked=false:items[i].checked=true;
  227.  
  228. }
  229. };
  230.  
  231. document.getElementById("export").onclick=function(){
  232. let tags=[]
  233. document.querySelectorAll("[name='general-tags']:checked").forEach((e)=>{tags.push(e.value)})
  234. let res=tags.join(", ")
  235. GM_setClipboard(res)
  236. GM_notification(`${tags.length} tag(s) were copied.`,"Danbooru Tags Exporter")
  237. };
  238.  
  239. })();