Lurl Video & Image Downloader (Top Button)

Enables video and image downloads on Lurl.cc, with the download button placed at the top of the page.

// ==UserScript==
// @license MIT
// @name         Lurl Video & Image Downloader (Top Button)
// @namespace    http://tampermonkey.net/
// @version      1.51
// @description  Enables video and image downloads on Lurl.cc, with the download button placed at the top of the page.
// @author       You
// @match        https://lurl.cc/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Function to create and position the download button at the top
    function CreateDownloadButton(videoUrl, fileName) {
        // Check if button already exists
        if (document.getElementById("lurl-download-button")) return;

        // Create a fixed top bar container
        let topBar = document.createElement("div");
        topBar.setAttribute("id", "lurl-top-bar");
        topBar.setAttribute("style", `
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            background: #28a745;
            padding: 10px;
            text-align: center;
            z-index: 10000;
            font-size: 16px;
            font-weight: bold;
        `);

        // Create the download button
        let downloadButton = document.createElement("a");
        downloadButton.innerText = "📥 下載影片";
        downloadButton.setAttribute("id", "lurl-download-button");
        downloadButton.setAttribute("href", videoUrl);
        downloadButton.setAttribute("download", fileName);
        downloadButton.setAttribute("style", `
            display: inline-block;
            padding: 10px 15px;
            background: #fff;
            color: #28a745;
            text-decoration: none;
            border-radius: 5px;
            font-size: 14px;
            font-weight: bold;
        `);

        // Append button to top bar
        topBar.appendChild(downloadButton);
        document.body.insertBefore(topBar, document.body.firstChild);
    }

    // Function to handle video download button placement
    function DownloadVideo() {
        let videoElement = document.querySelector('video');
        if (!videoElement) {
            console.warn("No video element found.");
            return;
        }

        let sourceElement = videoElement.querySelector('source');
        if (!sourceElement || !sourceElement.src) {
            console.error("No video source found.");
            return;
        }

        let videoUrl = sourceElement.src;
        let pageTitle = document.title || "video";  // Fallback title

        // Place the download button at the top of the page
        CreateDownloadButton(videoUrl, pageTitle + ".mp4");

        console.log("✅ Download button added at the top of the page.");
    }

    // Function to solve and download protected images
    function PictureSolve() {
        const parentElement = document.querySelector("#canvas_div_lurl")?.parentElement;
        if (!parentElement) {
            console.warn("Parent element not found.");
            return;
        }

        const scriptElements = parentElement.querySelectorAll("script");
        if (scriptElements.length < 2) {
            console.error("Not enough script elements found.");
            return;
        }

        const secondScriptElement = scriptElements[1];
        const scriptText = secondScriptElement.innerHTML;
        const regex = /canvas_img\(['"](https:\/\/[^'"]+)['"]/;
        const match = scriptText.match(regex);

        if (match) {
            const imageURL = match[1];

            // Create a download button for the image
            CreateDownloadButton(imageURL, "image.png");

            console.log("✅ Image download button added at the top.");
        } else {
            console.error("Image URL not found in script text.");
        }
    }

    // Function to auto-click adult verification on Dcard
    function SexBoard() {
        var buttons = document.querySelectorAll('button');

        if (buttons.length == 13) {
            ClickOK();
        }

        function ClickOK() {
            var pElements = document.getElementsByTagName('p');
            var nextSiblingElement = pElements[1]?.nextSibling;

            if (nextSiblingElement?.nodeType === 1) {
                var buttons = nextSiblingElement.querySelectorAll('button');

                if (buttons.length >= 2) {
                    buttons[1].click();
                }
            }
        }

        document.querySelectorAll('.__portal').forEach(div => div.remove());
        document.body.style.overflow = 'auto';
    }

    // Function to enhance video player experience
    function EnhanceVideoPlayer() {
        let TureUrl = document.querySelector('source')?.src;
        if (!TureUrl) return;

        let existingVideo = document.querySelector('video');
        if (!existingVideo) return;

        let newVideo = document.createElement('video');
        newVideo.src = TureUrl;
        newVideo.controls = true;
        newVideo.autoplay = true;
        newVideo.width = 640;
        newVideo.height = 360;
        newVideo.preload = 'metadata';
        newVideo.classList.add('vjs-tech');
        newVideo.setAttribute('data-setup', '{"aspectRatio":"16:9"}');
        newVideo.id = 'vjs_video_3_html5_api';
        newVideo.tabIndex = -1;
        newVideo.setAttribute('role', 'application');

        existingVideo.parentNode.replaceChild(newVideo, existingVideo);

        let videoContainer = document.getElementById('vjs_video_3');
        videoContainer?.removeAttribute('oncontextmenu');
        videoContainer?.removeAttribute('controlslist');

        document.querySelectorAll('.vjs-control-bar').forEach(controlBar => {
            controlBar.parentNode.removeChild(controlBar);
        });
    }

    // CSS Loader
    function LoadStyles() {
        let linkElement = document.createElement('link');
        linkElement.setAttribute('rel', 'stylesheet');
        linkElement.setAttribute('type', 'text/css');
        linkElement.setAttribute('href', 'https://cdn.jsdelivr.net/npm/toastify-js/src/toastify.min.css');

        let scriptElement = document.createElement('script');
        scriptElement.setAttribute('type', 'text/javascript');
        scriptElement.setAttribute('src', 'https://cdn.jsdelivr.net/npm/toastify-js');

        let headElement = document.head || document.getElementsByTagName('head')[0];
        headElement.appendChild(linkElement);
        headElement.appendChild(scriptElement);
    }

    // Main execution
    function Init() {
        let currentUrl = window.location.href;

        if (currentUrl.startsWith('https://www.dcard.tw/f/sex')) {
            SexBoard();
            setTimeout(SexBoard, 3500);
        } else {
            LoadStyles();

            window.addEventListener("load", function() {
                setTimeout(() => {
                    let videoElement = document.querySelector('video');
                    if (videoElement) {
                        DownloadVideo();
                        EnhanceVideoPlayer();
                    } else {
                        PictureSolve();
                    }
                }, 2000);
            });
        }
    }

    Init();
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址