Rottentomatoes Average Critics Scores

Display Critics All and Top Critics average scores on RottenTomatoes

K instalaci tototo skriptu si budete muset nainstalovat rozšíření jako Tampermonkey, Greasemonkey nebo Violentmonkey.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Violentmonkey.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Violentmonkey.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Userscripts.

You will need to install an extension such as Tampermonkey to install this script.

K instalaci tohoto skriptu si budete muset nainstalovat manažer uživatelských skriptů.

(Už mám manažer uživatelských skriptů, nechte mě ho nainstalovat!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Už mám manažer uživatelských stylů, nechte mě ho nainstalovat!)

// ==UserScript==
// @name         Rottentomatoes Average Critics Scores
// @namespace    http://tampermonkey.net/
// @version      1.5
// @description  Display Critics All and Top Critics average scores on RottenTomatoes
// @match        https://www.rottentomatoes.com/m/*
// @match        https://www.rottentomatoes.com/tv/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    function extractScore(html, type) {
        const match = html.match(new RegExp(`"${type}":\\{"averageRating":"(\\d+\\.\\d+)"`));
        return match ? match[1] : null;
    }

    function createScoreElement(label, score) {
        const el = document.createElement('div');
        el.style.marginBottom = '6px';
        el.style.fontWeight = 'bold';
        el.style.color = '#000000'; // black text
        el.style.textAlign = 'justify'; // justified alignment
        el.textContent = `${label}: ${score} Out of 10`;
        return el;
    }

    function displayScoreBox(allScore, topScore) {
        if (document.getElementById('rt-critics-combined-box')) return; // avoid duplicate

        const container = document.createElement('div');
        container.id = 'rt-critics-combined-box';
        container.style.background = '#f0f0f0'; // light gray background
        container.style.border = '1px solid #cccccc';
        container.style.padding = '12px 18px';
        container.style.borderRadius = '12px';
        container.style.boxShadow = '0 4px 12px rgba(0, 0, 0, 0.05)';
        container.style.fontSize = '15px';
        container.style.fontFamily = 'Arial, sans-serif';
        container.style.minWidth = '200px';
        container.style.marginTop = '12px';
        container.style.color = '#000000'; // black text
        container.style.textAlign = 'justify'; // justified alignment

        const title = document.createElement('div');
        title.textContent = 'Critics Average Scores';
        title.style.fontSize = '16px';
        title.style.marginBottom = '10px';
        title.style.fontWeight = 'bold';
        title.style.color = '#000000'; // black text
        title.style.textAlign = 'justify'; // justified alignment
        container.appendChild(title);

        if (allScore) container.appendChild(createScoreElement('All Critics Avg', allScore));
        if (topScore) container.appendChild(createScoreElement('Top Critics Avg', topScore));

        const target = document.querySelector('.no-border.media-scorecard');
        if (target && target.parentNode) {
            target.parentNode.insertBefore(container, target.nextSibling);
        } else {
            document.body.appendChild(container);
        }
    }

    function tryInjectScore() {
        const html = document.documentElement.innerHTML;
        const allScore = extractScore(html, 'criticsAll');
        const topScore = extractScore(html, 'criticsTop');

        if (allScore || topScore) displayScoreBox(allScore, topScore);
    }

    window.addEventListener('load', tryInjectScore);
    const observer = new MutationObserver(tryInjectScore);
    observer.observe(document.body, { childList: true, subtree: true });
})();