Video URL grabber

Display video URLs and allow copying on the webpage while playing videos.

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला Tampermonkey, Greasemonkey किंवा Violentmonkey यासारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला Tampermonkey किंवा Violentmonkey यासारखे एक्स्टेंशन इंस्टॉल करावे लागेल..

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला Tampermonkey किंवा Violentmonkey यासारखे एक्स्टेंशन इंस्टॉल करावे लागेल..

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला Tampermonkey यासारखे एक्स्टेंशन इंस्टॉल करावे लागेल..

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्क्रिप्ट व्यवस्थापक एक्स्टेंशन इंस्टॉल करावे लागेल.

(माझ्याकडे आधीच युझर स्क्रिप्ट व्यवस्थापक आहे, मला इंस्टॉल करू द्या!)

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला Stylus सारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला Stylus सारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला Stylus सारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्टाईल व्यवस्थापक इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्टाईल व्यवस्थापक इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्टाईल व्यवस्थापक इंस्टॉल करावे लागेल.

(माझ्याकडे आधीच युझर स्टाईल व्यवस्थापक आहे, मला इंस्टॉल करू द्या!)

// ==UserScript==
// @name         Video URL grabber 
// @namespace    https://github.com/Rainman69/video-link-grabber
// @version      1.0
// @description  Display video URLs and allow copying on the webpage while playing videos.
// @author       https://t.me/TheErfon
// @match        *://*/*
// @grant        GM_addStyle
// @license      CC BY-NC-ND 4.0
// @licenseURL   https://github.com/Rainman69/video-link-grabber/blob/main/LICENSE
// ==/UserScript==

(function() {
    'use strict';

    // Create a container for the video URLs
    var videoURLContainer = document.createElement('div');
    videoURLContainer.style.position = 'fixed';
    videoURLContainer.style.top = '10px';
    videoURLContainer.style.left = '10px';
    videoURLContainer.style.padding = '5px';
    videoURLContainer.style.background = 'none';
    videoURLContainer.style.color = '#000';
    videoURLContainer.style.fontFamily = 'Times New Roman, serif';
    videoURLContainer.style.fontSize = '10px';
    videoURLContainer.style.zIndex = '9999';
    videoURLContainer.style.cursor = 'pointer';
    videoURLContainer.style.userSelect = 'none';
    videoURLContainer.style.opacity = '0';
    videoURLContainer.style.transition = 'opacity 0.3s ease-in-out';

    // Function to extract video URLs from <video> elements
    function extractVideoURLs() {
        var videoElements = document.getElementsByTagName('video');
        var videoURLs = [];

        for (var i = 0; i < videoElements.length; i++) {
            var videoElement = videoElements[i];
            var videoURL = videoElement.currentSrc || videoElement.src;
            if (videoURL) {
                videoURLs.push(videoURL);
            }
        }

        return videoURLs;
    }

    // Update the video URLs in the container
    function updateVideoURLs() {
        var videoURLs = extractVideoURLs();
        if (videoURLs.length > 0) {
            videoURLContainer.textContent = videoURLs.join('\n');
        } else {
            videoURLContainer.textContent = 'No video URLs found.';
        }
    }

    // Copy the video URL to the clipboard
    function copyURL() {
        var textarea = document.createElement('textarea');
        textarea.value = videoURLContainer.textContent;
        document.body.appendChild(textarea);
        textarea.select();
        document.execCommand('copy');
        document.body.removeChild(textarea);

        // Display a confirmation message
        videoURLContainer.style.opacity = '1';
        videoURLContainer.textContent = 'URL copied!';
        setTimeout(function() {
            videoURLContainer.style.opacity = '0';
            updateVideoURLs();
        }, 3000);
    }

    // Call the updateVideoURLs function initially
    updateVideoURLs();

    // Add the video URL container to the document body
    document.documentElement.appendChild(videoURLContainer);

    // Update the video URLs whenever the video elements on the page change
    var observer = new MutationObserver(updateVideoURLs);
    observer.observe(document.documentElement, { subtree: true, childList: true });

    // Show the video URL container when clicked
    videoURLContainer.addEventListener('click', copyURL);

    // Hide the video URL container on scroll
    var isScrolling;
    window.addEventListener('scroll', function() {
        videoURLContainer.style.opacity = '0';
        clearTimeout(isScrolling);
        isScrolling = setTimeout(function() {
            videoURLContainer.style.opacity = '1';
        }, 300);
    });

    // Get the most used color on the target site and change the text color accordingly
    var colors = {};
    var elements = document.querySelectorAll('*');
    Array.prototype.forEach.call(elements, function(element) {
        var computedStyle = getComputedStyle(element);
        var color = computedStyle.color;
        if (color in colors) {
            colors[color]++;
        } else {
            colors[color] = 1;
        }
    });
    var mostUsedColor = Object.keys(colors).reduce(function(a, b) {
        return colors[a] > colors[b] ? a : b;
    }, '');
    videoURLContainer.style.color = mostUsedColor;

    // Add the custom styles to the page using GM_addStyle
    GM_addStyle(`
        * {
            color: ${mostUsedColor} !important;
        }
    `);
})();