AniList - Activity Assistant

Script that speeds up Activity Making

当前为 2022-04-30 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name AniList - Activity Assistant
  3. // @namespace https://www.youtube.com/c/NurarihyonMaou/
  4. // @version 1.0
  5. // @description Script that speeds up Activity Making
  6. // @author NurarihyonMaou
  7. // @match https://anilist.co/*
  8. // @icon https://www.google.com/s2/favicons?sz=64&domain=anilist.co
  9. // @require https://code.jquery.com/jquery-3.6.0.js
  10. // @require https://code.jquery.com/ui/1.13.1/jquery-ui.js
  11. // @resource IMPORTED_CSS https://code.jquery.com/ui/1.13.1/themes/base/jquery-ui.css
  12. // @grant GM_getResourceText
  13. // @grant GM_addStyle
  14. // ==/UserScript==
  15.  
  16. const $ = window.jQuery;
  17. const x_csrf_token = $("head script:contains('window.al_token')").text().split(/[“"”]+/g)[1];
  18.  
  19. const imported_CSS = GM_getResourceText("IMPORTED_CSS");
  20. const list_Style = 'ul.ui-autocomplete { background-color: rgb(21, 31, 46); color: RGB(159,173,189); }';
  21. const category_Style = '.ui-autocomplete-category { font-weight: bold; padding: .2em .4em; margin: .8em 0 .2em;line-height: 1.5;}';
  22.  
  23. GM_addStyle(list_Style);
  24. GM_addStyle(imported_CSS);
  25. GM_addStyle(category_Style);
  26.  
  27. let textArea;
  28. let autoComplete = [], selectedEntries = [];
  29. let allWords, currentWord, lastSearched, terms;
  30.  
  31. (function init() {
  32. textArea = document.getElementsByClassName("el-textarea__inner");
  33.  
  34. if (textArea.length > 0) {
  35.  
  36. $(textArea).after('<input type="hidden" id="testArea">');
  37.  
  38. function searchQuery(word) {
  39. var query = `
  40. query($search:String,$isAdult:Boolean){anime:Page(perPage:8){pageInfo{total}results:media(type:ANIME,isAdult:$isAdult,search:$search){id title{userPreferred}coverImage{medium}type format bannerImage isLicensed startDate{year}}}manga:Page(perPage:8){pageInfo{total}results:media(type:MANGA,isAdult:$isAdult,search:$search){id title{userPreferred}coverImage{medium}type format bannerImage isLicensed startDate{year}}}characters:Page(perPage:8){pageInfo{total}results:characters(search:$search){id name{userPreferred}image{medium}}}staff:Page(perPage:8){pageInfo{total}results:staff(search:$search){id primaryOccupations name{userPreferred}image{medium}}}studios:Page(perPage:13){pageInfo{total}results:studios(search:$search){id name}}users:Page(perPage:8){results:users(search:$search){id name avatar{medium}}}}
  41. `;
  42.  
  43. var variables = {
  44. search: word
  45. };
  46.  
  47. var url = 'https://anilist.co/graphql',
  48. options = {
  49. method: 'POST',
  50. headers: {
  51. 'Content-Type': 'application/json',
  52. 'Accept': 'application/json',
  53. "x-csrf-token": x_csrf_token
  54. },
  55. body: JSON.stringify({
  56. query: query,
  57. variables: variables
  58. })
  59. };
  60.  
  61. fetch(url, options).then(handleResponse)
  62. .then(handleData)
  63. .catch(handleError);
  64.  
  65. function handleResponse(response) {
  66. return response.json().then(function (json) {
  67. return response.ok ? json : Promise.reject(json);
  68. });
  69. }
  70.  
  71. function handleData(data) {
  72.  
  73. autoComplete = [];
  74.  
  75. $.each(data.data.anime.results, function (index, element) {
  76. autoComplete.push({ 'value': 'https://anilist.co/anime/' + element.id, 'label': element.title.userPreferred, 'category': 'Anime' });
  77. });
  78.  
  79. $.each(data.data.manga.results, function (index, element) {
  80. autoComplete.push({ 'value': 'https://anilist.co/manga/' + element.id, 'label': element.title.userPreferred, 'category': 'Manga' });
  81. });
  82.  
  83. $.each(data.data.characters.results, function (index, element) {
  84. autoComplete.push({ 'value': '[' + element.name.userPreferred + '](https://anilist.co/character/' + element.id + ")", 'label': element.name.userPreferred, 'category': 'Characters' });
  85. });
  86.  
  87. $.each(data.data.staff.results, function (index, element) {
  88. autoComplete.push({ 'value': '[' + element.name.userPreferred + '](https://anilist.co/staff/' + element.id + ")", 'label': element.name.userPreferred, 'category': 'Staff' });
  89. });
  90.  
  91. $.each(data.data.users.results, function (index, element) {
  92. autoComplete.push({ 'value': '@' + element.name, 'label': element.name, 'category': 'Users' });
  93. });
  94.  
  95. $.each(data.data.studios.results, function (index, element) {
  96. autoComplete.push({ 'value': '[' + element.name + '](https://anilist.co/studio/' + element.id + ")", 'label': element.name, 'category': 'Studios' });
  97. });
  98.  
  99. }
  100.  
  101. function handleError(error) {
  102. alert('Error, check console');
  103. console.error(error);
  104. }
  105. }
  106.  
  107. $.widget("custom.catcomplete", $.ui.autocomplete, {
  108. _create: function () {
  109. this._super();
  110. this.widget().menu("option", "items", "> :not(.ui-autocomplete-category)");
  111. },
  112. _renderMenu: function (ul, items) {
  113. var that = this,
  114. currentCategory = "";
  115. $.each(items, function (index, item) {
  116. var li;
  117. if (item.category != currentCategory) {
  118. ul.append("<li class='ui-autocomplete-category'>" + item.category + "</li>");
  119. currentCategory = item.category;
  120. }
  121. li = that._renderItemData(ul, item);
  122. if (item.category) {
  123. li.attr("aria-label", item.category + " : " + item.label);
  124. }
  125. });
  126. }
  127. });
  128.  
  129. $(textArea).on('input', function () {
  130. allWords = $(this).val().split(' ');
  131. currentWord = allWords[allWords.length - 1];
  132. if (currentWord.length > 2 && lastSearched != currentWord) {
  133. searchQuery(currentWord);
  134. lastSearched = currentWord;
  135. }
  136. });
  137.  
  138. function split(val) {
  139. return val.split(/ \s*/);
  140. }
  141.  
  142. function extractLast(term) {
  143. return split(term).pop();
  144. }
  145.  
  146. $(textArea).catcomplete({
  147. delay: 500,
  148. minLength: 3,
  149. source: function (request, response) {
  150. response($.ui.autocomplete.filter(
  151. autoComplete, extractLast(request.term)));
  152. },
  153. focus: function () {
  154. return false;
  155. },
  156. select: function (event, ui) {
  157. terms = split(this.value);
  158. terms.pop();
  159. terms.push(ui.item.value);
  160. terms.push("");
  161. this.value = terms.join(" ");
  162. selectedEntries.push(ui.item.label);
  163. autoComplete = [];
  164. return false;
  165. }
  166. });
  167.  
  168. } else {
  169. setTimeout(init, 0);
  170. }
  171. })();