VK Video - Добавить кнопки "Не интересно" и "Не рекомендовать автора"

Добавляет кнопки "Не интересно" и "Не рекомендовать автора" под каждым видео на VK Видео

// ==UserScript==
// @name         VK Video - Добавить кнопки "Не интересно" и "Не рекомендовать автора"
// @namespace    http://tampermonkey.net/
// @version      0.3
// @description  Добавляет кнопки "Не интересно" и "Не рекомендовать автора" под каждым видео на VK Видео
// @author       You
// @match        https://vkvideo.ru/*
// @icon         https://vk.com/images/icons/favicons/fav_vk_video_2x.ico
// @grant        none
// @run-at       document-end
// @license MIT 
// ==/UserScript==

(function() {
    'use strict';

    function addButtons() {
        const videoCards = document.querySelectorAll('.VideoCard');

        videoCards.forEach(card => {
            // Check if buttons already exist
            if (card.querySelector('.custom-buttons-added')) {
                return;
            }

            const infoContent = card.querySelector('.VideoCard__infoContent');
            if (!infoContent) {
                return;
            }

            const actionsContainer = document.createElement('div');
            actionsContainer.style.marginTop = '8px';
            actionsContainer.classList.add('custom-buttons-added'); // Add a class to prevent duplicates


            const notInterestedBtn = document.createElement('button');
            notInterestedBtn.textContent = 'Не интересно';
            applyButtonStyle(notInterestedBtn);
            notInterestedBtn.addEventListener('click', (event) => {
                event.preventDefault(); // Prevent default link behavior
                event.stopPropagation();  // Prevent event bubbling

                const videoId = card.dataset.id;
                const ownerId = card.dataset.ownerId;

                // Call the correct function with ownerId and videoId
                if (typeof VideoShowcase !== 'undefined' && typeof VideoShowcase.setNotRecommendOwner === 'function') {
                    VideoShowcase.setNotRecommendOwner(ownerId, videoId.split("_")[1]); //video ID is after _
                    console.log(`"Не интересно" clicked for video ID: ${videoId}, owner ID: ${ownerId}`);
                } else {
                    console.error("VideoShowcase.setNotRecommendOwner is not available.");
                }
            });


            const notRecommendBtn = document.createElement('button');
            notRecommendBtn.textContent = 'Не рекомендовать автора';
            applyButtonStyle(notRecommendBtn);
            notRecommendBtn.addEventListener('click', (event) => {
                event.preventDefault(); // Prevent default link behavior
                event.stopPropagation(); //Prevent event bubbling

              if (window.VideoShowcase && window.VideoShowcase.setNotRecommendOwner) {
                  const videoId = card.dataset.id;
                  const ownerId = card.dataset.ownerId;
                  window.VideoShowcase.setNotRecommendOwner(ownerId, videoId.split("_")[1]); // Call the function with owner and video id
                  console.log(`"Не рекомендовать автора" clicked for video ID: ${videoId}, owner ID: ${ownerId}`);

              } else
              {
                  console.error("VideoShowcase.setNotRecommendOwner is not available.");
              }
            });

            actionsContainer.appendChild(notInterestedBtn);
            actionsContainer.appendChild(notRecommendBtn);
            infoContent.appendChild(actionsContainer);
        });
    }

    function applyButtonStyle(button) {
        button.style.marginRight = '8px';
        button.style.padding = '4px 8px';
        button.style.border = '1px solid #ccc';
        button.style.borderRadius = '4px';
        button.style.backgroundColor = 'transparent';
        button.style.cursor = 'pointer';
        button.style.fontSize = '13px'; // Match VK's font size
        button.style.color = 'var(--vkui--color_text_subhead)'; // Use VKUI variable for color
    }


    // Initial run
    addButtons();

    // Observe for changes in the DOM (e.g., infinite scrolling, SPA navigation)
    const observer = new MutationObserver(addButtons);
    observer.observe(document.body, {
        childList: true,
        subtree: true
    });

    //One time button check after full page load, to catch any missed by the observer
    window.addEventListener('load', () => {
        setTimeout(addButtons, 500); //wait a bit for full render
    });


})();