Kinopoisk - FlicksBar Button for Google

Добавляет кнопку "Flicksbar" с подменой ссылки kinopoisk.ru на sspoisk.ru в раздел "Смотреть фильм"

当前为 2025-05-01 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Kinopoisk - FlicksBar Button for Google
// @namespace    https://t.me/flicksbar
// @version      1.0.1
// @description  Добавляет кнопку "Flicksbar" с подменой ссылки kinopoisk.ru на sspoisk.ru в раздел "Смотреть фильм"
// @author       Devitp001
// @match        https://www.google.com/search*
// @icon         https://www.kinopoisk.ru/favicon.ico
// @icon64       https://www.kinopoisk.ru/favicon.ico
// @grant        none
// @license MIT
// ==/UserScript==


(function () {
    'use strict';

    if (!location.hostname.includes('google')) return;

    function log(message) {
        console.log(`[FlicksBar]: ${message}`);
    }

    // Поиск кнопки "Хочу посмотреть"
    function findWishlistButton() {
        return Array.from(document.querySelectorAll('*'))
            .flatMap(el => {
            if (el.shadowRoot) {
                return Array.from(
                    el.shadowRoot.querySelectorAll('[aria-label=" Хочу посмотреть "]')
                );
            }
            return [];
        })
            .concat(
            Array.from(document.querySelectorAll('[aria-label=" Хочу посмотреть "]'))
        );
    }

    // Создание кнопки "F" с точной структурой
    function createFlicksBarButton(referenceElement, redirectURL) {
        const outerDiv = document.createElement('a');
        outerDiv.href = redirectURL;
        outerDiv.target = '_blank';
        outerDiv.rel = 'noopener';
        outerDiv.role = 'button';
        outerDiv.tabIndex = '0';

        // Копируем классы из оригинальной кнопки
        const originalClassList = referenceElement.classList;
        outerDiv.className = [...originalClassList].join(' ');

        // Внутренний контейнер VDgVie...
        const innerContainer = document.createElement('div');
        innerContainer.className = 'VDgVie btku5b fCrZyc NQYJvc qVhvac zqrO0 sLl7de OJeuxf';

        // Обёртка niO4u
        const niO4u = document.createElement('div');
        niO4u.className = 'niO4u';

        // kHtcsd
        const kHtcsd = document.createElement('div');
        kHtcsd.className = 'kHtcsd';

        // d3o3Ad gJdC8e
        const iconWrapper = document.createElement('span');
        iconWrapper.className = 'd3o3Ad gJdC8e';

        // RUoEBe... (иконка)
        const svgContainer = document.createElement('span');
        svgContainer.className = '1RUoEBe K5Jxee z1asCe DoJQd';
        svgContainer.style.height = '20px';
        svgContainer.style.lineHeight = '20px';
        svgContainer.style.width = '20px';

        // SVG
        const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
        svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');
        svg.setAttribute('width', '24');
        svg.setAttribute('height', '24');
        svg.setAttribute('viewBox', '0 0 24 24');
        //svg.innerHTML = `<path d="M8 5.5v13l9-6.5-9-6.5z"></path>`;
        //svg.innerHTML = `    <path d="M0 0 h24 v24 H5 v3 h14 v2 H5 v5 H3 zm0" stroke="#888"/>`;
        svg.innerHTML = `<path d="M3 3 h18 v2 H5 v3 h14 v2 H5 v5 H3 zm0" stroke="#888"/>`;
        svg.innerHTML = `<path d="M3 3 h18 v2 H5 v3 h14 v2 H5 v5 H3 zm0" stroke="#888"/>`;
        svg.innerHTML = `<path d="M3 3 h18 v2 H5 v3 h14 v2 H5 v5 H3 zm0" stroke="#888"/>`;
        svg.innerHTML = `<path d="M3 3 h18 v4 H6 v6 h14 v4 H6 v10 H2 zm0"/>`;




        svgContainer.appendChild(svg);
        iconWrapper.appendChild(svgContainer);

        kHtcsd.appendChild(iconWrapper);
        niO4u.appendChild(kHtcsd);

        // Текстовая часть
        const textContainer = document.createElement('div');
        textContainer.className = 'QuU3Wb sjVJQd';
        textContainer.setAttribute('aria-hidden', 'true');
        textContainer.textContent = ' FlicksBar ';

        //const textDiv = document.createElement('div');
        //textDiv.setAttribute('aria-hidden', 'true');
        //textDiv.textContent = ' FlicksBar ';

        //textContainer.appendChild(textDiv);

        // Компоновка
        innerContainer.appendChild(niO4u);
        innerContainer.appendChild(textContainer);
        outerDiv.appendChild(innerContainer);

        return outerDiv;
    }

    // Поиск ссылки на Кинопоиск
    function findKinopoiskLink() {
        return Array.from(document.querySelectorAll('a'))
            .filter(link => {
            const href = link.href || '';
            return (
                href.startsWith('https://www.kinopoisk.ru/film/') ||
                href.startsWith('https://www.kinopoisk.ru/series/')
            );
        })[0];
    }

    // Подмена ссылки kinopoisk.ru на sspoisk.ru
    function getRedirectURL(kinopoiskLink) {
        if (!kinopoiskLink) return null;

        const kinopoiskHref = kinopoiskLink.href;
        const sspoiskHref = kinopoiskHref.replace('kinopoisk.ru', 'sspoisk.ru');

        // Вариант 1: Переход напрямую на sspoisk.ru
        return sspoiskHref;

        // Вариант 2: С редиректом через flicks.bar (если нужно)
    }

    // Вставка кнопки "F"
    function injectFButtonBeforeWishlist(wishlistButton) {
        const container = wishlistButton.closest('div, span')?.parentElement;
        if (!container) return;

        const existing = container.querySelector('a[href*="sspoisk.ru"]');
        if (existing) return;

        // Найдём ссылку на Кинопоиск
        const kinopoiskLink = findKinopoiskLink();
        const redirectURL = getRedirectURL(kinopoiskLink);

        if (!redirectURL) {
            log('Не удалось найти ссылку на Кинопоиск');
            return;
        }

        const fButton = createFlicksBarButton(wishlistButton, redirectURL);
        container.insertBefore(fButton, wishlistButton);
        log('Добавлена кнопка "F" перед "Хочу посмотреть"');
    }

    // Наблюдатель за изменениями DOM
    const observer = new MutationObserver((mutationsList) => {
        for (const mutation of mutationsList) {
            if (mutation.type === 'childList') {
                const wishlistButton = findWishlistButton()[0];
                if (wishlistButton) {
                    injectFButtonBeforeWishlist(wishlistButton);
                }
            }
        }
    });

    observer.observe(document.body, { childList: true, subtree: true });

    // Первоначальный запуск
    const wishlistButton = findWishlistButton()[0];
    if (wishlistButton) {
        injectFButtonBeforeWishlist(wishlistButton);
    }
})();