Bangumi简易修改收藏条目

在收藏页面点击“Edit”即可修改收藏条目的状态,评分,标签,评论等信息,可单项修改,随改随存。

// ==UserScript==
// @name         Bangumi简易修改收藏条目
// @namespace    https://github.com/bangumi/scripts/tree/master/liaune
// @author       liaune
// @license      MIT
// @description  在收藏页面点击“Edit”即可修改收藏条目的状态,评分,标签,评论等信息,可单项修改,随改随存。
// @include      /^https?://(bangumi\.tv|bgm\.tv|chii\.in)\/\S+\/list\/\S+\/(wish|collect|do|on_hold|dropped).*
// @version      1.4
// @grant        GM_addStyle
// ==/UserScript==
GM_addStyle(`
	.input_tags{
		min-width: 200px;
		height: 20px;
		border: 1px solid;
		border-radius: 5px;
		margin: 5px 0;
		padding: 0 5px;
	}
	.select_rating{
		border-radius: 5px;
	}
	.select_interest{
		width: 50px;
		border-radius: 5px;
	}
`);
class BgmCollections {
	constructor() {

	}
	init(){
		// $('#browserTools').append('<a id="saveCollect" class="chiiBtn" href="#">保存修改</a>');
		let securitycode = $('#badgeUserPanel a[href*="logout"]')[0].href.split('/logout/')[1].toString();
		let interest = this.get_interest();
		let itemsList = document.querySelectorAll('#browserItemList li.item');
		itemsList.forEach( (elem, i) =>{
			let subject_id = elem.querySelector('a.subjectCover').href.split('/subject/')[1];
			//评分
			let rating = elem.querySelector('.collectInfo .starlight')? elem.querySelector('.collectInfo .starlight').className.match(/stars(\d+)/)[1]:0;
			//标签
			let tags = '';
			let privacy = '';
			let elem_tips = elem.querySelectorAll('.collectInfo .tip');
			elem_tips.forEach((tip,i) =>{
				if(tip.textContent.match(/标签: (.*)/)){
					tags = tip.textContent.match(/标签: (.*)/)[1];
					$(tip).hide();
				}
				if(tip.textContent.match(/自己可见/)) privacy = 1;
			});
			//评论
			let comment = elem.querySelector('.text')? elem.querySelector('.text').textContent: '';
			let info = {
						securitycode: securitycode,
						subject_id: subject_id,
						interest: interest,
						rating: rating,
						tags: tags,
						comment: comment,
						privacy: privacy,
					   };
			this.edit_interest(elem,info);
			this.edit_rating(elem,info);
			this.edit_tags(elem,info);
			this.edit_privacy(elem, info);
			this.edit_comment(elem,info);
		});
	}
	get_interest(){
		let status = location.href.match(/list\/\S+\/(wish|collect|do|on_hold|dropped)/)[1];
		const dc = {"wish":1,"collect":2,"do":3,"on_hold":4,"dropped":5};
		return dc[status];
	}
	edit_interest(elem,info){
		let select_interest = document.createElement('select');
		select_interest.classList.add("select_interest");
		let media = location.href.match(/^https?:\/\/(bgm\.tv|chii\.in|bangumi\.tv)\/(\S+)\/list\//)[2];
		const dc = {anime:'看',book:'读',music:'听',game:'玩',real:'看'};
		$(select_interest).append(`
			<option value="0">取消收藏</option>
			<option value="1">想${dc[media]}</option>
			<option value="2">${dc[media]}过</option>
			<option value="3">在${dc[media]}</option>
			<option value="4">搁置</option>
			<option value="5">抛弃</option>
		`);
		select_interest.value = info.interest;
		$(elem.querySelector('.inner h3')).append(select_interest);
		select_interest.addEventListener('change',function(){
			let data = {
						interest: select_interest.value,
						rating: info.rating,
						tags: info.tags,
						comment: info.comment,
						privacy: info.privacy,
					   };
			if(data.interest == '0') $.post(`/subject/${info.subject_id}/remove?gh=${info.securitycode}`);
			else $.post(`/subject/${info.subject_id}/interest/update?gh=${info.securitycode}`, data);

		});
	}
	edit_rating(elem,info){
		let select_rating = document.createElement('select');
		select_rating.classList.add("select_rating");;
		$(select_rating).append(`
			<option value="0"></option>
			<option value="1">1</option>
			<option value="2">2</option>
			<option value="3">3</option>
			<option value="4">4</option>
			<option value="5">5</option>
			<option value="6">6</option>
			<option value="7">7</option>
			<option value="8">8</option>
			<option value="9">9</option>
			<option value="10">10</option>
		`);
		select_rating.value = info.rating;
		$(elem.querySelector('.tip_j')).before(`<span> 评分:</span>`);
		$(elem.querySelector('.tip_j')).before(select_rating);
		select_rating.addEventListener('change',function(){
			let data = {
						interest: info.interest,
						rating: select_rating.value,
						tags: info.tags,
						comment: info.comment,
						privacy: info.privacy,
					   };
			$.post(`/subject/${info.subject_id}/interest/update?gh=${info.securitycode}`, data);
		});
	}
	edit_tags(elem,info){
		let input_tags = document.createElement('input');input_tags.type='text';
		input_tags.classList.add("input_tags");
		input_tags.value = info.tags;
		$(elem.querySelector('.collectInfo')).after(input_tags);
		$(elem.querySelector('.collectInfo')).after(`<span> 标签: </span>`);
		input_tags.addEventListener('blur',function(){
			let data = {
						interest: info.interest,
						rating: info.rating,
						tags: input_tags.value.trim(),
						comment: info.comment,
						privacy: info.privacy,
					   };
			$.post(`/subject/${info.subject_id}/interest/update?gh=${info.securitycode}`, data);
		});
	}
	edit_privacy(elem, info){
		let input_privacy = document.createElement('input'); input_privacy.type='checkbox';
		input_privacy.checked = info.privacy;
		input_privacy.title = '自己可见';
		$(elem.querySelector('.collectInfo')).append(input_privacy);
		input_privacy.addEventListener('change',function(){
			let data = {
						interest: info.interest,
						rating: info.rating,
						tags: info.tags,
						comment: info.comment,
						privacy: input_privacy.checked? 1: '',
					   };
			$.post(`/subject/${info.subject_id}/interest/update?gh=${info.securitycode}`, data);
		});
	}
	edit_comment(elem,info){
		if(!info.comment)
				$(elem).find('.inner').append(`<div id="comment_box"><div class="item"><div style="float:none;" class="text_main_even"><div class="text"><br></div><div class="text_bottom"></div></div></div></div>`);
		let comment = $(elem).find('.text')[0];
		$(comment).attr('contenteditable', 'true');
		comment.addEventListener('blur',function(){
			let data = {
						interest: info.interest,
						rating: info.rating,
						tags: info.tags,
						comment: $(comment).text().trim(),
						privacy: info.privacy,
					   };
			$.post(`/subject/${info.subject_id}/interest/update?gh=${info.securitycode}`, data);
		});
	}
}

(function() {
    let You = $('#headerNeue2 .idBadgerNeue a.avatar')[0]? $('#headerNeue2 .idBadgerNeue a.avatar')[0].href.split('/user/')[1]:null;
    let User = location.href.match(/\/list\/(\S+)\//)? location.href.match(/\/list\/(\S+)\//)[1]: null;
    if(You != User) return;
	$('#browserTools').append(`<a id="modifyCollect" class="chiiBtn" href="javascript:;">Edit</a>`);
	$('#modifyCollect').on('click',()=>{
		$('#modifyCollect').remove();
		let bc = new BgmCollections();
		bc.init();
	});
})();