您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
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.
当前为
// ==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("所有视频都已加载完成!"); } } })();