From a218e361cb31f83f3d6df9bc030f8e8379f6143f Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Wed, 29 Apr 2026 14:51:46 +0000 Subject: [PATCH 01/65] Update ImageFap_User_Gallery_Hider.user.js --- NSFW/ImageFap_User_Gallery_Hider.user.js | 324 ++++++++++++++++++----- 1 file changed, 263 insertions(+), 61 deletions(-) diff --git a/NSFW/ImageFap_User_Gallery_Hider.user.js b/NSFW/ImageFap_User_Gallery_Hider.user.js index ace2058..8770905 100644 --- a/NSFW/ImageFap_User_Gallery_Hider.user.js +++ b/NSFW/ImageFap_User_Gallery_Hider.user.js @@ -1,16 +1,16 @@ // ==UserScript== -// @name ImageFap User Gallery Hider -// @namespace ImageFap_User_Gallery_Hider -// @version 2.1 -// @description Hide ImageFap galleries by user, <4 pics, gender, country. Left menu collapsible vertically, pagination friendly + debounced. -// @author masterofobzene + Grok -// @match https://www.imagefap.com/gallery.php* -// @icon https://www.imagefap.com/favicon.ico -// @grant GM_getValue -// @grant GM_setValue -// @inject-into content -// @downloadURL https://github.com/masterofobzene/UserScriptRepo/raw/main/NSFW/ImageFap_User_Gallery_Hider.user.js -// @updateURL https://github.com/masterofobzene/UserScriptRepo/raw/main/NSFW/ImageFap_User_Gallery_Hider.user.js +// @name ImageFap User Gallery Hider +// @namespace ImageFap_User_Gallery_Hider +// @version 2.2 +// @description Hide ImageFap galleries by user, less than 4 pics, gender, country. Left menu collapsible vertically, pagination friendly. +// @author masterofobzene +// @match https://www.imagefap.com/gallery.php* +// @icon https://www.imagefap.com/favicon.ico +// @grant GM_getValue +// @grant GM_setValue +// @inject-into content +// @downloadURL https://github.com/masterofobzene/UserScriptRepo/raw/main/NSFW/ImageFap_User_Gallery_Hider.user.js +// @updateURL https://github.com/masterofobzene/UserScriptRepo/raw/main/NSFW/ImageFap_User_Gallery_Hider.user.js // ==/UserScript== (function() { @@ -23,53 +23,143 @@ let hiddenUsers = new Set(GM_getValue(hiddenUsersKey, [])); - const DEFAULT_HIDE_CONFIG = { women: false, couples: false, transsexuals: false, germany: false, belgium: false }; + const DEFAULT_HIDE_CONFIG = { + women: false, + couples: false, + transsexuals: false, + germany: false, + belgium: false, + spain: false, + france: false + }; + + function getHideConfig() { + return GM_getValue(hideConfigKey, DEFAULT_HIDE_CONFIG); + } - function getHideConfig() { return GM_getValue(hideConfigKey, DEFAULT_HIDE_CONFIG); } - function setHideConfig(cfg) { GM_setValue(hideConfigKey, cfg); } + function setHideConfig(cfg) { + GM_setValue(hideConfigKey, cfg); + } function createGenderPanel() { if (document.getElementById('genderFilterPanel')) return; + const cfg = getHideConfig(); const pos = GM_getValue(panelPosKey, { top: 120, right: 10 }); + const panel = document.createElement('div'); panel.id = 'genderFilterPanel'; - panel.style.cssText = `position:fixed;top:${pos.top}px;right:${pos.right}px;background:#111;color:#fff;width:170px;font-size:13px;z-index:99999;border:1px solid #444;border-radius:6px;box-shadow:0 0 6px black;`; + panel.style.cssText = ` + position:fixed; + top:${pos.top}px; + right:${pos.right}px; + background:#111; + color:#fff; + width:170px; + font-size:13px; + z-index:99999; + border:1px solid #444; + border-radius:6px; + box-shadow:0 0 6px black; + `; + panel.innerHTML = ` -
Hide users
+
+ Hide users +
-
+



