Greasy Fork

Greasy Fork is available in English.

HDrezka Cleanup

Cleanup HDrezka: change content width, change player size, remove blocks (telegram, social, support, vk, etc), restyle blocks (cover, status, rating, etc)

当前为 2022-06-18 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name            HDrezka Cleanup
// @name:en         HDrezka Cleanup
// @namespace       http://tampermonkey.net/
// @version         0.55
// @description     Cleanup HDrezka: change content width, change player size, remove blocks (telegram, social, support, vk, etc), restyle blocks (cover, status, rating, etc)
// @description:en  Cleanup HDrezka: change content width, change player size, remove blocks (telegram, social, support, vk, etc), restyle blocks (cover, status, rating, etc)
// @author          rub4ek
// @match           https://hdrezka.me/*
// @match           https://hdrezka.ag/*
// @match           https://hdrezka.club/*
// @match           https://rezka.ag/*
// @match           https://rezkify.com/*
// @match           https://kinopub.me/*
// @match           http://hdrezka.tv/*
// @match           http://hdrezka.co/*
// @match           http://hdrezka.ink/*
// @match           http://hdrezka.buzz/*
// @match           http://hdrezka.loan/*
// @match           http://hdrezka.center/*
// @match           http://hdrezka.city/*
// @match           http://hdrezka.fyi/*
// @match           http://hdrezka.run/*
// @match           http://hdrezka.today/*
// @match           http://hdrezka.win/*
// @match           http://hdrezka.tips/*
// @match           http://hdrezka.vip/*
// @match           http://hdrezka.solutions/*
// @icon            https://www.google.com/s2/favicons?domain=rezka.ag
// @grant           GM_addStyle
// @grant           GM_xmlhttpRequest
// @run-at          document-body
// @license         MIT
// ==/UserScript==

