// ==UserScript==
// @name Bangumi Autoshow Tags
// @namespace https://github.com/bangumi/scripts/liaune
// @version 0.3.1
// @description 在条目收藏列表显示条目的常用标签,双击标签栏可以修改。在右边显示标签统计,点击标签可在列表上方显示相应的条目
// @author Liaune
// @include /^https?://(bangumi\.tv|bgm\.tv|chii\.in)\/\S+\/list\/.*
// @grant GM_addStyle
// ==/UserScript==
(function() {
GM_addStyle(`
`);
let itemsList,TagsAll=[],JsonTags = {},AllTags=[],count=0,update=0;
const showBtn0 = document.createElement('a');
showBtn0.addEventListener('click', ShowProcess);
showBtn0.className = 'chiiBtn';
showBtn0.href='javascript:;';
showBtn0.textContent = 'Show Tags';
document.querySelector('#browserTools').append(showBtn0);
//更新缓存数据
const showBtn4 = document.createElement('a');
showBtn4.addEventListener('click', Update);
showBtn4.className = 'chiiBtn';
showBtn4.href='javascript:;';
showBtn4.textContent = '更新Tags';
const User =window.location.href.match(/\/list\/(\S+)\//)? window.location.href.match(/\/list\/(\S+)\//)[1]: null;
function Update(){
update=1;
count=0;
itemsList = document.querySelectorAll('#browserItemList li.item');
itemsList.forEach( (elem, index) => {
let href = elem.querySelector('a.subjectCover').href;
let ID = href.split('/subject/')[1];
FetchStatus(href,elem);
});
}
//Main Program
function ShowProcess(){
$(showBtn0).hide();
itemsList = document.querySelectorAll('#browserItemList li.item');
itemsList.forEach( (elem, index) => {
let href = elem.querySelector('a.subjectCover').href;
let ID = href.split('/subject/')[1];
//为每个条目添加单独刷新
let showBtn_Re = document.createElement('a');
showBtn_Re.className = 'l';
showBtn_Re.href='javascript:;';
showBtn_Re.textContent = '↺';
showBtn_Re.addEventListener('click', FetchStatus.bind(this,href,elem),false);
elem.querySelector('.inner h3').appendChild(showBtn_Re);
if(localStorage.getItem('Subject'+ID+'Tags')){
let info = {"Tags": localStorage.getItem('Subject'+ID+'Tags')};
DisplayStatus(elem,info);
}
else
FetchStatus(href,elem);
});
}
function FetchStatus(href,elem){
fetch(href,{credentials: "include"})
.then(data => {
return new Promise(function (resovle, reject) {
let targetStr = data.text();
resovle(targetStr);
});
})
.then(targetStr => {
let ID = href.split('/subject/')[1];
//获取Tag
let TagMatch = targetStr.match(/<a href="#;" class="btnGray" onclick="chiiLib.subject.addTag(\S+)<\/a>/g);
if(TagMatch){
let Tags=[];
for(i=0;i<Math.min(10,TagMatch.length-15);i++){
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]:'';
}
localStorage.setItem('Subject'+ID+'Tags',JSON.stringify(Tags));
let info = {"Tags": JSON.stringify(Tags)};
DisplayStatus(elem,info);
if(update){
showBtn4.textContent='更新中... (' + count + '/' + itemsList.length +')';
if(count==itemsList.length){ showBtn4.textContent='更新完毕!';}
}
}
});
}
function DisplayStatus(elem,info){
let href = elem.querySelector('a.subjectCover').href;
let ID = href.split('/subject/')[1];
let Tags = JSON.parse(info.Tags);
TagsAll = TagsAll.concat(Tags);
let DivTags = document.createElement('div');
DivTags.id = "DivTags";
for(i=0;i<Tags.length;i++){
let Atags = document.createElement('a');
Atags.href = "/anime/tag/"+Tags[i];
Atags.className = 'l';
if(i==Tags.length-1) Atags.innerHTML=Tags[i];
else Atags.innerHTML=Tags[i]+" ";
DivTags.appendChild(Atags);
}
if(elem.querySelector('#DivTags')) $(elem.querySelector('#DivTags')).remove();
$(DivTags).insertAfter(elem.querySelector('.inner .collectInfo'));
DivTags.addEventListener('dblclick', function (){
DivTags.contentEditable = true;
});
DivTags.addEventListener('blur', function (){
let Tags = DivTags.textContent.split(" ");
localStorage.setItem('Subject'+ID+'Tags',JSON.stringify(Tags));
});
function sortup(x,y){
return y.Value - x.Value;
}
count+=1;
if(count==itemsList.length){
document.querySelector('#browserTools').append(showBtn4);
for (i = 0; i < TagsAll.length; i++) {
JsonTags[TagsAll[i]] = (JsonTags[TagsAll[i]] + 1) || 1;
}
for (var key in JsonTags){
let temp_tag = {TagName:key,Value:JsonTags[key]};
AllTags.push(temp_tag);
}
AllTags.sort(sortup);
ShowSidePanel(AllTags);
//console.log(AllTags);
}
}
function ShowSidePanel(AllTags){
let SimpleSidePanel = document.createElement('div');
SimpleSidePanel.className = "SimpleSidePanel";
SimpleSidePanel.style.width = "190px";
$(SimpleSidePanel).append($("<h2>标签统计</h2>"));
let tagList = document.createElement('ul');
tagList.className = "tagList";
for(i=0; i<Math.min(50,AllTags.length); i++){
let tagli = document.createElement('li');
let taglia = document.createElement('a');
taglia.href='javascript:;';
taglia.addEventListener('click', ShowThisTag.bind(this,AllTags[i].TagName),false);
taglia.textContent = AllTags[i].TagName;
$(taglia).append(`<small>${AllTags[i].Value}</small>`);
tagli.appendChild(taglia);
tagList.appendChild(tagli);
}
$(SimpleSidePanel).append($(tagList));
let showmoreTags = document.createElement('a');
showmoreTags.href='javascript:;';
showmoreTags.textContent = '/ 展开全部标签';
showmoreTags.addEventListener('click', ShowmoreTags);
$(SimpleSidePanel).append($(showmoreTags));
function ShowmoreTags(){
$(showmoreTags).hide();
for(i=Math.min(50,AllTags.length); i<AllTags.length; i++){
let tagli = document.createElement('li');
let taglia = document.createElement('a');
taglia.href='javascript:;';
taglia.addEventListener('click', ShowThisTag.bind(this,AllTags[i].TagName),false);
taglia.textContent = AllTags[i].TagName;
$(taglia).append(`<small>${AllTags[i].Value}</small>`);
tagli.appendChild(taglia);
tagList.appendChild(tagli);
}
}
document.querySelector('#columnSubjectBrowserB').insertBefore(SimpleSidePanel,document.querySelector('#columnSubjectBrowserB .SimpleSidePanel'));
$(document.querySelectorAll('#columnSubjectBrowserB .SimpleSidePanel')[1]).hide();
}
function ShowThisTag(TagName){
itemsList = document.querySelectorAll('#browserItemList li.item');
let count_t = 0;
itemsList.forEach( (elem, index) => {
elem.style.border="none";
let TagsList = elem.querySelector('#DivTags').textContent.split(" ");
if (TagsList.includes(TagName)) {
if(count_t %2 == 0) elem.setAttribute('class', 'item odd clearit');
else elem.setAttribute('class', 'item even clearit');
elem.style.border="1px solid #5ebee3";
document.querySelector('#browserItemList').insertBefore(elem,document.querySelector('#browserItemList li.item'));
count_t+=1;
}
});
scrollTo(100,100);
}
})();