Bangumi Autoshow Tags

在条目收藏列表显示条目的常用标签,双击标签栏可以修改。在右边显示标签统计,点击标签可在列表上方显示相应的条目

目前為 2018-01-03 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name Bangumi Autoshow Tags
  3. // @namespace https://github.com/bangumi/scripts/liaune
  4. // @version 0.3.1
  5. // @description 在条目收藏列表显示条目的常用标签,双击标签栏可以修改。在右边显示标签统计,点击标签可在列表上方显示相应的条目
  6. // @author Liaune
  7. // @include /^https?://(bangumi\.tv|bgm\.tv|chii\.in)\/\S+\/list\/.*
  8. // @grant GM_addStyle
  9. // ==/UserScript==
  10.  
  11. (function() {
  12. GM_addStyle(`
  13. `);
  14. let itemsList,TagsAll=[],JsonTags = {},AllTags=[],count=0,update=0;
  15. const showBtn0 = document.createElement('a');
  16. showBtn0.addEventListener('click', ShowProcess);
  17. showBtn0.className = 'chiiBtn';
  18. showBtn0.href='javascript:;';
  19. showBtn0.textContent = 'Show Tags';
  20. document.querySelector('#browserTools').append(showBtn0);
  21.  
  22. //更新缓存数据
  23. const showBtn4 = document.createElement('a');
  24. showBtn4.addEventListener('click', Update);
  25. showBtn4.className = 'chiiBtn';
  26. showBtn4.href='javascript:;';
  27. showBtn4.textContent = '更新Tags';
  28.  
  29. const User =window.location.href.match(/\/list\/(\S+)\//)? window.location.href.match(/\/list\/(\S+)\//)[1]: null;
  30.  
  31. function Update(){
  32. update=1;
  33. count=0;
  34. itemsList = document.querySelectorAll('#browserItemList li.item');
  35. itemsList.forEach( (elem, index) => {
  36. let href = elem.querySelector('a.subjectCover').href;
  37. let ID = href.split('/subject/')[1];
  38. FetchStatus(href,elem);
  39. });
  40. }
  41.  
  42. //Main Program
  43. function ShowProcess(){
  44. $(showBtn0).hide();
  45. itemsList = document.querySelectorAll('#browserItemList li.item');
  46. itemsList.forEach( (elem, index) => {
  47. let href = elem.querySelector('a.subjectCover').href;
  48. let ID = href.split('/subject/')[1];
  49. //为每个条目添加单独刷新
  50. let showBtn_Re = document.createElement('a');
  51. showBtn_Re.className = 'l';
  52. showBtn_Re.href='javascript:;';
  53. showBtn_Re.textContent = '↺';
  54. showBtn_Re.addEventListener('click', FetchStatus.bind(this,href,elem),false);
  55. elem.querySelector('.inner h3').appendChild(showBtn_Re);
  56.  
  57. if(localStorage.getItem('Subject'+ID+'Tags')){
  58. let info = {"Tags": localStorage.getItem('Subject'+ID+'Tags')};
  59. DisplayStatus(elem,info);
  60. }
  61. else
  62. FetchStatus(href,elem);
  63.  
  64. });
  65. }
  66.  
  67. function FetchStatus(href,elem){
  68. fetch(href,{credentials: "include"})
  69. .then(data => {
  70. return new Promise(function (resovle, reject) {
  71. let targetStr = data.text();
  72. resovle(targetStr);
  73. });
  74. })
  75. .then(targetStr => {
  76. let ID = href.split('/subject/')[1];
  77. //获取Tag
  78. let TagMatch = targetStr.match(/<a href="#;" class="btnGray" onclick="chiiLib.subject.addTag(\S+)<\/a>/g);
  79. if(TagMatch){
  80. let Tags=[];
  81. for(i=0;i<Math.min(10,TagMatch.length-15);i++){
  82. Tags[i] = TagMatch[i].match(/<a href="#;" class="btnGray" onclick="chiiLib.subject.addTag(\S+)">(\S+)<\/a>/)? TagMatch[i].match(/<a href="#;" class="btnGray" onclick="chiiLib.subject.addTag(\S+)">(\S+)<\/a>/)[2]:'';
  83. }
  84. localStorage.setItem('Subject'+ID+'Tags',JSON.stringify(Tags));
  85. let info = {"Tags": JSON.stringify(Tags)};
  86. DisplayStatus(elem,info);
  87. if(update){
  88. showBtn4.textContent='更新中... (' + count + '/' + itemsList.length +')';
  89. if(count==itemsList.length){ showBtn4.textContent='更新完毕!';}
  90. }
  91. }
  92.  
  93. });
  94. }
  95.  
  96. function DisplayStatus(elem,info){
  97. let href = elem.querySelector('a.subjectCover').href;
  98. let ID = href.split('/subject/')[1];
  99. let Tags = JSON.parse(info.Tags);
  100. TagsAll = TagsAll.concat(Tags);
  101. let DivTags = document.createElement('div');
  102. DivTags.id = "DivTags";
  103.  
  104. for(i=0;i<Tags.length;i++){
  105. let Atags = document.createElement('a');
  106. Atags.href = "/anime/tag/"+Tags[i];
  107. Atags.className = 'l';
  108. if(i==Tags.length-1) Atags.innerHTML=Tags[i];
  109. else Atags.innerHTML=Tags[i]+"&nbsp;&nbsp;";
  110. DivTags.appendChild(Atags);
  111. }
  112. if(elem.querySelector('#DivTags')) $(elem.querySelector('#DivTags')).remove();
  113. $(DivTags).insertAfter(elem.querySelector('.inner .collectInfo'));
  114. DivTags.addEventListener('dblclick', function (){
  115. DivTags.contentEditable = true;
  116. });
  117. DivTags.addEventListener('blur', function (){
  118. let Tags = DivTags.textContent.split("  ");
  119. localStorage.setItem('Subject'+ID+'Tags',JSON.stringify(Tags));
  120.  
  121. });
  122. function sortup(x,y){
  123. return y.Value - x.Value;
  124. }
  125. count+=1;
  126. if(count==itemsList.length){
  127. document.querySelector('#browserTools').append(showBtn4);
  128. for (i = 0; i < TagsAll.length; i++) {
  129. JsonTags[TagsAll[i]] = (JsonTags[TagsAll[i]] + 1) || 1;
  130. }
  131. for (var key in JsonTags){
  132. let temp_tag = {TagName:key,Value:JsonTags[key]};
  133. AllTags.push(temp_tag);
  134. }
  135. AllTags.sort(sortup);
  136. ShowSidePanel(AllTags);
  137. //console.log(AllTags);
  138. }
  139.  
  140. }
  141.  
  142. function ShowSidePanel(AllTags){
  143. let SimpleSidePanel = document.createElement('div');
  144. SimpleSidePanel.className = "SimpleSidePanel";
  145. SimpleSidePanel.style.width = "190px";
  146. $(SimpleSidePanel).append($("<h2>标签统计</h2>"));
  147. let tagList = document.createElement('ul');
  148. tagList.className = "tagList";
  149. for(i=0; i<Math.min(50,AllTags.length); i++){
  150. let tagli = document.createElement('li');
  151. let taglia = document.createElement('a');
  152. taglia.href='javascript:;';
  153. taglia.addEventListener('click', ShowThisTag.bind(this,AllTags[i].TagName),false);
  154. taglia.textContent = AllTags[i].TagName;
  155. $(taglia).append(`<small>${AllTags[i].Value}</small>`);
  156. tagli.appendChild(taglia);
  157. tagList.appendChild(tagli);
  158. }
  159. $(SimpleSidePanel).append($(tagList));
  160. let showmoreTags = document.createElement('a');
  161. showmoreTags.href='javascript:;';
  162. showmoreTags.textContent = '/ 展开全部标签';
  163. showmoreTags.addEventListener('click', ShowmoreTags);
  164. $(SimpleSidePanel).append($(showmoreTags));
  165. function ShowmoreTags(){
  166. $(showmoreTags).hide();
  167. for(i=Math.min(50,AllTags.length); i<AllTags.length; i++){
  168. let tagli = document.createElement('li');
  169. let taglia = document.createElement('a');
  170. taglia.href='javascript:;';
  171. taglia.addEventListener('click', ShowThisTag.bind(this,AllTags[i].TagName),false);
  172. taglia.textContent = AllTags[i].TagName;
  173. $(taglia).append(`<small>${AllTags[i].Value}</small>`);
  174. tagli.appendChild(taglia);
  175. tagList.appendChild(tagli);
  176. }
  177. }
  178. document.querySelector('#columnSubjectBrowserB').insertBefore(SimpleSidePanel,document.querySelector('#columnSubjectBrowserB .SimpleSidePanel'));
  179. $(document.querySelectorAll('#columnSubjectBrowserB .SimpleSidePanel')[1]).hide();
  180. }
  181.  
  182. function ShowThisTag(TagName){
  183. itemsList = document.querySelectorAll('#browserItemList li.item');
  184. let count_t = 0;
  185. itemsList.forEach( (elem, index) => {
  186.  
  187. elem.style.border="none";
  188. let TagsList = elem.querySelector('#DivTags').textContent.split("  ");
  189. if (TagsList.includes(TagName)) {
  190. if(count_t %2 == 0) elem.setAttribute('class', 'item odd clearit');
  191. else elem.setAttribute('class', 'item even clearit');
  192. elem.style.border="1px solid #5ebee3";
  193. document.querySelector('#browserItemList').insertBefore(elem,document.querySelector('#browserItemList li.item'));
  194. count_t+=1;
  195. }
  196. });
  197. scrollTo(100,100);
  198. }
  199.  
  200. })();

QingJ © 2025

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