(function () {
    "use strict";

    /* ------------------------------------------------- */
    /* --------------GLOBAL----------------------------- */
    /* ------------------------------------------------- */

    let hc = {};

    /* ------------------------------------------------- */
    /* --------------DEBUG------------------------------ */
    /* ------------------------------------------------- */

    // unsafeWindow.hc = hc;

    /* ------------------------------------------------- */
    /* --------------IMAGES----------------------------- */
    /* ------------------------------------------------- */

    const images = {
        arrowImgURL:
            "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABaCAYAAAA4qEECAAAABmJLR0QA/wD/AP+gvaeTAAABa0lEQVR4nO3awUrDQBSF4dMuGhc+uF0puK/v4KL4RPoARbLUxTRQi5nMJDPJvcn/gRsp5NyfWgSVAAAAAAAAAAAAAAAAAACYXSPpKOlL0qekp+v3UNBB0rukn7uvD0kPC+5alb7IxC5oKDKxC0iNTOwJciMTe4SxkYmdoZF0VjzkOfE1/OrXI+Wd3L1bc16LG2PCETvTlGDETlQiFLEHlAxE7B41whD7Ts0gxL6aI8TmY88ZYLOxlzh8c7GXPHgzsS0camFDVZYOtLSlKIuHWdw0ieWDLG/L4uEQDxujPB3gaesfHoe72+xu8A03290MjTB/g/mBGczeYnbYBOZuSv2XAI9/7jd126uVIZWkxH6pPWIv6TsywHvkzlDsi6RdzQF7SW3Pw9cSuROL3Sq0qOrtnwevLXKnL/Zpjoc/KsRuFX6EnrXOyJ1G4TP5onDzSaHBbKp+Rhm00/ZuBgAAAAAAAAAAAAAAAODKL8SQFSF3JeZKAAAAAElFTkSuQmCC",
        settingsOpenImgURL:
            "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABmJLR0QA/wD/AP+gvaeTAAAHl0lEQVRoge2ZbWydZRnHf//ntD1th0EYGa0b48UQJtMRI6LQntEomnQ9HSwyiYnKmx9QE4MgJgiRKXwhIjMhcUHHgEgihsiAtSUmS5xbtwXQiMgEg3EMSk8LbGR2fTnrOfffD6ej571PkeOnXV9Ozv3c9/+6/s993dd9XdcDJ+WknJR6okYBZ67qOYfZ3DUlg81Nv+t8atfrjdDX1AhQAHK5PqR7wAUdJkc+NwH8shHqokaAzsl52Il5TY4IOrdRyhpGxHgdKnJdKwLWNUpfQ4iMp7svEqyseKBwzti6tZ9qhM5FEcms796USaf+9mb60uW15hgU0BahZBV1SeQtrhNkRvu7V2b6Ui9l1ndvWoxtsaNWpr/rpwTdgkiCpxRFPzicPPLo6icOHAcY2XDJ0sRs8gbjG2VWIJbUUDlpPCL0UL45u23F9ucPA7zW25s8pfnYDQTfK2izyRL5/s4de3/8oRHJ9Hf9hKBbi40TTLjwu9ORxwn6poVk2uJgGqYFlvgNZpnFl+YenFI0aZIE93U+M7zg7sQjku5+WXCBa4VrOcwd5sVLnbWCnK1XOgf3rFkIJpbykIh6DdM1J9QwxDAt6aiko9RaX+cFGE/llOuNY2PsMzKaTt0k/DMo2vrqMoE9a/GspH0E3pnTtExwmaGXws5+ZCEcJXxLx9N7t8axLzaRAxtXt5w+c9rhEh8ulSnBe8C3z7x4eFCbCNUmeRPR+AtdaUtbJH/UVnsNvIkjbe+dcSKYLCSLyrXG0t1PGjZUGAdTQttybbkfnvXE/touWCRvbry0rWkqcZ/FdYJKMuLJzh3DX4lr26JyrSDekR2gyK/NpODuzsE99y4Ga47wd8fSqRHbd5SGawfE24vBix1pRjZcslTm6yUkAItmROvBnp7WxSgGONjT02rcYtFc+kQRQd8Y2XDJ0rhYsYkkZpM3WJWuKGjB3NZ6Su5QJp26Oi5eJp26unVJ7g3BbYKW8ueGKJFrvT4uXqwzYtBYuvsV4IL5lZ7Gai3BEMeAVyPzrWWZ6X+MdbZ9zVJqDmV35+j04293tl0YxFZgVVngMCaLaJ0f4J+dA8OfEPh/JjKe7r4ooC3gNVDkx+Io6N+yz3dxSJaDraxgEtE6b6yOgWfA7YXxeRcVHAP+ZXEu5tQi9ZOyXlSC75z5zJ6XFkUkc1XPOeRyfYbzwOsEK0WUNEW1ReENPdIxMHzjeN9l11jRAxQiT61QWkumgCkFvnfm0PDjY31d24yuVZELC/LGWcMbkgYxBx3CwMeG9h0qBqo8I7nctZjNgu8LrQK1l5EAmLb8nMAdg/sez7XlV1psBk/JzC5kfWGOpyQ2W9NndwwN/1Zgi+ek0gzAkAC1C63C3IrZrCi6rhyzWvgVFVGkfIZmo+DMib9zofTOt65c+2CUD38C6laCFiMhkbh8+dO73ywej8yoI83iOkeiYFuFJ32wRC+ARa58eM6wl2MgvFxOAsBEedVlAXMHv2JONSKm4B61ASMnZHXUULXHuN7tPmXYVXVlFDocVMcbHCxySBW2VbpWU9Oj5HLvBnR2hNPA2aAkxefEbncUXQxsK1/ekj/+YLap+UeY0tBc+OMA2ebIv65mZgj6rOSyekZ5cNbW65YGo8BBOz9Uvnbh8Ls+tSafZ4vki6CksBrtGBiuWvKO9nV/hoidgiQnCi0xbcha0ReWP7P7r9XWZfq7RzGdRUOTsl6E/E0dg/vquuwHvxDRMRzWdw7u/WO1NUeuuOLUbOvMKHMhWWiyZSa5/PSdO49Wmz+WTn3R8lOll6Rf7RjYe2GcCzHWYS8A6SFKQqOXSLq/ViOhYLDfDwiWc7VIGIT9c3l+xw3TKPFQHBKxiQDkm7PbcAmoQOdn+lO3x8WoJZm+1O1EfLz4pQhC7vhsxRmsJbGJrNj+/GGLxwrntSDGS3C4M9PXvTG+2aWSWdf1VUW+wy5Lc+THzvrD/iNxcRZ1j0SwrDyNF2pDPDLWn7q5Xr+qXLyJKJNO3aZID+Oy1MaK5OiMRdoWT17r7U0arqjxuB377rF06s+jfV2phbAy/anLx1/o/gtwl2vmZ/7ygY2rK9L7WhK7QlySOHa9qH3tFjJgf1qRhjL9Xe9iBoxaTmyRTTKT7noA1I+91GIJuOYOGnTazNLrgQfj2BfLFd66cu1ZUT4cYOHOxzxwIZ0/Du/XFzOSW7yo/pf/ExKJT1ZLZ8olFmiUD0OiTgdRlR2TOYOLy9/WqiTkqt2WAqzao3x4NpaNcSYhb7fJlmmZACaQfm/YCkyhOk28Mplr+E0hfiXYDkwIJkrmmCzyk7FMjKt4rL/7Hgdulki6ThMbfCOwAmo1sZk0jEjR1nzTzMMnmtgHNq5uWZo9/VqHcJ9Qu01WEb/o2DF854dKBE40s6MN+ZBYt+LZXSPV5hiUSaeGZX8OUVaQKQ/e3zEwvLbWjT3S27MiEeWHiML2zh1774prW0M+ho6vT60JIeyHii7ilEL0+Y6h3X//sHU25ItVoVGgQ+Xjtg41ggQ08mOoGCrJzeRgGGyUusYRMQfFfDmsoHwU+WCj1DXuO3tT02DI5ZdLjgACCkokKiq7k3JSTsr/R/4LDG0pHVdMdVIAAAAASUVORK5CYII=",
        settingsCloseImgURL:
            "data:image/png;base64,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",
    };

    /* ------------------------------------------------- */
    /* --------------DOCUMENT--------------------------- */
    /* ------------------------------------------------- */

    function onDocumentStart() {
        initSettings();
        initPlayer();
        initContentSizeTumbler();
        initAutoPlayNext();
        initHideAds();
        initStyleImprovements();
        initPlayerCover();
        initHideInfo();
        initHideComments();
        initHideTranslators();
        initIMDbRating();
        initHotkeys();
        initHideRussian();
    }

    function onDocumentEnd() {}

    document.addEventListener("DOMContentLoaded", onDocumentEnd);

    onDocumentStart();

    /* ------------------------------------------------- */
    /* --------------GLOBAL-STYLES---------------------- */
    /* ------------------------------------------------- */

    GM_addStyle(`

    /* css */

    /* Hide last episode info */
    .b-post__lastepisodeout {
        display: none !important;
    }

    /* Hide support block */
    .b-post__support_holder {
        display: none !important;
    }
    .b-post__support_holder_report .append {
        display: none !important;
    }

    /* Hide share label */
    .b-post__social_holder_wrapper .share-label {
        display: none !important;
    }

    /* Hide mixedtext */
    .b-post__mixedtext {
        text-indent: -9999px !important;
        padding: 0 !important;
    }

    /* !css */

    `);

    /* ------------------------------------------------- */
    /* --------------PLAYER----------------------------- */
    /* ------------------------------------------------- */

    function initPlayer() {
        GM_addStyle(`
    
        /* css */
    
        /* Style player */
    
        .b-player {
            padding-top: 0;
        }
        .b-player #cdnplayer-preloader {
            height: 100%;
            width: 100%;
        }
        .b-player .b-simple_seasons__list {
            padding: 10px;
        }
        .b-player .b-player__holder_cdn {
            height: auto !important;
        }
        .b-player .b-player__container_cdn {
            resize: vertical;
            overflow: auto;
            width: 100% !important;
        }
    
        /* !css */
        
        `);

        hc.player = {};
        hc.player.start = start;
        hc.player.play = play;
        hc.player.pause = pause;
        hc.player.stop = stop;
        hc.player.next = next;
        hc.player.prev = prev;
        hc.player.toggle = toggle;
        hc.player.fullscreen = fullscreen;
        hc.player.poster = poster;
        hc.player.resize = resize;
        hc.player.mute = mute;

        document.addEventListener("DOMContentLoaded", setup);

        function setup() {
            window.addEventListener("message", function (event) {
                if (event.data) {
                    if (event.data.event == "inited") {
                        poster("hc-poster");
                    }
                }
            });
        }

        function start() {
            if (!sof) return;
            sof.tv.buildCDNPlayer("autoplay");
        }

        function play() {
            if (!CDNPlayer) return;
            CDNPlayer.api("play");
        }

        function pause() {
            if (!CDNPlayer) return;
            CDNPlayer.api("pause");
        }

        function stop() {
            if (!CDNPlayer) return;
            CDNPlayer.api("stop");
        }

        function toggle() {
            if (!CDNPlayer) return;
            if (!CDNPlayer.api("started")) {
                play();
            } else {
                CDNPlayer.api("toggle");
            }
        }

        function fullscreen() {
            if (!CDNPlayer) return;
            CDNPlayer.api("fullscreen");
        }

        function poster(poster) {
            if (!CDNPlayer) return;
            CDNPlayer.api("poster", poster);
        }

        function mute() {
            if (!CDNPlayer) return;
            if (!CDNPlayer.api("muted")) {
                CDNPlayer.api("mute");
            } else {
                CDNPlayer.api("unmute");
            }
        }

        function sibling(direction) {
            const activeEpisode = document.querySelector(".b-simple_episode__item.active");
            if (activeEpisode && activeEpisode[direction]) {
                activeEpisode[direction].click();
                setTimeout(start, 1000);
            } else {
                const activeSeason = document.querySelector(".b-simple_season__item.active");
                if (activeSeason && activeSeason[direction]) {
                    activeSeason[direction].click();
                    setTimeout(start, 1000);
                }
            }
        }

        function next() {
            if (!CDNPlayer) return;
            sibling("nextElementSibling");
        }

        function prev() {
            if (!CDNPlayer) return;
            sibling("previousElementSibling");
        }

        function resize() {
            const playerHolderElem = document.querySelector(".b-player__holder_cdn");
            if (!playerHolderElem) return;

            const playerContainerElem = document.querySelector(".b-player__container_cdn");
            if (!playerContainerElem) return;

            const contentMainElem = document.querySelector(".b-content__main");
            if (!contentMainElem) return;

            const initialWidth = playerHolderElem.offsetWidth;
            const initialHeight = playerHolderElem.offsetHeight;
            let resizedWidth = contentMainElem.offsetWidth;
            let windowHeight = window.innerHeight;

            if (initialHeight > 0 && initialWidth !== resizedWidth) {
                let ratio = initialWidth / initialHeight;
                let resizedHeight = resizedWidth / ratio;
                if (resizedHeight > windowHeight) {
                    resizedHeight = windowHeight;
                    resizedWidth = windowHeight * ratio;
                }
                playerHolderElem.style.width = resizedWidth + "px";
                playerContainerElem.style.height = resizedHeight + "px";
                console.log(
                    `HDrezka Cleanup: player resized ` +
                        `from ${initialWidth}x${initialHeight} ` +
                        `to ${resizedWidth}x${resizedHeight}.`
                );
            }
        }
    }

    /* ------------------------------------------------- */
    /* --------------CONTENT-SIZE----------------------- */
    /* ------------------------------------------------- */

    function initContentSizeTumbler() {
        GM_addStyle(`

        /* css */

        /* Padding for content */
        .b-wrapper {
            padding-left: 30px !important;
            padding-right: 30px !important;
        }
        .b-search__form.focused,
        .search-results {
            width: calc(100% - 60px);
            left: 30px;
        }

        /* Remove extra right padding for content page */
        .b-content__columns {
            padding-right: 0 !important;
        }

        /* Remove extra right padding on main content listing */
        .b-content__inline_inner_mainprobar {
            padding-right: 0 !important;
        }
        .b-content__inline_inner_mainprobar .b-content__inline_item {
            margin-left: 16px !important;
        }

        /* Active brand fixes */
        body.active-brand,
        body.active-brand.pp {
            padding-top: 0 !important;
        }
        .active-brand #wrapper {
            width: auto !important;
        }

        /* Style status (HDrezka tracker block) */
        .b-post__status_wrapper {
            width: auto !important;
            margin: 0px 10px 0px 13px !important;
        }

        /* Style and resize rating block */
        .b-post__rating_table {
            width: 100% !important;
        }
        .b-post__rating_table td > * {
            float: right !important;
        }
        .b-post__rating_table .label {
            display: none !important;
        }

        /* Content Size Tumbler */

        .hc-tumbler-content-size {
            width: 78px !important;
        }
        .hc-tumbler-content-size .hc-tumbler-point:nth-child(1) {
            border-width: 8px;
        }
        .hc-tumbler-content-size .hc-tumbler-point:nth-child(2) {
            border-width: 7px;
        }
        .hc-tumbler-content-size .hc-tumbler-point:nth-child(3) {
            border-width: 6px;
        }
        .hc-tumbler-content-size .hc-tumbler-point:nth-child(4) {
            border-width: 5px;
        }

        /* Content Sizes */

        body {
            min-width: 1020px;
        }
        body.hc-content-size-wide .b-wrapper {
            width: auto;
            min-width: 960px;
            max-width: 1150px;
        }
        body.hc-content-size-ultrawide .b-wrapper {
            width: auto;
            min-width: 960px;
            max-width: 1340px;
        }
        body.hc-content-size-full .b-wrapper {
            min-width: 960px;
            width: auto;
        }
        body.hc-content-size-full .glory {
            width: auto;
        }

        /* !css */

        `);

        settings();

        function settings() {
            if (hc.settings) {
                hc.settings.createTumblerSetting({
                    name: "content-size",
                    label: "Максимальная ширина контента",
                    classes: [],
                    options: [
                        {
                            class: null,
                            text: "960 px",
                            end: function () {
                                window.removeEventListener("resize", hc.player.resize);
                                hc.player.resize();
                            },
                        },
                        {
                            class: "hc-content-size-wide",
                            text: "1150 px",
                            end: function () {
                                window.removeEventListener("resize", hc.player.resize);
                                window.addEventListener("resize", hc.player.resize);
                                hc.player.resize();
                            },
                        },
                        {
                            class: "hc-content-size-ultrawide",
                            text: "1340 px",
                            end: function () {
                                window.removeEventListener("resize", hc.player.resize);
                                window.addEventListener("resize", hc.player.resize);
                                hc.player.resize();
                            },
                        },
                        {
                            class: "hc-content-size-full",
                            text: "1340 px",
                            end: function () {
                                window.removeEventListener("resize", hc.player.resize);
                                window.addEventListener("resize", hc.player.resize);
                                hc.player.resize();
                            },
                        },
                    ],
                });
            }
        }
    }

    /* ------------------------------------------------- */
    /* --------------PLAYER-AUTO-PLAY-NEXT-------------- */
    /* ------------------------------------------------- */

    function initAutoPlayNext() {
        setup();
        settings();

        function setup() {
            window.addEventListener("message", function (event) {
                if (event.data && event.data.event == "ended") {
                    if (document.body.classList.contains("hc-auto-play-next-enabled")) {
                        hc.player.next();
                    }
                }
                if (
                    event.data &&
                    event.data.event == "time" &&
                    event.data.data != 0 &&
                    event.data.data >= event.data.duration - 1
                ) {
                    if (document.body.classList.contains("hc-auto-play-next-disabled")) {
                        hc.player.stop();
                    }
                }
            });
        }

        function settings() {
            if (hc.settings) {
                hc.settings.createTumblerSetting({
                    name: "auto-play-next",
                    label: "Автопереключение",
                    classes: [],
                    options: [
                        {
                            class: null,
                            text: "Только эпизоды (поведение по умолчанию)",
                        },
                        {
                            class: "hc-auto-play-next-enabled",
                            text: "Эпизоды и сезоны (быстрое переключение)",
                        },
                        {
                            class: "hc-auto-play-next-disabled",
                            text: "Выкл",
                        },
                    ],
                });
            }
        }
    }


    /* ------------------------------------------------- */
    /* --------------HIDE-ADS--------------------------- */
    /* ------------------------------------------------- */

    function initHideAds() {
        GM_addStyle(`

        /* css */

        /* Hide some ads containers */

        body.hc-hide-ads .b-content__main > .b-post__mixedtext + div[style],
        body.hc-hide-ads .b-content__main > .b-post__rating_table + div[style],
        body.hc-hide-ads .b-content__main > div > .b-player > .b-player__network_issues_holder + div[style],
        body.hc-hide-ads .b-content__main > div > .b-player > a[target='_blank'],
        body.hc-hide-ads .b-content__main + div,
        body.hc-hide-ads .b-wrapper .nopadd,
        body.hc-hide-ads .b-seriesupdate__block_list > .b-seriesupdate__block_list_item[data-url=''] {
            display: none !important;
        }

        /* !css */

        `);

        settings();

        function settings() {
            if (hc.settings) {
                hc.settings.createTumblerSetting({
                    name: "hide-ads",
                    label: "Скрыть рекламные блоки",
                    classes: ["hc-on-of-tumbler"],
                    options: [
                        {
                            class: null,
                            text: "Выкл",
                        },
                        {
                            class: "hc-hide-ads",
                            text: "Вкл",
                            default: true,
                        },
                    ],
                });
            }
        }
    }

    /* ------------------------------------------------- */
    /* --------------STYLE-IMPROVEMENTS----------------- */
    /* ------------------------------------------------- */

    function initStyleImprovements() {
        GM_addStyle(`

        /* css */

        /* Top Nav */

        body.hc-style .b-topnav__sub_inner a {
            color: #000 !important;
        }

        body.hc-style.b-theme__template__night .b-topnav__sub_inner a {
            color: #fff !important;
        }

        /* Slider */

        body.hc-style .b-newest_slider__list .b-content__inline_item {
            width: 92px;
            margin-right: 8px;
        }

        body.hc-style.b-theme__template__night .b-newest_slider__title span {
            border-color: #fff;
            color: #fff;
        }

        /* Sidelist */

        body.hc-style .b-sidelist .b-content__inline_item {
            width: 92px;
            margin-right: 8px;
        }

        /* Сontent item */

        body.hc-style .b-content__inline_item {
            width: 166px;
            margin-right: 10px;
        }

        body.hc-style .b-content__inline_item .b-content__inline_item-link a,
        body.hc-style .b-content__inline_item .b-content__inline_item-link a:visited {
            color: #000;
        }

        body.hc-style.b-theme__template__night .b-content__inline_item .b-content__inline_item-link a,
        body.hc-style.b-theme__template__night .b-content__inline_item .b-content__inline_item-link a:visited {
            color: #fff;
        }

        body.hc-style .b-content__inline_item .cat {
            position: relative;
            top: unset;
            bottom: 0;
            right: 0;
            border-radius: 0;
            width: 100%;
        }

        body.hc-style.b-theme__template__night .b-content__inline_item .cat {
            background-color: #060f13 !important;
        }

        body.hc-style .b-content__inline_item .cat .entity {
            display: inline-block !important;
            margin-right: -8px;
            position: absolute;
            left: 0;
            right: 0;
            overflow: hidden;
            text-overflow: ellipsis;
        }

        body.hc-style .b-content__inline_item:hover .cat .entity,
        body.hc-style .b-content__inline_item.active .cat .entity {
            display: none !important;
            margin-right: -10px;
            position: absolute;
            left: 0;
            right: 0;
            overflow: hidden;
            text-overflow: ellipsis;
        }

        body.hc-style .b-content__inline_item .info {
            background-color: #6f6f6f;
            color: #fff;
            border-radius: 0 !important;
            box-sizing: border-box;
            width: 100%;
            margin-bottom: 26px;
        }

        body.hc-style .b-content__inline_item .trailer {
            display: none !important;
            left: 0;
        }

        body.hc-style .b-content__inline_item-cover {
            padding: 0;
            border: 0;
        }

        /* Сontent page */

        body.hc-style .b-post .b-post__partcontent a,
        body.hc-style .b-post__info a,
        body.hc-style .b-post__info .persons-list-holder .person-name-item a {
            color: #000 !important;
            border-color: #000;
        }

        body.hc-style.b-theme__template__night .b-post .b-post__partcontent a,
        body.hc-style.b-theme__template__night .b-post__info a,
        body.hc-style.b-theme__template__night .b-post__info .persons-list-holder .person-name-item a {
            color: #fff !important;
            border-color: #fff;
        }

        body.hc-style .b-sidecover {
            background: none;
            border: none;
            padding: 0;
            overflow: hidden;
            border-radius: 4px;
        }

        body.hc-style .b-post .b-sidetitle,
        body.hc-style .b-post .b-post__mtitle {
            font-size: 16px;
            font-weight: bold;
            line-height: 18px;
            overflow: hidden;
            padding: 10px 18px;
            text-overflow: ellipsis;
            white-space: nowrap;
        }
        body.hc-style .b-post .b-post__actions .btn,
        body.hc-style .b-post .b-sidetitle,
        body.hc-style .b-post .b-post__schedule_block_title,
        body.hc-style .b-post .b-post__schedule_more,
        body.hc-style .b-post .b-post__mtitle {
            background: #ddd;
        }
        body.hc-style .b-post .b-post__actions .btn,
        body.hc-style .b-post .b-sidetitle,
        body.hc-style .b-post .b-post__schedule_block_title .title,
        body.hc-style .b-post .b-post__schedule_more .title,
        body.hc-style .b-post .b-post__mtitle {
            color: #000;
        }
        body.hc-style.b-theme__template__night .b-post .b-post__actions .btn,
        body.hc-style.b-theme__template__night .b-post .b-sidetitle,
        body.hc-style.b-theme__template__night .b-post .b-post__schedule_block_title,
        body.hc-style.b-theme__template__night .b-post .b-post__schedule_more,
        body.hc-style.b-theme__template__night .b-post .b-post__mtitle {
            background: #192125;
        }
        body.hc-style.b-theme__template__night .b-post .b-post__actions .btn,
        body.hc-style.b-theme__template__night .b-post .b-sidetitle,
        body.hc-style.b-theme__template__night .b-post .b-post__schedule_block_title .title,
        body.hc-style.b-theme__template__night .b-post .b-post__schedule_more .title,
        body.hc-style.b-theme__template__night .b-post .b-post__mtitle {
            color: #fff;
        }
        body.hc-style .b-post .b-post__schedule .b-sidetitle {
            display: none;
        }
        body.hc-style .b-post .b-post__partcontent {
            margin-top: 0;
        }
        body.hc-style .b-post .b-post__actions .btn {
            border: 0;
            border-radius: 0;
        }
        body.hc-style .b-post .b-post__social_holder {
            background: #1f1f1f;
        }

        /* Rating stars */

        body.hc-style .b-content__bubble_rating .b-rating > .current,
        body.hc-style .b-post__rating .b-post__rating_layer_current {
            filter: grayscale(100%) !important;
        }
        body.hc-style.b-theme__template__night .b-content__bubble_rating .b-rating > .current,
        body.hc-style.b-theme__template__night .b-post__rating .b-post__rating_layer_current {
            filter: grayscale(100%) brightness(200%) !important;
        }

        body.hc-style .b-content__bubble_rating b {
            color: #000;
        }
        body.hc-style.b-theme__template__night .b-content__bubble_rating b {
            color: #fff;
        }

        body.hc-style .b-post__rating .num {
            color: inherit !important;;
        }

        /* Breadcrumbs */

        body.hc-style .b-content__crumbs a {
            color: #444;
        }

        body.hc-style.b-theme__template__night .b-content__crumbs a {
            color: #fff;
        }

        /* Comments */

        body.hc-style .b-comment__like_it > i {
            display: none;
        }

        body.hc-style .b-comment__likes_count {
            margin: 0 !important;
        }

        body.hc-style .b-comment__quoteuser,
        body.hc-style .b-comment__like_it,
        body.hc-style.b-theme__template__night .b-comment__quoteuser,
        body.hc-style.b-theme__template__night .b-comment__like_it {
            color: #888;
            border-color: #888;
        }

        body.hc-style .b-comment .message > .text {
            color: #000;
        }

        body.hc-style.b-theme__template__night .b-comment .message > .text {
            color: #fff;
        }

        /* Content bubble */

        body.hc-style .b-content__bubble_content a {
            color: #000;
        }

        body.hc-style.b-theme__template__night .b-content__bubble_content a {
            color: #fff;
        }

        /* Misc */

        body.hc-style .b-newest_slider__title {
            padding-bottom: 20px;
        }

        /* !css */

        `);

        settings();

        function settings() {
            if (hc.settings) {
                hc.settings.createTumblerSetting({
                    name: "styles",
                    label: "Декоративные изменения",
                    classes: ["hc-on-of-tumbler"],
                    options: [
                        {
                            class: null,
                            text: "Выкл",
                        },
                        {
                            class: "hc-style",
                            text: "Вкл",
                            default: true,
                        },
                    ],
                });
            }
        }
    }

    /* ------------------------------------------------- */
    /* --------------PLAYER-COVER----------------------- */
    /* ------------------------------------------------- */

    function initPlayerCover() {
        document.addEventListener("DOMContentLoaded", setup);
        settings();

        function setup() {
            const cover = document.querySelector(".b-sidecover");
            if (!cover) return;

            const imgURL = cover.querySelector("img").src;

            GM_addStyle(`

            /* css */

            body.hc-player-cover #cdnplayer [style*='hc-poster'] {
                background-image: 
                    linear-gradient(
                        to left, 
                        rgba(0,0,0,1) 0%, 
                        rgba(0,0,0,1) 30%, 
                        rgba(0,0,0,.8) 50%, 
                        rgba(0,0,0,1) 70%, 
                        rgba(0,0,0,1) 100%
                    ), 
                    url('${imgURL}') !important;
                background-size: auto 100% !important;
                background-position: center !important;
                background-repeat: no-repeat !important;
            }
            
            /* !css */

            `);
        }

        function settings() {
            if (hc.settings) {
                hc.settings.createTumblerSetting({
                    name: "player-cover",
                    label: "Отображать обложку в плеере",
                    classes: ["hc-on-of-tumbler"],
                    options: [
                        {
                            class: null,
                            text: "Выкл",
                        },
                        {
                            class: "hc-player-cover",
                            text: "Вкл",
                            default: true,
                        },
                    ],
                });
            }
        }
    }

    /* ------------------------------------------------- */
    /* --------------HIDE-INFO-------------------------- */
    /* ------------------------------------------------- */

    function initHideInfo() {
        GM_addStyle(`

        /* css */

        /* Content hide info (button) */

        .hc-hide-info-button {
            content: '';
            width: 25px;
            height: 25px;
            margin-right: 5px;
            background-size: 25px 25px;
            background-repeat: no-repeat;
            background-image: url(${images.arrowImgURL});
            cursor: pointer;
        }
        body.hc-hide-info .hc-hide-info-button {
            transform: rotate(180deg);
        }

        /* Content hide info (hidden styles) */

        body.hc-hide-info .b-post__infotable,
        body.hc-hide-info .b-post__description,
        body.hc-hide-info .b-post__infolast{
            display: none !important;
        }

        /* Content hide info (night theme) */

        body.b-theme__template__night .hc-hide-info-button {
            filter: invert(100%) sepia(95%) saturate(21%) hue-rotate(280deg) brightness(106%) contrast(106%);
        }

        /* !css */

        `);

        settings();
        document.addEventListener("DOMContentLoaded", setup);

        function setup() {
            const title = document.querySelector(".b-post__title");
            if (!title) return;

            if (title.querySelector(".hc-hide-info-button")) return;

            const button = document.createElement("div");
            button.classList.add("pull-right");
            button.classList.add("hc-hide-info-button");
            button.addEventListener("click", () => {
                document.body.classList.toggle("hc-hide-info");
            });
            title.insertBefore(button, title.firstChild);
        }

        function settings() {
            if (hc.settings) {
                hc.settings.createTumblerSetting({
                    name: "hide-info",
                    label: "Сворачивать описание контента",
                    classes: ["hc-on-of-tumbler"],
                    options: [
                        {
                            start: function () {
                                document.body.classList.remove("hc-hide-info");
                            },
                            class: null,
                            text: "Выкл",
                        },
                        {
                            start: function () {
                                document.body.classList.add("hc-hide-info");
                            },
                            class: "hc-hide-info-enabled",
                            text: "Вкл",
                        },
                    ],
                });
            }
        }
    }

    /* ------------------------------------------------- */
    /* --------------HIDE-COMMENTS---------------------- */
    /* ------------------------------------------------- */

    function initHideComments() {
        GM_addStyle(`

        /* css */

        body.hc-comments-hide #hd-comments-list,
        body.hc-comments-hide #hd-comments-navigation {
            display: none;
        }

        .hc-comments-title {
            margin-bottom: 13px;
            overflow: hidden;
        }

        .hc-comments-title .title {
            font-size: 16px;
            font-weight: bold;
            line-height: 18px;
            overflow: hidden;
            padding: 10px 18px;
            text-overflow: ellipsis;
            white-space: nowrap;
            width: 520px;
            float: left;
        }

        .hc-comments-title {
            background: #ddd;
        }
        .hc-comments-title .title {
            color: #000;
        }
        body.b-theme__template__night .hc-comments-title {
            background: #192125;
        }
        body.b-theme__template__night .hc-comments-title .title {
            color: #fff;
        }

        .hc-act {
            color: #878586;
            cursor: pointer;
            float: right;
            font-size: 12px;
            margin-top: 8px;
            margin-right: 18px;
        }

        .hc-act:hover {
            text-decoration: underline;
        }

        .hc-act-show {
            display: none;
        }

        .hc-act-hide {
            display: block;
        }

        body.hc-comments-hide .hc-act-show {
            display: block;
        }

        body.hc-comments-hide .hc-act-hide {
            display: none;
        }

        body.hc-comments-hide .b-content__crumbs {
            margin-top: 30px;
        }

        /* !css */

        `);

        settings();
        document.addEventListener("DOMContentLoaded", setup);

        function setup() {
            const commentsList = document.querySelector("#hd-comments-list");
            if (!commentsList) return;

            const commentsTitle = document.createElement("div");
            commentsTitle.classList.add("hc-comments-title");
            commentsTitle.addEventListener("click", () => {
                document.body.classList.toggle("hc-comments-hide");
            });

            const title = document.createElement("div");
            title.innerText = "Отзывы";
            title.classList.add("title");
            commentsTitle.appendChild(title);

            const actShow = document.createElement("div");
            actShow.classList.add("hc-act");
            actShow.classList.add("hc-act-show");
            actShow.innerText = "развернуть";
            commentsTitle.appendChild(actShow);

            const actHide = document.createElement("div");
            actHide.classList.add("hc-act");
            actHide.classList.add("hc-act-hide");
            actHide.innerText = "свернуть";
            commentsTitle.appendChild(actHide);

            commentsList.parentNode.insertBefore(commentsTitle, commentsList);
        }

        function settings() {
            if (hc.settings) {
                hc.settings.createTumblerSetting({
                    name: "comments-hide",
                    label: "Сворачивать отзывы",
                    classes: ["hc-on-of-tumbler"],
                    options: [
                        {
                            start: function () {
                                document.body.classList.remove("hc-comments-hide");
                            },
                            class: null,
                            text: "Выкл",
                        },
                        {
                            start: function () {
                                document.body.classList.add("hc-comments-hide");
                            },
                            class: "hc-comments-hide-enabled",
                            text: "Вкл",
                        },
                    ],
                });
            }
        }
    }

    /* ------------------------------------------------- */
    /* --------------TRANSLATORS------------------------ */
    /* ------------------------------------------------- */

    function initHideTranslators() {
        GM_addStyle(`

        /* css */

        /* Content hide translators */

        .hc-translators-hide-enabled .b-translator__item.active {
            cursor: pointer;
        }
        .hc-translators-hide-enabled .hc-toggle-translators-button {
            content: '';
            float: left;
            width: 20px;
            height: 20px;
            margin-right: 3px;
            margin-top: 8px;
            margin-left: 5px;
            background-size: 20px 20px;
            background-repeat: no-repeat;
            background-image: url(${images.arrowImgURL});
            filter: invert(100%) sepia(95%) saturate(21%) hue-rotate(280deg) brightness(106%) contrast(106%);
            transform: rotate(90deg);
            cursor: pointer;
        }
        .hc-translators-hide-enabled .hc-show-translators .hc-toggle-translators-button {
            transform: rotate(-90deg);
        }
        .hc-translators-hide-enabled .b-translator__item:not(.active):not(.hc-toggle-translators-button) {
            display: none;
        }
        .hc-translators-hide-enabled .b-translators__title {
            display: none;
        }
        .hc-translators-hide-enabled .hc-show-translators .b-translator__item:not(.active):not(.hc-toggle-translators-button) {
            display: block;
        }
        .hc-translators-hide-enabled .hc-show-translators .b-translators__title {
            display: block;
        }

        /* !css */

        `);

        settings();
        document.addEventListener("DOMContentLoaded", setup);

        function setup() {
            function toggle() {
                document.querySelector(".b-translators__block").classList.toggle("hc-show-translators");
            }

            const translators = document.querySelector(".b-translators__block");
            if (!translators) return;

            const translatorsList = translators.querySelector(".b-translators__list");
            if (!translatorsList) return;

            const toggler = document.createElement("li");
            toggler.classList.add("hc-toggle-translators-button");
            toggler.addEventListener("click", toggle);
            translatorsList.appendChild(toggler);

            translatorsList.querySelectorAll(".b-translator__item").forEach((button) => {
                button.addEventListener("click", function () {
                    if (this.classList.contains("active")) {
                        toggle();
                    }
                });
            });
        }

        function settings() {
            if (hc.settings) {
                hc.settings.createTumblerSetting({
                    name: "translators",
                    label: "Сворачивать список переводов",
                    classes: ["hc-on-of-tumbler"],
                    options: [
                        {
                            class: null,
                            text: "Выкл",
                        },
                        {
                            class: "hc-translators-hide-enabled",
                            text: "Вкл",
                        },
                    ],
                });
            }
        }
    }

    /* ------------------------------------------------- */
    /* --------------IMDB-RATING------------------------ */
    /* ------------------------------------------------- */

    function initIMDbRating() {
        GM_addStyle(`

        /* css */

        /* Rating */

        .b-content__inline_item-link > .rating {
            display: none;
        }

        body.hc-imdb .b-content__inline_item-link > .rating {
            display: block;
        }

        .b-content__inline_item-link > .rating {
            position: relative;
            line-height: 15px;
            font-size: 11px;
            font-weight: normal;
            margin-top: 3px;
        }
        .b-content__inline_item-link > .rating .rating-votes {
            font-size: 9px;
        }
        .b-content__inline_item-link > .rating .rating-value {
            margin-left: 29px;
            color: #f09a20;
        }
        .b-content__inline_item-link > .rating:before {
            content: '';
            position: absolute;
            width: 26px;
            height: 100%;
            background-size: auto 24px;
            background-position: center -4px;
            background-repeat: no-repeat;

            /* https://icons8.com/icon/V0AXUEQxEIf5/imdb */
            background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAABmJLR0QA/wD/AP+gvaeTAAAEu0lEQVR4nO2czYscRRiHn+nxY7ORdc1ulGgQYoxGNwbEKIoHDxpQNGxEURQPQQ34D/gRCFE8hJCDIIoHz7noRTeCB4MmB0OMHxFRE0wkStCIGM0SV1fDJuOhetze2uqu/piZ7u35PfAyzLxVv3q73uma6uquASGEEEIIIYQQQgghhBBCCCGEEEIIIUTdaCT4LgM2AuPAamA5sLgXQdWAv4CfgCPAbuBd4HTayouALcAk0JJ1xE4DLwADvs6/Evi0AgHX1b4Erk7q/BMVCLLudiLs6zksAj6rQHD9YgcJh6NmmIDngSfsrIiucRUwBexvYGY7PwCXlhpS/zEJXBMAD6LOL4NhYDwANpQdSR+zIQDGyo6ijxlrAH8Cl5QdSZ8y1cBMi7LyD7ATM3W9DXiWuVd508AO4BBwR+i/MIP+v8B2zHTtduZfRbbbPwDMRD4fAJYBK4H7gTUdOp6ukmce+5Sl8bTl32T57wPOptQ+C9xr1X/S034c1wG7gHMFj6eblqvSkBXwkOV3LdptAs57dM8zP3mEeknt+1gHHC9wPJVLgAufH2CrR3drQt00+kmMAh/HtOtrrzYJAHgtRvNNT72iCQDzzf7W0bavvVoloAlMWOUnmF0WicOnvwd4D3gVuJv4ex3XA3+n0KttAgAGMTOYVvg6mKJO1g47AFwbU3ZHCr17LHsA2Iz5Uf/D0d6CSgCYMXl3+JqGPN/Y33FfaA4DZzLGG2UxsI35Z9KCSkBW8iSgBXwHXOQo/5ZHLw23Aj8ntF2pBKxLeVBx5fImoAU84yj/uEcvLWsxqwmVT8CvmCvUJFaG5fLoJ8X7kaP8Wo9eFjZ72o+1vEsRrhlGK4X/GHAn8JvDvxTYD6wqoB/HqVA/ymgkDpfeHuv9NPAhZro8bfmawNfADQkxxNKrM6Dt+4T5s57B8PNO6LvM7jAwaz159D7H3MK12eKJofQhKOr/gNnZz9LwfSf1bTvqKL+igN5OR/lbPHUqlYAWZgXySPjaDf2oveEof1cBvZOO8qOeOpVLQK/0Z4AbHeVfLhCvb0hLbUFM43ViO3DY8fnGAppfOD5blleszmfAK4DrS7a+QLznwvo2D2U8xtoOQTPAXsyCnIsAc6cuT7y/AA/HlN/lOSanXRAjthBZj1n7+ZHkJ5FfAm5OqRflFPANc2+BtlkFPJJC00ldzoA0PIb7rlwRmpiLtjz9mHsIssfVIKO/0/o+Gpgb+3H3hvNORhrA6zGaXU2AvcS7xuO/qcv6SYwB72dsLw0jwDsZjqmjCdgLLAkDWQLss/z7Iv4Rh7+oftTvYgh4FHgbM2Znac/HauBFzO9M0c7PvRgH5uneY5gfINeDXVPA96E/z9amNPpfMfeiaAQzH7+C5O1Xce3ZelFGME81X55RN5EiCRAdIMBkXpTDmQD3wpLoDScD3OskojccDjBPJohymGhvUTqOeVRD9I5JYEUTc0MkIH7xSnSHbUQeFhhAG7R7af9vU42ijdq9MedG7WgSDlYgyLraIRL+qqDNAGbjdkfWOmS0wr58DrjY7uyk9ZJhzF/VjGMeOFqONvOlZYrZv6uZCG2y1IiEEEIIIYQQQgghhBBCCCGEEEIIIYQQPeM/uURowB/mrvMAAAAASUVORK5CYII=");

            /* https://codepen.io/sosuke/pen/Pjoqqp */
            filter: invert(66%) sepia(77%) saturate(1448%) hue-rotate(347deg) brightness(99%) contrast(91%);
        }

        /* !css */
        
        `);

        settings();

        function setWithExpiry(key, value, ttl) {
            const now = new Date();

            // `item` is an object which contains the original value
            // as well as the time when it's supposed to expire
            const item = {
                value: value,
                expiry: now.getTime() + ttl,
            };
            localStorage.setItem(key, JSON.stringify(item));
        }

        function getWithExpiry(key) {
            const itemStr = localStorage.getItem(key);
            // if the item doesn't exist, return null
            if (!itemStr) {
                return null;
            }
            const item = JSON.parse(itemStr);
            const now = new Date();
            // compare the expiry time of the item with the current time
            if (now.getTime() > item.expiry) {
                // If the item is expired, delete the item from storage
                // and return null
                localStorage.removeItem(key);
                return null;
            }
            return item.value;
        }

        function getRating(id) {
            return new Promise((resolve) => {
                console.debug(`HDrezka IMDB Rating: request quick content for id=${id}.`);
                GM_xmlhttpRequest({
                    method: "POST",
                    url: "/engine/ajax/quick_content.php",
                    data: `id=${id}&is_touch=1`,
                    headers: {
                        "Content-Type": "application/x-www-form-urlencoded",
                    },
                    onload: (response) => {
                        // One weak ttl in ms
                        const ttl = 7 * 24 * 60 * 60 * 1000;
                        if (response.status === 200) {
                            // Is 200 status code
                            // Find IMDb block
                            const ratingHTML = /<span class="imdb">IMDb: <b>.{1,60}\)<\/i><\/span>/.exec(
                                response.responseText
                            );
                            if (ratingHTML) {
                                // IMDb block found
                                let rating;
                                let votes;
                                try {
                                    // Get actual rating
                                    const rating = /(<b>)(.*)(<\/b>)/.exec(ratingHTML[0])[2];
                                    // Get actual votes count
                                    const votes = /(<i>)\((.*)\)(<\/i>)/.exec(ratingHTML[0])[2];
                                    // Save real rating to Storage
                                    // Resolve with real rating
                                    const data = {
                                        rating: rating,
                                        votes: votes,
                                        id: id,
                                    };
                                    setWithExpiry(id, data, ttl);
                                    resolve(data);
                                    console.debug(`HDrezka IMDB Rating: request quick content for id=${id} success.`);
                                    return;
                                } catch (err) {
                                    console.debug(err);
                                }
                            }
                            // IMDb block not found
                            // Save empty rating to storage to not make new request in next page load
                            // Resolve with empty rating
                            const data = { rating: "", votes: "", id: id };
                            setWithExpiry(id, data, ttl);
                            resolve(data);
                            console.debug(
                                `HDrezka IMDB Rating: request quick content for id=${id} success, but no correct data found.`
                            );
                        } else {
                            console.debug(
                                `HDrezka IMDB Rating: request quick content for id=${id} failed with ${response.status} status code.`
                            );
                            // Isn't 200 status code
                            // Don't save any rating so it will be requsted again in next page load
                            // Resolve with null rating
                            resolve({ rating: null, votes: null, id: id });
                        }
                    },
                    onerror: () => {
                        console.debug(`HDrezka IMDB Rating: request quick content for id=${id} failed.`);
                        // Request failed
                        // Don't save any rating so it will be requsted again in next page load
                        // Resolve with null rating
                        resolve({ rating: null, votes: null, id: id });
                    },
                });
            });
        }

        function showRating(ratingObject) {
            if (
                ratingObject &&
                ratingObject.id !== null &&
                ratingObject.rating !== null &&
                ratingObject.rating !== ""
            ) {
                // Got rating
                // Find related elements to append rating
                document
                    .querySelectorAll(`[data-id="${ratingObject.id}"] .b-content__inline_item-link`)
                    .forEach((contentItemLinkElement) => {
                        // Check rating wasn't already appended
                        if (contentItemLinkElement && !contentItemLinkElement.querySelector(".rating")) {
                            // Append rating block
                            let votesText;
                            try {
                                votesText = `${parseInt(parseInt(ratingObject.votes.replace(/\s/g, "")) / 1000)}k`;
                            } catch (err) {
                                console.debug(err);
                                votesText = "";
                            }
                            contentItemLinkElement.innerHTML +=
                                /* html */
                                `
                                    <!-- html -->
                                    <span class="rating">
                                        <span class="rating-value"><b>${ratingObject.rating}</b></span>
                                        <span> / </span>
                                        <span class="rating-votes">${votesText}</span>
                                    </span>
                                    <!-- !html -->
                                `;
                        }
                    });
            }
        }

        function getAndShowRating(contentItemElement) {
            const id = contentItemElement.dataset.id;
            const ratingObject = getWithExpiry(id);
            if (
                ratingObject !== null &&
                ratingObject.id != null &&
                ratingObject.rating != null &&
                ratingObject.votes != null
            ) {
                // Found vaid saved rating in storage
                // Show rating from storage
                return showRating(ratingObject);
            }
            // Rating not found in storage
            // Request rating and then show
            return getRating(id).then(showRating);
        }

        function settings() {
            if (hc.settings) {
                hc.settings.createTumblerSetting({
                    name: "imdb",
                    label: "Рейтинг IMDb",
                    classes: ["hc-on-of-tumbler"],
                    options: [
                        {
                            class: null,
                            text: "Выкл",
                        },
                        {
                            end: function () {
                                document.querySelectorAll(".b-content__inline_item").forEach(getAndShowRating);
                            },
                            class: "hc-imdb",
                            text: "Вкл",
                        },
                    ],
                });
            }
        }
    }

    /* ------------------------------------------------- */
    /* --------------HOTKEYS---------------------------- */
    /* ------------------------------------------------- */

    function initHotkeys() {
        const HELP_TOOLTIP =
            /* html */
            `
            <!-- html -->
            <span class="hc-tooltip">
                <span class="hc-tooltip-icon">i</span>
                <div class="tooltiptext">
                    <div>Список горячих клавиш</div>
                    <ul style="margin-top: 15px;">
                        <li style="margin-top: 5px;">ПРОБЕЛ - Плей/Пауза</li>
                        <li style="margin-top: 5px;">F - Полноэкранный режим</li>
                        <li style="margin-top: 5px;">N - Следующий эпизод</li>
                        <li style="margin-top: 5px;">P - Предыдущий эпизод</li>
                    </ul>
                    <div style="margin-top: 15px;">
                        <small>
                            В отличии от оригинальных работают с
                            разу полсле загрузки страницы. 
                            В том числе когда плеер не в фокусе 
                            или был не в фокусе на момент перевода 
                            в полноэкранный режим. 
                        </small>
                    </div>
                </div>
            </div>
            <!-- !html -->
        `;

        function setup() {
            function anyActiveInput() {
                const inputs = document.querySelectorAll("input,textarea");
                return Array.from(inputs).includes(document.activeElement);
            }

            document.addEventListener("keyup", function (e) {
                if (!anyActiveInput()) {
                    switch (e.code) {
                        case "KeyF":
                            hc.player.fullscreen();
                            e.preventDefault();
                            break;
                    }
                }
            });

            document.addEventListener("keydown", function (e) {
                if (!anyActiveInput()) {
                    switch (e.code) {
                        case "KeyN":
                            hc.player.next();
                            e.preventDefault();
                            break;
                        case "KeyP":
                            hc.player.prev();
                            e.preventDefault();
                            break;
                        case "Space":
                            hc.player.toggle();
                            e.preventDefault();
                            break;
                    }
                }
            });
        }

        settings();

        function settings() {
            if (hc.settings) {
                hc.settings.createTumblerSetting({
                    name: "hotkeys",
                    label: `Улучшеные горячие клавиши ${HELP_TOOLTIP}`,
                    classes: ["hc-on-of-tumbler"],
                    options: [
                        {
                            class: null,
                            text: "Выкл",
                            reload: true,
                        },
                        {
                            end: setup,
                            class: "hc-hotkeys-enabled",
                            text: "Вкл",
                            default: true,
                            reload: true,
                        },
                    ],
                });
            }
        }
    }

    /* ------------------------------------------------- */
    /* --------------HIDE-RUSSIAN----------------------- */
    /* ------------------------------------------------- */

    function initHideRussian() {
        GM_addStyle(`

        /* css */

        /* Main */

        .hc-hide-russian .hc-russian {
            display: none;
        }

        /* !css */
        
        `);

        document.addEventListener("DOMContentLoaded", setup);
        settings();

        function setup() {
            document.querySelectorAll(".b-content__inline_item").forEach((elem) => {
                if (elem.textContent.includes("Россия,") && !elem.classList.contains("hc-russian")) {
                    elem.classList.add("hc-russian");
                    const info = elem
                        .querySelector(".b-content__inline_item-link")
                        .textContent.replace(/(\r\n|\n|\r)/gm, "")
                        .trim();
                    console.debug(`HDrezka Cleanup: mark russian ${info}`);
                }
            });
        }

        function settings() {
            if (hc.settings) {
                hc.settings.createTumblerSetting({
                    name: "hide-russian",
                    label: "Скрыть контент из страны-агрессора",
                    classes: ["hc-on-of-tumbler"],
                    options: [
                        {
                            class: null,
                            text: "Выкл",
                        },
                        {
                            class: "hc-hide-russian",
                            text: "Вкл",
                        },
                    ],
                });
            }
        }
    }

    /* ------------------------------------------------- */
    /* --------------SETTINGS--------------------------- */
    /* ------------------------------------------------- */

    function initSettings() {
        GM_addStyle(`
        /* css */

        /* Settings */

        .hc-settings {
            position: relative;
        }

        /* Tumbler */

        .hc-tumbler {
            width: 38px;
            height: 30px;
            background-color: #000;
            border: #1d92b2;
            border-radius: 30px;
            display: flex;
            justify-content: space-between;
            align-items: center;
            padding: 0 6px;
            cursor: pointer;
            position: relative;
            user-select: none;
        }
        .hc-tumbler-point {
            border-radius: 50%;
            content: '';
            display: block;
            height: 20px;
            width: 20px;
            background-color: #999;
            background-clip: content-box;
            box-sizing: border-box;
            border-color: transparent;
            border-style: solid;
            border-width: 5px;
        }
        .hc-tumbler > .hc-tumbler-dot {
            position: absolute;
            height: 20px;
            width: 20px;
            border-radius: 50%;
            background-color: #fff;
            transition: transform .5s,background-color .5s;
            will-change: transform;
            z-index: 2;
        }
        body.b-theme__template__night .hc-tumbler {
            background: #222d33;
        }

        /* On-Off Tumbler */

        .hc-on-of-tumbler .hc-tumbler-point:nth-child(1) {
            background-color: green;
        }
        .hc-on-of-tumbler .hc-tumbler-point:nth-child(2) {
            background-color: indianred;
        }

        /* Settings */

        .hc-settings > ul {
            width: 400px;
            display: none;
            background: #313131;
            border-top: 0;
            position: absolute;
            top: 50px;
            left: 0px;
            white-space: nowrap;
            box-shadow: 0 5px 20px 0px #000;
            border-color: #222d33;
            border-style: solid;
            border-width: 3px 3px 3px 3px;
            padding: 5px 0;
        }
        .hc-settings > ul:before {
            content: '';
            display: block;
            position: absolute;
            top: -13px;
            left: 20px;
            width: 0; 
            height: 0; 
            border-left: 10px solid transparent;
            border-right: 10px solid transparent; 
            border-bottom: 10px solid #222d33; 
        }

        .hc-settings > ul:after {
            content: '';
            display: block;
            position: absolute;
            top: -9px;
            left: 21px;
            width: 0; 
            height: 0; 
            border-left: 9px solid transparent;
            border-right: 9px solid transparent; 
            border-bottom: 9px solid #313131; 
        }

        body.b-theme__template__night .hc-settings > ul:after {
            border-bottom-color: #060f13; 
        }

        body.hc-settings-active .hc-settings > ul {
            display: block !important;
        }

        .hc-settings > ul > li {
            white-space: nowrap;
            color: #777;
            font-size: 10px;
            font-weight: bold;
            margin: 0 !important;
            padding: 5px 10px;
            height: 30px;
        }

        .hc-settings > ul > li .hc-tumbler {
            float: right;
        }

        .hc-settings .hc-setting-text-value {
            display: none;
            opacity: .5;
        }

        .hc-settings .hc-setting-text-block {
            float: left;
            padding-top: 5px;
            position: relative;
        }

        body.b-theme__template__night .hc-settings > ul {
            background: #060f13;
        }

        /* Settings tumbler */

        .hc-tumbler-settings {
            margin-top: 5px;
            margin-left: 10px;
        }
        .hc-tumbler-settings .hc-tumbler-point {
            background-size: 15px 15px;
            background-repeat: no-repeat;
            background-position: center;
            border-width: 2px;
        }
        .hc-tumbler-settings .hc-tumbler-point:nth-child(1) {
            background-image: url('${images.settingsOpenImgURL}');
            background-color: transparent !important;
        }
        .hc-tumbler-settings .hc-tumbler-point:nth-child(2) {
            background-image: url('${images.settingsCloseImgURL}');
            background-color: transparent !important;
        }

        /* Tooltip */

        .hc-tooltip {
            position: relative;
            display: inline-block;
            border-bottom: 1px dotted black;
        }

        .hc-tooltip .tooltiptext {
            background: #313131;
            border-top: 0;
            position: absolute;
            top: -25px;
            left: 35px;
            white-space: nowrap;
            box-shadow: 0 5px 20px 0px #000;
            border-color: #222d33;
            border-style: solid;
            border-width: 3px;
            visibility: hidden;
            width: 200px;
            white-space: normal;
            padding: 15px;
            position: absolute;
            z-index: 3;
        }

        body.b-theme__template__night .hc-tooltip .tooltiptext {
            background: #060f13;
        }

        .hc-tooltip:hover .tooltiptext {
            visibility: visible;
        }

        .hc-tooltip .tooltiptext:before {
            content: '';
            display: block;
            position: absolute;
            left: -13px;
            top: 11px;
            width: 0; 
            height: 0; 
            border-top: 10px solid transparent; 
            border-bottom: 10px solid transparent; 
            border-right: 10px solid #222d33;
        }

        .hc-tooltip .tooltiptext:after {
            content: '';
            display: block;
            position: absolute;
            left: -9px;
            top: 12px;
            width: 0; 
            height: 0; 
            border-top: 9px solid transparent; 
            border-bottom: 9px solid transparent; 
            border-right: 9px solid #222d33;
        }

        body.b-theme__template__night .hc-tooltip .tooltiptext:after {
            border-right-color: #060f13; 
        }

        .hc-tooltip-icon {
            border-radius: 50%;
            background: #777;
            min-width: 15px;
            min-height: 15px;
            display: inline-block;
            text-align: center;
            color: #000;
            text-transform: lowercase;
            cursor: pointer;
            position: absolute;
            font-family: monospace, monospace;
            font-size: 13px;
            top: -10px;
            right: -20px;
        }

        body.hc-settings-active.active-brand.pp #top-head,
        body.hc-settings-active .b-tophead_wrapper {
            position: fixed !important;
            border-bottom: 3px solid #222d33;
        }

        .b-topnav_wrapper {
            transition: none;
        }

        body.hc-settings-active .b-topnav_wrapper {
            margin-top: 40px;
            transition: none;
        }

        /* !css */
        `);

        hc.settings = {};
        hc.settings.createTumblerSetting = createTumblerSetting;

        const SETTINGS_NAME = "hc-settings";
        const DEFAULT_SETTING = "";

        document.addEventListener("DOMContentLoaded", setup);

        function setSetting(config, option) {
            const setting = option.class !== null ? option.class : DEFAULT_SETTING;
            const settingsStr = localStorage.getItem(SETTINGS_NAME);
            let settings = settingsStr !== null ? JSON.parse(settingsStr) : {};
            settings[config.name] = setting;
            localStorage.setItem(SETTINGS_NAME, JSON.stringify(settings));
        }

        function getSetting(config) {
            const settingsStr = localStorage.getItem(SETTINGS_NAME);
            const settings = settingsStr !== null ? JSON.parse(settingsStr) : {};
            let setting = settings[config.name];
            return setting !== undefined ? setting : null;
        }

        function getDefaultOption(config) {
            for (let optionIndex = 0; optionIndex < config.options.length; optionIndex++) {
                const tumblerOption = config.options[optionIndex];
                if (tumblerOption.default === true) {
                    return tumblerOption;
                }
            }
        }

        function setBodyClass(config, option) {
            for (let optionIndex = 0; optionIndex < config.options.length; optionIndex++) {
                const tumblerOption = config.options[optionIndex];
                if (tumblerOption.class !== null) {
                    document.body.classList.remove(tumblerOption.class);
                }
            }

            if (option && option.class) {
                document.body.classList.add(option.class);
            }
        }

        function getNextOption(config, option) {
            let nextOptionIndex;
            if (option) {
                const currentOptionIndex = config.options.indexOf(option);
                if (currentOptionIndex < config.options.length - 1) {
                    nextOptionIndex = currentOptionIndex + 1;
                } else {
                    nextOptionIndex = 0;
                }
            } else {
                nextOptionIndex = 1;
            }
            return config.options[nextOptionIndex];
        }

        function getCurrentOption(config) {
            const currentSetting = getSetting(config);

            if (currentSetting != null) {
                for (let optionIndex = 0; optionIndex < config.options.length; optionIndex++) {
                    const tumblerOption = config.options[optionIndex];
                    const optionSetting = tumblerOption.class !== null ? tumblerOption.class : DEFAULT_SETTING;
                    if (optionSetting === currentSetting) {
                        return tumblerOption;
                    }
                }
            }

            const option = getDefaultOption(config);

            if (option) {
                setSetting(config, option);
                return option;
            } else {
                setSetting(config, { class: DEFAULT_SETTING });
            }
        }

        function rotateSetting(config) {
            const currentOption = getCurrentOption(config);
            const nextOption = getNextOption(config, currentOption);
            setSetting(config, nextOption);
            setBodyClass(config, nextOption);
            if (nextOption.reload === true) {
                document.location.reload();
            }
            if (nextOption.start) {
                nextOption.start();
            }
            if (nextOption.end) {
                nextOption.end();
            }
        }

        function initSetting(config) {
            const currentOption = getCurrentOption(config);
            setBodyClass(config, currentOption);
            if (currentOption && currentOption.start) {
                currentOption.start();
            }
            if (currentOption && currentOption.end) {
                document.addEventListener("DOMContentLoaded", currentOption.end);
            }
        }

        function setup() {
            const tophead = document.querySelector(".b-tophead-left");
            if (!tophead) return;

            const tumblerWrapper = buildTumbler({
                handler: toggle,
                name: "settings",
                classes: [],
                options: [
                    {
                        class: null,
                    },
                    {
                        class: "hc-settings-active",
                    },
                ],
            });
            tumblerWrapper.classList.add("hc-settings");
            tumblerWrapper.classList.add("pull-left");

            const tumblerUL = document.createElement("ul");
            tumblerWrapper.appendChild(tumblerUL);

            document.addEventListener("click", close);

            tophead.appendChild(tumblerWrapper);
        }

        function toggle(event) {
            document.body.classList.toggle("hc-settings-active");
            event.stopPropagation();
        }

        function close(event) {
            if (!event.target.closest(".hc-settings")) {
                document.body.classList.remove("hc-settings-active");
            }
        }

        function addTumblerSetting(element) {
            const tophead = document.querySelector(".b-tophead-left");
            if (!tophead) return;

            const dropdown = tophead.querySelector(".hc-settings ul");
            if (!dropdown) return;

            const item = document.createElement("li");
            item.appendChild(element);
            dropdown.appendChild(item);
        }

        function buildTumbler(config) {
            const optionsLength = config.options.length;
            const tumblerClassName = "hc-tumbler-" + config.name;

            GM_addStyle(`
            /* css */

            .${tumblerClassName} {
                width: ${optionsLength * 15 + optionsLength * 5}px !important;
            }
    
            /* !css */
            `);

            const tumblerWrapper = document.createElement("div");
            tumblerWrapper.classList.add("hc-tumbler-wrapper");

            const tumbler = document.createElement("div");
            tumbler.classList.add("hc-tumbler");
            tumbler.classList.add(tumblerClassName);
            tumbler.className += " " + config.classes.join(" ");

            tumbler.addEventListener("click", config.handler);

            for (let optionIndex = 0; optionIndex < optionsLength; optionIndex++) {
                const tumblerOption = config.options[optionIndex];
                const tumblerPoint = document.createElement("div");
                tumblerPoint.classList.add("hc-tumbler-point");
                tumbler.appendChild(tumblerPoint);

                if (tumblerOption.class !== null) {
                    // Add dot move style for all points except initial
                    const enabledClassName = tumblerOption.class;

                    GM_addStyle(`
                    /* css */
            
                    .${enabledClassName} .${tumblerClassName} .hc-tumbler-dot {
                        transform: translateX(${optionIndex * 100}%);
                    }

                    /* !css */
                    `);
                }
            }

            const tumblerDot = document.createElement("div");
            tumblerDot.classList.add("hc-tumbler-dot");
            tumbler.appendChild(tumblerDot);

            tumblerWrapper.appendChild(tumbler);

            return tumblerWrapper;
        }

        function buildTumblerSetting(config) {
            initSetting(config);
            const originalHandler = config.handler;
            function handler(event) {
                rotateSetting(config);
                if (originalHandler) {
                    originalHandler(event);
                }
            }
            config.handler = handler;
            const tumblerWrapper = buildTumbler(config);
            const settingClass = "hc-setting-" + config.name;
            tumblerWrapper.classList.add(settingClass);

            const settingTextBlock = document.createElement("div");
            settingTextBlock.classList.add("hc-setting-text-block");

            const labelSpan = document.createElement("span");
            labelSpan.classList.add("hc-setting-label");
            labelSpan.innerHTML = config.label;

            settingTextBlock.appendChild(labelSpan);

            const optionsLength = config.options.length;

            let defaultSelector = "body";
            for (let tumblerIndex = 0; tumblerIndex < optionsLength; tumblerIndex++) {
                const tumplerOption = config.options[tumblerIndex];
                if (tumplerOption.class !== null) {
                    defaultSelector += `:not(.${tumplerOption.class})`;
                }
            }

            for (let optionIndex = 0; optionIndex < optionsLength; optionIndex++) {
                const tumplerOption = config.options[optionIndex];
                const textValueClass = "hc-setting-text-value-" + (optionIndex + 1);

                const textValueSpan = document.createElement("span");
                textValueSpan.classList.add("hc-setting-text-value");
                textValueSpan.classList.add(textValueClass);
                textValueSpan.innerHTML = tumplerOption.text;
                settingTextBlock.appendChild(textValueSpan);

                if (optionIndex == 0) {
                    GM_addStyle(`
                    /* css */
            
                    ${defaultSelector} .${settingClass} .${textValueClass} {
                        display: block !important;
                    }
        
                    /* !css */
                    `);
                } else {
                    const enabledClassName = config.options[optionIndex].class;
                    GM_addStyle(`
                    /* css */
            
                    .${enabledClassName} .${settingClass} .${textValueClass} {
                        display: block !important;
                    }
    
                    /* !css */
                    `);
                }
            }

            tumblerWrapper.appendChild(settingTextBlock);

            return tumblerWrapper;
        }

        function createTumblerSetting(config) {
            const tumblerSetting = buildTumblerSetting(config);
            document.addEventListener("DOMContentLoaded", () => {
                addTumblerSetting(tumblerSetting);
            });
        }
    }
})();