Skip to content

Instantly share code, notes, and snippets.

@david082321
Last active October 28, 2024 03:06
Show Gist options
  • Save david082321/b5f998e609b3b4fb72c771a71763528c to your computer and use it in GitHub Desktop.
Save david082321/b5f998e609b3b4fb72c771a71763528c to your computer and use it in GitHub Desktop.
動畫瘋評分人數顯示
// ==UserScript==
// @name 巴哈姆特評分人數顯示
// @namespace animad_score
// @version 2024-10-25_1
// @description 顯示動畫瘋及ACG資料庫評分人數及標準差,並使用 SteamDB 計算公式改成百分制
// @author david082321, JasonKhew96
// @match *://ani.gamer.com.tw/animeVideo.php?*
// @match *://acg.gamer.com.tw/acgDetail.php?*
// @match *://forum.gamer.com.tw/A.php?bsn=*
// @icon https://ani.gamer.com.tw/apple-touch-icon-72.jpg
// @updateURL https://gist.github.com/david082321/b5f998e609b3b4fb72c771a71763528c/raw/animad_score.user.js
// @downloadURL https://gist.github.com/david082321/b5f998e609b3b4fb72c771a71763528c/raw/animad_score.user.js
// @grant none
// ==/UserScript==
/*
// @author david082321
const bodyHTML = document.body.innerHTML;
const keyword = "Bahamut.AcgReview('#acg_review', ";
if (bodyHTML.includes(keyword)) {
const reviews = bodyHTML.split(keyword)[1].split(",", 7);
let max_length = 0;
for (let i = 1; i <= 5; i++) {
let review_length = reviews[i].split(':')[1].split('}')[0].length;
if (review_length > max_length) {
max_length = review_length;
}
}
for (let i = 0; i < 5; i++) {
let div = document.createElement("div");
div.style.whiteSpace = "nowrap";
let reviewer = document.createTextNode(reviews[5-i].split(':')[1].split('}')[0].padStart(max_length, String.fromCharCode(8194)));
div.appendChild(reviewer);
document.getElementsByClassName("score-star")[i].appendChild(div);
}
}
*/
// @author JasonKhew96
(() => {
function main() {
try {
const l = acgReview.allData.list
let count = 0;
for (let i = 1; i <= 5; i++) {
let span = document.createElement("span");
span.style = "min-width: 45px;padding-left: 2.5px;"
span.innerText = l[(i + "")]
count += l[(i + "")]
document.querySelector('.acg-score-date[data-acgstar="' + i + '"]').appendChild(span)
}
// @author SteamDB.info (https://steamdb.info/blog/steamdb-rating/)
function GetRating(positiveVotes, negativeVotes) {
const totalVotes = positiveVotes + negativeVotes;
const average = positiveVotes / totalVotes;
const score = average - (average - 0.5) * Math.pow(2, -Math.log10(totalVotes + 1));
return score * 100;
}
// @author fifth (https://github.com/bangumi/scripts/blob/master/fifth/friendsPowerUp.user.js)
function calculateSD(scores, n) {
let mean = 0;
scores.forEach(function (i) {
let elem = i[0];
let index = i[1];
mean += index * elem;
});
mean /= n;
let sd = 0;
scores.forEach(function (i) {
let elem = i[0];
let index = i[1];
if (index === 0) {
return;
}
sd += (index - mean) * (index - mean) * elem;
});
return Math.sqrt(sd / (n - 1));
}
// @author david082321
// let count = acgReview.allData.count; // 可能出現無資料
let number = document.getElementsByClassName("score-overall-number")[0];
let people = document.getElementsByClassName("score-overall-people")[0];
let tipSpan = document.getElementsByClassName("text-tip")[0];
tipSpan.innerHTML = "原評價:" + number.innerText;
// let rateAnime = GetRating(l[("5")], l[("4")] + l[("3")] + l[("2")] + l[("1")]); // 原計算公式,棄用
let average = (l[("5")] + l[("4")] * 0.75 + l[("3")] * 0.5 + l[("2")] * 0.25) / count;
let rate = (average - (average - 0.5) * Math.pow(2, -Math.log10(count + 1))) * 100;
if (isNaN(rate)) {
rate = 0;
}
let emoji, tip = "";
// 分數區間抄 SteamDB 的設定,並依據動畫瘋全部的動畫分數微調區間
if (count < 300) {
emoji = "❓"; // Mixed
tip = "低於300人評價";
} else if (rate > 95) {
emoji = "😎"; // Overwhelmingly Positive
tip = "壓倒性好評";
} else if (rate >= 90) {
emoji = "😍"; // Very Positive
tip = "極度好評";
} else if (rate >= 80) {
emoji = "😋"; // Very Positive
tip = "大多好評";
} else if (rate >= 70) {
emoji = "😏"; // Very Positive
tip = "一般還行";
} else if (rate >= 60) {
emoji = "😐"; // Mixed
tip = "褒貶不一";
} else if (rate >= 50) {
emoji = "😕"; // Mixed
tip = "褒貶不一";
} else if (rate >= 40) {
emoji = "😢"; // Mostly Negative
tip = "大多負評";
} else if (rate >= 30) {
emoji = "😨"; // Mostly Negative
tip = "極度負評";
} else {
emoji = "😱"; // Overwhelmingly Negative
tip = "壓倒性負評";
}
people.innerHTML = tip + "<br>" + people.innerText;
people.style.textAlign = "center";
number.innerHTML = emoji + "<br>" + rate.toFixed(2).padStart(5, '0');
if (rate == 0) {
number.innerHTML = emoji + "<br>--";
}
number.style.fontSize = "30px";
number.style.whiteSpace = "nowrap";
number.style.lineHeight = "30px";
number.style.textAlign = "center";
// 計算標準差
if (count > 1) {
let sd = calculateSD([[l[("5")], 5], [l[("4")], 4], [l[("3")], 3], [l[("2")], 2], [l[("1")], 1]], count).toFixed(2);
let tip = "";
// 分數區間抄 https://bgm.tv/group/topic/345367 的設定,並參考底下評論做出修改
if (count < 100) {
tip = "一面之詞/人數不足";
} else if (sd <= 1) {
tip = "異口同聲";
} else if (sd <= 1.15) {
tip = "大多贊同";
} else if (sd <= 1.30) {
tip = "略有分歧";
} else if (sd <= 1.45) {
tip = "莫衷一是";
} else if (sd <= 1.60) {
tip = "各執一詞";
} else if (l[("5")] >= (count / 5)
&& l[("1")] >= (count / 5)
&& (l[("2")] + l[("3")] + l[("4")]) < (count / 2)
) {
// 隨便亂填的算法,如果有問題請留言告訴我
// 用於區分中間低,兩邊高的情況
// 評價分散的改用「眾口難調」
if (sd <= 1.75) {
tip = "你死我活";
} else {
tip = "廚黑大戰";
}
} else {
tip = "眾口難調";
}
tipSpan.innerHTML += "<br/>標準差:" + sd + "(" + tip + ")";
}
tipSpan.innerHTML += "<br/>(1~5 星各自代表 1~5 分,將分數加總後除以總評價人數即為總平均分數。)";
} catch (error) {
// pass
}
let abox6Bpage = document.getElementsByClassName("FM-abox6Bpage");
for (let i = 0; i < abox6Bpage.length; i++) {
let childs = abox6Bpage[i].children;
for (let j = 0; j < childs.length; j++) {
childs[j].addEventListener("click", function () {
setTimeout(main, 500);
});
}
}
}
main();
})()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment