The blur is removed individually when pointing or playing a video, without interfering with the viewing.
// ==UserScript==
// @name Furry34 Blur
// @name:ru Furry34 Размытие
// @namespace http://tampermonkey.net/
// @version 1.0
// @description The blur is removed individually when pointing or playing a video, without interfering with the viewing.
// @description:ru Размытие снимается индивидуально при наведении или воспроизведении видео, не мешая просмотру.
// @author scody
// @license MIT
// @match *://furry34.com/*
// @grant none
// ==/UserScript==
(function () {
'use strict';
const style = document.createElement('style');
style.textContent = `
.blurred-media {
filter: blur(18px);
transition: filter 0.2s ease-in-out;
position: relative;
cursor: pointer;
}
.blurred-media.revealed {
filter: none !important;
}
`;
document.head.appendChild(style);
function applySimpleBlur(el) {
el.classList.add('blurred-media');
const isVideo = el.tagName.toLowerCase() === 'video';
if (isVideo) {
el.setAttribute('preload', 'metadata');
}
el.addEventListener('mouseenter', () => {
if (!isVideo || el.paused) {
el.classList.add('revealed');
}
});
el.addEventListener('mouseleave', () => {
if (!isVideo || el.paused) {
el.classList.remove('revealed');
}
});
if (isVideo) {
el.addEventListener('play', () => {
el.classList.add('revealed');
});
el.addEventListener('pause', () => {
el.classList.remove('revealed');
});
el.addEventListener('ended', () => {
el.classList.remove('revealed');
});
}
}
function processAll() {
const imgs = document.querySelectorAll('img:not([data-blur-applied])');
const vids = document.querySelectorAll('video:not([data-blur-applied])');
imgs.forEach(img => {
img.setAttribute('data-blur-applied', 'true');
applySimpleBlur(img);
});
vids.forEach(video => {
video.setAttribute('data-blur-applied', 'true');
applySimpleBlur(video);
if (!video.paused && !video.ended && video.readyState > 2) {
video.classList.add('revealed');
}
});
}
const observer = new MutationObserver(processAll);
observer.observe(document.body, { childList: true, subtree: true });
processAll();
})();