🏠 返回首頁 

Greasy Fork is available in English.

Save Danbooru Images to Eagle

Save images from Danbooru to Eagle.


Installer dette script?
  1. // ==UserScript==
  2. // @name Save Danbooru Images to Eagle
  3. // @name:zh 导入 Danbooru 图片到 Eagle
  4. // @name:zh-CN 导入 Danbooru 图片到 Eagle
  5. // @description Save images from Danbooru to Eagle.
  6. // @description:zh 在danbooru网页上添加下载按钮直接导入Eagle,默认同时保存所有标签,若属于pool则会以pool名创建文件夹
  7. // @description:zh-CN 在danbooru网页上添加下载按钮直接导入Eagle,默认同时保存所有标签,若属于pool则会以pool名创建文件夹
  8. // @author miracleXL
  9. // @namespace https://github.com/miracleXL
  10. // @homepageURL https://github.com/miracleXL/scripts-for-Eagle
  11. // @icon https://danbooru.donmai.us/favicon.ico
  12. // @match danbooru.donmai.us/posts/*
  13. // @match safebooru.donmai.us/posts/*
  14. // @match danbooru.donmai.us/pools/*
  15. // @match safebooru.domai.us/pools/*
  16. // @connect danbooru.donmai.us
  17. // @connect safebooru.donmai.us
  18. // @connect localhost
  19. // @grant GM_xmlhttpRequest
  20. // @version 0.1.3
  21. // ==/UserScript==
  22. (function() {
  23. 'use strict';
  24. // Eagle API 服务器位置
  25. const EAGLE_SERVER_URL = "http://localhost:41595";
  26. const EAGLE_IMPORT_API_URL = `${EAGLE_SERVER_URL}/api/item/addFromURL`;
  27. const EAGLE_IMPORT_API_URLS = `${EAGLE_SERVER_URL}/api/item/addFromURLs`;
  28. const EAGLE_CREATE_FOLDER_API_URL = `${EAGLE_SERVER_URL}/api/folder/create`;
  29. const EAGLE_GET_FOLDERS_API_URL = `${EAGLE_SERVER_URL}/api/folder/list`;
  30. // 是否保存标签(true/false)
  31. const saveTags = true;
  32. let mode = document.URL.split("/")[3];
  33. function addButton(){
  34. let button = document.createElement("button");
  35. button.className = "ui-button ui-widget ui-corner-all";
  36. if(mode === "posts"){
  37. button.innerText = "下载";
  38. let buttons_div = document.getElementsByClassName("fav-buttons")[0];
  39. buttons_div.firstElementChild.style.display = "inline";
  40. buttons_div.appendChild(button);
  41. //绑定下载事件
  42. button.addEventListener("click",async ()=>{
  43. let [data,pool] = getImageData();
  44. if(pool){
  45. let folderId = await getFolderId(pool);
  46. if(folderId){
  47. data.folderId = folderId;
  48. }
  49. }
  50. // console.log(data);
  51. download(data);
  52. })
  53. }
  54. else{
  55. button.innerText = "下载当前页全部";
  56. let buttonPos = document.getElementById("description");
  57. buttonPos.appendChild(button);
  58. //绑定下载事件
  59. button.addEventListener("click",async ()=>{
  60. let [data,pool] = getPoolData();
  61. if(pool){
  62. let folderId = await getFolderId(pool);
  63. if(folderId){
  64. data.folderId = folderId;
  65. }
  66. }
  67. // console.log(data);
  68. downloadAll(data);
  69. })
  70. }
  71. }
  72. addButton();
  73. function download(data){
  74. GM_xmlhttpRequest({
  75. url: EAGLE_IMPORT_API_URL,
  76. method: "POST",
  77. data: JSON.stringify(data),
  78. onload: function(response) {
  79. if(response.statusText !== "OK"){
  80. console.log(response);
  81. alert("下载失败!")
  82. }
  83. }
  84. });
  85. }
  86. function downloadAll(data){
  87. GM_xmlhttpRequest({
  88. url: EAGLE_IMPORT_API_URLS,
  89. method: "POST",
  90. data: JSON.stringify(data),
  91. onload: function(response) {
  92. if(response.statusText !== "OK"){
  93. alert("请检查eagle是否打开!");
  94. console.log("下载失败!")
  95. }
  96. }
  97. });
  98. }
  99. function getImageData(){
  100. let name = document.getElementById("original-artist-commentary");
  101. if(name){
  102. name = name.firstElementChild.textContent;
  103. }
  104. else{
  105. let pool = document.getElementsByClassName("pool-name")[0]
  106. if(pool){
  107. pool = pool.firstElementChild;
  108. var poolname = pool.textContent.replace("Pool: ","");
  109. name = pool + " " + pool.title;
  110. }
  111. else{
  112. name = document.title;
  113. }
  114. }
  115. let website = document.getElementById("post-info-source").firstElementChild?.href;
  116. let data = {
  117. "url": document.getElementById("post-option-view-original").firstElementChild.href,
  118. "name": name,
  119. "website": website ? website : document.URL,
  120. "tags": [],
  121. "headers": {
  122. "referer" : document.URL
  123. }
  124. };
  125. if(saveTags){
  126. for(let tag of document.getElementsByClassName("search-tag")){
  127. data.tags.push(tag.textContent);
  128. };
  129. }
  130. return [data,poolname];
  131. };
  132. function getPoolData(){
  133. try{
  134. var name = document.getElementsByClassName("pool-category-series")[0].textContent;
  135. }catch(e){
  136. name = document.title;
  137. console.log(e);
  138. }
  139. let data = {
  140. "items":[]
  141. };
  142. let count = 0;
  143. for(let article of document.getElementsByTagName("article")){
  144. let item = {
  145. "url": article.getAttribute("data-file-url"),
  146. "name": name + "_" + count,
  147. "website": article.getAttribute("data-normalized-source"),
  148. "tags": saveTags ? article.getAttribute("data-tags").split(" ") : [],
  149. "headers": {
  150. "referer" : document.URL
  151. }
  152. };
  153. data.items.push(item);
  154. }
  155. return [data,name];
  156. }
  157. // 获取文件夹id
  158. async function getFolderId(pool){
  159. let folders = await getFolders();
  160. let dlFolder;
  161. if(folders){
  162. for(let folder of folders){
  163. if(folder.name === pool){
  164. dlFolder = folder;
  165. }
  166. }
  167. if(dlFolder === undefined) dlFolder = await creatFolder(pool);
  168. }
  169. else{
  170. console.log("获取文件夹信息失败!");
  171. alert("下载失败!");
  172. return;
  173. }
  174. return dlFolder.id;
  175. }
  176. // 获取文件夹
  177. function getFolders(){
  178. return new Promise((resolve, reject) => {
  179. GM_xmlhttpRequest({
  180. url: EAGLE_GET_FOLDERS_API_URL,
  181. method: "GET",
  182. redirect:'follow',
  183. onload: function(response) {
  184. if(response.status !== 200){
  185. reject();
  186. }
  187. resolve(JSON.parse(response.response).data);
  188. }
  189. });
  190. })
  191. }
  192. // 创建文件夹
  193. function creatFolder(folderName){
  194. return new Promise((resolve, reject) => {
  195. GM_xmlhttpRequest({
  196. url: EAGLE_CREATE_FOLDER_API_URL,
  197. method: "POST",
  198. data: JSON.stringify({ folderName: folderName }),
  199. onload: function(response) {
  200. var r###lt = JSON.parse(response.response);
  201. if (r###lt.status === "success" && r###lt.data && r###lt.data.id) {
  202. return resolve(r###lt.data);
  203. }
  204. else{
  205. return reject();
  206. }
  207. }
  208. })
  209. })
  210. }
  211. })();