// ==UserScript==
// @name unlock lpsg videos
// @namespace MBing
// @version 7.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. Also added a button on top left to hide user info, so you can browse the page more quickly.
// @author MBing
// @match https://www.lpsg.com/threads*
// @icon https://www.google.com/s2/favicons?sz=64&domain=lpsg.com
// @grant none
// @license MIT
// ==/UserScript==
(function() {
'use strict';
// 控制是否继续切换后缀
let shouldContinue = true;
var volume=0.05;
var autoSwitchInterval=2500
//创建放按钮的区域
createControlDiv();
//替换不能播放的视频
replaceUnplayableVideos();
//第三个标题栏
createSkipInfoLabel();
//增加纯文字页自动翻页选择框
createCheckboxToAutoJumpTextOnlyPage();
//增加向前翻页选择框
createCheckboxToAutoJumpBackward();
//增加隐藏纯文字帖子按钮
createCheckboxToHideTextOnlyPost();
//第一个标题栏
createUserInfoLabel();
//增加隐藏用户信息按钮
createCheckboxToHideUserInfo();
//点击空白处折叠div
createCheckboxToFoldDiv();
//第二个标题栏
createPicLabel();
//把附件的图片改为全部显示而非填满
createCheckboxToChangeAttaImgDisplay();
//每行显示一张图片
createCheckboxToDisplayOnePicPerLine();
//限制图片最大大小
createCheckboxToLimitImgSize();
//滚动到最后时自动跳转到下一页
//scrollToNextPage();
//点击空白处折叠div
function createCheckboxToFoldDiv(){
/* ----------- 常量与工具 ----------- */
const STORAGE_KEY = 'TM_messageFoldEnabled';
const ORIGINAL_HEIGHT = 'data-original-height';
/* 读取开关状态 */
let enabled = localStorage.getItem(STORAGE_KEY) === 'true';
/* ----------- 创建固定 checkbox ----------- */
// 创建复选框
const checkbox = document.createElement('input');
checkbox.type = 'checkbox';
checkbox.id = 'fold-div-checkbox';
checkbox.style.marginLeft = '5px';
checkbox.checked = enabled;
// 创建复选框标签
const label = document.createElement('label');
label.htmlFor = 'fold-div-checkbox';
label.textContent = 'Click Empty Space Below To Collapse Post';
// 创建一个div装他们
const containerDiv = document.createElement('div');
// 将复选框和标签添加到div中
const controlDiv = document.getElementById('custom-control-div');
containerDiv.appendChild(checkbox);
containerDiv.appendChild(label);
controlDiv.appendChild(containerDiv);
/* ----------- 折叠/恢复单个节点 ----------- */
function fold(inner) {
if (inner.classList.contains('folded')) return;// 已折叠
const content = inner.querySelector('.message-content.js-messageContent');
/* 记录原始高度 */
if (!inner.hasAttribute(ORIGINAL_HEIGHT)) {
inner.setAttribute(ORIGINAL_HEIGHT, window.getComputedStyle(inner).height);
}
inner.style.height = '500px';
inner.style.backgroundColor = '#6ba65e59';
//inner.style.backgroundColor = '#fff';
inner.style.overflowY = 'hidden';
if (content) content.style.overflowY = 'hidden';
inner.classList.add('folded');
inner.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
function restore(inner) {
if (!inner.classList.contains('folded')) return;
const content = inner.querySelector('.message-content.js-messageContent');
inner.style.height = inner.getAttribute(ORIGINAL_HEIGHT) || '';
inner.style.backgroundColor = '';
inner.style.overflowY = '';
if (content) content.style.overflowY = '';
inner.classList.remove('folded');
}
/* ----------- 绑定 / 解绑 ----------- */
function bindToggle(inner) {
if (inner._foldClickHandler) return; // 已绑定
const handler = function (ev) {
if (ev.target !== inner) return;
if (inner.classList.contains('folded')) {
restore(inner);
} else {
fold(inner);
}
};
inner.addEventListener('click', handler);
inner._foldClickHandler = handler;
}
function unbindToggle(inner) {
if (!inner._foldClickHandler) return;
inner.removeEventListener('click', inner._foldClickHandler);
delete inner._foldClickHandler;
restore(inner);
}
/* ----------- 全量启用 / 禁用 ----------- */
function enableFeature() {
document.querySelectorAll('.message-inner').forEach(bindToggle);
}
function disableFeature() {
document.querySelectorAll('.message-inner').forEach(unbindToggle);
}
/* ----------- 动态节点支持 ----------- */
const mo = new MutationObserver(() => {
if (!enabled) return;
document.querySelectorAll('.message-inner:not([data-toggle-ready])')
.forEach(bindToggle);
});
/* ----------- 开关变化处理 ----------- */
checkbox.addEventListener('change', () => {
enabled = checkbox.checked;
localStorage.setItem(STORAGE_KEY, enabled);
if (enabled) {
enableFeature();
mo.observe(document.body, { childList: true, subtree: true });
} else {
mo.disconnect();
disableFeature();
document.querySelectorAll('.message-inner').forEach(unbindToggle);
}
});
/* ----------- 初始化 ----------- */
if (enabled) {
enableFeature();
mo.observe(document.body, { childList: true, subtree: true });
}
}
//创建放按钮的区域
function createControlDiv(){
/*
// 创建一个固定在左上角的div
const controlDiv = document.createElement('div');
controlDiv.id = 'custom-control-div';
controlDiv.style.position = 'fixed';
controlDiv.style.top = '5px';
controlDiv.style.left = '5px';
controlDiv.style.zIndex = '9999';
controlDiv.style.padding = '5px';
controlDiv.style.border = '1px solid #ccc';
controlDiv.style.borderRadius = '5px';
controlDiv.style.fontSize = '14px';
controlDiv.style.backgroundColor = '#a18705';
controlDiv.style.color = 'white';
// 将div添加到页面中
document.body.appendChild(controlDiv);
*/
// 创建一个折叠的 div
const foldableDiv = document.createElement('div');
foldableDiv.id = 'foldableDiv';
foldableDiv.style.transition = 'height 0.5s ease'; // 平滑过渡效果
foldableDiv.style.overflow = 'hidden'; // 隐藏超出部分
foldableDiv.style.cursor = 'pointer'; // 鼠标指针样式
//foldableDiv.style.height = '30px'; // 默认高度为 30px,作为提示区域
foldableDiv.style.position = 'fixed';
foldableDiv.style.top = '5px';
foldableDiv.style.left = '5px';
foldableDiv.style.maxWidth = '250px';
foldableDiv.style.zIndex = '999';
foldableDiv.style.padding = '8px';
foldableDiv.style.border = '1px solid #ccc';
foldableDiv.style.borderRadius = '5px';
foldableDiv.style.fontSize = '14px';
foldableDiv.style.fontWeight = 'bold';
foldableDiv.style.backgroundColor = '#a18705';
foldableDiv.style.color = 'white';
// 创建内容
const controlDiv = document.createElement('div');
controlDiv.id = 'custom-control-div';
//controlDiv.style.padding = '5px';
controlDiv.style.display = 'none'; // 默认隐藏内容
//controlDiv.textContent = '这是折叠的内容,鼠标悬停时显示。';
// 创建提示区域
const hint = document.createElement('div');
//hint.style.padding = '5px';
hint.style.textAlign = 'center';
hint.style.color = 'white';
//hint.style.fontWeight = 'bold';
hint.textContent = 'Extra Enhancements';
// 将内容和提示区域添加到折叠的 div 中
foldableDiv.appendChild(controlDiv);
foldableDiv.appendChild(hint);
// 将折叠的 div 添加到页面中
document.body.appendChild(foldableDiv);
// 鼠标悬停时展开
foldableDiv.addEventListener('mouseover', () => {
foldableDiv.style.height = 'auto'; // 展开
controlDiv.style.display = 'block'; // 显示内容
hint.style.display = 'none'; // 隐藏提示区域
});
// 鼠标移开时折叠
foldableDiv.addEventListener('mouseout', () => {
//foldableDiv.style.height = '30px'; // 折叠
controlDiv.style.display = 'none'; // 隐藏内容
hint.style.display = 'block'; // 显示提示区域
});
}
//限制图片最大大小
function createCheckboxToLimitImgSize(){
// 用于存储用户的选择状态
const maxImgWidthKey = 'maxImgWidthKey';
// 检查localStorage中是否存在maxImgWidthKey变量,若不存在则初始化为""
if (localStorage.getItem(maxImgWidthKey) === null) {
localStorage.setItem(maxImgWidthKey, '');
}
// 创建一个标签
const label = document.createElement('label');
label.textContent = 'Pic Max Width:';
label.style.marginLeft = '27px';
// 创建一个输入框
const input = document.createElement('input');
input.id = 'max-width-input';
input.type = 'text';
input.style.width = '50px';
input.style.marginLeft = '5px';
input.style.background = 'transparent'; // 透明背景
input.style.border = 'none'; // 移除边框
input.style.borderBottom = '1px solid #fff'; // 下划线样式
input.style.outline = 'none'; // 移除焦点时的边框
input.style.color = '#4f4e4e'; // 输入文字颜色
input.style.fontWeight = 'bold';
//input.style.fontSize = '14px'; // 字体大小
input.style.textAlign = 'center'; // 文字居中
input.addEventListener('change', function() {
const value = input.value.trim();
const images = document.querySelectorAll('.message-cell.message-cell--main img:not(.smilie)');
//const images = document.querySelectorAll('.bbImageWrapper.js-lbImage img');
if (value === '') {
// 如果输入框为空,移除最大宽度限制
images.forEach(img => img.style.maxWidth = '');
localStorage.setItem(maxImgWidthKey, value);
} else if (!isNaN(value) && value > 0) {
// 如果输入的是数字,设置最大宽度
images.forEach(img => img.style.maxWidth = value + 'px');
localStorage.setItem(maxImgWidthKey, value);
console.log("改变了图片最大尺寸");
} else {
// 如果输入的不是数字,清除输入框
input.value = '';
}
});
// 初始状态设置
input.value=getMaxImgWidth();
// 创建一个 change 事件
const changeEvent = new Event('change', {
bubbles: true,
cancelable: true
});
// 触发 change 事件
input.dispatchEvent(changeEvent);
// 动态获取最大宽度
function getMaxImgWidth() {
return localStorage.getItem(maxImgWidthKey);
}
// 创建一个div装他们
const containerDiv = document.createElement('div');
// 将复选框和标签添加到div中
const controlDiv = document.getElementById('custom-control-div');
containerDiv.appendChild(label);
containerDiv.appendChild(input);
controlDiv.appendChild(containerDiv);
}
//第一个标题栏
function createUserInfoLabel(){
// 创建复选框标签
const label = document.createElement('label');
label.textContent = 'User Info Area';
label.style.color = '#ffee9d'; // 输入文字颜色
// 创建一个div装他们
const containerDiv = document.createElement('div');
// 将复选框和标签添加到div中
const controlDiv = document.getElementById('custom-control-div');
containerDiv.appendChild(label);
controlDiv.appendChild(containerDiv);
}
//第二个标题栏
function createPicLabel(){
// 创建复选框标签
const label = document.createElement('label');
label.textContent = 'Better Pic Display';
label.style.color = '#ffee9d'; // 输入文字颜色
// 创建一个div装他们
const containerDiv = document.createElement('div');
// 将复选框和标签添加到div中
const controlDiv = document.getElementById('custom-control-div');
containerDiv.appendChild(label);
controlDiv.appendChild(containerDiv);
}
//第三个标题栏
function createSkipInfoLabel(){
// 创建复选框标签
const label = document.createElement('label');
label.textContent = 'Skip Useless Stuff';
label.style.color = '#ffee9d'; // 输入文字颜色
// 创建一个div装他们
const containerDiv = document.createElement('div');
// 将复选框和标签添加到div中
const controlDiv = document.getElementById('custom-control-div');
containerDiv.appendChild(label);
controlDiv.appendChild(containerDiv);
}
//每行显示一张图片
function createCheckboxToDisplayOnePicPerLine(){
// 创建复选框
const checkbox = document.createElement('input');
checkbox.type = 'checkbox';
checkbox.id = 'one-pic-per-line-checkbox';
checkbox.style.marginLeft = '5px';
// 创建复选框标签
const label = document.createElement('label');
label.htmlFor = 'one-pic-per-line-checkbox';
label.textContent = 'One Pic Per Line';
// 创建一个div装他们
const containerDiv = document.createElement('div');
// 将复选框和标签添加到div中
const controlDiv = document.getElementById('custom-control-div');
containerDiv.appendChild(checkbox);
containerDiv.appendChild(label);
controlDiv.appendChild(containerDiv);
// 为复选框添加事件监听
checkbox.addEventListener('change', function() {
switchPicDisplayState();
if (this.checked) {
displayOnePic();//勾选每行一张图
} else {
displayMultiPics();//取消勾选恢复原状
}
});
// 用于存储用户的选择状态
const onePicKey = 'onePicKey';
// 初始状态设置
if (getOnePicState()) {
checkbox.checked = true;
displayOnePic();
} else {
checkbox.checked = false;
}
// 动态获取当前是否显示大图
function getOnePicState() {
return localStorage.getItem(onePicKey) === 'true';
}
// 动态切换是否显示大图
function switchPicDisplayState(){
const newState = !getOnePicState(); // 获取新的状态
// 更新本地存储
localStorage.setItem(onePicKey, newState.toString());
}
// 勾选时,把媒体改成display:block
function displayOnePic(){
//document.querySelectorAll('.bbImageWrapper, .bbMediaWrapper').forEach(function (el) {
document.querySelectorAll('.bbImageWrapper,.inserted-img, .bbImage, .bbMediaWrapper').forEach(function (el) {
el.style.display = 'block';
});
}
// 取消勾选时,把媒体改成display:inline-block
function displayMultiPics(){
//document.querySelectorAll('.bbImageWrapper, .bbMediaWrapper').forEach(function (el) {
document.querySelectorAll('.bbImageWrapper,.inserted-img, .bbImage, .bbMediaWrapper').forEach(function (el) {
el.style.display = 'inline-block';
});
}
}
//把附件的图片改为全部显示而非填满
function createCheckboxToChangeAttaImgDisplay(){
/*
//显示所有附件图片全部内容
// 获取所有 .file-preview img 元素
const images = document.querySelectorAll('.file-preview img');
// 遍历并修改 object-fit 属性
images.forEach(img => {
img.style.objectFit = 'contain';
});
*/
// 创建复选框
const checkbox = document.createElement('input');
checkbox.type = 'checkbox';
checkbox.id = 'attachment-pic-checkbox';
checkbox.style.marginLeft = '5px';
// 创建复选框标签
const label = document.createElement('label');
label.htmlFor = 'attachment-pic-checkbox';
label.textContent = 'Enlarge Attachment Pics';
// 创建一个div装他们
const containerDiv = document.createElement('div');
// 将复选框和标签添加到div中
const controlDiv = document.getElementById('custom-control-div');
containerDiv.appendChild(checkbox);
containerDiv.appendChild(label);
controlDiv.appendChild(containerDiv);
// 为复选框添加事件监听
checkbox.addEventListener('change', function() {
switchBigPreviewState();
if (this.checked) {
displayBigPreview();//勾选展示大图
} else {
delBigPreview();//取消勾选删除大图
}
});
// 用于存储用户的选择状态
const bigPreviewKey = 'bigPreviewKey';
// 初始状态设置
if (getBigPreviewState()) {
checkbox.checked = true;
displayBigPreview();
} else {
checkbox.checked = false;
}
// 动态获取当前是否显示大图
function getBigPreviewState() {
return localStorage.getItem(bigPreviewKey) === 'true';
}
// 动态切换是否显示大图
function switchBigPreviewState(){
const newState = !getBigPreviewState(); // 获取新的状态
// 更新本地存储
localStorage.setItem(bigPreviewKey, newState.toString());
}
// 勾选时,为每个section中的a元素创建img并插入
function displayBigPreview(){
const insertedImgs=document.querySelectorAll('img.inserted-img');
if(insertedImgs.length > 0){
insertedImgs.forEach(img => {
img.style.display = '';
});
}else{
document.querySelectorAll('section.message-attachments').forEach(section => {
section.querySelectorAll('a.file-preview.js-lbImage').forEach(link => {
const img = document.createElement('img');
img.src = link.href;
img.alt = 'Inserted Image';
let maxWidth = localStorage.getItem("maxImgWidthKey");
if (maxWidth !== null && maxWidth !="") {
img.style.maxWidth = maxWidth+"px"; // 设置图片宽度,可根据需要调整
}
img.style.height = 'auto';
img.style.margin = '5px';
img.classList.add('inserted-img'); // 添加标记类名方便后续删除
section.appendChild(img);
});
});
}
const attaList = document.querySelectorAll('ul.attachmentList');
attaList.forEach(atta => {
atta.style.display = 'none';
});
}
// 取消勾选时,删除所有标记的img元素
function delBigPreview(){
document.querySelectorAll('img.inserted-img').forEach(img => {
img.style.display = 'none';
});
const attaList = document.querySelectorAll('ul.attachmentList');
attaList.forEach(atta => {
atta.style.display = '';
});
}
}
//隐藏用户信息的部分
function createCheckboxToHideUserInfo(){
// 用于存储用户的选择状态
const hideUserInfoKey = 'hideUserInfo';
// 动态获取当前的隐藏状态
function getIsUserInfoHidden() {
return localStorage.getItem(hideUserInfoKey) === 'true';
}
// 动态切换当前的隐藏状态
function switchIsUserInfoHidden(){
const newState = !getIsUserInfoHidden(); // 获取新的状态
// 更新本地存储
localStorage.setItem(hideUserInfoKey, newState.toString());
}
// 创建复选框
const checkbox = document.createElement('input');
checkbox.type = 'checkbox';
checkbox.id = 'hide-userinfo';
checkbox.style.marginLeft = '5px';
// 创建复选框标签
const label = document.createElement('label');
label.htmlFor = 'hide-userinfo';
label.textContent = 'Hide User Info';
// 创建一个div装他们
const containerDiv = document.createElement('div');
// 将复选框和标签添加到div中
const controlDiv = document.getElementById('custom-control-div');
containerDiv.appendChild(checkbox);
containerDiv.appendChild(label);
controlDiv.appendChild(containerDiv);
// 为复选框添加事件监听
checkbox.addEventListener('change', function() {
toggleVisibility();
});
// 初始状态设置
if (getIsUserInfoHidden()) {
checkbox.checked = true;
document.querySelectorAll('.message-userExtras').forEach(element => {
element.style.display = 'none';
});
} else {
checkbox.checked = false;
}
// 切换隐藏状态的函数
function toggleVisibility() {
const newState = !getIsUserInfoHidden(); // 获取新的状态
// 更新本地存储
localStorage.setItem(hideUserInfoKey, newState.toString());
// 更新元素的显示状态
document.querySelectorAll('.message-userExtras').forEach(element => {
element.style.display = newState ? 'none' : '';
});
}
}
//用于控制向前跳还是向后跳
function createCheckboxToAutoJumpBackward(){
// 检查localStorage中是否存在autoJumpBackward变量,若不存在则初始化为false
if (localStorage.getItem('autoJumpBackward') === null) {
localStorage.setItem('autoJumpBackward', 'false');
}
// 创建一个勾选框
const checkbox2 = document.createElement('input');
checkbox2.type = 'checkbox';
checkbox2.id = 'autoJumpBackward';
checkbox2.style.marginLeft = '5px';
// 根据localStorage的值设置勾选框的初始状态
if (localStorage.getItem('autoJumpBackward') === 'true') {
checkbox2.checked = true;
} else {
checkbox2.checked = false;
}
// 创建一个标签用于描述勾选框
const label2 = document.createElement('label');
label2.htmlFor = 'autoJumpBackward';
label2.textContent = 'Skip Backward';
// 创建一个div装他们
const containerDiv = document.createElement('div');
containerDiv.id = 'autoJumpContainer';
containerDiv.style.marginLeft = '10px';
// 将复选框和标签添加到div中
const controlDiv = document.getElementById('custom-control-div');
containerDiv.appendChild(checkbox2);
containerDiv.appendChild(label2);
controlDiv.appendChild(containerDiv);
// 添加事件监听器,更新localStorage的值
checkbox2.addEventListener('change', function() {
localStorage.setItem('autoJumpBackward', this.checked ? 'true' : 'false');
});
}
//用于控制是否跳转纯文字页面
function createCheckboxToAutoJumpTextOnlyPage(){
// 检查localStorage中是否存在autoJumpTextOnlyPage变量,若不存在则初始化为false
if (localStorage.getItem('autoJumpTextOnlyPage') === null) {
localStorage.setItem('autoJumpTextOnlyPage', 'false');
}
// 创建一个勾选框
const checkbox = document.createElement('input');
checkbox.type = 'checkbox';
checkbox.id = 'autoJumpCheckbox';
checkbox.style.marginLeft = '5px';
// 根据localStorage的值设置勾选框的初始状态
if (localStorage.getItem('autoJumpTextOnlyPage') === 'true') {
checkbox.checked = true;
} else {
checkbox.checked = false;
}
// 创建一个标签用于描述勾选框
const label = document.createElement('label');
label.htmlFor = 'autoJumpCheckbox';
label.textContent = 'Autoskip Textonly Pages';
// 创建一个div装他们
const containerDiv = document.createElement('div');
containerDiv.id = 'autoJumpcontainer2';
containerDiv.style.marginLeft = '10px';
// 将复选框和标签添加到div中
const controlDiv = document.getElementById('custom-control-div');
containerDiv.appendChild(checkbox);
containerDiv.appendChild(label);
controlDiv.appendChild(containerDiv);
// 添加事件监听器,更新localStorage的值
checkbox.addEventListener('change', function() {
localStorage.setItem('autoJumpTextOnlyPage', this.checked ? 'true' : 'false');
});
}
//隐藏没有图片或视频的post
function createCheckboxToHideTextOnlyPost(){
// 用于存储用户的选择状态
const hideTextOnlyKey = 'hideTextOnlyPost';
// 检查localStorage中是否存在autoJumpTextOnlyPage变量,若不存在则初始化为false
if (localStorage.getItem(hideTextOnlyKey) === null) {
localStorage.setItem(hideTextOnlyKey, 'false');
}
// 创建一个勾选框
const checkbox = document.createElement('input');
checkbox.type = 'checkbox';
checkbox.id = 'hideTextOnlyPostCheckbox';
checkbox.style.marginLeft = '5px';
// 根据localStorage的值设置勾选框的初始状态
if (getTextIsHidden()) {
checkbox.checked = true;
HideTextOnlyPosts();
} else {
checkbox.checked = false;
ShowAllPosts();
}
// 创建一个标签用于描述勾选框
const label = document.createElement('label');
label.htmlFor = 'hideTextOnlyPostCheckbox';
label.textContent = 'Hide Textonly Post';
// 创建一个div装他们
const containerDiv = document.createElement('div');
// 将复选框和标签添加到div中
const controlDiv = document.getElementById('custom-control-div');
const subDiv = document.getElementById('autoJumpcontainer2');
containerDiv.appendChild(checkbox);
containerDiv.appendChild(label);
controlDiv.insertBefore(containerDiv, subDiv);
// 添加事件监听器,更新localStorage的值
checkbox.addEventListener('change', function() {
toggleTextOnlyPost();
});
// 动态获取当前的隐藏状态
function getTextIsHidden() {
return localStorage.getItem(hideTextOnlyKey) === 'true';
}
// 切换隐藏状态的函数
function toggleTextOnlyPost() {
const newState = !getTextIsHidden(); // 获取新的状态
// 更新本地存储
localStorage.setItem(hideTextOnlyKey, newState.toString());
// 更新元素的显示状态
if(newState){
HideTextOnlyPosts();
}else{
ShowAllPosts();
}
}
//隐藏只有文字的帖子
function HideTextOnlyPosts() {
//显示额外选项
const container = document.getElementById('autoJumpContainer');
container.style.display = '';
const container2 = document.getElementById('autoJumpcontainer2');
container2.style.display = '';
// 获取所有符合条件的article元素
const articles = document.querySelectorAll('article.message.message--post.js-post.js-inlineModContainer');
var textPostCount=0;
var nonTextPostCount=0;
articles.forEach(article => {
// 获取每个article中的message-content元素
const content = article.querySelector('.message-content.js-messageContent');
if (content) {
// 检查message-content中是否存在video元素
const hasVideo = content.querySelector('video') !== null;
// 检查message-content中是否存在iframe元素
const hasIframe = content.querySelector('iframe') !== null;
// 检查message-content中是否存在非emoji的img元素
var hasValidImage = Array.from(content.querySelectorAll('img')).some(img => {
// 检查img元素的class属性是否包含"emoji"字样
return !img.className.includes('smilie');
});
//如果想连图片也跳过,用下面这句
//hasValidImage=false;
// 如果没有视频且没有非emoji的图片,则隐藏整个article
if (!hasVideo && !hasValidImage&& !hasIframe) {
textPostCount+=1;
article.style.display = 'none';
}else{
nonTextPostCount+=1;
}
}
});
//如果是纯文字页面,自动跳转下一页
if(nonTextPostCount==0){
setTimeout(autoClickNextPage, 1000);
}
console.log("隐藏了"+textPostCount+"篇");
}
//显示所有帖子
function ShowAllPosts() {
//隐藏额外选项
const container = document.getElementById('autoJumpContainer');
container.style.display = 'none';
const container2 = document.getElementById('autoJumpcontainer2');
container2.style.display = 'none';
// 获取所有符合条件的article元素
const articles = document.querySelectorAll('article.message.message--post.js-post.js-inlineModContainer');
articles.forEach(article => {
article.style.display = '';
});
}
// 自动跳转下一页
function autoClickNextPage() {
// 获取勾选框
const checkbox = document.getElementById('autoJumpCheckbox');
if (!checkbox) {
console.warn('未找到勾选框,脚本无法运行。');
return;
}
const checkbox2 = document.getElementById('autoJumpBackward');
if (!checkbox2) {
console.warn('未找到往前翻勾选框,脚本无法运行。');
return;
}
// 如果勾选框被选中
if (checkbox.checked) {
// 查找页面上第一个class="pageNav-jump pageNav-jump--next"的<a>元素
var nextLink;
if(checkbox2.checked){
nextLink = document.querySelector('a.pageNav-jump.pageNav-jump--prev');
}else{
nextLink = document.querySelector('a.pageNav-jump.pageNav-jump--next');
}
if (nextLink) {
console.log('自动点击下一页按钮');
nextLink.click(); // 模拟点击
} else {
console.warn('未找到下一页按钮');
}
}
}
}
//替换视频的部分
function replaceUnplayableVideos(){
var easterEggPoster = document.getElementsByClassName("video-easter-egg-poster");
var videoDiv=[];
var imageUrl;
var newDiv;
var baseVideoUrl;
if(easterEggPoster.length==0){
//console.log("官方时间,无需替换");
//把官方时间的视频放大然后静音
enlargeAndMuteVideo();
return;
}else if(easterEggPoster.length>5){
autoSwitchInterval=5000;
}
//替换预览照片为视频播放器
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:800px; 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>`;
//videoDiv[i]=`<video 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>`;
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;
}
**/
//把官方时间的视频放大然后静音
enlargeAndMuteVideo();
// 延时后开始检查视频
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("所有视频都已加载完成!");
}
}
//把官方时间的视频放大然后静音
function enlargeAndMuteVideo(){
// 获取页面上所有的 video 元素
const videos = document.querySelectorAll('video');
var count=0;
videos.forEach(video => {
const parent = video.parentElement;
// 检查父元素的 className 是否不是 'newVideoDiv'
if (parent.className !== 'newVideoDiv') {
count+=1;
// 设置 video 的样式
video.style.width = '800px';
video.style.maxHeight = '750px';
// 设置 video 的音量为 0
video.volume = volume;
// 将 video 提升到父元素的同级位置,并放在父元素前面
parent.before(video);
parent.remove();
}
});
console.log("放大了"+count+"个视频");
//把包着video的div的宽度也设置大点
const elements = document.querySelectorAll('div.bbMediaWrapper.bbMediaWrapper--inline');
elements.forEach(el => {
el.style.width = '800px';
});
}
//滚动到最后自动换页
function scrollToNextPage(){
let timeoutId = null; // 用于存储定时器的ID
window.addEventListener('scroll', function() {
// 清除之前的定时器
if (timeoutId) {
clearTimeout(timeoutId);
}
// 获取页面的总高度
var totalHeight = document.documentElement.scrollHeight;
// 获取当前窗口的高度
var windowHeight = window.innerHeight;
// 获取当前滚动的位置
var scrollPosition = window.pageYOffset + windowHeight;
// 判断是否滚动到页面底部
if (scrollPosition >= totalHeight) {
// 设置一个定时器,在等待后点击下一页
timeoutId = setTimeout(autoClickNextPage, 1000);
}
});
// 自动跳转下一页
function autoClickNextPage() {
const checkbox2 = document.getElementById('autoJumpBackward');
if (!checkbox2) {
console.warn('未找到往前翻勾选框,脚本无法运行。');
return;
}
// 查找页面上第一个class="pageNav-jump pageNav-jump--next"的<a>元素
var nextLink;
if(checkbox2.checked){
nextLink = document.querySelector('a.pageNav-jump.pageNav-jump--prev');
}else{
nextLink = document.querySelector('a.pageNav-jump.pageNav-jump--next');
}
if (nextLink) {
console.log('自动点击下一页按钮');
nextLink.click(); // 模拟点击
} else {
console.warn('未找到下一页按钮');
}
}
}
})();