Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions plugins/SFWSwitch/additional_plugins.css
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,14 @@
.pwr-hover-preview,
.pwr-scene-image-container .pwr-scene-image,

/* HotOrNot */
/* Ascension */
.hon-performer-image,
.hon-performer-card,
.hon-scene-image,
.hon-selection-image,
.hon-image-image-container,
.hon-image-image,
.hon-victory-image,

/* Deck Viewer */
.swiper-zoom-container,
Expand Down Expand Up @@ -68,7 +69,7 @@
.pwr-scene-image-container:hover .pwr-scene-image,
.pwr-scene-info:hover,

/* HotOrNot */
/* Ascension */
.hon-performer-image:hover,
.hon-performer-card:hover,
.hon-scene-image:hover,
Expand All @@ -78,6 +79,7 @@
.hon-selection-card:hover,
.hon-selection-name:hover,
.hon-selection-image:hover,
.hon-victory-image:hover,

/* Sprite Tab */
.sprite-cell:hover,
Expand Down
57 changes: 36 additions & 21 deletions plugins/SFWSwitch/sfw.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,13 @@ async function getSfwConfig() {
return false;
}
}

async function sfw_mode() {
const stash_css = sfwswitch_findstashcss();
const button = document.getElementById("plugin_sfw");

if (!stash_css) return;

const sfwState = localStorage.getItem("sfw_mode") === "true";
const rawState = localStorage.getItem("sfw_mode");
const sfwState = rawState === "true";
const audioMuteEnabled = await getSfwConfig();

stash_css.disabled = !sfwState;
Expand Down Expand Up @@ -69,25 +69,21 @@ function sfwswitch_createbutton() {

document.getElementById(buttonId).addEventListener("click", sfwswitch_switcher);

// Initialize the button based on saved state
sfw_mode();
}
}, 100);

setTimeout(() => clearInterval(intervalId), 10000);
}

// Function to strictly handle the muted state
function sfw_forceMute(media) {
if (!media) return;
media.muted = true;
}

function sfw_mute_all_media() {
// Initial sweep
document.querySelectorAll("audio, video").forEach(sfw_forceMute);

// Global event listener for play, seek, and volume changes
if (!sfw_playListener) {
sfw_playListener = function(e) {
if (e.target.tagName === "VIDEO" || e.target.tagName === "AUDIO") {
Expand All @@ -101,7 +97,6 @@ function sfw_mute_all_media() {
document.addEventListener("seeking", sfw_playListener, true);
}

// MutationObserver for content loaded via AJAX/Dynamic updates
if (!sfw_mediaObserver) {
sfw_mediaObserver = new MutationObserver(mutations => {
for (const mutation of mutations) {
Expand All @@ -119,7 +114,6 @@ function sfw_mute_all_media() {
}

function sfw_unmute_all_media() {
// 1. Remove listeners FIRST to prevent them from firing during the unmute loop
if (sfw_playListener) {
document.removeEventListener("play", sfw_playListener, true);
document.removeEventListener("volumechange", sfw_playListener, true);
Expand All @@ -133,36 +127,29 @@ function sfw_unmute_all_media() {
sfw_mediaObserver = null;
}

// 2. Unmute existing media
document.querySelectorAll("audio, video").forEach(media => {
media.muted = false;
// Optional: media.volume = 1.0; // Use if volume was also forced to 0
});
}

async function sfwswitch_switcher() {
const stash_css = sfwswitch_findstashcss();
if (!stash_css) return;

// Toggle the CSS
stash_css.disabled = !stash_css.disabled;
const enabled = !stash_css.disabled;

localStorage.setItem("sfw_mode", enabled);

const audioMuteEnabled = await getSfwConfig();

// Logic Check: If we just disabled SFW, we MUST run unmute immediately
if (enabled && audioMuteEnabled) {
sfw_mute_all_media();
} else {
// This clears observers and sets muted = false
sfw_unmute_all_media();

// CRITICAL: Force a pause/reset on any media that might be stuck in a background buffer
document.querySelectorAll("audio, video").forEach(media => {
if (media.paused && media.muted) {
// If it was supposed to be stopped, make sure it stays stopped
media.muted = false;
}
});
Expand All @@ -176,13 +163,41 @@ async function sfwswitch_switcher() {

function sfwswitch_findstashcss() {
for (let i = 0; i < document.styleSheets.length; i++) {
const stylesheet = document.styleSheets[i];
if (stylesheet.href && stylesheet.href.includes("/plugin/sfwswitch/css")) {
return stylesheet;
const sheet = document.styleSheets[i];
try {
if (sheet.href && sheet.href.includes("/plugin/sfwswitch/css")) {
return sheet;
}
} catch (e) {
// Cross-origin access blocked - skip
}
}
return null;
}

// Initialize button on page load
sfwswitch_createbutton();
async function sfw_init() {
// Wait until the stylesheet is available
let retries = 0;
const maxRetries = 50; // ~5 seconds with 100ms delay

while (!sfwswitch_findstashcss() && retries < maxRetries) {
await new Promise(r => setTimeout(r, 100));
retries++;
}

if (!document.getElementById("plugin_sfw")) {
sfwswitch_createbutton();
}
}

function sfw_start() {
setTimeout(() => {
sfw_init();
}, 0);
}

if (document.readyState === "loading") {
window.addEventListener("DOMContentLoaded", sfw_start);
} else {
sfw_start();
}
2 changes: 1 addition & 1 deletion plugins/SFWSwitch/sfwswitch.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: SFW Switch
description: Add a button to blur covers and images.
version: 1.7
version: 1.8
url: https://discourse.stashapp.cc/t/sfw-switch/4658
ui:
javascript:
Expand Down
Loading