// ==UserScript==
// @name B站显示点赞率、投币率、收藏率
// @namespace http://tampermonkey.net/
// @version 1.0.1
// @description 显示b站 | bilibili | 哔哩哔哩 点赞率、投币率、收藏率
// @author 魂hp
// @license MIT
// @match *.bilibili.com/video/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=bilibili.com
// @grant GM.addStyle
// @grant unsafeWindow
// @downloadURL none
// ==/UserScript==
(function () {
"use strict";
if (!(unsafeWindow?.__INITIAL_STATE__?.videoData?.stat?.view)) {
return;
}
// 修改样式
GM.addStyle(`
.video-toolbar-left-item{
width:auto !important
}
.toolbar-left-item-wrap{
margin-rigth:auto !important;
display:flex !important
}
`);
class videoData {
videoStat = {
view: 0,
like: 0,
coin: 0,
favorite: 0,
};
constructor() {
this.initVideoStat();
}
initVideoStat() {
for (let key in this.videoStat) {
this.videoStat[key] = unsafeWindow.__INITIAL_STATE__.videoData.stat[key];
}
}
// 计算点赞率、投币率、收藏率,并获取对应的颜色
getRateAndColor(nameStr) {
let res = { rate: 0, color: "#222" };
if (!(nameStr in this.videoStat)) {
return res;
}
let num = this.videoStat.view / this.videoStat[nameStr];
if (num == Infinity) {
return res;
}
if (num <= 10) {
res.rate = num.toFixed(2);
res.color = "DarkOrange";
} else if (num <= 25) {
res.rate = num.toFixed(1);
res.color = "#db03fc";
} else {
res.rate = num.toFixed(0);
}
return res;
}
}
const vData = new videoData();
//添加元素
const div = { like: {}, coin: {}, favorite: {} };
for (let e in div) {
div[e] = document.createElement("div");
div[e].innerHTML = `
≈
`;
}
// 更新数据
function updateRate() {
for (let e in div) {
let mi = div[e].querySelector("mi");
let rateAndColor = vData.getRateAndColor(e);
mi.style.color = rateAndColor.color;
mi.textContent = rateAndColor.rate;
}
}
updateRate();
new MutationObserver(function (mutationsList) {
for (let mutation of mutationsList) {
if (mutation.type === "attributes") {
document
.querySelector(".video-like")
.parentNode.appendChild(div.like);
document
.querySelector(".video-coin")
.parentNode.appendChild(div.coin);
document
.querySelector(".video-fav")
.parentNode.appendChild(div.favorite);
}
}
}).observe(document.querySelector(".toolbar-left-item-wrap"), {
attributes: true,
});
new MutationObserver(function (mutationsList) {
for (let mutation of mutationsList) {
if (mutation.type === "childList" && mutation.addedNodes.length > 0) {
vData.initVideoStat();
updateRate();
}
}
}).observe(document.querySelector(".video-fav-info"), {
childList: true,
});
})();