calculate weighted average track rating based on track lengths
当前为
// ==UserScript==
// @name RYM: Weighted average track rating (updated)
// @version 2.0
// @description calculate weighted average track rating based on track lengths
// @match https://rateyourmusic.com/release/*
// @match http://rateyourmusic.com/release/*
// @copyright 2021, w_biggs (originally by thought_house)
// @namespace https://greasyfork.org/users/170755
// ==/UserScript==
window.addEventListener('load', function() {
const tracklistTracks = document.querySelectorAll('#tracks li.track');
const trackLengths = {};
tracklistTracks.forEach((track) => {
if (track.querySelector('.tracklist_num')) {
const n = parseInt(track.querySelector('.tracklist_num').textContent.trim(), 10);
const name = track.querySelector('.tracklist_title .rendered_text').textContent.trim();
let seconds = 0;
if (track.querySelector('span.tracklist_duration')) {
seconds = parseInt(track.querySelector('span.tracklist_duration').dataset.inseconds, 10);
trackLengths[n + '|' + name] = seconds;
}
}
});
//console.log(trackLengths);
addWeightedAvg('#track_ratings', trackLengths);
addWeightedAvg('.track_rating_hide ul', trackLengths);
const catalogList = document.getElementById('catalog_list');
const catalogObserver = new MutationObserver(function(records, observer) {
records.forEach((mutation) => {
if (mutation.type === 'childList') {
addWeightedAvg('.track_rating_hide ul', trackLengths);
}
});
});
catalogObserver.observe(catalogList, {
childList: true,
attributes: false,
subtree: false
});
});
const addWeightedAvg = function addWeightedAvg(selector, trackLengths) {
const areas = document.querySelectorAll(selector);
areas.forEach((area) => {
if (!area.dataset.weightedShow) {
let rating = 0;
let rawRating = 0;
let trackCount = 0;
let rated = 0;
let allFound = true;
const tracks = area.querySelectorAll('.tracklist_line');
tracks.forEach((track) => {
const n = parseInt(track.querySelector('.tracklist_num').textContent.trim(), 10);
const name = track.querySelector('.tracklist_title .rendered_text').textContent.trim();
let starsVal = 0;
const ratingNum = track.querySelector('.rating_num');
if (ratingNum) {
starsVal = parseFloat(ratingNum.textContent.trim(), 10);
} else {
const starsImg = track.querySelector('.track_rating_disp img');
if (starsImg) {
starsVal = parseFloat(starsImg.getAttribute('title'), 10);
}
}
if (starsVal > 0) {
if (trackLengths[n + '|' + name]) {
rating += trackLengths[n + '|' + name] * starsVal;
rated += trackLengths[n + '|' + name] * 1;
} else {
allFound = false;
}
rawRating += starsVal;
trackCount += 1;
}
});
//console.log(rating, rated);
if (allFound) {
rating = rating / rated;
}
rawRating = rawRating / trackCount;
let avgHTML = '';
if (rawRating > 0) {
avgHTML += 'Average: <b>' + rawRating.toFixed(2) + '</b>';
}
if (rating > 0) {
avgHTML += ', Weighted: <b>' + rating.toFixed(2) + '</b>';
}
const row = document.createElement('li');
row.classList.add('track');
const text = document.createElement('span');
text.style = 'float:right;margin-right:10px;color:var(--mono-2);font-size:1.1em;margin-top:6px;margin-bottom:6px;';
text.innerHTML = avgHTML;
row.appendChild(text);
area.appendChild(row);
}
});
};