Redgifs Embed Tweaks

tweaks redgifs embed/iframe video

Versione datata 27/11/2023. Vedi la nuova versione l'ultima versione.

// ==UserScript==
// @name        Redgifs Embed Tweaks
// @namespace   https://greasyfork.org/pt-BR/users/821661
// @match       https://www.redgifs.com/ifr/*
// @grant       GM_registerMenuCommand
// @grant       GM_addElement
// @grant       GM_addStyle
// @grant       GM_setValue
// @grant       GM_getValue
// @version     0.2.5
// @author      hdyzen
// @description tweaks redgifs embed/iframe video
// @license     MIT
// ==/UserScript==

(function () {
	'use strict';
	// Autoplay state
	const autoplay = GM_getValue('autoplay', true);
	// Open state
	const openLink = GM_getValue('openlink', false);
	// Autopause state
	const autoPause = GM_getValue('autoPause', true);
	// Muted state
	const muted = GM_getValue('muted', false);
	// Bloat state
	const bloat = GM_getValue('bloat', false);
	// Quality state
	const quality = GM_getValue('quality', true);
	// Middle click state
	const middleClick = GM_getValue('middleClick', true);
	let midClick = false;
	// Background color state
	let bgkColor = GM_getValue('bgkColor', false);
	let style = GM_addStyle(`body,.App{background:${bgkColor}}`);
	// Title
	const title = 'Click for toggle';
	// Toggle item and reload page
	function toggle(key, value) {
		GM_setValue(key, value);
		location.reload();
	}
	// Autoplay toggle
	function autoplayToggle() {
		toggle('autoplay', !autoplay);
	}
	// Open link when click on video
	function openLinkToggle() {
		toggle('openlink', !openLink);
	}
	// Pause when video less than 80% visible
	function pauseVideoToggle() {
		toggle('autoPause', !autoPause);
	}
	// Muted default
	function mutedToggle() {
		toggle('muted', !muted);
	}
	// Open link when click on video
	function bloatToggle() {
		toggle('bloat', !bloat);
	}
	// Quality default
	function qualityToggle() {
		toggle('quality', !quality);
	}
	// Middle click
	function midClickToggle() {
		toggle('middleClick', !middleClick);
	}
	function openPickColor() {
		document.querySelector('#pick-color').dispatchEvent(click);
	}
	// Prevent opening video link
	if (!openLink) {
		document.addEventListener('click', (e) => {
			if (!e.target.closest('.videoLink')) return;
			e.preventDefault();
		});
	}
	// Middle click open link
	if (!middleClick) {
		document.addEventListener('mousedown', (e) => {
			if (!e.target.closest('.videoLink')) return;
			midClick = true;
		});
		document.addEventListener('mouseup', (e) => {
			if (midClick) {
				const videoLink = e.target.parentElement;
				videoLink.href = videoLink.href.replace('/watch/', '/ifr/');
				midClick = false;
			}
		});
	}
	// Remove bloat
	if (bloat) GM_addStyle(`.userInfo,.logo,#shareButton{display:none!important}`);
	// Intersection observer video
	function observerVideo(target) {
		const observer = new IntersectionObserver(
			(entries) => {
				for (const entry of entries) {
					if (!entry.isIntersecting && !entry.target.paused) entry.target.pause();
				}
			},
			{
				threshold: 0.8,
			},
		);
		observer.observe(target);
	}
	// Menu commands
	(function menuCommands() {
		// Autoplay
		const commandAutoplay = GM_registerMenuCommand('Autoplay: ON', autoplayToggle, {
			title: title,
		});
		if (!autoplay) {
			GM_registerMenuCommand('Autoplay: OFF', autoplayToggle, {
				title: title,
				id: commandAutoplay,
			});
		}
		// Open link
		const commandLink = GM_registerMenuCommand('Open link when click: OFF', openLinkToggle, {
			title: title,
		});
		if (openLink) {
			GM_registerMenuCommand('Open link when click: ON', openLinkToggle, {
				title: title,
				id: commandLink,
			});
		}
		// Pause video
		const commandPause = GM_registerMenuCommand('Autopause: ON', pauseVideoToggle, {
			title: title,
		});
		if (!autoPause) {
			GM_registerMenuCommand('Autopause: OFF', pauseVideoToggle, {
				title: title,
				id: commandPause,
			});
		}
		// Muted
		const commandMuted = GM_registerMenuCommand('Muted: ON', mutedToggle, {
			title: title,
		});
		if (!muted) {
			GM_registerMenuCommand('Muted: OFF', mutedToggle, {
				title: title,
				id: commandMuted,
			});
		}
		// Bloat
		const commandBloat = GM_registerMenuCommand('Hide Bloat: OFF', bloatToggle, {
			title: title,
		});
		if (bloat) {
			GM_registerMenuCommand('Hide Bloat: ON', bloatToggle, {
				title: title,
				id: commandBloat,
			});
		}
		// Quality
		const commandQuality = GM_registerMenuCommand('Default Quality: HD', qualityToggle, {
			title: title,
		});
		if (!quality) {
			GM_registerMenuCommand('Default Quality: SD', qualityToggle, {
				title: title,
				id: commandQuality,
			});
		}
		// Middle click
		const commandMidClick = GM_registerMenuCommand('Middle click: open watch page', midClickToggle, {
			title: title,
		});
		if (!middleClick) {
			GM_registerMenuCommand('Middle click: open ifr page', midClickToggle, {
				title: title,
				id: commandMidClick,
			});
		}
		// Background color
		const commandBgkColor = GM_registerMenuCommand('Background color: Default', openPickColor, {
			title: title,
		});
		if (bgkColor !== false) {
			GM_registerMenuCommand(`Background color: ${bgkColor}`, openPickColor, {
				title: title,
				id: commandBgkColor,
			});
		}
	})();
	// Pick color background
	let pickColor = GM_addElement(document.body, 'input', {
		type: 'color',
		id: 'pick-color',
		style: 'position:absolute;top:0;left:0;visibility:hidden',
	});
	// Pick color background input event
	pickColor.oninput = (e) => {
		let color = e.target.value;
		GM_setValue('bgkColor', color);
		style = GM_addStyle(`body,.App{background:${color}}`);
	};
	// Return element
	function el(e) {
		return document.querySelector(e);
	}
	// Click event
	const click = new MouseEvent('click', {
		bubbles: true,
		cancelable: true,
	});
	// Mutation observer
	const observer = new MutationObserver((mutations) => {
		mutations.forEach((mutation) => {
			if (mutation.type === 'childList' && mutation.target.querySelector('video')) {
				const video = el('video');
				const qBtn = quality ? el('[d^="M1 12C1"]') : el('[d^="M1.16712"]');
				const muteButton = el('.soundOff');
				if (video && !autoplay) {
					video.removeAttribute('autoplay');
				}
				if (video && autoPause) {
					observerVideo(video);
				}
				if (video && !muted) {
					muteButton.dispatchEvent(click);
				}
				if (video && qBtn) {
					qBtn.closest('.button').dispatchEvent(click);
				}
				observer.disconnect();
			}
		});
	});
	// Installing observer
	observer.observe(document.body, {
		childList: true,
		subtree: true,
	});
})();