// ==UserScript==
// @name 哔哩哔哩(B站|Bilibili)收藏夹Fix (跳转第三方网站)
// @name:zh-CN 哔哩哔哩(B站|Bilibili)收藏夹Fix (跳转第三方网站)
// @name:zh-TW 哔哩哔哩(B站|Bilibili)收藏夹Fix (跳转第三方网站)
// @namespace http://tampermonkey.net/
// @version 1.2.4
// @description 跳转至BiliPlus, 贝贝工具站, 唧唧, 备份或查看某个视频的信息
// @description:zh-CN 跳转至BiliPlus, 贝贝工具站, 唧唧, 备份或查看某个视频的信息
// @description:zh-TW 跳转至BiliPlus, 贝贝工具站, 唧唧, 备份或查看某个视频的信息
// @author YTB0710
// @match https://space.bilibili.com/*
// @grant GM_openInTab
// ==/UserScript==
(function () {
'use strict';
const favlistURLRegex = /https:\/\/space\.bilibili\.com\/\d+\/favlist.*/;
const getBVFromURLRegex = /video\/(\w+)/;
const getCoverFromURLRegex = /\/\/([^@]*)@/;
let onFavlistPage = false;
const favlistObserver = new MutationObserver((_mutations, observer) => {
if (document.querySelector('div.favlist-main')) {
observer.disconnect();
addMessage(true);
biliCardDropdownPopperObserver.observe(document.body, { childList: true, attributes: false, characterData: false });
return;
}
if (document.querySelector('div.fav-content.section')) {
observer.disconnect();
addMessage(false);
favContentSectionObserver.observe(document.querySelector('div.fav-content.section'), { characterData: false, attributeFilter: ['class'] });
return;
}
});
const biliCardDropdownPopperObserver = new MutationObserver(mutations => {
for (const mutation of mutations) {
for (const addedNode of mutation.addedNodes) {
if (addedNode.nodeType === 1 && addedNode.classList.contains('bili-card-dropdown-popper')) {
mainNewFreshSpace(addedNode);
return;
}
}
}
});
const favContentSectionObserver = new MutationObserver(mutations => {
for (const mutation of mutations) {
if (!mutation.target.classList.contains('loading')) {
main();
return;
}
}
});
checkURL();
const originalPushState = history.pushState;
history.pushState = function (...args) {
originalPushState.apply(this, args);
checkURL();
};
const originalReplaceState = history.replaceState;
history.replaceState = function (...args) {
originalReplaceState.apply(this, args);
checkURL();
};
window.addEventListener('popstate', checkURL);
function checkURL() {
if (favlistURLRegex.test(location.href)) {
if (!onFavlistPage) {
onFavlistPage = true;
favlistObserver.observe(document.body, { subtree: true, childList: true, attributes: false, characterData: false });
}
} else {
if (onFavlistPage) {
onFavlistPage = false;
favlistObserver.disconnect();
biliCardDropdownPopperObserver.disconnect();
favContentSectionObserver.disconnect();
}
}
}
function mainNewFreshSpace(divDropdownPopper) {
const divDropdowns = document.querySelectorAll('div.bili-card-dropdown--visible');
if (divDropdowns.length !== 1) {
return;
}
let divTargetVideo;
try {
divTargetVideo = document.querySelector('div.items__item:has(.bili-card-dropdown--visible)');
} catch {
const items = document.querySelectorAll('div.items__item');
for (const item of items) {
if (item.contains(divDropdowns[0])) {
divTargetVideo = item;
break;
}
}
}
if (!divTargetVideo) {
return;
}
if (divTargetVideo.querySelector('div.bili-cover-card__tags')) {
return;
}
let disabled = false;
if (!divTargetVideo.querySelector('div.bili-cover-card__stats')) {
disabled = true;
}
const BV = divDropdowns[0].parentNode.querySelector('a').getAttribute('href').match(getBVFromURLRegex)[1];
const dropdownJump = document.createElement('div');
dropdownJump.classList.add('bili-card-dropdown-popper__item');
dropdownJump.textContent = '跳转至BXJ';
dropdownJump.addEventListener('click', () => {
divDropdownPopper.classList.remove('visible');
GM_openInTab(`https://www.biliplus.com/video/${BV}`, { active: disabled, insert: false, setParent: true });
GM_openInTab(`https://xbeibeix.com/video/${BV}`, { insert: false, setParent: true });
GM_openInTab(`https://www.jijidown.com/video/${BV}`, { insert: false, setParent: true });
});
divDropdownPopper.appendChild(dropdownJump);
if (!disabled) {
const dropdownCover = document.createElement('div');
dropdownCover.classList.add('bili-card-dropdown-popper__item');
dropdownCover.textContent = '封面原图';
dropdownCover.addEventListener('click', () => {
divDropdownPopper.classList.remove('visible');
GM_openInTab(`https://${divTargetVideo.querySelector('img').getAttribute('src').match(getCoverFromURLRegex)[1]}`, { active: true, insert: true, setParent: true });
});
divDropdownPopper.appendChild(dropdownCover);
}
}
function main() {
for (const li of document.querySelectorAll('li.small-item')) {
if (li.querySelector('div.ogv-corner-tag')) {
continue;
}
const ul = li.querySelector('ul.be-dropdown-menu');
if (!ul) {
continue;
}
if (!ul.lastElementChild.classList.contains('added')) {
ul.lastElementChild.classList.add('be-dropdown-item-delimiter');
let disabled = false;
if (li.classList.contains('disabled')) {
disabled = true;
}
const BV = li.getAttribute('data-aid');
const dropdownJump = document.createElement('li');
dropdownJump.classList.add('be-dropdown-item', 'added');
dropdownJump.textContent = '跳转至BXJ';
dropdownJump.addEventListener('click', () => {
GM_openInTab(`https://www.biliplus.com/video/${BV}`, { active: disabled, insert: false, setParent: true });
GM_openInTab(`https://xbeibeix.com/video/${BV}`, { insert: false, setParent: true });
GM_openInTab(`https://www.jijidown.com/video/${BV}`, { insert: false, setParent: true });
});
ul.appendChild(dropdownJump);
if (!disabled) {
const dropdownCover = document.createElement('li');
dropdownCover.classList.add('be-dropdown-item', 'added');
dropdownCover.textContent = '封面原图';
dropdownCover.addEventListener('click', () => {
GM_openInTab(`https://${li.querySelector('img').getAttribute('src').match(getCoverFromURLRegex)[1]}`, { active: true, insert: true, setParent: true });
});
ul.appendChild(dropdownCover);
}
}
}
}
function addMessage(newFreshSpace) {
const p = document.createElement('p');
p.innerHTML = '<a href="https://greasyfork.org/scripts/506785" target="_blank" style="text-decoration-line: underline;">哔哩哔哩(B站|Bilibili)收藏夹Fix (跳转第三方网站)</a> 的功能' +
'已经整合进 <a href="https://greasyfork.org/scripts/521668" target="_blank" style="text-decoration-line: underline;">哔哩哔哩(B站|Bilibili)收藏夹Fix (备份视频信息)</a>。';
p.style.padding = newFreshSpace ? '2px 0' : '2px';
p.style.fontSize = newFreshSpace ? '13px' : '12px';
p.style.lineHeight = '1.5';
document.querySelector(newFreshSpace ? 'div.favlist-aside' : 'div.fav-sidenav').appendChild(p);
}
})();