Greasy Fork

Search Links for Kinopoisk

Кнопка с ссылками для фильмов и аниме на Кинопоиске

目前为 2025-01-18 提交的版本。查看 最新版本

// ==UserScript==
// @name         Search Links for Kinopoisk
// @namespace    http://tampermonkey.net/
// @version      1.5
// @description  Кнопка с ссылками для фильмов и аниме на Кинопоиске
// @match        *://www.kinopoisk.ru/*
// @icon         https://www.kinopoisk.ru/favicon.ico
// @license      MIT
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    // Список сайтов и их ссылки
    const defaultLinks = {
        'HDRezka': 'https://hdrezka.co/search/?do=search&subaction=search&q=',
        'LostFilm': 'https://lostfilm.tv/search/?q=',
        'Kinozal': 'https://kinozal.tv/browse.php?s=',
        'Traktorr': 'http://tragtorr.in/search/',
        'Rutor': 'https://rutor.is/search/',
        'Shikimori': 'https://shikimori.one/animes?search=',
        'AnimeGo': 'https://animego.org/search/all?q=',
        'SeasonVar': 'http://seasonvar.ru/search?q=',
        'Kinorium': 'https://ru.kinorium.com/search/?q='
    };

    // Загружаем настройки из LocalStorage, по умолчанию включены Кинориум, Traktorr, HDRezka, Shikimori и LostFilm
    let activeSites = JSON.parse(localStorage.getItem('activeSites')) || ['Kinorium', 'Traktorr', 'HDRezka', 'Shikimori', 'LostFilm'];

    // Функция для добавления кнопок
    function addButtons() {
        const titleElement = document.querySelector('h1');
        if (!titleElement || document.querySelector('.useful-links-container')) return;

        const movieTitle = titleElement.innerText.trim();
        const buttonContainer = createButtonContainer();

        // Добавляем кнопки для активных сайтов
        activeSites.forEach((siteName) => {
            const siteLink = defaultLinks[siteName] + encodeURIComponent(movieTitle);
            const button = createButton(siteName, siteLink);
            buttonContainer.appendChild(button);
        });

        // Кнопка настроек
        const settingsButton = createSettingsButton();
        buttonContainer.appendChild(settingsButton);

        // Добавляем контейнер в DOM
        titleElement.appendChild(buttonContainer);
    }

    // Создание контейнера для кнопок
    function createButtonContainer() {
        const container = document.createElement('div');
        container.className = 'useful-links-container';
        container.style.cssText = `
            display: flex;
            flex-wrap: wrap;
            margin-top: 15px;
            gap: 10px;
        `;
        return container;
    }

    // Создание кнопки
    function createButton(text, link) {
        const button = document.createElement('button');
        button.innerText = text;
        button.style.cssText = `
            background-color: #f2f2f2;
            border: none;
            border-radius: 20px;
            padding: 10px 20px;
            font-size: 14px;
            cursor: pointer;
            transition: 0.3s;
        `;
        button.onmouseover = () => button.style.backgroundColor = '#e0e0e0';
        button.onmouseout = () => button.style.backgroundColor = '#f2f2f2';
        button.onclick = () => window.open(link, '_blank');
        return button;
    }

    // Создание кнопки настроек
    function createSettingsButton() {
        const button = document.createElement('button');
        button.innerText = '⚙️';
        button.style.cssText = `
            background-color: #f2f2f2;
            border: none;
            border-radius: 50%;
            width: 40px;
            height: 40px;
            font-size: 18px;
            cursor: pointer;
            display: flex;
            align-items: center;
            justify-content: center;
            transition: 0.3s;
        `;
        button.onmouseover = () => button.style.backgroundColor = '#e0e0e0';
        button.onmouseout = () => button.style.backgroundColor = '#f2f2f2';
        button.onclick = (event) => toggleSettingsMenu(event, button);
        return button;
    }

    // Показ/скрытие меню настроек
    function toggleSettingsMenu(event, button) {
        let menu = document.querySelector('.settings-menu');
        if (menu) {
            menu.remove();
            return;
        }

        menu = createSettingsMenu();
        document.body.appendChild(menu);

        // Установка позиции окна под кнопкой
        const rect = button.getBoundingClientRect();
        menu.style.top = `${window.scrollY + rect.bottom + 10}px`;
        menu.style.left = `${window.scrollX + rect.left}px`;

        // Закрытие окна при клике за его пределами
        const closeMenuOnClickOutside = (e) => {
            if (!menu.contains(e.target) && e.target !== button) {
                menu.remove();
                document.removeEventListener('click', closeMenuOnClickOutside);
            }
        };
        document.addEventListener('click', closeMenuOnClickOutside);
    }

    // Создание меню настроек
    function createSettingsMenu() {
        const menu = document.createElement('div');
        menu.className = 'settings-menu';
        menu.style.cssText = `
            position: absolute;
            background: white;
            border-radius: 10px;
            padding: 20px;
            box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2);
            z-index: 1000;
        `;

        const title = document.createElement('h3');
        title.innerText = 'Настройки ссылок';
        title.style.cssText = `
            margin: 0 0 15px;
            font-size: 18px;
        `;
        menu.appendChild(title);

        Object.keys(defaultLinks).forEach((siteName) => {
            const label = document.createElement('label');
            label.style.cssText = `
                display: flex;
                align-items: center;
                gap: 10px;
                margin-bottom: 10px;
            `;

            const checkbox = document.createElement('input');
            checkbox.type = 'checkbox';
            checkbox.checked = activeSites.includes(siteName);
            checkbox.onchange = () => {
                if (checkbox.checked) activeSites.push(siteName);
                else activeSites = activeSites.filter(site => site !== siteName);
            };

            label.appendChild(checkbox);
            label.appendChild(document.createTextNode(siteName));
            menu.appendChild(label);
        });

        const saveButton = document.createElement('button');
        saveButton.innerText = 'Сохранить';
        saveButton.style.cssText = `
            display: block;
            margin: 20px auto 0;
            padding: 10px 20px;
            background-color: #4caf50;
            color: white;
            border: none;
            border-radius: 5px;
            cursor: pointer;
        `;
        saveButton.onclick = () => {
            localStorage.setItem('activeSites', JSON.stringify(activeSites));
            menu.remove();
            location.reload(); // Обновление страницы
        };
        menu.appendChild(saveButton);

        return menu;
    }

    // Наблюдатель за изменениями в DOM
    const observer = new MutationObserver(addButtons);
    observer.observe(document.body, { childList: true, subtree: true });

    window.addEventListener('load', addButtons);
})();