CharWhoIWouldveknow

show voiced characters that are from subjects in your collections

当前为 2023-10-04 提交的版本,查看 最新版本

// ==UserScript==
// @name         CharWhoIWouldveknow
// @namespace    https://jirehlov.com
// @version      0.2.1
// @description  show voiced characters that are from subjects in your collections
// @author       Jirehlov
// @include        /^https?:\/\/(bgm\.tv|bangumi\.tv|chii\.in)\/person\/\d+\/works\/voice+/
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
	let collectStatus = {};
	const limit = 50;
	let guess = 1000000;
	let totalItems = 0;
	let allData = [];
	let username = null;
	let updatingData = false;
	let getLi = null;
	if (localStorage.getItem('bangumi_subject_collectStatus')) {
		collectStatus = JSON.parse(localStorage.getItem('bangumi_subject_collectStatus'));
	}
	const idBadgerNeue = document.querySelector('.idBadgerNeue');
	if (idBadgerNeue) {
		const avatarLink = idBadgerNeue.querySelector('.avatar');
		if (avatarLink) {
			const href = avatarLink.getAttribute('href');
			username = href.substring(href.lastIndexOf('/') + 1);
		}
	}
	let subject_type = [
		1,
		2,
		3,
		4,
		6
	];
	let collection_type = [
		1,
		2,
		3,
		4,
		5
	];
	let subject_type_index = 0;
	function isSubjectCollected(subjectId) {
		return collectStatus[subjectId] === 'collect';
	}
	function checkCharactersInPage(isCollected, notCollected) {
		const browserListItems = document.querySelectorAll('.browserList li');
		browserListItems.forEach(item => {
			const innerRightList = item.querySelector('.innerRightList.rr');
			if (innerRightList) {
				const clearitItem = innerRightList.querySelector('li.clearit');
				if (clearitItem) {
					const aElement = clearitItem.querySelector('a');
					if (aElement) {
						const href = aElement.getAttribute('href');
						const subjectIdMatch = href.match(/\/subject\/(\d+)/);
						if (subjectIdMatch) {
							const subjectId = subjectIdMatch[1];
							if (isSubjectCollected(subjectId)) {
								if (isCollected) {
									item.style.display = 'block';
								} else {
									item.style.display = 'none';
								}
							} else {
								if (notCollected) {
									item.style.display = 'block';
								} else {
									item.style.display = 'none';
								}
							}
						}
					}
				}
			}
		});
	}
	function createFilterButtons() {
		const subjectFilterElement = document.querySelector('.subjectFilter');
		if (subjectFilterElement) {
			const groupedUL = document.createElement('ul');
			groupedUL.className = 'grouped clearit';
			const titleLi = document.createElement('li');
			titleLi.classList.add('title');
			titleLi.innerHTML = '<span>收藏状态</span>';
			const collectedLi = document.createElement('li');
			collectedLi.innerHTML = '<a href="javascript:;" class="l"><span>已收藏</span></a>';
			collectedLi.addEventListener('click', () => {
				checkCharactersInPage(true, false);
			});
			const notCollectedLi = document.createElement('li');
			notCollectedLi.innerHTML = '<a href="javascript:;" class="l"><span>未收藏</span></a>';
			notCollectedLi.addEventListener('click', () => {
				checkCharactersInPage(false, true);
			});
			const allLi = document.createElement('li');
			allLi.innerHTML = '<a href="javascript:;" class="l"><span>全部显示</span></a>';
			allLi.addEventListener('click', () => {
				checkCharactersInPage(true, true);
			});
			getLi = document.createElement('li');
			getLi.innerHTML = '<a href="javascript:;" class="l"><span>收藏数据有误\uFF1F单击手动刷新</span></a>';
			getLi.addEventListener('click', () => {
				getData();
			});
			groupedUL.appendChild(titleLi);
			groupedUL.appendChild(collectedLi);
			groupedUL.appendChild(notCollectedLi);
			groupedUL.appendChild(allLi);
			groupedUL.appendChild(getLi);
			subjectFilterElement.appendChild(groupedUL);
		}
	}
	async function fetchData(collection_type, offset) {
		const url = `https://api.bgm.tv/v0/users/${ username }/collections?subject_type=${ subject_type[subject_type_index] }&type=${ collection_type }&limit=${ limit }&offset=${ offset }`;
		const headers = { 'Accept': 'application/json' };
		const response = await fetch(url, { headers });
		const data = await response.json();
		return data;
	}
	async function getData() {
		if (updatingData) return;
		updatingData = true;
		console.log(`Update started.`);
		if (getLi) {
			getLi.innerHTML = '<a href="javascript:;" class="l"><span>更新中</span></a>';
			getLi.removeEventListener('click', getData);
			getLi.style.pointerEvents = 'none';
		}
		for (let ct = 1; ct < collection_type.length; ct++) {
			for (let i = 0; i < subject_type.length; i++) {
				subject_type_index = i;
				const initialData = await fetchData(ct, guess);
				if ('description' in initialData && initialData.description.includes('equal to')) {
					totalItems = parseInt(initialData.description.split('equal to ')[1]);
					console.log(`Updated totalItems to: ${ totalItems }`);
				} else {
					totalItems = 0;
				}
				for (let offset = 0; offset < totalItems; offset += limit) {
					const data = await fetchData(ct, offset);
					allData.push(...data.data);
					console.log(`Fetched ${ offset + 1 }-${ offset + limit } items...`);
				}
			}
		}
		for (const item of allData) {
			const subjectId = item.subject_id;
			collectStatus[subjectId] = 'collect';
		}
		localStorage.setItem('bangumi_subject_collectStatus', JSON.stringify(collectStatus));
		updatingData = false;
		if (getLi) {
			getLi.innerHTML = '<a href="javascript:;" class="l"><span>更新结束</span></a>';
		}
		console.log(`Update completed.`);
	}
	createFilterButtons();
}());

QingJ © 2025

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