Рейтинг Шики

Добавляет среднюю оценку пользователей Шикимори на страницы тайтлов и личную среднюю оценку на страницы списков.

// ==UserScript==
// @name         Рейтинг Шики
// @namespace    http://tampermonkey.net/
// @version      1.8
// @description  Добавляет среднюю оценку пользователей Шикимори на страницы тайтлов и личную среднюю оценку на страницы списков.
// @author       grin3671
// @license      MIT
// @match        https://shikimori.one/*
// @match        https://shikimori.org/*
// @match        https://shikimori.me/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=shikimori.me
// @grant        none
// ==/UserScript==

(function() {
  'use strict';

  function checkPage () {
    let currentURL = location.pathname.substring(1).split('/');
    let selector;
    switch (currentURL[0]) {
      case 'animes':
      case 'mangas':
      case 'ranobe':
        selector = 'rates_scores_stats';
        console.debug(document.getElementById(selector).getAttribute('data-stats'));
        if (document.getElementById(selector).getAttribute('data-stats') == null) return;
        showScore(selector, getScore(selector));
        break;
    }
    switch (currentURL[1]) {
      case 'list':
        selector = 'scores';
        console.debug(document.getElementById(selector).getAttribute('data-stats'));
        if (document.getElementById(selector).getAttribute('data-stats') == null) return;
        showScore(selector, getScore(selector, 'name'));
        break;
    }
  }

  function getScore (id, key) {
    let data, total, rates;
    data = JSON.parse(document.getElementById(id).getAttribute('data-stats'));
    total = data.reduce((a, b) => a + (key ? +b.value : +b[1]), 0);
    rates = data.reduce((a, b) => a + (key ? +b[key] * +b.value : +b[0] * +b[1]), 0);
    console.debug('Средняя оценка:', (rates / total).toFixed(2));
    return { total, rates };
  }

  function showScore (selector, score) {
    let subheadline, elem;
    subheadline = document.getElementById(selector).parentElement.querySelector('.subheadline');
    if (subheadline.children.length == 0) {
      elem = document.createElement('div');
      elem.style.float = 'right';
      elem.textContent = (score.rates / score.total).toFixed(2) + ' (' + score.total + ')';
      subheadline.appendChild(elem);
    }
  }

  checkPage();

  document.addEventListener('page:load', checkPage);
  document.addEventListener('turbolinks:load', checkPage);
})();