- +
+
+
`; + document.body.appendChild(panel); - const w = panel.querySelector('#hideWomen'), c = panel.querySelector('#hideCouples'), - t = panel.querySelector('#hideTrans'), g = panel.querySelector('#hideGermany'), - f = panel.querySelector('#hideBelgium'); + const w = panel.querySelector('#hideWomen'); + const c = panel.querySelector('#hideCouples'); + const t = panel.querySelector('#hideTrans'); + const g = panel.querySelector('#hideGermany'); + const b = panel.querySelector('#hideBelgium'); + const s = panel.querySelector('#hideSpain'); + const f = panel.querySelector('#hideFrance'); - w.checked = cfg.women; c.checked = cfg.couples; t.checked = cfg.transsexuals; - g.checked = cfg.germany; f.checked = cfg.belgium; + w.checked = cfg.women; + c.checked = cfg.couples; + t.checked = cfg.transsexuals; + g.checked = cfg.germany; + b.checked = cfg.belgium; + s.checked = cfg.spain; + f.checked = cfg.france; const update = () => { - setHideConfig({ women: w.checked, couples: c.checked, transsexuals: t.checked, germany: g.checked, belgium: f.checked }); + setHideConfig({ + women: w.checked, + couples: c.checked, + transsexuals: t.checked, + germany: g.checked, + belgium: b.checked, + spain: s.checked, + france: f.checked + }); + + console.log('[ImageFap Hider] Filters updated'); applyAll(); }; - w.onchange = c.onchange = t.onchange = g.onchange = f.onchange = update; + + w.onchange = update; + c.onchange = update; + t.onchange = update; + g.onchange = update; + b.onchange = update; + s.onchange = update; + f.onchange = update; const header = panel.querySelector('#panelHeader'); + let sx, sy, st, sr, drag = false; - header.onpointerdown = e => { drag = true; header.setPointerCapture(e.pointerId); sx = e.clientX; sy = e.clientY; const r = panel.getBoundingClientRect(); st = r.top; sr = window.innerWidth - r.right; }; - header.onpointermove = e => { if (!drag) return; panel.style.top = (st + e.clientY - sy) + 'px'; panel.style.right = (sr - (e.clientX - sx)) + 'px'; }; - header.onpointerup = e => { drag = false; header.releasePointerCapture(e.pointerId); GM_setValue(panelPosKey, { top: parseInt(panel.style.top, 10), right: parseInt(panel.style.right, 10) }); }; + + header.onpointerdown = e => { + drag = true; + header.setPointerCapture(e.pointerId); + + sx = e.clientX; + sy = e.clientY; + + const rect = panel.getBoundingClientRect(); + st = rect.top; + sr = window.innerWidth - rect.right; + }; + + header.onpointermove = e => { + if (!drag) return; + + panel.style.top = `${st + (e.clientY - sy)}px`; + panel.style.right = `${sr - (e.clientX - sx)}px`; + }; + + header.onpointerup = e => { + drag = false; + header.releasePointerCapture(e.pointerId); + + GM_setValue(panelPosKey, { + top: parseInt(panel.style.top, 10), + right: parseInt(panel.style.right, 10) + }); + }; } function applyMenuState() { const collapsed = GM_getValue(menuCollapsedKey, false); - document.querySelectorAll('#menuContentWrapper').forEach(w => w.style.display = collapsed ? 'none' : ''); + + document.querySelectorAll('#menuContentWrapper').forEach(w => { + w.style.display = collapsed ? 'none' : ''; + }); + document.querySelectorAll('#menuToggleHeader').forEach(h => { const icon = collapsed ? '▶' : '▼'; const text = collapsed ? 'Menu collapsed' : 'Navigation'; @@ -83,12 +173,29 @@ const header = document.createElement('div'); header.id = 'menuToggleHeader'; - header.style.cssText = `background:#1f1f1f;color:#ddd;padding:10px 12px;font-weight:bold;cursor:pointer;border-bottom:2px solid #333;display:flex;align-items:center;justify-content:space-between;user-select:none;`; + + header.style.cssText = ` + background:#1f1f1f; + color:#ddd; + padding:10px 12px; + font-weight:bold; + cursor:pointer; + border-bottom:2px solid #333; + display:flex; + align-items:center; + justify-content:space-between; + user-select:none; + `; + leftTd.insertBefore(header, leftTd.firstChild); const wrapper = document.createElement('div'); wrapper.id = 'menuContentWrapper'; - Array.from(leftTd.children).filter(el => el !== header).forEach(el => wrapper.appendChild(el)); + + Array.from(leftTd.children) + .filter(el => el !== header) + .forEach(el => wrapper.appendChild(el)); + leftTd.appendChild(wrapper); header.onclick = () => { @@ -96,96 +203,187 @@ applyMenuState(); }; }); + applyMenuState(); } function shouldHideByFilter(detailRow) { const cfg = getHideConfig(); + const sexIcon = detailRow.querySelector('.sex.iconSex'); - const hideGender = (cfg.women && sexIcon?.classList.contains('sexW')) || - (cfg.couples && sexIcon?.classList.contains('sexC')) || - (cfg.transsexuals && sexIcon?.classList.contains('sexS')); + + const hideGender = + (cfg.women && sexIcon?.classList.contains('sexW')) || + (cfg.couples && sexIcon?.classList.contains('sexC')) || + (cfg.transsexuals && sexIcon?.classList.contains('sexS')); + const flagDiv = detailRow.querySelector('div.country.iconCountry'); + let hideCountry = false; + if (flagDiv) { const style = flagDiv.getAttribute('style') || ''; - hideCountry = (cfg.germany && style.includes('/DE.gif')) || (cfg.belgium && style.includes('/BE.gif')); + + hideCountry = + (cfg.germany && style.includes('/DE.gif')) || + (cfg.belgium && style.includes('/BE.gif')) || + (cfg.spain && style.includes('/ES.gif')) || + (cfg.france && style.includes('/FR.gif')); } + return hideGender || hideCountry; } function getPicCount(titleRow) { const center = titleRow.querySelector('td > center'); + if (!center) return null; + const n = parseInt(center.textContent.trim(), 10); - return isNaN(n) ? null : n; + + return Number.isNaN(n) ? null : n; } function hideRow(titleRow, detailRow) { titleRow.style.display = 'none'; - if (detailRow) detailRow.style.display = 'none'; + + if (detailRow) { + detailRow.style.display = 'none'; + } } function hideAllGalleriesForUser(username) { document.querySelectorAll('div.avatar').forEach(avatar => { const link = avatar.querySelector('a.gal_title'); - if (!link || link.textContent.trim().toLowerCase() !== username) return; + + if (!link) return; + + if (link.textContent.trim().toLowerCase() !== username) return; + let detailRow = avatar; - while (detailRow && detailRow.tagName !== 'TR') detailRow = detailRow.parentElement; + + while (detailRow && detailRow.tagName !== 'TR') { + detailRow = detailRow.parentElement; + } + if (!detailRow) return; + const titleRow = detailRow.previousElementSibling; - if (titleRow?.tagName === 'TR') hideRow(titleRow, detailRow); + + if (titleRow?.tagName === 'TR') { + hideRow(titleRow, detailRow); + } }); } function processGallery(titleRow) { const detailRow = titleRow.nextElementSibling; + if (!detailRow || detailRow.getAttribute('valign') !== 'top') return; + const avatar = detailRow.querySelector('div.avatar'); const userLink = avatar?.querySelector('a.gal_title'); + if (!avatar || !userLink) return; + const username = userLink.textContent.trim().toLowerCase(); - if (hiddenUsers.has(username)) { hideRow(titleRow, detailRow); return; } + + if (hiddenUsers.has(username)) { + hideRow(titleRow, detailRow); + return; + } + const picCount = getPicCount(titleRow); - if (picCount !== null && picCount < 4) { hideRow(titleRow, detailRow); return; } - if (shouldHideByFilter(detailRow)) { hideRow(titleRow, detailRow); return; } + + if (picCount !== null && picCount < 4) { + hideRow(titleRow, detailRow); + return; + } + + if (shouldHideByFilter(detailRow)) { + hideRow(titleRow, detailRow); + return; + } + if (avatar.querySelector('.ifap-hide-btn')) return; + const btn = document.createElement('span'); + btn.className = 'ifap-hide-btn'; btn.textContent = '✖'; btn.title = `Block ${userLink.textContent.trim()} site-wide`; - btn.style.cssText = `position:absolute;top:4px;right:4px;width:24px;height:24px;background:rgba(255,0,0,.8);color:white;font-weight:bold;text-align:center;line-height:24px;border-radius:50%;cursor:pointer;z-index:9999;`; + + btn.style.cssText = ` + position:absolute; + top:4px; + right:4px; + width:24px; + height:24px; + background:rgba(255,0,0,.8); + color:white; + font-weight:bold; + text-align:center; + line-height:24px; + border-radius:50%; + cursor:pointer; + z-index:9999; + `; + avatar.style.position = 'relative'; avatar.appendChild(btn); + btn.onclick = e => { - e.preventDefault(); e.stopPropagation(); + e.preventDefault(); + e.stopPropagation(); + hiddenUsers.add(username); GM_setValue(hiddenUsersKey, [...hiddenUsers]); + + console.log(`[ImageFap Hider] User blocked: ${username}`); + hideAllGalleriesForUser(username); }; } function applyAll() { - createGenderPanel(); - setupMenuCollapser(); + try { + createGenderPanel(); + setupMenuCollapser(); - document.querySelectorAll('tr').forEach(tr => { - if (tr.querySelector('a[href*="gallery.php?gid="]') || tr.getAttribute('valign') === 'top' || - tr.hasAttribute('bgcolor') || tr.style.borderTop?.includes('dotted')) { - tr.style.display = ''; - } - }); + document.querySelectorAll('tr').forEach(tr => { + if ( + tr.querySelector('a[href*="gallery.php?gid="]') || + tr.getAttribute('valign') === 'top' || + tr.hasAttribute('bgcolor') || + tr.style.borderTop?.includes('dotted') + ) { + tr.style.display = ''; + } + }); - document.querySelectorAll('a[href*="gallery.php?gid="]').forEach(a => { - let titleRow = a; - while (titleRow && titleRow.tagName !== 'TR') titleRow = titleRow.parentElement; - if (titleRow) processGallery(titleRow); - }); + document.querySelectorAll('a[href*="gallery.php?gid="]').forEach(a => { + let titleRow = a; + + while (titleRow && titleRow.tagName !== 'TR') { + titleRow = titleRow.parentElement; + } + + if (titleRow) { + processGallery(titleRow); + } + }); + } catch (err) { + console.error('[ImageFap Hider] applyAll failed', err); + } } let applyTimeout = null; + const debouncedApplyAll = () => { - if (applyTimeout) clearTimeout(applyTimeout); + if (applyTimeout) { + clearTimeout(applyTimeout); + } + applyTimeout = setTimeout(applyAll, 150); }; @@ -195,5 +393,9 @@ debouncedApplyAll(); } - new MutationObserver(debouncedApplyAll).observe(document.body, { childList: true, subtree: true }); + new MutationObserver(debouncedApplyAll).observe(document.body, { + childList: true, + subtree: true + }); + })(); From 8035f0b486471688e80132231e633c3f47fff3c4 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Wed, 29 Apr 2026 14:54:07 +0000 Subject: [PATCH 02/65] Update ImageFap User Gallery Hider.md --- INFOS/ImageFap User Gallery Hider.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/INFOS/ImageFap User Gallery Hider.md b/INFOS/ImageFap User Gallery Hider.md index 6f31194..26c32b3 100644 --- a/INFOS/ImageFap User Gallery Hider.md +++ b/INFOS/ImageFap User Gallery Hider.md @@ -19,6 +19,9 @@ UPDATE 1.9: Now you can filter by user country. Germany is the worst offender, F UPDATE 2.0: Now the left categories menu is collapsible, meaning no more "empty space" when paginating the search results. UPDATE 2.1: Changed France to Belgium. I found that Belgium has worse users than France. Germany remains the worst offender. + +UPDATE 2.2: Added back France and added Spain. Europe seems to be derailing very hard. + ### USAGE: --------------- From 5b0665f7ed9cf784ef102e9398932438062e74b4 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Thu, 30 Apr 2026 14:10:28 +0000 Subject: [PATCH 03/65] Update NXBrew_Search_Button.user.js --- SFW/NXBrew_Search_Button.user.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SFW/NXBrew_Search_Button.user.js b/SFW/NXBrew_Search_Button.user.js index 096e25d..b8de65b 100644 --- a/SFW/NXBrew_Search_Button.user.js +++ b/SFW/NXBrew_Search_Button.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name NXBrew Search Button // @namespace NXBrew_Search_Button -// @version 1.0 +// @version 1.1 // @description Adds SEARCH ON NXBREW button on each game card on Nintendo game catalog. // @author masterofobzene // @match https://www.nintendo.com/us/store/games/* @@ -31,7 +31,7 @@ if (!name) return; - const url = `https://nxbrew.net/?s=${encodeURIComponent(name)}`; + const url = `https://nxbrew.me/?s=${encodeURIComponent(name)}`; const btn = document.createElement('a'); btn.href = url; From 8034569c6fd5ddb85e85c313b2dabb21d2806a0d Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Thu, 30 Apr 2026 14:13:59 +0000 Subject: [PATCH 04/65] Update NXBrew_Search_Button.user.js --- SFW/NXBrew_Search_Button.user.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/SFW/NXBrew_Search_Button.user.js b/SFW/NXBrew_Search_Button.user.js index b8de65b..71e1e37 100644 --- a/SFW/NXBrew_Search_Button.user.js +++ b/SFW/NXBrew_Search_Button.user.js @@ -26,7 +26,9 @@ console.log('[NXBrew] Game found:', name); name = name - .replace(/\s*(Nintendo Switch|™|®|Switch 2|\(Switch\)|Edition|Deluxe|DLC|Bundle|\+.*|–.*)$/gi, '') + .replace(/[™®]/g, '') + .replace(/\s*(Nintendo Switch|Switch 2|\(Switch\)|Edition|Deluxe|DLC|Bundle|\+.*|–.*)$/gi, '') + .replace(/\s{2,}/g, ' ') .trim(); if (!name) return; From 86df92a60ce55e6aba805bce5de7cc927bf3e942 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Thu, 30 Apr 2026 14:14:07 +0000 Subject: [PATCH 05/65] Update NXBrew_Search_Button.user.js --- SFW/NXBrew_Search_Button.user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SFW/NXBrew_Search_Button.user.js b/SFW/NXBrew_Search_Button.user.js index 71e1e37..aa335b2 100644 --- a/SFW/NXBrew_Search_Button.user.js +++ b/SFW/NXBrew_Search_Button.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name NXBrew Search Button // @namespace NXBrew_Search_Button -// @version 1.1 +// @version 1.2 // @description Adds SEARCH ON NXBREW button on each game card on Nintendo game catalog. // @author masterofobzene // @match https://www.nintendo.com/us/store/games/* From 61270b80642fc9d297f1d91b2af82010d5284800 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Thu, 30 Apr 2026 14:17:21 +0000 Subject: [PATCH 06/65] Update NXBrew_Search_Button.md --- INFOS/NXBrew_Search_Button.md | 1 + 1 file changed, 1 insertion(+) diff --git a/INFOS/NXBrew_Search_Button.md b/INFOS/NXBrew_Search_Button.md index 8c318ff..64796a7 100644 --- a/INFOS/NXBrew_Search_Button.md +++ b/INFOS/NXBrew_Search_Button.md @@ -6,6 +6,7 @@ Lazy game discovery and acquisition on NXBrew, using Nintendo's store as a catal --------------- On each game card, you will have 1 big red button to search the game name on NXBrew. +UPDATE 1.2: Fixed new NXBREW domain. Now the script removes any "™" that would break the search. ### WHY?: --------------- From 653f55c8ba75bb1e6bd3521d4d24ed6f1d90fc58 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Thu, 30 Apr 2026 14:17:49 +0000 Subject: [PATCH 07/65] Update NXBrew_Search_Button.md --- INFOS/NXBrew_Search_Button.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INFOS/NXBrew_Search_Button.md b/INFOS/NXBrew_Search_Button.md index 64796a7..728d502 100644 --- a/INFOS/NXBrew_Search_Button.md +++ b/INFOS/NXBrew_Search_Button.md @@ -6,7 +6,7 @@ Lazy game discovery and acquisition on NXBrew, using Nintendo's store as a catal --------------- On each game card, you will have 1 big red button to search the game name on NXBrew. -UPDATE 1.2: Fixed new NXBREW domain. Now the script removes any "™" that would break the search. +UPDATE 1.2: Fixed new nxbrew.me domain. Now the script removes any "™" that would break the search. ### WHY?: --------------- From cdf1788747bd997f79f86772e7f3cfc44b8e6e2d Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Thu, 30 Apr 2026 14:56:24 +0000 Subject: [PATCH 08/65] Update NXBrew_Search_Button.user.js --- SFW/NXBrew_Search_Button.user.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SFW/NXBrew_Search_Button.user.js b/SFW/NXBrew_Search_Button.user.js index aa335b2..9289570 100644 --- a/SFW/NXBrew_Search_Button.user.js +++ b/SFW/NXBrew_Search_Button.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name NXBrew Search Button // @namespace NXBrew_Search_Button -// @version 1.2 +// @version 1.3 // @description Adds SEARCH ON NXBREW button on each game card on Nintendo game catalog. // @author masterofobzene // @match https://www.nintendo.com/us/store/games/* @@ -33,7 +33,7 @@ if (!name) return; - const url = `https://nxbrew.me/?s=${encodeURIComponent(name)}`; + const url = `https://nxbrew.net/?s=${encodeURIComponent(name)}`; const btn = document.createElement('a'); btn.href = url; From 5de2ebae096ebc03d1b5d899580ca47ce6458b92 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Thu, 30 Apr 2026 14:57:21 +0000 Subject: [PATCH 09/65] Update NXBrew_Search_Button.md --- INFOS/NXBrew_Search_Button.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/INFOS/NXBrew_Search_Button.md b/INFOS/NXBrew_Search_Button.md index 728d502..30e141b 100644 --- a/INFOS/NXBrew_Search_Button.md +++ b/INFOS/NXBrew_Search_Button.md @@ -7,6 +7,8 @@ Lazy game discovery and acquisition on NXBrew, using Nintendo's store as a catal On each game card, you will have 1 big red button to search the game name on NXBrew. UPDATE 1.2: Fixed new nxbrew.me domain. Now the script removes any "™" that would break the search. +UPDATE 1.3: ROLLBACK!! as nxbrew.me is a FAKE MALWARE DOMAIN. DO NOT USE IT. + ### WHY?: --------------- From c3c43f784a2f3e1453afca6d2ca246a4f688c829 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Thu, 30 Apr 2026 14:57:31 +0000 Subject: [PATCH 10/65] Update NXBrew_Search_Button.md --- INFOS/NXBrew_Search_Button.md | 1 + 1 file changed, 1 insertion(+) diff --git a/INFOS/NXBrew_Search_Button.md b/INFOS/NXBrew_Search_Button.md index 30e141b..c7efb9a 100644 --- a/INFOS/NXBrew_Search_Button.md +++ b/INFOS/NXBrew_Search_Button.md @@ -7,6 +7,7 @@ Lazy game discovery and acquisition on NXBrew, using Nintendo's store as a catal On each game card, you will have 1 big red button to search the game name on NXBrew. UPDATE 1.2: Fixed new nxbrew.me domain. Now the script removes any "™" that would break the search. + UPDATE 1.3: ROLLBACK!! as nxbrew.me is a FAKE MALWARE DOMAIN. DO NOT USE IT. From 7f62be38e7eed1dfb28b56dd279ca0990d7afc46 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Thu, 30 Apr 2026 14:57:54 +0000 Subject: [PATCH 11/65] Update NXBrew_Search_Button.md --- INFOS/NXBrew_Search_Button.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INFOS/NXBrew_Search_Button.md b/INFOS/NXBrew_Search_Button.md index c7efb9a..c9d600a 100644 --- a/INFOS/NXBrew_Search_Button.md +++ b/INFOS/NXBrew_Search_Button.md @@ -6,7 +6,7 @@ Lazy game discovery and acquisition on NXBrew, using Nintendo's store as a catal --------------- On each game card, you will have 1 big red button to search the game name on NXBrew. -UPDATE 1.2: Fixed new nxbrew.me domain. Now the script removes any "™" that would break the search. +UPDATE 1.2: ~Fixed new nxbrew.me domain.~ Now the script removes any "™" that would break the search. UPDATE 1.3: ROLLBACK!! as nxbrew.me is a FAKE MALWARE DOMAIN. DO NOT USE IT. From d53ae7e30219db92da1e19eb15f1b6e0678faceb Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Thu, 30 Apr 2026 15:21:50 +0000 Subject: [PATCH 12/65] Update NXBrew_Search_Button.user.js --- SFW/NXBrew_Search_Button.user.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/SFW/NXBrew_Search_Button.user.js b/SFW/NXBrew_Search_Button.user.js index 9289570..896d3b3 100644 --- a/SFW/NXBrew_Search_Button.user.js +++ b/SFW/NXBrew_Search_Button.user.js @@ -1,8 +1,8 @@ // ==UserScript== -// @name NXBrew Search Button -// @namespace NXBrew_Search_Button -// @version 1.3 -// @description Adds SEARCH ON NXBREW button on each game card on Nintendo game catalog. +// @name NSWPEDIA Search Button +// @namespace NSWPEDIA_Search_Button +// @version 1.4 +// @description Adds SEARCH ON NSWPEDIA button on each game card on Nintendo game catalog. // @author masterofobzene // @match https://www.nintendo.com/us/store/games/* // @license GNU GPLv3 @@ -23,7 +23,7 @@ let name = link.getAttribute('aria-label'); if (!name) return; - console.log('[NXBrew] Game found:', name); + console.log('[NSWPEDIA] Game found:', name); name = name .replace(/[™®]/g, '') @@ -33,13 +33,13 @@ if (!name) return; - const url = `https://nxbrew.net/?s=${encodeURIComponent(name)}`; + const url = `https://nswpedia.com/?s=${encodeURIComponent(name)}`; const btn = document.createElement('a'); btn.href = url; btn.target = "_blank"; btn.rel = "noopener noreferrer"; - btn.textContent = "SEARCH ON NXBREW"; + btn.textContent = "SEARCH ON NSWPEDIA"; btn.style.cssText = ` display: block !important; margin: 12px auto 8px !important; From b91ff26dcc35ebc9abc207145b78869d22f0ddd6 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Thu, 30 Apr 2026 15:25:03 +0000 Subject: [PATCH 13/65] Update NXBrew_Search_Button.md --- INFOS/NXBrew_Search_Button.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/INFOS/NXBrew_Search_Button.md b/INFOS/NXBrew_Search_Button.md index c9d600a..6e4205b 100644 --- a/INFOS/NXBrew_Search_Button.md +++ b/INFOS/NXBrew_Search_Button.md @@ -1,21 +1,24 @@ ### USE CASE: -------------- -Lazy game discovery and acquisition on NXBrew, using Nintendo's store as a catalog. +Lazy game discovery and acquisition on ~NXBrew~ NSWPEDIA, using Nintendo's store as a catalog. ### USAGE: --------------- -On each game card, you will have 1 big red button to search the game name on NXBrew. +On each game card, you will have 1 big red button to search the game name on ~NXBrew~ NSWPEDIA. UPDATE 1.2: ~Fixed new nxbrew.me domain.~ Now the script removes any "™" that would break the search. UPDATE 1.3: ROLLBACK!! as nxbrew.me is a FAKE MALWARE DOMAIN. DO NOT USE IT. +UPDATE 1.4: Since nxbrew.net is hacked and nxbrew.me IS A MALWARE SITE, I've moved to NSWPEDIA which also hosts +games in a similar way. For the time being, the script will still be called "NXBrew Search Button" internally to avoid +problems when updating, otherwise I would have to remove it and make users install a new extension. ### WHY?: --------------- As with Steam and GOG too, it is way better to use Nintendo's store as a catalog to search for new games to download from clean sites later, having filtering options to avoid the wave of trash -games that appear in NXBrew that has no filtering options. +games that appear in ~NXBrew~ NSWPEDIA that has no filtering options. --------------- From a2e09020f48657f6f0f9fee057c5cec886d73b4b Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Thu, 30 Apr 2026 15:27:32 +0000 Subject: [PATCH 14/65] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a134b4f..caec544 100644 --- a/README.md +++ b/README.md @@ -107,9 +107,10 @@ above if you see prices in other currency. ----------- -[NXBrew Search Button](https://github.com/masterofobzene/UserScriptRepo/raw/refs/heads/main/SFW/NXBrew_Search_Button.user.js) Shows a new button to search for the game on NXBrew so you can use the Big N's catalog to browse for games. +[nswpedia Search Button](https://github.com/masterofobzene/UserScriptRepo/raw/refs/heads/main/SFW/NXBrew_Search_Button.user.js) Shows a new button to search for the game on ~NXBrew~ nswpedia so you can use the Big N's catalog to browse for games. + +MpzbL14VKC - [DESCRIPTION](https://github.com/masterofobzene/UserScriptRepo/blob/main/INFOS/NXBrew_Search_Button.md) From 8002a3b3ff0040f778a564835db3023931ff4b25 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Thu, 30 Apr 2026 15:33:39 +0000 Subject: [PATCH 15/65] Update README.md --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index caec544..d47a8e0 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ above if you see prices in other currency. [nswpedia Search Button](https://github.com/masterofobzene/UserScriptRepo/raw/refs/heads/main/SFW/NXBrew_Search_Button.user.js) Shows a new button to search for the game on ~NXBrew~ nswpedia so you can use the Big N's catalog to browse for games. -MpzbL14VKC +MpzbL14VKC @@ -119,7 +119,7 @@ above if you see prices in other currency. [Stable Diffusion FORGE quick access buttons](https://github.com/masterofobzene/UserScriptRepo/raw/refs/heads/main/SFW/SDForge.user.js) Shows a copy of the most used buttons: "generate", "Reuse seed", "random seed", "save image" and "hires.fix" toggle. Also it has a box showing the current seed (mostly for knowing if you are on -1 or reusing). Mind that the 📌 instead of ♻ icons are because I modded them, not part of this script. - + [DESCRIPTION](https://github.com/masterofobzene/UserScriptRepo/blob/main/INFOS/SDForge.md) @@ -127,7 +127,7 @@ above if you see prices in other currency. [Youtube Music controls always visible](https://github.com/masterofobzene/UserScriptRepo/raw/refs/heads/main/SFW/YT_Music_Controls.user.js) Shows volume, shuffle and repeat always without having to hover on the arrow. Also removed the arrow. -FhsNpBQ1lW +FhsNpBQ1lW [DESCRIPTION](https://github.com/masterofobzene/UserScriptRepo/blob/main/INFOS/YT_Music_Controls.md) @@ -135,7 +135,7 @@ above if you see prices in other currency. [Steam Block Games](https://github.com/masterofobzene/UserScriptRepo/raw/refs/heads/main/SFW/Steam_Block_Games.user.js) Shows a "Block" button on each game card on steam to stop seeing trash games that have your desired tags. Control given back to you. -ID9CSDOuzf +ID9CSDOuzf [DESCRIPTION](https://github.com/masterofobzene/UserScriptRepo/blob/main/INFOS/Steam_Search_Block_Games.md) @@ -143,7 +143,7 @@ above if you see prices in other currency. [Steam Dumb Comment Remover](https://github.com/masterofobzene/UserScriptRepo/raw/refs/heads/main/SFW/Steam_dumb_comment_remover.user.js) Shows two buttons on the bottom to match phrases and optionally replace the comment with custom messages. More like a joke but can be useful sometimes. "I REALLY WANTED TO LOVE THIS DESCRIPTION BUT..." -OKCtj4GgKS +OKCtj4GgKS @@ -153,7 +153,7 @@ above if you see prices in other currency. [DeepSeek auto collapse thinking](https://github.com/masterofobzene/UserScriptRepo/raw/refs/heads/main/SFW/DeepSeek_Auto_Collapse_Thinking.user.js) Collapses the thinking cluster automatically for every answer. -37YvtBU3LC +37YvtBU3LC From 584416710617f9202c3778181e7b229da5f3b3c9 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Wed, 20 May 2026 14:00:14 +0000 Subject: [PATCH 16/65] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d47a8e0..727d028 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Supports: ## INSTALL INDEX You must have violentmonkey, tampermonkey or another script manager for these to work. -Click on the script name to install it. All scripts here were made for Firefox/Librewolf. +Click on the script name to install it. All scripts here were made for Firefox/Librewolf but you can try them on Chrome and see if they work. ### SFW ----------- From 31f463836702e84442f76698701d81647b364642 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Wed, 20 May 2026 14:00:34 +0000 Subject: [PATCH 17/65] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 727d028..cdcae5c 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Supports: ## INSTALL INDEX You must have violentmonkey, tampermonkey or another script manager for these to work. -Click on the script name to install it. All scripts here were made for Firefox/Librewolf but you can try them on Chrome and see if they work. +Click on the script name to install it. All scripts here were made for Firefox/Librewolf but you can try them on Chrome/Brave and see if they work. ### SFW ----------- From 64067a73fa55dacb2116dfb7ff0c5fdf4daabf07 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Wed, 20 May 2026 14:09:32 +0000 Subject: [PATCH 18/65] Update Steam Search: Hide Games Under Minimum Price.md --- INFOS/Steam Search: Hide Games Under Minimum Price.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INFOS/Steam Search: Hide Games Under Minimum Price.md b/INFOS/Steam Search: Hide Games Under Minimum Price.md index 025735b..ab4c074 100644 --- a/INFOS/Steam Search: Hide Games Under Minimum Price.md +++ b/INFOS/Steam Search: Hide Games Under Minimum Price.md @@ -32,7 +32,7 @@ I created the [long-waited MINIMUM PRICE filter](https://www.reddit.com/r/Steam/ functionalities, I added further filters by using the reviews system. If you are thinking "why don't you simply use steamdb?" I answer you: steamdb has a hard-limit on tags you can filter, meaning it is also useless. -Enjoy browsing a clean, completely filtrable Steam catalog now! +Enjoy browsing a clean, completely filterable Steam catalog now! --------------- [INSTALL LINK](https://github.com/masterofobzene/UserScriptRepo/raw/main/SFW/--Steam%20Search-%20Hide%20Games%20Under%20Minimum%20Price--.user.js) From 7b57fd3edbb6966ac5838e9c1829aba65dcd8edb Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Wed, 20 May 2026 14:31:35 +0000 Subject: [PATCH 19/65] Update ImageFap User Gallery Hider.md --- INFOS/ImageFap User Gallery Hider.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INFOS/ImageFap User Gallery Hider.md b/INFOS/ImageFap User Gallery Hider.md index 26c32b3..95c8ab5 100644 --- a/INFOS/ImageFap User Gallery Hider.md +++ b/INFOS/ImageFap User Gallery Hider.md @@ -5,7 +5,7 @@ in the main gallery search results. A red "X" button will appear on the users av from you view forever. If you want to restore users open the code view of the userscript, then go to "values" and remove them (keep the format and commas). It is persistent so you don't have to do this each time you visit the site. To put it clear, the sense in doing this is because you are effectively removing users from your sight site-wide so even -if they uploaded more stuff on the site before or after, you will not see them again and all in one click! +if they uploaded more stuff, you will not see them again and all in one click! UPDATE: It will also hide galleries with less than 4 pictures in them automatically. From b9c0dfa861daf3d80faae14a756292049b1990ce Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Wed, 20 May 2026 14:38:14 +0000 Subject: [PATCH 20/65] Update ImageFap User Gallery Hider.md --- INFOS/ImageFap User Gallery Hider.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/INFOS/ImageFap User Gallery Hider.md b/INFOS/ImageFap User Gallery Hider.md index 95c8ab5..5aa5d2c 100644 --- a/INFOS/ImageFap User Gallery Hider.md +++ b/INFOS/ImageFap User Gallery Hider.md @@ -25,16 +25,18 @@ UPDATE 2.2: Added back France and added Spain. Europe seems to be derailing very ### USAGE: --------------- -Just click the red X button on the avatar of the offender. After applying to a user or many in the page. -All instances (past and future) will not appear anymore in your searches. +Just click the red X button on the avatar of the offender. +All content of the user (past and future) will not appear anymore in your searches. You can also collapse or extend the left categories menu. ### WHY?: --------------- That site is a dump filled with weirdos trying to somehow convince people to become gay. The site doesn't offer -any blocking features only if you sign you get some filtering by tags, but the weirdos don't use tags or use -false ones to get exposition. The site doesn't mind that, it seems. So here is your tool to clean it. LGBT my ass, gender +any blocking features only if you sign in, you get some filtering by tags but the weirdos don't use tags or use +false ones to get exposition and the tags you can filter in the options are limited in numbers + the site loves +profiling users. +The site doesn't mind that. So here is your tool to clean it. LGBT my ass, gender dysphoria is not a virtue, nor normal. --------------- From 84a2eb08aafd5289caf64cec3087de9fa6fa7ce4 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Thu, 21 May 2026 15:39:51 +0000 Subject: [PATCH 21/65] Create Pornolab_Post_Preview.user.js --- NSFW/Pornolab_Post_Preview.user.js | 417 +++++++++++++++++++++++++++++ 1 file changed, 417 insertions(+) create mode 100644 NSFW/Pornolab_Post_Preview.user.js diff --git a/NSFW/Pornolab_Post_Preview.user.js b/NSFW/Pornolab_Post_Preview.user.js new file mode 100644 index 0000000..853d41c --- /dev/null +++ b/NSFW/Pornolab_Post_Preview.user.js @@ -0,0 +1,417 @@ +// ==UserScript== +// @name Pornolab Post Preview +// @namespace PornolabPreview +// @version 1.0 +// @description Shows first real post image when hovering topic links +// @author masterofobzene +// @match *://pornolab.net/forum/* +// @grant GM_xmlhttpRequest +// @grant GM_addStyle +// @connect * +// @run-at document-idle +// @icon https://pornolab.net/favicon.ico +// @downloadURL https://github.com/masterofobzene/UserScriptRepo/raw/main/NSFW/Pornolab_Post_Preview.user.js +// @updateURL https://github.com/masterofobzene/UserScriptRepo/raw/main/NSFW/Pornolab_Post_Preview.user.js +// ==/UserScript== + +(() => { + 'use strict'; + + console.log('[HoverPreview] Initialized'); + + const CACHE = new Map(); + const REQUESTS = new Map(); + + const POPUP_WIDTH = 480; + const POPUP_HEIGHT = 360; + const HOVER_DELAY = 250; + + let hoverTimer = null; + let currentAnchor = null; + + GM_addStyle(` + #vm-hover-preview { + position: fixed; + z-index: 999999; + display: none; + width: ${POPUP_WIDTH}px; + background: rgba(20,20,20,0.97); + border: 1px solid #555; + border-radius: 8px; + box-shadow: 0 8px 30px rgba(0,0,0,0.7); + overflow: hidden; + padding: 8px; + pointer-events: none; + } + + #vm-hover-preview img { + width: 100%; + height: auto; + max-height: ${POPUP_HEIGHT}px; + object-fit: contain; + display: block; + border-radius: 4px; + } + + #vm-hover-preview .vm-msg { + color: #ddd; + font-family: sans-serif; + font-size: 14px; + text-align: center; + padding: 30px 10px; + } + `); + + const popup = document.createElement('div'); + + popup.id = 'vm-hover-preview'; + + document.body.appendChild(popup); + + function isTopicLink(anchor) { + if (!anchor?.href) { + return false; + } + + try { + const url = new URL(anchor.href); + + return ( + url.pathname.includes('/forum/viewtopic.php') && + url.searchParams.has('t') + ); + } catch { + return false; + } + } + + function showMessage(message, event) { + popup.innerHTML = `
${message}
`; + popup.style.display = 'block'; + + if (event) { + positionPopup(event); + } + } + + function hidePopup() { + popup.style.display = 'none'; + popup.innerHTML = ''; + } + + function positionPopup(event) { + const margin = 20; + + let left = event.clientX + margin; + let top = event.clientY + margin; + + if (left + POPUP_WIDTH > window.innerWidth) { + left = event.clientX - POPUP_WIDTH - margin; + } + + if (top + POPUP_HEIGHT > window.innerHeight) { + top = window.innerHeight - POPUP_HEIGHT - margin; + } + + popup.style.left = `${Math.max(10, left)}px`; + popup.style.top = `${Math.max(10, top)}px`; + } + + function normalizeUrl(url, base) { + try { + return new URL(url, base).href; + } catch { + return null; + } + } + + function extractFirstImage(html, pageUrl) { + try { + const parser = new DOMParser(); + + const doc = parser.parseFromString(html, 'text/html'); + + /* + REAL PORNOLAB STRUCTURE: + + + + + Source verified from post-source.txt + */ + + const vars = [ + ...doc.querySelectorAll('var.postImg') + ]; + + console.log( + '[HoverPreview] postImg count:', + vars.length + ); + + for (const node of vars) { + const title = node.getAttribute('title'); + + if (!title) { + continue; + } + + const imageUrl = normalizeUrl(title, pageUrl); + + if (!imageUrl) { + continue; + } + + const lower = imageUrl.toLowerCase(); + + // Ignore ads/logos/etc + if ( + lower.includes('logo') || + lower.includes('banner') || + lower.includes('avatar') || + lower.includes('ads') || + lower.includes('smile') || + lower.includes('static.pornolab') + ) { + continue; + } + + console.log( + '[HoverPreview] Selected post image:', + imageUrl + ); + + return imageUrl; + } + + console.warn('[HoverPreview] No postImg found'); + + return null; + } catch (err) { + console.error( + '[HoverPreview] Failed extracting image:', + err + ); + + return null; + } + } + + async function fetchTopicImage(url) { + if (CACHE.has(url)) { + return CACHE.get(url); + } + + if (REQUESTS.has(url)) { + return REQUESTS.get(url); + } + + const promise = new Promise((resolve, reject) => { + console.log('[HoverPreview] Fetching topic:', url); + + GM_xmlhttpRequest({ + method: 'GET', + url, + anonymous: false, + timeout: 15000, + + headers: { + Referer: location.href + }, + + onload: response => { + try { + if (response.status !== 200) { + reject( + new Error( + `HTTP ${response.status}` + ) + ); + + return; + } + + const imageUrl = extractFirstImage( + response.responseText, + url + ); + + CACHE.set(url, imageUrl); + + resolve(imageUrl); + } catch (err) { + reject(err); + } finally { + REQUESTS.delete(url); + } + }, + + onerror: err => { + REQUESTS.delete(url); + + reject(err); + }, + + ontimeout: () => { + REQUESTS.delete(url); + + reject(new Error('Timeout')); + } + }); + }); + + REQUESTS.set(url, promise); + + return promise; + } + + async function fetchImageBlob(url) { + return new Promise((resolve, reject) => { + console.log('[HoverPreview] Fetching image:', url); + + GM_xmlhttpRequest({ + method: 'GET', + url, + responseType: 'blob', + anonymous: false, + timeout: 15000, + + headers: { + Referer: location.href + }, + + onload: response => { + try { + if (response.status !== 200) { + reject( + new Error( + `Image HTTP ${response.status}` + ) + ); + + return; + } + + const blobUrl = URL.createObjectURL( + response.response + ); + + resolve(blobUrl); + } catch (err) { + reject(err); + } + }, + + onerror: reject, + + ontimeout: () => { + reject(new Error('Image timeout')); + } + }); + }); + } + + async function handleHover(anchor, event) { + try { + const topicUrl = anchor.href; + + showMessage('Loading preview...', event); + + const imageUrl = await fetchTopicImage(topicUrl); + + if (currentAnchor !== anchor) { + return; + } + + if (!imageUrl) { + showMessage('No image found', event); + + return; + } + + const blobUrl = await fetchImageBlob(imageUrl); + + if (currentAnchor !== anchor) { + URL.revokeObjectURL(blobUrl); + + return; + } + + popup.innerHTML = ''; + + const img = document.createElement('img'); + + img.onload = () => { + console.log('[HoverPreview] Image displayed'); + }; + + img.onerror = err => { + console.error( + '[HoverPreview] Failed displaying image:', + err + ); + + showMessage('Failed displaying image', event); + }; + + img.src = blobUrl; + + popup.appendChild(img); + + popup.style.display = 'block'; + + positionPopup(event); + } catch (err) { + console.error('[HoverPreview] Hover failed:', err); + + showMessage('Failed loading image', event); + } + } + + document.addEventListener('mouseover', event => { + const anchor = event.target.closest('a'); + + if (!isTopicLink(anchor)) { + return; + } + + currentAnchor = anchor; + + clearTimeout(hoverTimer); + + hoverTimer = setTimeout(() => { + handleHover(anchor, event); + }, HOVER_DELAY); + }); + + document.addEventListener('mousemove', event => { + if (popup.style.display === 'block') { + positionPopup(event); + } + }); + + document.addEventListener('mouseout', event => { + const anchor = event.target.closest('a'); + + if (!anchor || anchor !== currentAnchor) { + return; + } + + clearTimeout(hoverTimer); + + currentAnchor = null; + + hidePopup(); + }); + + window.addEventListener( + 'scroll', + () => { + hidePopup(); + }, + { passive: true } + ); + + console.log('[HoverPreview] Ready'); +})(); From 57b4b32f3b4fd2a5d93213a3e9ba8a3f50e65fbb Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Thu, 21 May 2026 15:42:45 +0000 Subject: [PATCH 22/65] Create Pornolab_Post_Preview.md --- INFOS/Pornolab_Post_Preview.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 INFOS/Pornolab_Post_Preview.md diff --git a/INFOS/Pornolab_Post_Preview.md b/INFOS/Pornolab_Post_Preview.md new file mode 100644 index 0000000..3c2f59c --- /dev/null +++ b/INFOS/Pornolab_Post_Preview.md @@ -0,0 +1,23 @@ +### USE CASE: +-------------- +Lets you see the first post image in a medium sized window pop up while you are hovering the links of the posts. +This makes it easier to check what is inside without having to click each link. + +### USAGE: +--------------- +Just hover the mouse over the post link. + + +### WHY?: +--------------- +Lazy discovery of content. + + + +--------------- +[INSTALL LINK](https://github.com/masterofobzene/UserScriptRepo/raw/main/NSFW/Pornolab_Post_Preview.user.js) +You must have violentmonkey installed for this to work. + + + + From 287dd93e00cd3792a83de664751ad3c39cc05a4d Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Thu, 21 May 2026 15:45:08 +0000 Subject: [PATCH 23/65] Update README.md --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index cdcae5c..f1e116c 100644 --- a/README.md +++ b/README.md @@ -239,6 +239,14 @@ NO it doesn't do what you are thinking. [DESCRIPTION](https://github.com/masterofobzene/UserScriptRepo/blob/main/INFOS/Heavy-R_Tag_Hider.md) +----------- + +[Pornolab post preview](https://github.com/masterofobzene/UserScriptRepo/raw/main/NSFW/Pornolab_Post_Preview.user.js +) Shows the first post image in a dynamic popup while hovering on a post link, so you can preview the contents without having to click the link. + +[DESCRIPTION](https://github.com/masterofobzene/UserScriptRepo/blob/main/INFOS/Pornolab_Post_Preview.md) + +


From 466759f89d4ba94f747468ca50abf1a204e6ae84 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Sun, 24 May 2026 21:47:32 +0000 Subject: [PATCH 24/65] Update README.md --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f1e116c..04bfcac 100644 --- a/README.md +++ b/README.md @@ -264,10 +264,18 @@ Description: Select text -> right click -> "search this" -> searches those words +
+
+
+
+-------------------------- - +> [!TIP] +> - azRggiVKee – This button is **not** for installing anything. +> - g41eGfc03s – This button is to show that you **like** this repo. +> - fIVz9FY5CQ – This button is to **get spam** every time I modify something. From 2409ea35b8651fdc5763a9ff08f2957117e03446 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Thu, 28 May 2026 16:50:25 +0000 Subject: [PATCH 25/65] Update Steam_Block_Games.user.js updated matching pattern --- SFW/Steam_Block_Games.user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SFW/Steam_Block_Games.user.js b/SFW/Steam_Block_Games.user.js index 00a6f25..34b8cce 100644 --- a/SFW/Steam_Block_Games.user.js +++ b/SFW/Steam_Block_Games.user.js @@ -4,7 +4,7 @@ // @version 1.1 // @author masterofobzene // @description Block button to hide individual games. -// @match https://store.steampowered.com/search/* +// @match https://store.steampowered.com/search* // @grant GM_getValue // @grant GM_setValue // @grant GM_registerMenuCommand From fc71a249554b4df7a5e3d1d5bbff8b1669eaffc2 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Thu, 28 May 2026 16:50:35 +0000 Subject: [PATCH 26/65] Update Steam_Block_Games.user.js --- SFW/Steam_Block_Games.user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SFW/Steam_Block_Games.user.js b/SFW/Steam_Block_Games.user.js index 34b8cce..55ee769 100644 --- a/SFW/Steam_Block_Games.user.js +++ b/SFW/Steam_Block_Games.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name Steam Search Block Games // @namespace Steam_Search_Block_Games -// @version 1.1 +// @version 1.2 // @author masterofobzene // @description Block button to hide individual games. // @match https://store.steampowered.com/search* From f153767a1b9e265413833b8942242d4a76b1ce05 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Mon, 8 Jun 2026 17:34:48 +0000 Subject: [PATCH 27/65] Create deepseek-concise.user.js --- SFW/deepseek-concise.user.js | 178 +++++++++++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 SFW/deepseek-concise.user.js diff --git a/SFW/deepseek-concise.user.js b/SFW/deepseek-concise.user.js new file mode 100644 index 0000000..a8fc653 --- /dev/null +++ b/SFW/deepseek-concise.user.js @@ -0,0 +1,178 @@ +// ==UserScript== +// @name DeepSeek Be Concise +// @namespace DeepSeek_Be_Concise +// @version 1.0 +// @description Appends "be concise" to the prompt before sending and provides an enable/disable toggle. +// @author masterofobzene +// @match *://*.deepseek.com/* +// @grant GM_getValue +// @grant GM_setValue +// @run-at document-idle +// @license GNU GPLv3 +// @icon https://deepseek.com/favicon.ico +// @downloadURL https://github.com/masterofobzene/UserScriptRepo/raw/main/SFW/deepseek-concise.user.js +// @updateURL https://github.com/masterofobzene/UserScriptRepo/raw/main/SFW/deepseek-concise.user.js +// ==/UserScript== + +(() => { + 'use strict'; + + console.log('[Be Concise] Script loaded'); + + let enabled = GM_getValue('beConciseEnabled', true); + const SUFFIX = ' be concise'; + + function appendSuffixToInput() { + try { + if (!enabled) { + return; + } + + const input = + document.querySelector('textarea') || + document.querySelector('[contenteditable="true"]'); + + if (!input) { + console.warn('[Be Concise] Input not found'); + return; + } + + const currentText = + input instanceof HTMLTextAreaElement + ? input.value + : input.textContent || ''; + + if (!currentText.trim()) { + return; + } + + if (currentText.endsWith(SUFFIX)) { + return; + } + + const newText = currentText + SUFFIX; + + if (input instanceof HTMLTextAreaElement) { + const descriptor = Object.getOwnPropertyDescriptor( + HTMLTextAreaElement.prototype, + 'value' + ); + + if (descriptor?.set) { + descriptor.set.call(input, newText); + } else { + input.value = newText; + } + } else { + input.textContent = newText; + } + + input.dispatchEvent( + new InputEvent('input', { + bubbles: true, + cancelable: true + }) + ); + + input.dispatchEvent( + new Event('change', { + bubbles: true + }) + ); + + console.log('[Be Concise] Prompt modified'); + } catch (error) { + console.error('[Be Concise]', error); + } + } + + document.addEventListener( + 'keydown', + event => { + try { + if (!enabled) { + return; + } + + if (event.key !== 'Enter') { + return; + } + + if (event.shiftKey || event.ctrlKey || event.altKey || event.metaKey) { + return; + } + + appendSuffixToInput(); + } catch (error) { + console.error('[Be Concise]', error); + } + }, + true + ); + + function createToggle() { + try { + if (!document.body) { + setTimeout(createToggle, 500); + return; + } + + if (document.getElementById('be-concise-toggle')) { + return; + } + + const container = document.createElement('div'); + container.id = 'be-concise-toggle'; + + Object.assign(container.style, { + position: 'fixed', + top: '10px', + right: '10px', + zIndex: '2147483647', + background: 'rgba(255,255,255,0.95)', + border: '1px solid #ccc', + borderRadius: '8px', + padding: '8px 12px', + boxShadow: '0 2px 10px rgba(0,0,0,0.15)', + fontFamily: 'system-ui, sans-serif', + fontSize: '13px', + color: '#000' + }); + + container.innerHTML = ` + + `; + + document.body.appendChild(container); + + const checkbox = container.querySelector('#be-concise-checkbox'); + + checkbox.addEventListener('change', event => { + enabled = event.target.checked; + GM_setValue('beConciseEnabled', enabled); + + console.log('[Be Concise] Enabled:', enabled); + }); + + console.log('[Be Concise] Toggle added'); + } catch (error) { + console.error('[Be Concise]', error); + } + } + + createToggle(); + + const observer = new MutationObserver(() => { + if (!document.getElementById('be-concise-toggle')) { + createToggle(); + } + }); + + observer.observe(document.documentElement, { + childList: true, + subtree: true + }); +})(); From d3a1baff8b7ff1063c658463d2f17136daf04d0f Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Mon, 8 Jun 2026 17:38:30 +0000 Subject: [PATCH 28/65] Create deepseek-concise.md --- INFOS/deepseek-concise.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 INFOS/deepseek-concise.md diff --git a/INFOS/deepseek-concise.md b/INFOS/deepseek-concise.md new file mode 100644 index 0000000..8f321d1 --- /dev/null +++ b/INFOS/deepseek-concise.md @@ -0,0 +1,19 @@ +### USE CASE: +-------------- +Stop deepseek quackery and get to the point. + +### USAGE: +--------------- +Click the checkmark in the new box that appears on the upper right of the page. + +### WHY?: +--------------- +Deepseek is unbearable with its answers being walls of text and things nobody asked for that will quickly fill your context. +This script is very dumb, it only adds the phrase "be concise" at the end of every prompt you write after sending it, so +DS stops giving walls of useless text. + +--------------- +[INSTALL LINK](https://github.com/masterofobzene/UserScriptRepo/raw/main/SFW/deepseek-concise.user.js) +You must have violentmonkey installed for this to work. + + From 5b42656eb21b7c282214ffba55e46960f6b536ee Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Mon, 8 Jun 2026 17:42:06 +0000 Subject: [PATCH 29/65] Update README.md --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 04bfcac..edf5428 100644 --- a/README.md +++ b/README.md @@ -163,6 +163,16 @@ above if you see prices in other currency. ----------- +[DeepSeek be concise](https://github.com/masterofobzene/UserScriptRepo/raw/refs/heads/main/SFW/deepseek-concise.user.js) Makes DeepSeek give concise answers instead of walls of text. + +e65aw4NRcw + + + +[DESCRIPTION](https://github.com/masterofobzene/UserScriptRepo/blob/main/INFOS/DeepSeek_Auto_Collapse_Thinking.md) + +----------- +


From dab96ce4951aeb46a5714cc8d406eb95e3f84789 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Mon, 8 Jun 2026 17:43:21 +0000 Subject: [PATCH 30/65] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index edf5428..710a7d6 100644 --- a/README.md +++ b/README.md @@ -169,7 +169,7 @@ above if you see prices in other currency. -[DESCRIPTION](https://github.com/masterofobzene/UserScriptRepo/blob/main/INFOS/DeepSeek_Auto_Collapse_Thinking.md) +[DESCRIPTION](https://github.com/masterofobzene/UserScriptRepo/blob/main/INFOS/deepseek-concise.md) ----------- From f7e6d86ae5b2f853a0df0b42c7d72d8ddbf6279a Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Tue, 9 Jun 2026 15:43:20 +0000 Subject: [PATCH 31/65] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 710a7d6..2a01b72 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Click on the script name to install it. All scripts here were made for Firefox/L ### SFW ----------- -[::GOG Links::](https://github.com/masterofobzene/UserScriptRepo/raw/main/SFW/--GOG%20Links--.user.js) Adds links for GOG store to gameplay videos without youtubers comments and direct search on Gog-games for free clean download. +[::GOG Links::](https://github.com/masterofobzene/UserScriptRepo/raw/main/SFW/--GOG%20Links--.user.js) Adds links for GOG store to gameplay videos without youtubers comments and direct search on Torrminatorr for free clean download. @@ -23,7 +23,7 @@ Click on the script name to install it. All scripts here were made for Firefox/L ----------- -[::GOG-Games Links::](https://github.com/masterofobzene/UserScriptRepo/raw/main/SFW/--GOG-Games%20Links--.user.js) Adds "Gameplay Video" and "Changelog" buttons per game card to search for no-commentary gameplay videos and if lucky, a changelog. +~~[::GOG-Games Links::](https://github.com/masterofobzene/UserScriptRepo/raw/main/SFW/--GOG-Games%20Links--.user.js)~~ ~~Adds "Gameplay Video" and "Changelog" buttons per game card to search for no-commentary gameplay videos and if lucky, a changelog.~~ Gog-games admin says he is not updating the site anymore and will close the site on September 6/2026. From 01f982fee4966f4d1a974f5a7466ba02849d17be Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Tue, 9 Jun 2026 15:46:09 +0000 Subject: [PATCH 32/65] Update GOG-Games Links.md --- INFOS/GOG-Games Links.md | 36 +++++++++++++----------------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/INFOS/GOG-Games Links.md b/INFOS/GOG-Games Links.md index 464997b..13a805a 100644 --- a/INFOS/GOG-Games Links.md +++ b/INFOS/GOG-Games Links.md @@ -1,35 +1,25 @@ ### USE CASE: -------------- -Direct discovery of games on gog-games. +~~Direct discovery of games on gog-games.~~ ### USAGE: --------------- -Just click the purple button to search for a gameplay video of the selected game without annoying youtubers -screaming and mumbling word salads or click the orange button to HOPEFULLY get a changelog FROM STEAM. +~~Just click the purple button to search for a gameplay video of the selected game without annoying youtubers +screaming and mumbling word salads or click the orange button to HOPEFULLY get a changelog FROM STEAM.~~ -DISCLAIMER: -The script will search the dedicated steam "news hub" for the game using DuckDuckGo (because changelog pages -use the game numeric id instead of game name) in an effort to show you a changelog of the game but there are many conditions -for this to serve its purpose: - -1- It simply makes a search on DDG for the "steam news hub" for that specific game, you will have to click the result to get -there (usually "[GAMENAME] - Steam News Hub" result) - -2- I've chosen "steam news hub" to check for changelogs since developers focus more on steam than on gog releases of -their games; in other words, __they usually don't create changelogs for gog released games.__ Gogdb changelogs are -mostly outdated for a lot of games. - -3- Steam changelogs may differ from gog release of the same game in some aspects. - -4- There may not be any changelogs or may be completely abandoned. - -5- We rely on the devs maintaining the changelogs, so check the version before assuming anything. +Gog-games will go offline on September 6 2026, according to the site owner: +> PLEASE READ: It has been decided that all operations will cease (no new +games, updates, etc.) and the site will go offline in 90 days from this +message (September 6). This was a personal decision and not because of +any legal pressure. All remaining funds (around 700 EUR in XMR) will be +donated to torrminatorr. ❤️ A huge thank you to anyone who donated. Your funds will be going to a good home. ❤️ +I cannot imagine the face of donors after they realize the money will go to a forum that probably doesn't even know them with no VIP treatment or anything. ❤️❤️❤️ 🤣😂 ### WHY?: --------------- -Sometimes, you just start your search for "available" games on gog-games directly instead of gog.com. The problem is that gog-games didn't have the possibility to quickly search for gameplay videos and changelogs. This userscript comes to fix that. +~~Sometimes, you just start your search for "available" games on gog-games directly instead of gog.com. The problem is that gog-games didn't have the possibility to quickly search for gameplay videos and changelogs. This userscript comes to fix that.~~ --------------- -[INSTALL LINK](https://github.com/masterofobzene/UserScriptRepo/raw/main/SFW/--GOG-Games%20Links--.user.js) -You must have violentmonkey installed for this to work. +~~[INSTALL LINK](https://github.com/masterofobzene/UserScriptRepo/raw/main/SFW/--GOG-Games%20Links--.user.js) +You must have violentmonkey installed for this to work.~~ From f82f29ba2934f2de9fb6d3390de02052c4e9a1a9 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Tue, 9 Jun 2026 15:47:08 +0000 Subject: [PATCH 33/65] Update GOG-Games Links.md --- INFOS/GOG-Games Links.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INFOS/GOG-Games Links.md b/INFOS/GOG-Games Links.md index 13a805a..aea163a 100644 --- a/INFOS/GOG-Games Links.md +++ b/INFOS/GOG-Games Links.md @@ -14,7 +14,7 @@ message (September 6). This was a personal decision and not because of any legal pressure. All remaining funds (around 700 EUR in XMR) will be donated to torrminatorr. ❤️ A huge thank you to anyone who donated. Your funds will be going to a good home. ❤️ -I cannot imagine the face of donors after they realize the money will go to a forum that probably doesn't even know them with no VIP treatment or anything. ❤️❤️❤️ 🤣😂 +I cannot imagine the face of the donors ❤️❤️❤️ 🤣😂 ### WHY?: --------------- From 189d372ccdec7cb2d480f7f03a6ecf8a4f999f10 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Tue, 9 Jun 2026 15:49:30 +0000 Subject: [PATCH 34/65] Update --GOG Links--.user.js --- SFW/--GOG Links--.user.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SFW/--GOG Links--.user.js b/SFW/--GOG Links--.user.js index 0a55ebb..cca96c2 100644 --- a/SFW/--GOG Links--.user.js +++ b/SFW/--GOG Links--.user.js @@ -2,8 +2,8 @@ // @name ::GOG Links:: // @namespace masterofobzene // @author masterofobzene -// @version 1.9 -// @description Adds links for GOG store to gameplay videos without youtubers comments and direct search on Gog-games for free clean download. +// @version 2.0 +// @description Adds links for GOG store to gameplay videos without youtubers comments and direct search on Torrminatorr for free clean download. // @require https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js // @match *://www.gog.com/*/game/* // @homepage https://github.com/masterofobzene/UserScriptRepo @@ -17,9 +17,9 @@ var pirateLinks = [ { - url: "https://gog-games.to/?search=", + url: "https://forum.torrminatorr.com/search.php?keywords=", urlSpecial: "", - title: "Search on GoG-Games" + title: "Search on Torrminatorr" }, { url: "https://www.youtube.com/results?search_query=", From ac1831f46609a6e3ea4e9ed84d4a3e850c6abfd9 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Tue, 9 Jun 2026 15:55:40 +0000 Subject: [PATCH 35/65] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2a01b72..c3e9134 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Click on the script name to install it. All scripts here were made for Firefox/L [::GOG Links::](https://github.com/masterofobzene/UserScriptRepo/raw/main/SFW/--GOG%20Links--.user.js) Adds links for GOG store to gameplay videos without youtubers comments and direct search on Torrminatorr for free clean download. - +GeaabI9Wys [DESCRIPTION](https://github.com/masterofobzene/UserScriptRepo/blob/main/INFOS/GOG%20Links.md) From 4b1d6a1d8861707d24f1cb0ccaee5e46b3219af9 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Tue, 9 Jun 2026 15:58:23 +0000 Subject: [PATCH 36/65] Update GOG Links.md --- INFOS/GOG Links.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/INFOS/GOG Links.md b/INFOS/GOG Links.md index 5775e0c..d7d5c2d 100644 --- a/INFOS/GOG Links.md +++ b/INFOS/GOG Links.md @@ -1,7 +1,8 @@ ### USE CASE: -------------- Lazy game discovery. This userscript will add 2 new buttons to Gog.com; one to search for non(voice)commented gameplay videos -on youtube to roughly judge gameplay, and one for searching that game on gog-games.to for download. +on youtube to roughly judge gameplay, and one for searching that game on torrminatorr forum for download. +ATTENTION: IT IS NOW REQUIRED TO HAVE A USER ON TORRMINATORR TO WORK WITH THIS EXTENSION. ### USAGE: --------------- From 326a156466065c47952137074a90481c5cc5a8f3 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Tue, 9 Jun 2026 16:04:08 +0000 Subject: [PATCH 37/65] Update --Steam Links--.user.js remove gog-games --- SFW/--Steam Links--.user.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/SFW/--Steam Links--.user.js b/SFW/--Steam Links--.user.js index 48031f3..25566b3 100644 --- a/SFW/--Steam Links--.user.js +++ b/SFW/--Steam Links--.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name ::Steam Links:: // @namespace Steam-Links -// @version 2.2 +// @version 2.3 // @icon https://cdn.freebiesupply.com/images/large/2x/steam-logo-black-transparent.png // @description Lets you easily search the games on clean DL sites, watch gameplays without youtuber's comments and see if the game is woke-oriented. // @author masterofobzene @@ -32,11 +32,10 @@ // Sites configuration const sites = [ - { name: 'GOG Games', url: `https://gog-games.to/?search=${encodeURIComponent(gameName)}`}, { name: 'CS.RIN.RU', url: `https://cs.rin.ru/forum/search.php?keywords=${encodeURIComponent(gameName)}` + '&terms=any&author=&sc=1&sf=titleonly&sk=t&sd=d&sr=topics&st=0&ch=300&t=0&submit=Search'}, { name: 'Torrminatorr', url: `https://forum.torrminatorr.com/search.php?keywords=${encodeURIComponent(gameName)}` }, { name: 'FitGirl Repacks', url: `https://fitgirl-repacks.site/?s=${encodeURIComponent(gameName)}` }, - { name: 'DElDETECTED', url: `https://deidetected.com/games/?search=${encodeURIComponent(gameName)}` }, + { name: 'DEIDETECTED', url: `https://deidetected.com/games/?search=${encodeURIComponent(gameName)}` }, { name: 'YouTube (No Commentary)', url: `https://www.youtube.com/results?search_query=${encodeURIComponent(gameName + ' no commentary')}` } ]; From a833100c2beb9f63189682553960454d5886f24e Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Tue, 9 Jun 2026 16:05:59 +0000 Subject: [PATCH 38/65] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c3e9134..7781e43 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,8 @@ Click on the script name to install it. All scripts here were made for Firefox/L [::Steam Links::](https://github.com/masterofobzene/UserScriptRepo/raw/main/SFW/--Steam%20Links--.user.js) Lets you easily search the games on clean DL sites, watch gameplays without youtuber's comments and see if the game is woke-oriented. - +E9MtE02Pbt + [DESCRIPTION](https://github.com/masterofobzene/UserScriptRepo/blob/main/INFOS/Steam%20Links.md) From 8abab7aa1613e09e650335f4d9ab5abf406c329b Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Tue, 9 Jun 2026 16:06:28 +0000 Subject: [PATCH 39/65] Update Steam Links.md --- INFOS/Steam Links.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INFOS/Steam Links.md b/INFOS/Steam Links.md index 61972a9..65d69dc 100644 --- a/INFOS/Steam Links.md +++ b/INFOS/Steam Links.md @@ -4,7 +4,7 @@ Lazy game discovery and acquisition on clean sites, using Steam as a catalog. ### USAGE: --------------- -On each game shop page, you will have 6 big green buttons, each will search for the game in +On each game shop page, you will have 5 big green buttons, each will search for the game in different known-to-be-safe sites, some for review, some for dl. It also has one link to search for non-commented youtube gameplay videos, and one for checking if the game has been "infected" with DEI policies by searching for it on deidetected.com. From cb1f686cc36171af1a68ae9d90624da9d482f2ed Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Wed, 10 Jun 2026 00:34:32 +0000 Subject: [PATCH 40/65] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7781e43..f911c74 100644 --- a/README.md +++ b/README.md @@ -100,7 +100,7 @@ above if you see prices in other currency. ----------- -[Steam Bad Reviews](https://github.com/masterofobzene/UserScriptRepo/raw/refs/heads/main/SFW/Steam_Bad_Reviews.user.js) Automatically switches to "bad reviews" when visiting the game page so you can judge the game a little bit better. +[Steam Bad Reviews](https://github.com/masterofobzene/UserScriptRepo/raw/refs/heads/main/SFW/Steam_Bad_Reviews.user.js) Automatically switches to "negative reviews" when visiting the game page so you can judge the game a little bit better. From 043f2dd5b1d5072f3b11fcea73554fac796d512a Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Fri, 12 Jun 2026 13:40:50 +0000 Subject: [PATCH 41/65] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f911c74..7d8ac14 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,9 @@ Click on the script name to install it. All scripts here were made for Firefox/L ----------- -~~[::GOG-Games Links::](https://github.com/masterofobzene/UserScriptRepo/raw/main/SFW/--GOG-Games%20Links--.user.js)~~ ~~Adds "Gameplay Video" and "Changelog" buttons per game card to search for no-commentary gameplay videos and if lucky, a changelog.~~ Gog-games admin says he is not updating the site anymore and will close the site on September 6/2026. +~~[::GOG-Games Links::](https://github.com/masterofobzene/UserScriptRepo/raw/main/SFW/--GOG-Games%20Links--.user.js)~~ ~~Adds "Gameplay Video" and "Changelog" buttons per game card to search for no-commentary gameplay videos and if lucky, a changelog.~~ + +Gog-games admin says he is not updating the site anymore and ~will close the site on September 6/2026.~ UPDATE: he shut down the site today june 12. RIP gog-games.to 👋, now GET YOUR torrminatorr acount created (free) and use the other scripts that are updated for it! 😁 From 32475517df24114b791f22c0ca4239554f4f0f5b Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Fri, 12 Jun 2026 13:49:58 +0000 Subject: [PATCH 42/65] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7d8ac14..79517d2 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Click on the script name to install it. All scripts here were made for Firefox/L ~~[::GOG-Games Links::](https://github.com/masterofobzene/UserScriptRepo/raw/main/SFW/--GOG-Games%20Links--.user.js)~~ ~~Adds "Gameplay Video" and "Changelog" buttons per game card to search for no-commentary gameplay videos and if lucky, a changelog.~~ -Gog-games admin says he is not updating the site anymore and ~will close the site on September 6/2026.~ UPDATE: he shut down the site today june 12. RIP gog-games.to 👋, now GET YOUR torrminatorr acount created (free) and use the other scripts that are updated for it! 😁 +Gog-games admin says he is not updating the site anymore and ~will close the site on September 6/2026.~ UPDATE: he shut down the site today june 12. RIP gog-games.to 👋, now GET YOUR torrminatorr account created (free) and use the other scripts that are updated for it to search for your games! 😁 From 3f051574e202e826153eec0ca4c5219426035e63 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Fri, 12 Jun 2026 13:59:34 +0000 Subject: [PATCH 43/65] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 79517d2..3749102 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,8 @@ Click on the script name to install it. All scripts here were made for Firefox/L Gog-games admin says he is not updating the site anymore and ~will close the site on September 6/2026.~ UPDATE: he shut down the site today june 12. RIP gog-games.to 👋, now GET YOUR torrminatorr account created (free) and use the other scripts that are updated for it to search for your games! 😁 - +so long gog-games + [DESCRIPTION](https://github.com/masterofobzene/UserScriptRepo/blob/main/INFOS/GOG-Games%20Links.md) From da40796e6008d61307a6d84b9c9415723791b063 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Fri, 12 Jun 2026 14:02:12 +0000 Subject: [PATCH 44/65] Update GOG-Games Links.md --- INFOS/GOG-Games Links.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/INFOS/GOG-Games Links.md b/INFOS/GOG-Games Links.md index aea163a..210c585 100644 --- a/INFOS/GOG-Games Links.md +++ b/INFOS/GOG-Games Links.md @@ -7,7 +7,7 @@ ~~Just click the purple button to search for a gameplay video of the selected game without annoying youtubers screaming and mumbling word salads or click the orange button to HOPEFULLY get a changelog FROM STEAM.~~ -Gog-games will go offline on September 6 2026, according to the site owner: +~~Gog-games will go offline on September 6 2026~~, according to the site owner: > PLEASE READ: It has been decided that all operations will cease (no new games, updates, etc.) and the site will go offline in 90 days from this message (September 6). This was a personal decision and not because of @@ -16,6 +16,8 @@ donated to torrminatorr. ❤️ A huge thank you to anyone who donated. Your fun I cannot imagine the face of the donors ❤️❤️❤️ 🤣😂 +UPDATE: He shut down the site today June 12 2026. + ### WHY?: --------------- ~~Sometimes, you just start your search for "available" games on gog-games directly instead of gog.com. The problem is that gog-games didn't have the possibility to quickly search for gameplay videos and changelogs. This userscript comes to fix that.~~ From 49bcf903a92d4701a04fcce56aa3bebd31dd0a44 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Fri, 12 Jun 2026 15:52:14 +0000 Subject: [PATCH 45/65] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3749102..b4e9dc7 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Click on the script name to install it. All scripts here were made for Firefox/L ~~[::GOG-Games Links::](https://github.com/masterofobzene/UserScriptRepo/raw/main/SFW/--GOG-Games%20Links--.user.js)~~ ~~Adds "Gameplay Video" and "Changelog" buttons per game card to search for no-commentary gameplay videos and if lucky, a changelog.~~ -Gog-games admin says he is not updating the site anymore and ~will close the site on September 6/2026.~ UPDATE: he shut down the site today june 12. RIP gog-games.to 👋, now GET YOUR torrminatorr account created (free) and use the other scripts that are updated for it to search for your games! 😁 +Gog-games admin says he is not updating the site anymore and ~will close the site on September 6/2026.~ UPDATE: he took down the site today june 12. RIP gog-games.to 👋, now GET YOUR torrminatorr account created (free) and use the other scripts that are updated for it to search for your games! 😁 so long gog-games From dc04c9df9a999ce7cfeb9fadcb1643a779262e8e Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Fri, 12 Jun 2026 16:37:57 +0000 Subject: [PATCH 46/65] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b4e9dc7..4c4842d 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Click on the script name to install it. All scripts here were made for Firefox/L ~~[::GOG-Games Links::](https://github.com/masterofobzene/UserScriptRepo/raw/main/SFW/--GOG-Games%20Links--.user.js)~~ ~~Adds "Gameplay Video" and "Changelog" buttons per game card to search for no-commentary gameplay videos and if lucky, a changelog.~~ -Gog-games admin says he is not updating the site anymore and ~will close the site on September 6/2026.~ UPDATE: he took down the site today june 12. RIP gog-games.to 👋, now GET YOUR torrminatorr account created (free) and use the other scripts that are updated for it to search for your games! 😁 +Gog-games admin says he is not updating the site anymore and will close the site on September 6/2026. RIP gog-games.to 👋, now GET YOUR torrminatorr account created (free) and use the other scripts that are updated for it to search for your games! 😁 so long gog-games From 4dc430a8847714b5bbff2a8b3c6c58e98e8ec6a4 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Fri, 12 Jun 2026 16:38:12 +0000 Subject: [PATCH 47/65] Update GOG-Games Links.md --- INFOS/GOG-Games Links.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INFOS/GOG-Games Links.md b/INFOS/GOG-Games Links.md index 210c585..7173420 100644 --- a/INFOS/GOG-Games Links.md +++ b/INFOS/GOG-Games Links.md @@ -16,7 +16,7 @@ donated to torrminatorr. ❤️ A huge thank you to anyone who donated. Your fun I cannot imagine the face of the donors ❤️❤️❤️ 🤣😂 -UPDATE: He shut down the site today June 12 2026. + ### WHY?: --------------- From fc920e617b304688b0101184e2fb58d581476851 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Fri, 26 Jun 2026 23:31:03 +0000 Subject: [PATCH 48/65] Update Realbooru Downloader.user.js fixed realbooru now asking for referers to give the media. --- NSFW/Realbooru Downloader.user.js | 81 ++++++++++++++++++------------- 1 file changed, 46 insertions(+), 35 deletions(-) diff --git a/NSFW/Realbooru Downloader.user.js b/NSFW/Realbooru Downloader.user.js index 8a254c3..aaa829b 100644 --- a/NSFW/Realbooru Downloader.user.js +++ b/NSFW/Realbooru Downloader.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name Realbooru Downloader // @namespace Realbooru-Downloader -// @version 1.7 +// @version 1.8 // @icon https://realbooru.com/favicon.ico // @author masterofobzene // @homepage https://github.com/masterofobzene/UserScriptRepo @@ -29,7 +29,7 @@ border-radius: 3px; cursor: pointer; font-weight: bold; - font-size: 10px; + font-size: 17px; z-index: 9999; `; @@ -38,29 +38,59 @@ const pathname = new URL(url).pathname; return decodeURIComponent(pathname.substring(pathname.lastIndexOf('/') + 1)) || 'file'; } catch (e) { - console.error('❌ Error parsing filename from URL:', url, e); + console.error('❌ Error parsing filename:', url, e); return 'file'; } } - function extractFullMediaUrl(html) { + function extractFullMediaUrl(html, baseUrl) { const doc = new DOMParser().parseFromString(html, 'text/html'); + const base = baseUrl || doc.baseURI; - const image = doc.querySelector('#image'); - if (image?.src) return image.src; + const img = doc.querySelector('#image'); + if (img?.src) return new URL(img.getAttribute('src'), base).href; - const video = doc.querySelector('video source'); - if (video?.src) return video.src; + const videoSrc = doc.querySelector('video source'); + if (videoSrc?.src) return new URL(videoSrc.getAttribute('src'), base).href; - const meta = doc.querySelector('meta[property="og:video"]'); - if (meta?.content) return meta.content; + const metaImg = doc.querySelector('meta[property="og:image"]'); + if (metaImg?.content) return new URL(metaImg.content, base).href; + const metaVid = doc.querySelector('meta[property="og:video"]'); + if (metaVid?.content) return new URL(metaVid.content, base).href; - const ogImage = doc.querySelector('meta[property="og:image"]'); - if (ogImage?.content) return ogImage.content; + const origLink = doc.querySelector('a[href*="/images/"]'); + if (origLink) return new URL(origLink.getAttribute('href'), base).href; return null; } + function downloadFile(url, filename, referer) { + GM_xmlhttpRequest({ + method: 'GET', + url: url, + responseType: 'blob', + headers: { 'Referer': referer }, + onload: function (resp) { + if (resp.status === 200) { + const blob = resp.response; + const blobUrl = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = blobUrl; + a.download = filename; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(blobUrl); + } else { + console.error('❌ Download failed, status:', resp.status); + } + }, + onerror: function (err) { + console.error('❌ Download error:', err); + } + }); + } + function createDownloadButton(postUrl) { const btn = document.createElement('button'); btn.textContent = '⬇'; @@ -70,7 +100,6 @@ btn.addEventListener('click', async (e) => { e.preventDefault(); e.stopPropagation(); - console.log(`🔄 Fetching: ${postUrl}`); try { const response = await new Promise((resolve, reject) => { @@ -82,20 +111,13 @@ }); }); - const fullUrl = extractFullMediaUrl(response.responseText); + const fullUrl = extractFullMediaUrl(response.responseText, postUrl); if (!fullUrl) { - console.error('❌ Media URL not found'); + console.error('❌ Could not extract media URL.'); return; } - const filename = getFilenameFromUrl(fullUrl); - GM_download({ - url: fullUrl, - name: filename, - saveAs: false, - onerror: (err) => console.error('❌ Download error:', err), - onload: () => console.log('✅ Downloaded:', filename), - }); + downloadFile(fullUrl, getFilenameFromUrl(fullUrl), postUrl); } catch (err) { console.error('❌ Failed to fetch post page:', err); } @@ -117,19 +139,10 @@ selectors.forEach(selector => { document.querySelectorAll(selector).forEach(element => { - // Find the main post container const container = element.closest('div.thumb, article.thumbnail-preview, div.thumbnail-container') || element; - - // Skip if container already has a button if (container.querySelector('.realbooru-download-button')) return; - - // Find the post link - const link = element.href ? element : - element.querySelector('a[href*="page=post&s=view"]'); - + const link = element.href ? element : element.querySelector('a[href*="page=post&s=view"]'); if (!link || !link.href) return; - - // Prepare container and add button container.style.position = 'relative'; const btn = createDownloadButton(link.href); container.appendChild(btn); @@ -140,10 +153,8 @@ if (count > 0) console.log(`✅ Added ${count} download button(s).`); } - // Initial run setTimeout(addButtons, 1000); - // MutationObserver for dynamic content new MutationObserver(addButtons).observe(document.body, { childList: true, subtree: true From 460a1449b60e81bad0886e0441df200efcaf8a86 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Fri, 26 Jun 2026 23:36:32 +0000 Subject: [PATCH 49/65] Update and rename NSFW Button Downloaders.md to Realbooru_Downloader.md --- INFOS/{NSFW Button Downloaders.md => Realbooru_Downloader.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename INFOS/{NSFW Button Downloaders.md => Realbooru_Downloader.md} (77%) diff --git a/INFOS/NSFW Button Downloaders.md b/INFOS/Realbooru_Downloader.md similarity index 77% rename from INFOS/NSFW Button Downloaders.md rename to INFOS/Realbooru_Downloader.md index b7b85ae..9ac5994 100644 --- a/INFOS/NSFW Button Downloaders.md +++ b/INFOS/Realbooru_Downloader.md @@ -1,6 +1,6 @@ ### USE CASE: -------------- -Download individual files from this especific site. If you want massive downloading, use gallery-dl instead! +Download individual files from realbooru with a single click on a button. If you want massive downloading, use gallery-dl instead! ### USAGE: --------------- From a852b64fefe16e5a7e32b16100c7bf653915ea05 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Fri, 26 Jun 2026 23:37:25 +0000 Subject: [PATCH 50/65] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4c4842d..57f0c7a 100644 --- a/README.md +++ b/README.md @@ -193,7 +193,7 @@ above if you see prices in other currency. ----------- [Realbooru Downloader](https://github.com/masterofobzene/UserScriptRepo/raw/main/NSFW/Realbooru%20Downloader.user.js) Download full-resolution images and videos from Realbooru posts with a small button -[DESCRIPTION](https://github.com/masterofobzene/UserScriptRepo/blob/main/INFOS/NSFW%20Button%20Downloaders.md) +[DESCRIPTION](https://github.com/masterofobzene/UserScriptRepo/blob/main/INFOS/Realbooru_Downloader.md) ----------- [Reddtastic Downloader](https://github.com/masterofobzene/UserScriptRepo/raw/main/NSFW/Reddtastic%20Downloader.user.js) Shows a download button for each thumbnail to download the full res file. From 8552daf19c7c1f34fc7b34edff0b2eb3356d9fbf Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Fri, 26 Jun 2026 23:38:05 +0000 Subject: [PATCH 51/65] Update Realbooru_Downloader.md --- INFOS/Realbooru_Downloader.md | 1 + 1 file changed, 1 insertion(+) diff --git a/INFOS/Realbooru_Downloader.md b/INFOS/Realbooru_Downloader.md index 9ac5994..1889e91 100644 --- a/INFOS/Realbooru_Downloader.md +++ b/INFOS/Realbooru_Downloader.md @@ -6,6 +6,7 @@ Download individual files from realbooru with a single click on a button. If you --------------- Just click the "Download" button. +1.8: Updated to work again. ### WHY?: --------------- From d27669c976b22a26d03cc9caa0d9c46d27087911 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Sat, 27 Jun 2026 21:13:05 +0000 Subject: [PATCH 52/65] Create deepseek-answer-in-english.user.js --- SFW/deepseek-answer-in-english.user.js | 178 +++++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 SFW/deepseek-answer-in-english.user.js diff --git a/SFW/deepseek-answer-in-english.user.js b/SFW/deepseek-answer-in-english.user.js new file mode 100644 index 0000000..0679abb --- /dev/null +++ b/SFW/deepseek-answer-in-english.user.js @@ -0,0 +1,178 @@ +// ==UserScript== +// @name DeepSeek Answer in English +// @namespace DeepSeek_Answer_In_English +// @version 1.0 +// @description Appends "answer in english" to the prompt before sending and provides an enable/disable toggle. +// @author masterofobzene +// @match *://*.deepseek.com/* +// @grant GM_getValue +// @grant GM_setValue +// @run-at document-idle +// @license GNU GPLv3 +// @icon https://deepseek.com/favicon.ico +// @downloadURL https://github.com/masterofobzene/UserScriptRepo/raw/main/SFW/deepseek-answer-in-english.user.js +// @updateURL https://github.com/masterofobzene/UserScriptRepo/raw/main/SFW/deepseek-answer-in-english.user.js +// ==/UserScript== + +(() => { + 'use strict'; + + console.log('[Answer in English] Script loaded'); + + let enabled = GM_getValue('answerInEnglishEnabled', true); + const SUFFIX = ' answer in english'; + + function appendSuffixToInput() { + try { + if (!enabled) { + return; + } + + const input = + document.querySelector('textarea') || + document.querySelector('[contenteditable="true"]'); + + if (!input) { + console.warn('[Answer in English] Input not found'); + return; + } + + const currentText = + input instanceof HTMLTextAreaElement + ? input.value + : input.textContent || ''; + + if (!currentText.trim()) { + return; + } + + if (currentText.endsWith(SUFFIX)) { + return; + } + + const newText = currentText + SUFFIX; + + if (input instanceof HTMLTextAreaElement) { + const descriptor = Object.getOwnPropertyDescriptor( + HTMLTextAreaElement.prototype, + 'value' + ); + + if (descriptor?.set) { + descriptor.set.call(input, newText); + } else { + input.value = newText; + } + } else { + input.textContent = newText; + } + + input.dispatchEvent( + new InputEvent('input', { + bubbles: true, + cancelable: true + }) + ); + + input.dispatchEvent( + new Event('change', { + bubbles: true + }) + ); + + console.log('[Answer in English] Prompt modified'); + } catch (error) { + console.error('[Answer in English]', error); + } + } + + document.addEventListener( + 'keydown', + event => { + try { + if (!enabled) { + return; + } + + if (event.key !== 'Enter') { + return; + } + + if (event.shiftKey || event.ctrlKey || event.altKey || event.metaKey) { + return; + } + + appendSuffixToInput(); + } catch (error) { + console.error('[Answer in English]', error); + } + }, + true + ); + + function createToggle() { + try { + if (!document.body) { + setTimeout(createToggle, 500); + return; + } + + if (document.getElementById('answer-in-english-toggle')) { + return; + } + + const container = document.createElement('div'); + container.id = 'answer-in-english-toggle'; + + Object.assign(container.style, { + position: 'fixed', + top: '60px', + right: '10px', + zIndex: '2147483647', + background: 'rgba(255,255,255,0.95)', + border: '1px solid #ccc', + borderRadius: '8px', + padding: '8px 12px', + boxShadow: '0 2px 10px rgba(0,0,0,0.15)', + fontFamily: 'system-ui, sans-serif', + fontSize: '13px', + color: '#000' + }); + + container.innerHTML = ` + + `; + + document.body.appendChild(container); + + const checkbox = container.querySelector('#answer-in-english-checkbox'); + + checkbox.addEventListener('change', event => { + enabled = event.target.checked; + GM_setValue('answerInEnglishEnabled', enabled); + + console.log('[Answer in English] Enabled:', enabled); + }); + + console.log('[Answer in English] Toggle added'); + } catch (error) { + console.error('[Answer in English]', error); + } + } + + createToggle(); + + const observer = new MutationObserver(() => { + if (!document.getElementById('answer-in-english-toggle')) { + createToggle(); + } + }); + + observer.observe(document.documentElement, { + childList: true, + subtree: true + }); +})(); From 3369db442d701576e1b422bd25efed840f526ac1 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Sat, 27 Jun 2026 21:13:36 +0000 Subject: [PATCH 53/65] Create deepseek-answer-in-english.md --- INFOS/deepseek-answer-in-english.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 INFOS/deepseek-answer-in-english.md diff --git a/INFOS/deepseek-answer-in-english.md b/INFOS/deepseek-answer-in-english.md new file mode 100644 index 0000000..5bcc430 --- /dev/null +++ b/INFOS/deepseek-answer-in-english.md @@ -0,0 +1,22 @@ +### USE CASE: +-------------- +Force Deepseek to use english. + +### USAGE: +--------------- +Just install it. A Checkbox will appear on the top right to turn ON or OFF this script. + + +### WHY?: +--------------- +Recently Deepseek started giving me a lot of answers in chinese (randomly and in the middle of an ongoing prompt). +This started randomly in very rare ocassions but now it has became an annoyance for the non-chinese speakers. So +with this dumb script we will append "answer in english" to every prompt. + +--------------- +[INSTALL LINK](https://github.com/masterofobzene/UserScriptRepo/raw/refs/heads/main/SFW/deepseek-answer-in-english.user.js) +You must have violentmonkey installed for this to work. + + + + From 7b95d94e451e87b9399147f5a30b94bd38bd66f0 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Sat, 27 Jun 2026 21:15:54 +0000 Subject: [PATCH 54/65] Update README.md --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 57f0c7a..4a468d6 100644 --- a/README.md +++ b/README.md @@ -177,6 +177,18 @@ above if you see prices in other currency. ----------- + +[DeepSeek always in english](https://github.com/masterofobzene/UserScriptRepo/raw/refs/heads/main/SFW/deepseek-answer-in-english.user.js) Makes DeepSeek give answers in english instead of randomly using chinese. + +2MepdZsKOX + + + + +[DESCRIPTION](https://github.com/masterofobzene/UserScriptRepo/blob/main/INFOS/deepseek-answer-in-english.md) + +----------- +


