unlock lpsg videos

unlock lpsg video access. may need to manually switch video format since I can't figure that part out. Also load all images ASAP instead of having to scroll to them.

От 15.12.2024. Виж последната версия.

// ==UserScript==
// @name         unlock lpsg videos
// @namespace    MBing
// @version      4.0
// @description  unlock lpsg video access. may need to manually switch video format since I can't figure that part out. Also load all images ASAP instead of having to scroll to them.
// @author       MBing
// @match        https://www.lpsg.com/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// @license            MIT
// ==/UserScript==

(function() {
    'use strict';

    var easterEggPoster = document.getElementsByClassName("video-easter-egg-poster");
    var volume=0.0;
    var autoSwitchInterval=2500
    var videoDiv=[];
    var imageUrl;
    var newDiv;
    var baseVideoUrl;

    // 获取所有包含 lazy loading 的图片
    const images = document.querySelectorAll('img[loading="lazy"]');

    // 遍历所有懒加载图片,将其 loading 属性更改为 "eager"
    images.forEach(img => {
        img.loading = 'eager'; // 立刻加载图片
    });

    if(easterEggPoster.length==0){
        //console.log("官方时间,无需替换");
        return;
    }else if(easterEggPoster.length>5){
        autoSwitchInterval=5000;
    }

    // 控制是否继续切换后缀
    let shouldContinue = true;

    //替换预览照片为视频播放器
    for (let i=easterEggPoster.length-1;i>-1;i--){
        let videoUrl
        imageUrl =easterEggPoster[i].children[0].src;
        videoUrl=imageUrl.replace("attachments/posters","video").replace("/lsvideo/thumbnails","lsvideo/videos").replace(".jpg",".mp4");


        videoDiv[i]=`<video onloadstart="this.volume=${volume}" style="width:750px; max-height: 750px;" controls=\"\" data-xf-init=\"video-init\" data-poster=\"${imageUrl}\" class=\"\" style=\"\" poster=\"${imageUrl}\"><source data-src=\"${videoUrl}\" src=\"${videoUrl}\"><div class=\"bbMediaWrapper-fallback\">Your browser is not able to display this video.</div></video>`;
        //void(easterEggPoster[i].innerHTML=videoDiv[i]);

        newDiv = document.createElement("div");
        newDiv.setAttribute("class","newVideoDiv");
        newDiv.innerHTML=videoDiv[i];
        easterEggPoster[i].parentElement.parentElement.append(newDiv);
        //console.log("正在插入第几条:"+i+",url:"+videoUrl)
        easterEggPoster[i].parentElement.parentElement.append(createButton("mov",i));
        easterEggPoster[i].parentElement.parentElement.append(createButton("m4v",i));
        easterEggPoster[i].parentElement.parentElement.append(createButton("mp4",i));
    }

    //删除easterEggPoster
    for (let i=easterEggPoster.length-1;i>-1;i--){
        easterEggPoster[i].parentElement.parentElement.removeChild(easterEggPoster[i].parentElement);
    }

    //删除video-easter-egg-blocker
    var easterEggBlocker = document.getElementsByClassName("video-easter-egg-blocker");
    for (let i=easterEggBlocker.length-1;i>-1;i--){
        easterEggBlocker[i].parentElement.removeChild(easterEggBlocker[i]);
    }

    //删除video-easter-egg-overlay
    var easterEggOverlay = document.getElementsByClassName("video-easter-egg-overlay");
    for (let i=easterEggOverlay.length-1;i>-1;i--){
        easterEggOverlay[i].parentElement.removeChild(easterEggOverlay[i]);
    }

    //调小音量
    var allVideoPlayers = document.getElementsByTagName('video');
    for (let i=allVideoPlayers.length-1;i>-1;i--){
        allVideoPlayers[i].volume = volume;
    }

    // 延时后开始检查视频
    setTimeout(checkVideosAndUpdate, autoSwitchInterval);


    //创建按钮
    function createButton(format,entryId){
        var inp;
        inp = document.createElement("input");
        inp.type = "button";
        inp.value = format;
        inp.id = entryId;
        inp.addEventListener('click', function () {
            //点击任何手动切换后缀按钮,即停止自动切换后缀
            shouldContinue = false;
            //console.log('停止切换后缀');
            //切换后缀
            var oldUrl = document.getElementsByClassName("newVideoDiv")[this.id].innerHTML;
            document.getElementsByClassName("newVideoDiv")[this.id].innerHTML=oldUrl.replaceAll("mp4",format).replaceAll("m4v",format).replaceAll("mov",format);
        });
        return inp;
    }


    // 定义一个函数,用于遍历所有 video 元素并检查其 readyState
    function checkVideosAndUpdate() {
        // 如果点击了停止按钮,则不再继续执行
        if (!shouldContinue) return;

        // 获取页面上所有的 video 元素
        const videoElements = document.querySelectorAll('video');

        let allLoaded = true;
        let failCount=0;
        // 遍历所有 video 元素
        videoElements.forEach(videoElement => {
            // 获取当前视频的 readyState
            const state = videoElement.readyState;

            // 如果视频的 readyState 不是 4(HAVE_ENOUGH_DATA),说明视频还没有加载完成
            if (state !== 4) {
                failCount+=1;
                allLoaded = false;

                // 获取视频中的所有 source 标签
                const sources = videoElement.querySelectorAll('source');
                sources.forEach(source => {
                    // 获取当前 source 的 src 和 data-src 属性
                    const currentSrc = source.src || source.getAttribute('data-src');

                    // 根据原视频格式替换为对应的新格式
                    let newSrc = currentSrc;
                    if (currentSrc.endsWith('.mp4')) {
                        newSrc = currentSrc.replace('.mp4', '.mov');
                    } else if (currentSrc.endsWith('.mov')) {
                        newSrc = currentSrc.replace('.mov', '.m4v');
                    } else if (currentSrc.endsWith('.m4v')) {
                        newSrc = currentSrc.replace('.m4v', '.mp4');
                    }

                    // 更新 source 的 src 和 data-src 属性为新的链接
                    //console.log(`替换视频链接: ${currentSrc} 为 ${newSrc}`);
                    source.src = newSrc;
                    source.setAttribute('data-src', newSrc);
                });

                // 重新加载视频
                videoElement.load();
            }
        });

        // 如果还有未加载完成的 video,则延时 2 秒再次执行
        if (!allLoaded) {
            //console.log(failCount+"条视频加载失败,稍后切换后缀重试");
            setTimeout(checkVideosAndUpdate, autoSwitchInterval);
        } else {
            //console.log("所有视频都已加载完成!");
        }
    }


})();