old.myshows.me

С 1 мая 2024 года отключают old.myshows.me. Под ручку с ChatGPT попытался починить нужные мне места.

Fra 18.04.2024. Se den seneste versjonen.

// ==UserScript==
// @name         old.myshows.me
// @namespace    http://tampermonkey.net/
// @version      2024-04-18
// @description  С 1 мая 2024 года отключают old.myshows.me. Под ручку с ChatGPT попытался починить нужные мне места.
// @             Желательно использовать вместе с внешним видом от другого энтузиаста: https://userstyles.world/style/15722/old-myshows-me (инструкцию ищите там же)
// @author       SanBest93
// @match        https://myshows.me/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=myshows.me
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    const originalTitleIsNeeded = true; // Всегда выводить оригинальные названия на странице 'https://myshows.me/profile/next/'. Не надо — замените на 'false'
    const postfix = '1080'; // Текст после s01e01. Мне так удобнее на торрентах искать. Не надо — измените на ''

    var myMap = new Map(); // Сюда будем складывать соответствие showId — titleOriginal
    var changed = 0; // Для проверки количества внесённых изменений
    var changeIsNeeded = true; // Так мне просто понятнее
    var showIDs;
    var userName;

    var headerLogin = document.querySelector('div.HeaderLogin__username');
    if (headerLogin) {userName = headerLogin.textContent;}

    // Обработчик события загрузки всего DOM
    window.addEventListener('load', onPageLoad());

    // Функция, которая будет выполняться после загрузки всего DOM
    function onPageLoad() {
        // Создаём новый экземпляр MutationObserver
        var observer = new MutationObserver(function(mutations) {
            // При каждом изменении DOM вызываем функцию checkPage
            checkPage();
        });
        // Настраиваем наблюдение за изменениями DOM
        observer.observe(document.body, {
            subtree: true,
            childList: true
        });
    }

    // Функция, которая будет выполняться при изменении DOM
    function checkPage() {

        // Для /profile/next/ ---->
        // Проверяем, является ли текущий URL страницей 'https://myshows.me/profile/next/'
        if (!linksAreSimilar(window.location.href, 'https://myshows.me/profile/next/') && changeIsNeeded !== true) {
            changeIsNeeded = true;
            changed = 0;
        }
        if (linksAreSimilar(window.location.href, 'https://myshows.me/profile/next/') && changeIsNeeded === true) {
            // Не знаю, какими стандартными функциями получаются данные.
            if (originalTitleIsNeeded === true) {
                // Создаём свою карту данных
                createMap();
            }
            if (myMap.size > 0 || originalTitleIsNeeded === false) {
                fixProfileNext();
            }
            changeIsNeeded = changed === 0;
        }
        // <---- Для /profile/next/

        // Для /username/ ---->
        if (linksAreSimilar(window.location.href, 'https://myshows.me/' + userName)) {
            fixProfileNumbers();
        }
        // <---- Для /username/

    }

    // Создание своей карты соответствия данных
    function createMap() {
        // Получаем содержимое <script> и преобразуем его в объект JavaScript
        const scriptElement = document.getElementById('__NUXT_DATA__');
        const dataString = scriptElement.textContent;
        const dataObject = JSON.parse(dataString);
        var showIDs, iShowIDs; // Массив сериалов и его адрес
        // Получаем нужные данные из объекта
        if (dataObject.length > 0) {
            // Тут будут нужные данные, если изначально была открыта страница 'https://myshows.me/profile/next/'
            iShowIDs = findKeyInArray(dataObject, 'list', 30);
            if (iShowIDs === undefined) {
                // Тут будут нужные данные, если изначально была открыта страница 'https://myshows.me/<имя профиля>'
                iShowIDs = findKeyInArray(dataObject, 'userShows', 30);
            }
            if (iShowIDs !== undefined) {
                // Если нашли адрес, получаем список сериалов
                showIDs = dataObject[iShowIDs];
            } else {
                // Иначе перезагрузим страницу.
                // Тогда точно попадутся правильные данные в '__NUXT_DATA__'
                location.reload();
                return;
            }
        }
        // Перебираем полученный массив сериалов, заполняем карту.
        // На всякий случай с попыткой
        if (showIDs !== undefined && typeof showIDs.forEach === 'function') {
            var show = 0;
            showIDs.forEach(element => {
                try {
                    show = dataObject[element].show;
                    myMap.set(dataObject[dataObject[show].id].toString(), dataObject[dataObject[show].titleOriginal]);
                } catch (error) {
                    console.error('Произошла ошибка 2:', error);
                }
            });
        }
    }

    // Функция проверки элементов
    function fixProfileNext() {
        var rows = document.querySelectorAll('.Row');
        // Перебираем все элементы страницы
        rows.forEach(function(row) {
            checkChild(row);
        });
    }

    // Рекурсивная функция проверки всех вложенных элементов
    function checkChild(row) {
        row.childNodes.forEach(function(child) {
            if (child.className === 'WatchSoon-episode') {
                fixSeasonEpisode(child);
            } else if (child.className === 'WatchSoon-show' && originalTitleIsNeeded === true) {
                fixTitle(child);
            } else {
                checkChild(child);
            }
        });
    }

    // Замена "1 x 1" на "s01e01"
    // Если указан постфикс, тоже добавить
    function fixSeasonEpisode(episode) {
        if (episode.nodeType === 1 && episode.childNodes.length === 4) {
            var part0 = episode.childNodes[0];
            var part1 = episode.childNodes[1]; // Изначально ' x '
            var part2 = episode.childNodes[2];
            if (part1.textContent !== '') {
                part0.textContent = addPrefix(part0.textContent, 's');
                part1.textContent = '';
                part2.textContent = addPrefix(part2.textContent, 'e') + (postfix === '' ? '' : ' ' + postfix);
                changed++;
            }
        }
    }

    // Замена названия на оригинальное
    function fixTitle(show) {
        if (myMap.size > 0) {
            var parts = show.pathname.split("/");
            var showId = parts[parts.length - 2];
            var titleOriginal = myMap.get(showId);
            if (titleOriginal !== undefined && titleOriginal !== '') {
                show.textContent = titleOriginal;
                changed++;
            }
        }
    }

    // Добавление префикса S или E к номеру сезона или серии
    function addPrefix(text, prefix) {
        if (!text.toLowerCase().startsWith(prefix)) {
            var num = +text;
            text = (num < 10 ? prefix + '0' : prefix) + text;
        }
        return text;
    }

    // Общая функция для поиска ключа в массиве данных
    function findKeyInArray(data, key, N) {
        var end = N === undefined ? data.length : Math.min(N, data.length); // Количество первых
        var result;
        for (var i = 0; i < end; i++) {
            // Проверяем, является ли элемент объектом и содержит ли указанный ключ
            if (typeof data[i] === 'object' && !!data[i] && key in data[i]) {
                // Если да, выводим значение ключа и прерываем цикл
                result = data[i][key];
                break;
            }
        }
        return result;
    }

    // Смена чисел профиля с "1к" на "1 000"
    function fixProfileNumbers() {
        // Выбираем все div с классом UserHeader__stats-value на странице
        var statsValues = document.querySelectorAll('div.UserHeader__stats-value');
        if (statsValues && typeof statsValues.forEach === 'function' && statsValues.lenght !== 0) {
            // Перебираем коллекцию элементов и меняем их содержимое
            statsValues.forEach(function(element) {
                element.textContent = element.title;
            });
        }
    }

    function linksAreSimilar(link1, link2) {
        // Удаляем последний слеш, если он есть
        link1 = link1.endsWith('/') ? link1.slice(0, -1) : link1;
        link2 = link2.endsWith('/') ? link2.slice(0, -1) : link2;
        // Сравниваем ссылки
        return link1 === link2;
    }

})();
长期地址
遇到问题?请前往 GitHub 提 Issues,或加Q群1031348184

赞助商

Fishcpy

广告

Rainyun

注册一下就行

Rainyun

一年攒够 12 元