From cea702ce5e55596f3be9da85ad83ec3d3664ef92 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Sat, 27 Jun 2026 21:39:35 +0000 Subject: [PATCH 55/65] Update Reddtastic Downloader.user.js --- NSFW/Reddtastic Downloader.user.js | 67 ++++++++---------------------- 1 file changed, 17 insertions(+), 50 deletions(-) diff --git a/NSFW/Reddtastic Downloader.user.js b/NSFW/Reddtastic Downloader.user.js index d1a73a8..c397a6d 100644 --- a/NSFW/Reddtastic Downloader.user.js +++ b/NSFW/Reddtastic Downloader.user.js @@ -1,16 +1,12 @@ // ==UserScript== // @name Reddtastic Downloader -// @namespace Reddtastic-Downloader -// @homepage https://github.com/masterofobzene/UserScriptRepo -// @author masterofobzene -// @version 1.4.8 -// @description Shows a download button for each thumbnail to download the full res file. +// @namespace https://reddtastic.com/ +// @version 1.4.9 +// @description Muestra un boton "download" para imagenes y videos. // @match https://reddtastic.com/* // @icon https://reddtastic.com/favicon.ico // @grant GM_download // @grant GM_xmlhttpRequest -// @grant GM_registerMenuCommand -// @connect * // @downloadURL https://github.com/masterofobzene/UserScriptRepo/raw/main/NSFW/Reddtastic%20Downloader.user.js // @updateURL https://github.com/masterofobzene/UserScriptRepo/raw/main/NSFW/Reddtastic%20Downloader.user.js // ==/UserScript== @@ -27,7 +23,7 @@ top: 5px; right: 5px; z-index: 9999; padding: 4px 8px; - background: rebeccapurple; + background: #FF00FF; color: white; font-size: 12px; font-weight: bold; @@ -39,14 +35,7 @@ `; document.head.appendChild(style); - GM_registerMenuCommand("Set Download Method", function () { - const method = prompt("Choose download method:\n1. IDM (recommended)\n2. Firefox Native", "1"); - localStorage.setItem('rdDownloadMethod', method === "2" ? "firefox" : "idm"); - }); - - function getDownloadMethod() { - return localStorage.getItem('rdDownloadMethod') || 'idm'; - } + // ---- removed: GM_registerMenuCommand & getDownloadMethod ---- function randStr(len = 8) { return Math.random().toString(36).substr(2, len); @@ -70,40 +59,18 @@ }); } - function triggerIDMDownload(url, filename) { - const a = document.createElement('a'); - a.href = url; - a.download = filename || url.split('/').pop() || `reddit_${randStr()}.jpg`; - a.style.display = 'none'; - document.body.appendChild(a); - a.click(); - setTimeout(() => document.body.removeChild(a), 100); - } + // ---- removed: triggerIDMDownload ---- function doDownload(url, defaultName) { - const method = getDownloadMethod(); - - if (method === 'firefox') { - GM_download({ - url: url, - name: defaultName, - saveAs: false, - onerror: () => { - console.warn('GM_download failed, falling back to IDM click method.'); - triggerIDMDownload(url, defaultName); - } - }); - } else { - GM_download({ - url: url, - name: defaultName, - saveAs: false, - onerror: () => { - console.warn('GM_download failed, falling back to fake link click.'); - triggerIDMDownload(url, defaultName); - } - }); - } + // Always use native GM_download – fallback to IDM removed + GM_download({ + url: url, + name: defaultName, + saveAs: false, + onerror: () => { + console.warn('GM_download failed for:', url); + } + }); } function makeBtn(parent, onClick) { @@ -112,8 +79,8 @@ parent.classList.add('vm-dl-wrap'); const btn = document.createElement('button'); btn.className = 'vm-dl-btn'; - btn.textContent = 'Download (IDM)'; - btn.title = 'Download with IDM'; + btn.textContent = 'DL⬇'; // changed from "Download (IDM)" + btn.title = 'Download'; // changed from "Download with IDM" btn.addEventListener('click', e => { e.stopPropagation(); e.preventDefault(); From 54d8fd47130b9f56622c157a3fb104bbd5d28ef7 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Sat, 27 Jun 2026 21:47:24 +0000 Subject: [PATCH 56/65] Rename Reddtastic Downloader.user.js to Reddtastic_Downloader.user.js --- ...eddtastic Downloader.user.js => Reddtastic_Downloader.user.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename NSFW/{Reddtastic Downloader.user.js => Reddtastic_Downloader.user.js} (100%) diff --git a/NSFW/Reddtastic Downloader.user.js b/NSFW/Reddtastic_Downloader.user.js similarity index 100% rename from NSFW/Reddtastic Downloader.user.js rename to NSFW/Reddtastic_Downloader.user.js From ad24154ad8cc2910c004189739a585cc49b29d60 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Sat, 27 Jun 2026 21:48:07 +0000 Subject: [PATCH 57/65] Rename Reddtastic_Downloader.user.js to Reddtastic Downloader.user.js --- ...eddtastic_Downloader.user.js => Reddtastic Downloader.user.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename NSFW/{Reddtastic_Downloader.user.js => Reddtastic Downloader.user.js} (100%) diff --git a/NSFW/Reddtastic_Downloader.user.js b/NSFW/Reddtastic Downloader.user.js similarity index 100% rename from NSFW/Reddtastic_Downloader.user.js rename to NSFW/Reddtastic Downloader.user.js From a4ef3faec2590d89ec6727115ff9a0710c64f2aa Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Sat, 27 Jun 2026 21:48:29 +0000 Subject: [PATCH 58/65] Create reddstatic_downloader.md --- INFOS/reddstatic_downloader.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 INFOS/reddstatic_downloader.md diff --git a/INFOS/reddstatic_downloader.md b/INFOS/reddstatic_downloader.md new file mode 100644 index 0000000..472990e --- /dev/null +++ b/INFOS/reddstatic_downloader.md @@ -0,0 +1,20 @@ +### USE CASE: +-------------- +Download individual files from reddstatic with a single click on a button. If you want massive downloading, use gallery-dl instead! + +### USAGE: +--------------- +Just click the "Download" button. + +1.4.9: Removed "IDM" references that never worked. Changed button color for better visibility. Made button smaller. + +### WHY?: +--------------- +To avoid downloading trash and focus on what we want. Also it is way more lazy than having to +follow each link and manually clicking "save as". + +--------------- +[INSTALL LINK](https://github.com/masterofobzene/UserScriptRepo/raw/main/NSFW/Reddtastic%20Downloader.user.js) +You must have violentmonkey installed for this to work. + + From f036ce2a5344c36bb9607dffd82205a499ef788d Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Sat, 27 Jun 2026 21:51:31 +0000 Subject: [PATCH 59/65] Update and rename reddstatic_downloader.md to reddtastic_downloader.md --- INFOS/{reddstatic_downloader.md => reddtastic_downloader.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename INFOS/{reddstatic_downloader.md => reddtastic_downloader.md} (90%) diff --git a/INFOS/reddstatic_downloader.md b/INFOS/reddtastic_downloader.md similarity index 90% rename from INFOS/reddstatic_downloader.md rename to INFOS/reddtastic_downloader.md index 472990e..4f01dff 100644 --- a/INFOS/reddstatic_downloader.md +++ b/INFOS/reddtastic_downloader.md @@ -1,6 +1,6 @@ ### USE CASE: -------------- -Download individual files from reddstatic with a single click on a button. If you want massive downloading, use gallery-dl instead! +Download individual files from reddtastic with a single click on a button. If you want massive downloading, use gallery-dl instead! ### USAGE: --------------- From 603e8ce556678309a254544a0fffabcfa682378c Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Sat, 27 Jun 2026 21:52:06 +0000 Subject: [PATCH 60/65] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4a468d6..b3931f6 100644 --- a/README.md +++ b/README.md @@ -210,7 +210,7 @@ above if you see prices in other currency. ----------- [Reddtastic Downloader](https://github.com/masterofobzene/UserScriptRepo/raw/main/NSFW/Reddtastic%20Downloader.user.js) Shows a download button for each thumbnail to download the full res file. -[DESCRIPTION](https://github.com/masterofobzene/UserScriptRepo/blob/main/INFOS/NSFW%20Button%20Downloaders.md) +[DESCRIPTION](https://github.com/masterofobzene/UserScriptRepo/blob/main/INFOS/reddtastic_downloader.md) ----------- ~~Successor of zzup~~ From 5280eaa55fa0d339f2aa7de7d5dcad86a7890089 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Sat, 27 Jun 2026 22:15:18 +0000 Subject: [PATCH 61/65] Update NSFW.XXX Downloader.user.js --- NSFW/NSFW.XXX Downloader.user.js | 120 +++++++++++-------------------- 1 file changed, 43 insertions(+), 77 deletions(-) diff --git a/NSFW/NSFW.XXX Downloader.user.js b/NSFW/NSFW.XXX Downloader.user.js index 19a5372..edfb0a0 100644 --- a/NSFW/NSFW.XXX Downloader.user.js +++ b/NSFW/NSFW.XXX Downloader.user.js @@ -1,9 +1,9 @@ // ==UserScript== // @name NSFW.XXX Downloader // @namespace NSFW.XXX-Downloader -// @version 3.0 +// @version 3.1 // @icon https://nsfw.xxx/favicon.ico -// @description Download full-resolution images/videos from NSFW.XXX posts +// @description Download full-resolution images/videos from NSFW.XXX // @author masterofobzene // @homepage https://github.com/masterofobzene/UserScriptRepo // @match https://nsfw.xxx/* @@ -13,6 +13,8 @@ // @grant GM_addStyle // @connect nsfw.xxx // @connect cdn2.nsfw.xxx +// @connect cdn3.nsfw.xxx +// @connect cdn4.nsfw.xxx // @connect * // @downloadURL https://github.com/masterofobzene/UserScriptRepo/raw/main/NSFW/NSFW.XXX%20Downloader.user.js // @updateURL https://github.com/masterofobzene/UserScriptRepo/raw/main/NSFW/NSFW.XXX%20Downloader.user.js @@ -21,15 +23,14 @@ (function() { 'use strict'; - // --- Button styles --- GM_addStyle(` .nsfw-download-btn { position: absolute !important; bottom: 10px !important; right: 10px !important; z-index: 99999 !important; - background: #4CAF50 !important; - color: white !important; + background: #19FF19 !important; + color: black !important; border: none !important; border-radius: 4px !important; padding: 5px 10px !important; @@ -38,72 +39,39 @@ opacity: 0.9 !important; transition: opacity 0.2s !important; } - .nsfw-download-btn:hover { - opacity: 1 !important; - } - .media-container { - position: relative !important; - } + .nsfw-download-btn:hover { opacity: 1 !important; } + .post { position: relative !important; } `); - // --- Inject buttons into each media container --- function addDownloadButtons() { - document.querySelectorAll('.sh-section__image, .sh-section__media, .post-media, .image-container').forEach(container => { - if (container.querySelector('.nsfw-download-btn')) return; + document.querySelectorAll('.post:not([data-nsfw-dl])').forEach(card => { + card.setAttribute('data-nsfw-dl', '1'); const btn = document.createElement('button'); btn.className = 'nsfw-download-btn'; - btn.textContent = '↓ Download'; + btn.textContent = 'DL↓'; btn.addEventListener('click', async e => { - e.preventDefault(); e.stopPropagation(); - await onDownloadClick(container, btn); + e.preventDefault(); + e.stopPropagation(); + await onDownloadClick(card, btn); }); - container.classList.add('media-container'); - container.appendChild(btn); + card.appendChild(btn); }); } - // --- Handle button click --- - async function onDownloadClick(container, btn) { + async function onDownloadClick(card, btn) { btn.disabled = true; btn.textContent = 'Finding source...'; try { - let url = await extractMediaUrl(container); - if (!url) throw new Error('No media source found'); + const postLink = card.querySelector('a.post--link'); + if (!postLink || !postLink.href) throw new Error('No post link found'); + const url = await fetchFullResFromPost(postLink.href); + if (!url) throw new Error('No media source found on post page'); await downloadFile(url, btn); } catch (err) { notifyError(err, btn); } } - // --- Extract the best media URL from the container --- - async function extractMediaUrl(container) { - // 1. Direct full-res image already in page? - let img = container.querySelector('img'); - if (img && img.src && !img.src.includes('/thumbnails/')) { - return img.src; - } - - // 2. If it's still a thumbnail, follow the post link - if (img && (img.src.includes('/thumbnails/') || img.dataset.src?.includes('/thumbnails/'))) { - const link = img.closest('a.slider_init_href'); - if (!link || !link.href) { - throw new Error('Cannot find post link for thumbnail'); - } - return await fetchFullResFromPost(link.href); - } - - // 3. Fallback: video preview container - const vid = container.querySelector('video source'); - if (vid && vid.src) return vid.src; - - // 4. Iframe or other embed - const iframe = container.querySelector('iframe'); - if (iframe && iframe.src) return iframe.src; - - return null; - } - - // --- Fetch the post page and scrape the real full-res media URL --- async function fetchFullResFromPost(postUrl) { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ @@ -113,17 +81,25 @@ try { const doc = new DOMParser().parseFromString(response.responseText, 'text/html'); - // Look *only* inside the .sh-section__image container for big images - const images = doc.querySelectorAll('.sh-section__image img'); - for (let img of images) { - const src = img.getAttribute('src') || img.dataset.src; - // Must be a real upload (not still thumbnail) - if (src && !src.includes('/thumbnails/') && src.includes('/uploads')) { + // 1. Look for an with /uploads in the src (not thumbnails) + for (const img of doc.querySelectorAll('img')) { + const src = img.getAttribute('src') || img.dataset.src || ''; + if (src.includes('/uploads') && !src.includes('/thumbnails/')) { return resolve(src); } } - // If no suitable image, try video + // 2. Check Vuetify background image on .v-image__image + const bgDiv = doc.querySelector('.v-image__image'); + if (bgDiv) { + const style = bgDiv.getAttribute('style') || ''; + const match = style.match(/url\("([^"]+)"\)/); + if (match && match[1] && match[1].includes('/uploads') && !match[1].includes('/thumbnails/')) { + return resolve(match[1]); + } + } + + // 3. Video source const videoSrc = doc.querySelector('video source')?.src; if (videoSrc) return resolve(videoSrc); @@ -132,14 +108,11 @@ reject(new Error('Error parsing post page HTML.')); } }, - onerror() { - reject(new Error('Failed to fetch post page.')); - } + onerror() { reject(new Error('Failed to fetch post page.')); } }); }); } - // --- Download via GM_download and update button state --- async function downloadFile(url, btn) { let filename = url.split('/').pop().split('?')[0].replace(/[^a-zA-Z0-9\.\-_]/g, '_'); btn.textContent = 'Downloading...'; @@ -148,32 +121,25 @@ onload() { btn.textContent = '✓ Done'; setTimeout(() => { - btn.textContent = '↓ Download'; + btn.textContent = 'DL↓'; btn.disabled = false; }, 2000); }, - onerror(err) { - notifyError(new Error(`Download failed: ${err.error}`), btn); - }, - ontimeout() { - notifyError(new Error('Download timed out'), btn); - } + onerror(err) { notifyError(new Error(`Download failed: ${err.error}`), btn); }, + ontimeout() { notifyError(new Error('Download timed out'), btn); } }); } - // --- Error handler --- function notifyError(err, btn) { console.error(err); GM_notification({ title: 'Download Error', text: err.message, timeout: 5000 }); - btn.textContent = '↓ Download'; + btn.textContent = 'DL↓'; btn.disabled = false; } - // --- Watch for dynamically loaded content --- - new MutationObserver(muts => muts.forEach(m => m.addedNodes.length && addDownloadButtons())) - .observe(document.body, { childList: true, subtree: true }); + new MutationObserver(muts => { + for (const m of muts) if (m.addedNodes.length) addDownloadButtons(); + }).observe(document.body, { childList: true, subtree: true }); - // --- Initial run --- addDownloadButtons(); - })(); From 9cccd5830b200a4507ab0993664cf4cd4bf7e49a Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Sat, 27 Jun 2026 22:18:51 +0000 Subject: [PATCH 62/65] Create NSFW.XXX_Downloader.md --- INFOS/NSFW.XXX_Downloader.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 INFOS/NSFW.XXX_Downloader.md diff --git a/INFOS/NSFW.XXX_Downloader.md b/INFOS/NSFW.XXX_Downloader.md new file mode 100644 index 0000000..db4a4e6 --- /dev/null +++ b/INFOS/NSFW.XXX_Downloader.md @@ -0,0 +1,22 @@ +### USE CASE: +-------------- +One click download. + +### USAGE: +--------------- +Click on the green download button. + +UPDATE 3.1: Fixed the script for the changes in nsfw.xxx. Changed button size and color. + + +### WHY?: +--------------- +Just a helper. + +--------------- +[INSTALL LINK](https://github.com/masterofobzene/UserScriptRepo/raw/refs/heads/main/NSFW/NSFW.XXX%20Downloader.user.js) +You must have violentmonkey installed for this to work. + + + + From ad064d51217d2e57737acec6e74fab2ce80a5228 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Sat, 27 Jun 2026 22:19:34 +0000 Subject: [PATCH 63/65] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b3931f6..e025aa7 100644 --- a/README.md +++ b/README.md @@ -200,7 +200,7 @@ above if you see prices in other currency. [NSFW.XXX Downloader](https://github.com/masterofobzene/UserScriptRepo/raw/main/NSFW/NSFW.XXX%20Downloader.user.js) Download full-resolution images/videos from NSFW.XXX posts -[DESCRIPTION](https://github.com/masterofobzene/UserScriptRepo/blob/main/INFOS/NSFW%20Button%20Downloaders.md) +[DESCRIPTION](https://github.com/masterofobzene/UserScriptRepo/blob/main/INFOS/NSFW.XXX_Downloader.md) ----------- [Realbooru Downloader](https://github.com/masterofobzene/UserScriptRepo/raw/main/NSFW/Realbooru%20Downloader.user.js) Download full-resolution images and videos from Realbooru posts with a small button From 483dce4095e30c5265c5fb951fcc959a3c2f1449 Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Sat, 27 Jun 2026 22:21:20 +0000 Subject: [PATCH 64/65] Update Reddtastic Downloader.user.js --- NSFW/Reddtastic Downloader.user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NSFW/Reddtastic Downloader.user.js b/NSFW/Reddtastic Downloader.user.js index c397a6d..6cae203 100644 --- a/NSFW/Reddtastic Downloader.user.js +++ b/NSFW/Reddtastic Downloader.user.js @@ -2,7 +2,7 @@ // @name Reddtastic Downloader // @namespace https://reddtastic.com/ // @version 1.4.9 -// @description Muestra un boton "download" para imagenes y videos. +// @description Shows a button for downloading media on each thumbnail. // @match https://reddtastic.com/* // @icon https://reddtastic.com/favicon.ico // @grant GM_download From 2711ff6e85a56459b6989c25fde2b0b8dc55c01c Mon Sep 17 00:00:00 2001 From: masterofobzene <94469116+masterofobzene@users.noreply.github.com> Date: Sat, 27 Jun 2026 22:26:35 +0000 Subject: [PATCH 65/65] Update README.md --- README.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/README.md b/README.md index e025aa7..12840a4 100644 --- a/README.md +++ b/README.md @@ -212,13 +212,6 @@ above if you see prices in other currency. [DESCRIPTION](https://github.com/masterofobzene/UserScriptRepo/blob/main/INFOS/reddtastic_downloader.md) ------------ -~~Successor of zzup~~ - -~~[up2img Infinite Scroll](https://github.com/masterofobzene/UserScriptRepo/raw/main/NSFW/ZZup%20Infinite%20Scroll.user.js)~~ ~~Repaginates up2img.com so you get "infinite scroll"~~ - -~~[DESCRIPTION](https://github.com/masterofobzene/UserScriptRepo/blob/main/INFOS/ZZup%20Infinite%20Scroll.md)~~ - ----------- [Pornpaw Gallery Filter](https://github.com/masterofobzene/UserScriptRepo/raw/main/NSFW/ZZup%20Infinite%20Scroll.user.js) Lets you filter galleries by using words that can be found in any the title or the tags of the galleries