Last active
October 28, 2024 03:06
-
-
Save david082321/b5f998e609b3b4fb72c771a71763528c to your computer and use it in GitHub Desktop.
動畫瘋評分人數顯示
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==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