PickTrueBrowser

A tool to get meta info form ArtStation within browser to provide downloading service.

  1. // ==UserScript==
  2. // @name PickTrueBrowser
  3. // @author winkidney@gmail.com
  4. // @version 0.0.4
  5. // @namespace tools
  6. // @description A tool to get meta info form ArtStation within browser to provide downloading service.
  7. // @match *://*/*
  8. // @grant GM_xmlhttpRequest
  9. // @require https://code.jquery.com/jquery-1.12.4.min.js
  10. // @run-at context-menu
  11. // ==/UserScript==
  12. let utils = {
  13. isFirefox: function () {
  14. return (navigator.userAgent.indexOf("Firefox") !== -1)
  15. },
  16. isChrome: function () {
  17. return (navigator.userAgent.indexOf("Chrome") !== -1)
  18. }
  19. };
  20.  
  21. let logger = {
  22. info: function(...args) {
  23. console.log("[PickTrue]: ", ...args);
  24. }
  25. };
  26.  
  27. let BrowserClient = function () {
  28. function fetchUrl(url, callback) {
  29. logger.info("Fetching url:", url);
  30. return $.get(url, callback);
  31. }
  32. return {
  33. fetchUrl: fetchUrl,
  34. }
  35. };
  36.  
  37. let RequestProxy = function () {
  38. let client = BrowserClient();
  39.  
  40. function submitTask(request_url, respData, callback) {
  41. logger.info("Submit response:", respData);
  42. let request_data = JSON.stringify(respData);
  43. let data = JSON.stringify(
  44. {
  45. request_url: request_url,
  46. response: request_data
  47. }
  48. )
  49.  
  50. let details = {
  51. url: "http://localhost:2333/tasks/submit/",
  52. data: data,
  53. method: "POST",
  54. onloadend: function (data) {
  55. logger.info("Submit response done: ", data);
  56. callback()
  57. },
  58. };
  59. return GM_xmlhttpRequest(details);
  60. }
  61. function getTask() {
  62. let details = {
  63. url: "http://localhost:2333/tasks/",
  64. method: "GET",
  65. onloadend: function (resp) {
  66. logger.info("Get task: ", resp);
  67. let data = JSON.parse(resp.responseText);
  68. if (data.length <= 0){
  69. return getTask()
  70. } else {
  71. client.fetchUrl(
  72. data[0],
  73. function (respData) {
  74. submitTask(data[0], respData, getTask)
  75. },
  76. )
  77. }
  78. },
  79. };
  80. return GM_xmlhttpRequest(details);
  81. }
  82. return {
  83. getTask: getTask,
  84. submitTask: submitTask,
  85. };
  86. };
  87.  
  88. function entry() {
  89. alert("请确保已经启动了PickTrue客户端。将要解析当前用户的所有图集并将下载地址发送PickTrue下载器,确认后将立即开始。");
  90. let proxy = RequestProxy();
  91. proxy.getTask();
  92. }
  93.  
  94. function _setUpContextMenuFirefox(entryFn) {
  95. var menu = document.body.appendChild(document.createElement("menu"));
  96. var html = document.documentElement;
  97. if (html.hasAttribute("contextmenu")) {
  98. // We don't want to override web page context menu if any
  99. var contextmenu = $("#" + html.getAttribute("contextmenu"));
  100. contextmenu[0].appendChild(menu); // Append to web page context menu
  101. } else {
  102. html.setAttribute("contextmenu", "userscript-picktrue-context-menu");
  103. }
  104.  
  105. menu.outerHTML = '<menu id="userscript-picktrue-context-menu"\
  106. type="context">\
  107. <menuitem id="userscript-picktrue-menuitem"\
  108. label="发送相册到PickTrue并下载">\
  109. </menuitem>\
  110. </menu>';
  111.  
  112. if ("contextMenu" in html && "HTMLMenuItemElement" in window) {
  113. var menuitem = $("#userscript-picktrue-menuitem")[0];
  114. menuitem.addEventListener("click", entryFn, false);
  115. }
  116. }
  117.  
  118. function _setUpContextMenuChrome(entryFn) {
  119. $(document).on("contextmenu", function (e) {
  120. if (e.ctrlKey){
  121. entryFn()
  122. }
  123. });
  124. }
  125.  
  126. function setUpContextMenu(entryFn) {
  127. if (utils.isFirefox()) {
  128. _setUpContextMenuFirefox(entryFn);
  129. } else if (utils.isChrome()) {
  130. _setUpContextMenuChrome(entryFn);
  131. } else {
  132. alert("Unsupported browser " + navigator.userAgent);
  133. }
  134. }
  135.  
  136. setUpContextMenu(entry);