Attachments
Attachments
Code: Select all
// ==UserScript==
// @name - Add - Video - List - Blackout Overlay Button
// @version 3.9.1
// @match *://pluto.tv/*
// @match *://popcornflix.com/*
// @match *://tubitv.com/*
// @match *://watch.plex.tv/*
// @grant none
// ==/UserScript==
(function () {
'use strict';
/*** CONFIGURATION ***/
const SEGMENT_TIMES = [27, 30, 30, 30, 30, 30]; // seconds for each of the 6 segments
const HOLE_RADIUS = 40; // pixels
const HOLE_FADE = 40; // pixels
const OVERLAY_OPACITY = 1.0; // 0.0 (transparent) to 1.0 (fully opaque)
const HOLE_OPACITY = 0.4; // 0.0 (fully transparent hole) to 1.0 (same as overlay)
const CANCEL_COLORS = [
'#dc3545', // red
'#fd7e14', // orange
'#ffc107', // yellow
'#28a745', // green
'#17a2b8', // blue
'#6f42c1' // purple
]; // one color per segment
/*** Helper: Pad seconds to two digits ***/
function padSeconds(sec) {
return sec.toString().padStart(2, '0');
}
function init() {
let hideTimeout, countdownInterval;
let currentSegmentIndex = 0;
let segmentRemaining = SEGMENT_TIMES[0];
let originalMuteStates = new WeakMap(), originalMuteStatusText = '';
// Hover detection area (moved to top right)
const hoverArea = document.createElement('div');
hoverArea.style.cssText = `
background: transparent;
height: 37px;
position: fixed;
right: 20px;
top: 20px;
width: 84px;
z-index: 2147483647;
`;
// Main "Blackout" button (moved to top right)
const btn = document.createElement('button');
//btn.textContent = `Show Overlay (${SEGMENT_TIMES.reduce((a,b)=>a+b,0)}s)`;
btn.textContent = `Blackout`;
btn.style.cssText = `
background: #222;
border: none;
border-radius: 5px;
color: #fff;
cursor: pointer;
font-size: 14px;
opacity: 0;
padding: 10px 15px;
pointer-events: none;
position: fixed;
right: 20px;
top: 20px;
z-index: 2147483647;
`;
// Overlay with adjustable center hole opacity and faded border
const overlay = document.createElement('div');
overlay.style.cssText = `
background-color: rgba(0,0,0,${OVERLAY_OPACITY});
display: none;
height: 100%;
mask-image: radial-gradient(
circle ${HOLE_RADIUS + HOLE_FADE}px at 50% 50%,
rgba(0,0,0,${HOLE_OPACITY}) ${HOLE_RADIUS}px,
rgba(0,0,0,1) ${HOLE_RADIUS + HOLE_FADE}px);
mask-position: center;
mask-repeat: no-repeat;
pointer-events: auto;
position: fixed;
left: 0;
top: 0;
width: 100%;
z-index: 2147483646;
`;
// Cancel button inside the hole
const cancelBtn = document.createElement('button');
cancelBtn.style.cssText = `
background: ${CANCEL_COLORS[0]};
border: none;
border-radius: 8px;
color: #fff;
cursor: pointer;
display: none;
font-family: monospace;
font-size: 12px;
line-height: 0.8;
max-width: ${HOLE_RADIUS * 1.5}px;
padding: 4px;
position: fixed;
left: 50%;
top: 50%;
text-align: center;
transform: translate(-50%,-50%);
white-space: pre-line;
z-index: 2147483648;
`;
function showButton() {
clearTimeout(hideTimeout);
btn.style.opacity = '1';
btn.style.pointerEvents = 'auto';
}
function hideButton() {
hideTimeout = setTimeout(() => {
btn.style.opacity = '0';
btn.style.pointerEvents = 'none';
}, 0);
}
function handleAudioOnOverlayStart() {
let anyUnmuted = false;
document.querySelectorAll('audio, video').forEach(el => {
originalMuteStates.set(el, el.muted);
if (!el.muted) { anyUnmuted = true; el.muted = true; }
});
originalMuteStatusText = anyUnmuted ? 'Unmuted' : 'Muted';
}
function handleAudioOnOverlayEnd() {
document.querySelectorAll('audio, video').forEach(el => {
if (originalMuteStates.has(el)) {
el.muted = originalMuteStates.get(el);
}
});
}
function updateCancelButtonText() {
cancelBtn.textContent = `${padSeconds(segmentRemaining)}\n\n${currentSegmentIndex + 1} of ${SEGMENT_TIMES.length}\n\n${originalMuteStatusText}`;
}
function startOverlay() {
handleAudioOnOverlayStart();
currentSegmentIndex = 0;
segmentRemaining = SEGMENT_TIMES[0];
cancelBtn.style.background = CANCEL_COLORS[0];
updateCancelButtonText();
overlay.style.display = 'block';
cancelBtn.style.display = 'block';
countdownInterval = setInterval(() => {
segmentRemaining--;
if (segmentRemaining <= 0) {
currentSegmentIndex++;
if (currentSegmentIndex >= SEGMENT_TIMES.length) {
stopOverlay();
return;
}
segmentRemaining = SEGMENT_TIMES[currentSegmentIndex];
cancelBtn.style.background = CANCEL_COLORS[currentSegmentIndex % CANCEL_COLORS.length];
}
updateCancelButtonText();
}, 1000);
}
function stopOverlay() {
overlay.style.display = 'none';
cancelBtn.style.display = 'none';
clearInterval(countdownInterval);
handleAudioOnOverlayEnd();
}
hoverArea.addEventListener('mouseenter', showButton);
hoverArea.addEventListener('mouseleave', hideButton);
btn.addEventListener('mouseenter', showButton);
btn.addEventListener('mouseleave', hideButton);
btn.addEventListener('click', startOverlay);
cancelBtn.addEventListener('click', stopOverlay);
document.body.appendChild(hoverArea);
document.body.appendChild(btn);
document.body.appendChild(overlay);
document.body.appendChild(cancelBtn);
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();
Attachments
Code: Select all
// ==UserScript==
// @name - Add - Video - List - Blackout Overlay Button
// @version 3.9.1
// @match *://pluto.tv/*
// @match *://popcornflix.com/*
// @match *://tubitv.com/*
// @match *://watch.plex.tv/*
// @grant none
// ==/UserScript==
(function () {
'use strict';
/*** CONFIGURATION ***/
const SEGMENT_TIMES = [27, 30, 30, 30, 30, 30]; // seconds for each of the 6 segments
const HOLE_RADIUS = 40; // pixels
const HOLE_FADE = 40; // pixels
const OVERLAY_OPACITY = 1.0; // 0.0 (transparent) to 1.0 (fully opaque)
const HOLE_OPACITY = 0.4; // 0.0 (fully transparent hole) to 1.0 (same as overlay)
const CANCEL_COLORS = [
'#dc3545', // red
'#fd7e14', // orange
'#ffc107', // yellow
'#28a745', // green
'#17a2b8', // blue
'#6f42c1' // purple
]; // one color per segment
/*** Helper: Pad seconds to two digits ***/
function padSeconds(sec) {
return sec.toString().padStart(2, '0');
}
function init() {
let hideTimeout, countdownInterval;
let currentSegmentIndex = 0;
let segmentRemaining = SEGMENT_TIMES[0];
let originalMuteStates = new WeakMap(), originalMuteStatusText = '';
// Hover detection area (moved to top right)
const hoverArea = document.createElement('div');
hoverArea.style.cssText = `
background: transparent;
height: 37px;
position: fixed;
right: 20px;
top: 20px;
width: 84px;
z-index: 2147483647;
`;
// Main "Blackout" button (moved to top right)
const btn = document.createElement('button');
//btn.textContent = `Show Overlay (${SEGMENT_TIMES.reduce((a,b)=>a+b,0)}s)`;
btn.textContent = `Blackout`;
btn.style.cssText = `
background: #222;
border: none;
border-radius: 5px;
color: #fff;
cursor: pointer;
font-size: 14px;
opacity: 0;
padding: 10px 15px;
pointer-events: none;
position: fixed;
right: 20px;
top: 20px;
z-index: 2147483647;
`;
// Overlay with adjustable center hole opacity and faded border
const overlay = document.createElement('div');
overlay.style.cssText = `
background-color: rgba(0,0,0,${OVERLAY_OPACITY});
display: none;
height: 100%;
mask-image: radial-gradient(
circle ${HOLE_RADIUS + HOLE_FADE}px at 50% 50%,
rgba(0,0,0,${HOLE_OPACITY}) ${HOLE_RADIUS}px,
rgba(0,0,0,1) ${HOLE_RADIUS + HOLE_FADE}px);
mask-position: center;
mask-repeat: no-repeat;
pointer-events: auto;
position: fixed;
left: 0;
top: 0;
width: 100%;
z-index: 2147483646;
`;
// Cancel button inside the hole
const cancelBtn = document.createElement('button');
cancelBtn.style.cssText = `
background: ${CANCEL_COLORS[0]};
border: none;
border-radius: 8px;
color: #fff;
cursor: pointer;
display: none;
font-family: monospace;
font-size: 12px;
line-height: 0.8;
max-width: ${HOLE_RADIUS * 1.5}px;
padding: 4px;
position: fixed;
left: 50%;
top: 50%;
text-align: center;
transform: translate(-50%,-50%);
white-space: pre-line;
z-index: 2147483648;
`;
function showButton() {
clearTimeout(hideTimeout);
btn.style.opacity = '1';
btn.style.pointerEvents = 'auto';
}
function hideButton() {
hideTimeout = setTimeout(() => {
btn.style.opacity = '0';
btn.style.pointerEvents = 'none';
}, 0);
}
function handleAudioOnOverlayStart() {
let anyUnmuted = false;
document.querySelectorAll('audio, video').forEach(el => {
originalMuteStates.set(el, el.muted);
if (!el.muted) { anyUnmuted = true; el.muted = true; }
});
originalMuteStatusText = anyUnmuted ? 'Unmuted' : 'Muted';
}
function handleAudioOnOverlayEnd() {
document.querySelectorAll('audio, video').forEach(el => {
if (originalMuteStates.has(el)) {
el.muted = originalMuteStates.get(el);
}
});
}
function updateCancelButtonText() {
cancelBtn.textContent = `${padSeconds(segmentRemaining)}\n\n${currentSegmentIndex + 1} of ${SEGMENT_TIMES.length}\n\n${originalMuteStatusText}`;
}
function startOverlay() {
handleAudioOnOverlayStart();
currentSegmentIndex = 0;
segmentRemaining = SEGMENT_TIMES[0];
cancelBtn.style.background = CANCEL_COLORS[0];
updateCancelButtonText();
overlay.style.display = 'block';
cancelBtn.style.display = 'block';
countdownInterval = setInterval(() => {
segmentRemaining--;
if (segmentRemaining <= 0) {
currentSegmentIndex++;
if (currentSegmentIndex >= SEGMENT_TIMES.length) {
stopOverlay();
return;
}
segmentRemaining = SEGMENT_TIMES[currentSegmentIndex];
cancelBtn.style.background = CANCEL_COLORS[currentSegmentIndex % CANCEL_COLORS.length];
}
updateCancelButtonText();
}, 1000);
}
function stopOverlay() {
overlay.style.display = 'none';
cancelBtn.style.display = 'none';
clearInterval(countdownInterval);
handleAudioOnOverlayEnd();
}
hoverArea.addEventListener('mouseenter', showButton);
hoverArea.addEventListener('mouseleave', hideButton);
btn.addEventListener('mouseenter', showButton);
btn.addEventListener('mouseleave', hideButton);
btn.addEventListener('click', startOverlay);
cancelBtn.addEventListener('click', stopOverlay);
document.body.appendChild(hoverArea);
document.body.appendChild(btn);
document.body.appendChild(overlay);
document.body.appendChild(cancelBtn);
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();
Attachments
Notice that R3dfox v140.14.0 ESR is out:
Notice that R3dfox v140.14.0 ESR is out:
Attachments
Attachments
Attachments
Attachments
but it appears that detail went unnoticed by the majority of usersDisabled WebRTC because it didn't work anyways and faster to compile without.
but it appears that detail went unnoticed by the majority of usersDisabled WebRTC because it didn't work anyways and faster to compile without.
Yes, I admit I missed this information.]]>GoodConscience wrote: ↑06 Sep 2026, 13:35but it appears that detail went unnoticed by the majority of usersDisabled WebRTC because it didn't work anyways and faster to compile without....
Yes, I admit I missed this information.]]>GoodConscience wrote: ↑06 Sep 2026, 13:35but it appears that detail went unnoticed by the majority of usersDisabled WebRTC because it didn't work anyways and faster to compile without....
Attachments
Attachments
Attachments
Attachments
Attachments
Attachments
Attachments
Attachments
Attachments
Attachments
https://www.coindrop.ccReward your community with a single command. Send crypto instantly, withdraw anytime.
Attachments
https://www.coindrop.ccReward your community with a single command. Send crypto instantly, withdraw anytime.
Attachments
You are not the whole world. See above.The-10-Pen wrote: ↑09 Aug 2026, 13:14 But I haven't ran a "preinstalled" OS in nearly 20yrs. So explain that one?
This is not true anymore. For both Linux and Windows. Recent and modern distros of Linux have a good hardware support whilst Windows 11 dropped support for some devices.The-10-Pen wrote: ↑09 Aug 2026, 13:14 Hardware compatibility is why Linux SUCKS. Microsoft just does a million times better at supporting a diverse range of hardware.
You are not the whole world. See above.The-10-Pen wrote: ↑09 Aug 2026, 13:14 But I haven't ran a "preinstalled" OS in nearly 20yrs. So explain that one?
This is not true anymore. For both Linux and Windows. Recent and modern distros of Linux have a good hardware support whilst Windows 11 dropped support for some devices.The-10-Pen wrote: ↑09 Aug 2026, 13:14 Hardware compatibility is why Linux SUCKS. Microsoft just does a million times better at supporting a diverse range of hardware.
How do you do that ?The-10-Pen wrote: ↑09 Aug 2026, 14:58 Here is a "before" and "after" of how I use a SHADOW to effect font readability.
The key is the ORANGE / BROWN pixels of this BLACK FONT.
Code: Select all
// ==UserScript==
// @name - Fonts - Apply Text Shadow
// @match *://*/*
// @version 2.17.1
// @grant none
// ==/UserScript==
'use strict';
var isRunning;
function applyFilter() {
var AllElem=document.querySelectorAll(':not(script):not(style):not(area):not(base):not(br):not(col):not(embed):not(hr):not(img):not(input):not(keygen):not(link):not(meta):not(param):not(source):not(track):not(wbr):not(table):not(tbody):not(tr):not(ul)')
for (var i=0;i<AllElem.length;i++) {
for (var j=0;j<AllElem[i].childNodes.length;j++) { // cycle through element nodes
if (AllElem[i].childNodes[j].nodeType===3 && AllElem[i].childNodes[j].textContent.trim().length>0) {// is it a text node?
if (window.getComputedStyle(AllElem[i]).getPropertyValue('text-shadow')=='none'){ // do not run if text-shadow is already present
var Col=window.getComputedStyle(AllElem[i]).getPropertyValue('color').replace(/[^\d,.]/g,'').split(',') // text color array (R/G/B/A)
if (typeof(Col[3])=='undefined'||Col[3].split('.')[0]=='1') { // run if element does not have an alpha channel already applied
var Lum=Math.round(0.2126*Col[0]+0.7152*Col[1]+0.0722*Col[2]) // luminosity
var Opa=parseFloat(255*(255-Lum)/65025).toFixed(1) // opacity between 0 and 1
if (Lum<128) Opa=1
AllElem[i].style.setProperty('text-shadow','0 0 0px rgba('+Col[0]+','+Col[1]+','+Col[2]+','+Opa+')','important') // set text shadow with alpha
}
}
}
}
}
}
function waitAndApplyFilter() {
if (typeof(isRunning)!='undefined') clearTimeout(isRunning)
isRunning=setTimeout(function(){applyFilter()},100)
}
const callback = (mutationList, observer) => { // called every time BODY has changed
for (const mutation of mutationList) {
if (mutation.type === "childList") waitAndApplyFilter()
}
};
applyFilter();
const targetNode = document.getElementsByTagName("body")[0]
// Options for the observer (which mutations to observe)
const config = { attributes: false, childList: true, subtree: true };
// Create an observer instance linked to the callback function
const observer = new MutationObserver(callback);
// Start observing the target node for configured mutations
observer.observe(targetNode, config);
How do you do that ?The-10-Pen wrote: ↑09 Aug 2026, 14:58 Here is a "before" and "after" of how I use a SHADOW to effect font readability.
The key is the ORANGE / BROWN pixels of this BLACK FONT.
Code: Select all
// ==UserScript==
// @name - Fonts - Apply Text Shadow
// @match *://*/*
// @version 2.17.1
// @grant none
// ==/UserScript==
'use strict';
var isRunning;
function applyFilter() {
var AllElem=document.querySelectorAll(':not(script):not(style):not(area):not(base):not(br):not(col):not(embed):not(hr):not(img):not(input):not(keygen):not(link):not(meta):not(param):not(source):not(track):not(wbr):not(table):not(tbody):not(tr):not(ul)')
for (var i=0;i<AllElem.length;i++) {
for (var j=0;j<AllElem[i].childNodes.length;j++) { // cycle through element nodes
if (AllElem[i].childNodes[j].nodeType===3 && AllElem[i].childNodes[j].textContent.trim().length>0) {// is it a text node?
if (window.getComputedStyle(AllElem[i]).getPropertyValue('text-shadow')=='none'){ // do not run if text-shadow is already present
var Col=window.getComputedStyle(AllElem[i]).getPropertyValue('color').replace(/[^\d,.]/g,'').split(',') // text color array (R/G/B/A)
if (typeof(Col[3])=='undefined'||Col[3].split('.')[0]=='1') { // run if element does not have an alpha channel already applied
var Lum=Math.round(0.2126*Col[0]+0.7152*Col[1]+0.0722*Col[2]) // luminosity
var Opa=parseFloat(255*(255-Lum)/65025).toFixed(1) // opacity between 0 and 1
if (Lum<128) Opa=1
AllElem[i].style.setProperty('text-shadow','0 0 0px rgba('+Col[0]+','+Col[1]+','+Col[2]+','+Opa+')','important') // set text shadow with alpha
}
}
}
}
}
}
function waitAndApplyFilter() {
if (typeof(isRunning)!='undefined') clearTimeout(isRunning)
isRunning=setTimeout(function(){applyFilter()},100)
}
const callback = (mutationList, observer) => { // called every time BODY has changed
for (const mutation of mutationList) {
if (mutation.type === "childList") waitAndApplyFilter()
}
};
applyFilter();
const targetNode = document.getElementsByTagName("body")[0]
// Options for the observer (which mutations to observe)
const config = { attributes: false, childList: true, subtree: true };
// Create an observer instance linked to the callback function
const observer = new MutationObserver(callback);
// Start observing the target node for configured mutations
observer.observe(targetNode, config);