RYM: Weighted average track rating (updated)

calculate weighted average track rating based on track lengths

目前為 2021-08-04 提交的版本,檢視 最新版本

// ==UserScript==
// @name       RYM: Weighted average track rating (updated)
// @version    2.2
// @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://gf.qytechs.cn/users/170755
// ==/UserScript==

window.addEventListener('load', function() {
  const tracklistTracks = document.querySelectorAll('#tracks li.track');

  const trackLengths = {};

  tracklistTracks.forEach((track) => {
    if (track.querySelector('span.tracklist_duration') && track.querySelector('span.tracklist_duration').textContent.trim() !== '') {
      const n = parseInt(track.querySelector('.tracklist_num').textContent.trim(), 10);
      const name = track.querySelector('.tracklist_title .rendered_text').textContent.trim();
      let 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 ratingStarButton = document.getElementById('track_ratings_save_btn');
  ratingStarButton.addEventListener('click', function() {
    addWeightedAvg('#track_ratings', trackLengths);
  });
});

const addWeightedAvg = function addWeightedAvg(selector, trackLengths) {
  const areas = document.querySelectorAll(selector);
  areas.forEach((area) => {
    const weightedRow = area.querySelector('.avg-rating');
    if (weightedRow) {
      weightedRow.remove();
    }

    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;
      }
    });

    let unweightedRating = rawRating / trackCount;

    let weightedRating = 0;

    if (allFound) {
      weightedRating = rating / rated;
    }

    let avgHTML = '';

    if (unweightedRating > 0) {
      avgHTML += 'Average: <b>' + unweightedRating.toFixed(2) + '</b>';
    }
    if (weightedRating > 0) {
      avgHTML += ', Weighted: <b>' + weightedRating.toFixed(2) + '</b>';
    }

    const row = document.createElement('li');
    row.classList.add('track');
    row.classList.add('avg-rating');
    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);
  });
};

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址