YouTube - Фикс Изображений + Квадратные аватарки

Делает аватары квадратными везде, включая Главную страницу и Рекомендации, а также восстанавливает иконки YouTube

// ==UserScript==
// @name         YouTube - Фикс Изображений + Квадратные аватарки
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  Делает аватары квадратными везде, включая Главную страницу и Рекомендации, а также восстанавливает иконки YouTube
// @match        *://*.youtube.com/*
// @grant        none
// @author       https://t.me/aisingers
// @source       https://t.me/aisingers
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';
    const AVATAR_SELECTORS = [
        'yt-img-shadow#avatar img', // Аватары в разделах "Подписки"
        '#guide-content yt-img-shadow img', // Аватары в боковом меню
        '#comments yt-img-shadow img', // Аватары в комментариях
        'ytd-video-owner-renderer yt-img-shadow img', // Аватар автора видео
        'ytd-channel-renderer yt-img-shadow img', // Аватары в результатах поиска каналов
        'ytd-comment-renderer #img', // Аватары в комментариях (дополнительный селектор)
        'ytd-comment-thread-renderer #author-thumbnail img', // Дополнительный селектор для комментариев
        'ytd-rich-item-renderer #avatar-link yt-img-shadow img', // Аватары на главной странице
        'ytd-rich-grid-media #avatar img', // Аватары на главной странице (дополнительный селектор)
        'ytd-video-renderer #img', // Аватары в рекомендациях и других списках видео
        'img[src^="https://yt3.ggpht.com/"]' // Общий селектор для всех аватаров YouTube
    ];

    function redirectImageURL(url) {
        return url.replace(/^https:\/\/yt3\.ggpht\.com\//, 'https://yt4.ggpht.com/');
    }

    function applySquareStyle(element) {
        element.style.borderRadius = '4px';
        element.style.overflow = 'hidden';
        let img = element.querySelector('img') || element;
        img.style.borderRadius = '4px';
        img.style.width = '100%';
        img.style.height = '100%';
        img.style.objectFit = 'cover';
    }

    function processAvatars() {
        AVATAR_SELECTORS.forEach(selector => {
            document.querySelectorAll(selector).forEach(element => {
                if (element.src && element.src.includes('yt3.ggpht.com')) {
                    element.src = redirectImageURL(element.src);
                }
                let target = element.closest('yt-img-shadow') || element;
                applySquareStyle(target);
                // Применяем стили к родительскому элементу для дополнительной гарантии
                if (target.parentElement) {
                    target.parentElement.style.borderRadius = '4px';
                }
            });
        });
    }

    function observeDOMChanges() {
        const observer = new MutationObserver((mutations) => {
            mutations.forEach((mutation) => {
                if (mutation.type === 'childList') {
                    processAvatars();
                }
            });
        });
        observer.observe(document.body, {
            childList: true,
            subtree: true
        });
    }

    // Инициализация
    processAvatars();
    observeDOMChanges();

    // Обработка динамически загружаемого контента
    window.addEventListener('yt-navigate-finish', processAvatars);

    // Дополнительная обработка для гарантии применения стилей
    setInterval(processAvatars, 1000);
})();