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-17 提交的版本,檢視 最新版本

// ==UserScript==
// @name            HDrezka Cleanup
// @name:en         HDrezka Cleanup
// @namespace       http://tampermonkey.net/
// @version         0.52
// @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 = {};

    const arrowImageURL =
        "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABaCAYAAAA4qEECAAAABmJLR0QA/wD/AP+gvaeTAAABa0lEQVR4nO3awUrDQBSF4dMuGhc+uF0puK/v4KL4RPoARbLUxTRQi5nMJDPJvcn/gRsp5NyfWgSVAAAAAAAAAAAAAAAAAACYXSPpKOlL0qekp+v3UNBB0rukn7uvD0kPC+5alb7IxC5oKDKxC0iNTOwJciMTe4SxkYmdoZF0VjzkOfE1/OrXI+Wd3L1bc16LG2PCETvTlGDETlQiFLEHlAxE7B41whD7Ts0gxL6aI8TmY88ZYLOxlzh8c7GXPHgzsS0camFDVZYOtLSlKIuHWdw0ieWDLG/L4uEQDxujPB3gaesfHoe72+xu8A03290MjTB/g/mBGczeYnbYBOZuSv2XAI9/7jd126uVIZWkxH6pPWIv6TsywHvkzlDsi6RdzQF7SW3Pw9cSuROL3Sq0qOrtnwevLXKnL/Zpjoc/KsRuFX6EnrXOyJ1G4TP5onDzSaHBbKp+Rhm00/ZuBgAAAAAAAAAAAAAAAODKL8SQFSF3JeZKAAAAAElFTkSuQmCC";

    /* ------------------------------------------------- */
    /* --------------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 */

    `);

    /* ------------------------------------------------- */
    /* --------------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;
        }

        /* Post Info */

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

        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__info a {
            color: #fff;
        }

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

        /* Сontent page */

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

    /* ------------------------------------------------- */
    /* --------------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();
                            },
                        },
                    ],
                });
            }
        }
    }

    /* ------------------------------------------------- */
    /* --------------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(${arrowImageURL});
            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: "Вкл",
                        },
                    ],
                });
            }
        }
    }

    /* ------------------------------------------------- */
    /* --------------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,
                        },
                    ],
                });
            }
        }
    }

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

    function initHideTranslatorsButton() {
        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(${arrowImageURL});
            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: "Вкл",
                        },
                    ],
                });
            }
        }
    }

    /* ------------------------------------------------- */
    /* --------------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: "Вкл",
                        },
                    ],
                });
            }
        }
    }

    /* ------------------------------------------------- */
    /* --------------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: "Вкл",
                        },
                    ],
                });
            }
        }
    }

    /* ------------------------------------------------- */
    /* --------------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;

        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 (!CDNPlayer) 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 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}.`
                );
            }
        }
    }

    /* ------------------------------------------------- */
    /* --------------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: "Выкл",
                        },
                    ],
                });
            }
        }
    }

    /* ------------------------------------------------- */
    /* --------------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("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 "KeyF":
                            hc.player.fullscreen();
                            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,
                        },
                    ],
                });
            }
        }
    }

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

    function initSettings() {
        const settingsOpenImgURL =
            "data:image/png;base64,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";
        const settingsCloseImgURL =
            "data:image/png;base64,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";

        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('${settingsOpenImgURL}');
            background-color: transparent !important;
        }
        .hc-tumbler-settings .hc-tumbler-point:nth-child(2) {
            background-image: url('${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 .b-tophead_wrapper {
            position: fixed;
            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) {
                        console.log(tumblerOption);
                        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);
            });
        }
    }

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

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

    function onDocumentEnd() {}

    document.addEventListener("DOMContentLoaded", onDocumentEnd);

    onDocumentStart();
})();

QingJ © 2025

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