RYM: Weighted average track rating (updated)

calculate weighted average track rating based on track lengths

目前为 2021-07-27 提交的版本。查看 最新版本

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