bangumi关联条目显示增强

显示条目页面关联条目的完成情况

  1. // ==UserScript==
  2. // @name bangumi关联条目显示增强
  3. // @namespace https://github.com/bangumi/scripts/liaune
  4. // @version 0.4.3
  5. // @description 显示条目页面关联条目的完成情况
  6. // @author Liaune
  7. // @include /^https?:\/\/((bangumi|bgm)\.tv|chii.in)\/subject\/\d+$/
  8. // @grant GM_addStyle
  9. // ==/UserScript==
  10. (function() {
  11. GM_addStyle(`
  12. .rank{
  13. padding: 2px 5px 1px 5px;
  14. background: #b4b020;
  15. color: #FFF;
  16. -webkit-box-shadow: 0 1px 2px #EEE,inset 0 1px 1px #FFF;
  17. -moz-box-shadow: 0 1px 2px #EEE,inset 0 1px 1px #FFF;
  18. box-shadow: 0 1px 2px #EEE,inset 0 1px 1px #FFF;
  19. -moz-border-radius: 4px;
  20. -webkit-border-radius: 4px;
  21. border-radius: 4px
  22. }
  23. .rank_1{
  24. padding: 2px 5px 1px 5px;
  25. background: #15d7b3;
  26. color: #FFF;
  27. -webkit-box-shadow: 0 1px 2px #EEE,inset 0 1px 1px #FFF;
  28. -moz-box-shadow: 0 1px 2px #EEE,inset 0 1px 1px #FFF;
  29. box-shadow: 0 1px 2px #EEE,inset 0 1px 1px #FFF;
  30. -moz-border-radius: 4px;
  31. -webkit-border-radius: 4px;
  32. border-radius: 4px
  33. }
  34. .wish{
  35. border-color: #fd59a9;
  36. border-style: solid;
  37. border-width:2px;
  38. border-radius: 4px
  39. }
  40. .collect{
  41. border-color: #3838e6;
  42. border-style: solid;
  43. border-width:2px;
  44. border-radius: 4px
  45. }
  46. .do{
  47. border-color: #15d748;
  48. border-style: solid;
  49. border-width:2px;
  50. border-radius: 4px
  51. }
  52. .on_hold{
  53. border-color: #f6af45;
  54. border-style: solid;
  55. border-width:2px;
  56. border-radius: 4px
  57. }
  58. .dropped{
  59. border-color: #5a5855;
  60. border-style: solid;
  61. border-width:2px;
  62. border-radius: 4px
  63. }
  64.  
  65. `);
  66. let update=0,count=0;
  67. const itemsList = document.querySelectorAll('#columnSubjectHomeB ul.browserCoverMedium li');
  68. const itemsList2 = document.querySelectorAll('#columnSubjectHomeB ul.coversSmall li');
  69. const TotalItems=itemsList.length + itemsList2.length;
  70.  
  71. //修改柱状图高度
  72. let votes_subject = document.querySelectorAll('.horizontalChart li a .count');
  73. let vote_subject = new Array(); for(i=0;i<votes_subject.length;i++) vote_subject[i]=votes_subject[i].textContent.match(/\d+/)?votes_subject[i].textContent.match(/\d+/)[0]:0;
  74. let largest=0; for(i=0;i<vote_subject.length;i++) {if(parseInt(vote_subject[i])>largest) largest=parseInt(vote_subject[i]);}
  75. for(i=0;i<votes_subject.length;i++){height=parseFloat(parseInt(vote_subject[i])/largest*100).toFixed(2).toString(); votes_subject[i].style.height=height+'%';}
  76.  
  77. //更新缓存数据
  78. const showBtn = document.createElement('a');
  79. showBtn.addEventListener('click', Update);
  80. showBtn.className = 'chiiBtn';
  81. showBtn.href='javascript:;';
  82. showBtn.textContent = '更新';
  83.  
  84. GetInfo(update);
  85.  
  86. function Update(){
  87. count=0;
  88. update=1;
  89. GetInfo(update);
  90. }
  91.  
  92. function GetInfo(update){
  93.  
  94. itemsList.forEach( (elem, index) => {
  95. elem.style.height="150px";
  96. let href = elem.querySelector('a.avatar').href;
  97. let href1 = href.replace(/subject/,"update");
  98. let ID = href.split('/subject/')[1];
  99. if(localStorage.getItem(ID+'Votes') && !update)
  100. DisplayRank(localStorage.getItem(ID+'Rank'),index,1);
  101. else ShowRank(href,index,1);
  102. if(localStorage.getItem(ID+'Interest') && !update)
  103. DisplayCollect(localStorage.getItem(ID+'Interest'),index,1);
  104. else if(localStorage.getItem(ID+'Votes')>20 || !localStorage.getItem(ID+'Votes')) ShowCollect(href1,index,1);
  105. });
  106.  
  107. itemsList2.forEach( (elem, index) => {
  108. elem.style.height="150px";
  109. elem.style.width="82px";
  110. let href = elem.querySelector('a').href;
  111. let href1 = href.replace(/subject/,"update");
  112. let ID = href.split('/subject/')[1];
  113. if(localStorage.getItem(ID+'Votes') && !update)
  114. DisplayRank(localStorage.getItem(ID+'Rank'),index,0);
  115. else ShowRank(href,index,0);
  116. if(localStorage.getItem(ID+'Interest') && !update)
  117. DisplayCollect(localStorage.getItem(ID+'Interest'),index,0);
  118. else if(localStorage.getItem(ID+'Votes')>20 || !localStorage.getItem(ID+'Votes')) ShowCollect(href1,index,0);
  119.  
  120. });
  121. }
  122.  
  123. function ShowCollect(href,index,args){
  124. fetch(href,{credentials: "include"})
  125. .then(data => {
  126. return new Promise(function (resovle, reject) {
  127. let targetStr = data.text();
  128. resovle(targetStr);
  129. });
  130. })
  131. .then(targetStr => {
  132. let Match = targetStr.match(/"GenInterestBox\('(\S+?)'\)" checked="checked"/);
  133. let interest = Match ? Match[1] : null;
  134. let ID = href.split('/update/')[1];
  135. if(Match) localStorage.setItem(ID+'Interest',interest);
  136. if(!update) DisplayCollect(interest,index,args);
  137. else{
  138. count+=1;
  139. showBtn.textContent='更新中... (' + count + '/' + TotalItems +')';
  140. if(count==TotalItems){ location.reload(); showBtn4.textContent='更新完毕!';}
  141. }
  142. });
  143. }
  144.  
  145. function DisplayCollect(interest,index,args){
  146. let avatarNeue,pictureFrameGroup;
  147. if(args) avatarNeue = document.querySelectorAll('#columnSubjectHomeB ul.browserCoverMedium li')[index].querySelector('span.avatarNeue');
  148. else pictureFrameGroup = document.querySelectorAll('#columnSubjectHomeB ul.coversSmall li')[index].querySelector('span.pictureFrameGroup');
  149. if(interest=='wish'){
  150. if(args) avatarNeue.classList.add('wish');
  151. else pictureFrameGroup.classList.add('wish');
  152. }
  153. else if(interest=='collect'){
  154. if(args) avatarNeue.classList.add('collect');
  155. else pictureFrameGroup.classList.add('collect');
  156. }
  157. else if(interest=='do'){
  158. if(args) avatarNeue.classList.add('do');
  159. else pictureFrameGroup.classList.add('do');
  160. }
  161. else if(interest=='on_hold'){
  162. if(args) avatarNeue.classList.add('on_hold');
  163. else pictureFrameGroup.classList.add('on_hold');
  164. }
  165. else if(interest=='dropped'){
  166. if(args) avatarNeue.classList.add('dropped');
  167. else pictureFrameGroup.classList.add('dropped');
  168. }
  169. }
  170.  
  171. function ShowRank(href,index,args){
  172. fetch(href,{credentials: "include"})
  173. .then(data => {
  174. return new Promise(function (resovle, reject) {
  175. let targetStr = data.text();
  176. resovle(targetStr);
  177. });
  178. })
  179. .then(targetStr => {
  180. let canMatch = targetStr.match(/<small class="alarm">#(\S+?)<\/small>/);
  181. let rankNum = canMatch ? parseInt(canMatch[1], 10) : null;
  182. let ID = href.split('/subject/')[1];
  183. if(canMatch) localStorage.setItem(ID+'Rank',rankNum);
  184.  
  185. let Match2 = targetStr.match(/<span property="v:votes">(\S+?)<\/span>/);
  186. let votes = Match2? parseInt(Match2[1]) : null;
  187. if(Match2) localStorage.setItem(ID+'Votes',votes);
  188.  
  189. if(!update) DisplayRank(rankNum,index,args);
  190. else{
  191. showBtn.textContent='更新中... (' + count + '/' + TotalItems +')';
  192. if(count==itemsList.length){ location.reload(); showBtn4.textContent='更新完毕!';}
  193. }
  194. });
  195. }
  196.  
  197. function DisplayRank(rankNum,index,args){
  198. let rankSp = document.createElement('span');
  199. rankSp.className = 'rank';
  200. if (rankNum) {
  201. if(rankNum<=1500) rankSp.classList.add('rank_1');
  202. else rankSp.classList.add('rank');
  203. rankSp.innerHTML = `<small>Rank </small>${rankNum}`;
  204. }
  205. else rankSp.style.display="none";
  206.  
  207. if(args) document.querySelectorAll('#columnSubjectHomeB ul.browserCoverMedium li')[index].append(rankSp);
  208. else document.querySelectorAll('#columnSubjectHomeB ul.coversSmall li')[index].append(rankSp);
  209. count+=1;
  210. if(count==TotalItems && document.querySelector('#columnSubjectHomeB .subject_section .clearit'))
  211. document.querySelector('#columnSubjectHomeB .subject_section .clearit').append(showBtn);
  212. }
  213.  
  214. })();
  215.  

QingJ © 2025

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