Advanced Scene Switcher

Advanced Scene Switcher 1.37.0

Hello !

It would be awesome if we could hide the "Set transition to" and "Set transition duration to" options on each 'Scene Item Visibility' action. Right now, it makes the element way too large vertically, which is really impractical and cluttered when you stack a lot of them in a row.

On top of that, the plugin is becoming less and less responsive. Each action now takes more than a second to process, which wasn't the case a few months ago...

View attachment 119903
Unfortunately, I am not sure how I would hide those additional options "effectively".
Introducing yet another checkbox "hide XY settings ... " just to hide two other checkboxes seems a bit pointless.

But I am open to suggestions!

Just to mention it:
You can collapse individual actions / conditions so they take up less space:
Example.gif


Regarding the performance issues you mentioned:
Can you reproduce the issue and share a corresponding OBS log file with verbose logging enabled?
Then I should be able to see which actions / conditions take an unexpected amount of time to process.
 
Hello, Warmuptill! So, I've read through your Installation page on github, and I couldn't find manual installation instructions for those of us that use OBS-Portable. Having to put the plugin files into "%ProgramData%\obs-studio\plugins" ends up breaking the self-containment-ness that OBS-Portable establishes. Is there a fix for this, or perhaps something I overlooked?

Thanks for your time!
 
Hello, Warmuptill! So, I've read through your Installation page on github, and I couldn't find manual installation instructions for those of us that use OBS-Portable. Having to put the plugin files into "%ProgramData%\obs-studio\plugins" ends up breaking the self-containment-ness that OBS-Portable establishes. Is there a fix for this, or perhaps something I overlooked?

Thanks for your time!
You can use the “*advanced-scene-switcher-*-windows-x64-legacy.zip” archive for this purpose.
Let me know if you need further support!

I have updated the wiki accordingly.
 
Last edited:
You can use the “*advanced-scene-switcher-*-windows-x64-legacy.zip” archive for this purpose.
Let me know if you need further support!

I have updated the wiki accordingly.
Oh great! I was thinking MAYBE I could use the legacy version, but I didn't want to screw anything up haha! Thank you so much! I'll give it a shot and reach back out if I run into any issues. Also thanks for updating the wiki! I'm sure that'll come in handy for others.
 
1781900645023.png


What happens in this setup? Do all conditions get evaluated, then macro properties saved to vars? Or do they get saved once that condition is just true?
 
View attachment 120132

What happens in this setup? Do all conditions get evaluated, then macro properties saved to vars? Or do they get saved once that condition is just true?
The variable mappings are applied after a condition is evaluated / an action is performed.

So, in the macro you took a screenshot of the Twitch condition gets evaluated, then the value of "User input for reward" is assigned to "TwitchInputText" and "User name redeeming the reward" to "TwitchInputUsername", next the Source condition gets checked, ...
 
Hi there,
still absolutely loving this plug in - literally runs my whole stream.

Question - is there a way for it to "listen" to the audio and if it detects a specific audio cue, it will trigger a command? Example for me is when I cast a spell (or if someone else casts the spell near me), i'd like it to turn on a few layers and start a timer.
 
Hi there,
still absolutely loving this plug in - literally runs my whole stream.

Question - is there a way for it to "listen" to the audio and if it detects a specific audio cue, it will trigger a command? Example for me is when I cast a spell (or if someone else casts the spell near me), i'd like it to turn on a few layers and start a timer.
Unfortunately there is no audio detection in the form of listening for specific audio / speech patterns at the moment.
Honestly I never looked into that before so I can't really judge how difficult it would be to implement.
 
Unfortunately there is no audio detection in the form of listening for specific audio / speech patterns at the moment.
Honestly I never looked into that before so I can't really judge how difficult it would be to implement.
Gotcha, no worries - appreciate the fast replies as usual !
 
Greetings. I'm looking for advice on something that used to work, but then perhaps changed in a recent update.

I have a titling macro set to update whenever the HTML file it's tied to changes. Basically, changing the "Now Playing" display on the screen.
Screenshot 2026-06-28 173010.png

File text changes --> Hide animation --> Refresh file text unseen --> Show animation

But recently, starting say a month or so ago, the file text immediately updates without even needing to refresh the file. So now it's become:
File text changes --> Text immediately changes on screen --> Hide animation --> Refresh file (which it already did, I guess) --> Show animation
title.gif


Is there any way to prevent the file from refreshing before I want it to? Or does anyone have any other ideas on how to handle this?
Thanks in advance.
 
Last edited:
Greetings. I'm looking for advice on something that used to work, but then perhaps changed in a recent update.

I have a titling macro set to update whenever the HTML file it's tied to changes. Basically, changing the "Now Playing" display on the screen.
View attachment 120249
File text changes --> Hide animation --> Refresh file text unseen --> Show animation

But recently, starting say a month or so ago, the file text immediately updates without even needing to refresh the file. So now it's become:
File text changes --> Text immediately changes on screen --> Hide animation --> Refresh file (which it already did, I guess) --> Show animation
View attachment 120250


Is there any way to prevent the file from refreshing before I want it to? Or does anyone have any other ideas on how to handle this?
Thanks in advance.
Hm .. I can't really think of any recent changes, which would be relevant here.
Do you remember with which version of the plugin it was working as expected?
Does it work as expected, if you add a "wait 1 second" action between the "hide" and "refresh" step?
 
Does it work as expected, if you add a "wait 1 second" action between the "hide" and "refresh" step?
...This actually worked. Thanks. Perhaps the macro was executing the refresh "after" triggering the hide animation, but wasn't waiting until the animation was finished.

Hm .. I can't really think of any recent changes, which would be relevant here.
My first guess was that maybe it was something that OBS did, but I can't be sure. 32.1 which was released late April has this in there, which might have done something. But who knows what.

32.1 Changes
  • Improved security of browser sources using local files [Warchamp7]

It's probably not anything major to worry about. But I might've been on Scene Switcher 1.33.1 at the time if it helps. Thanks again.
 
This is a fantastic piece of kit, thanks for developing! I have a specific use case but apologies if it's been asked and answered before. I use OBS to send multiple scenes to individual TVs around a hospitality venue. These scenes never make it to the program window, they always reside in the preview window and are sent via NDI using a dedicated NDI output filter. A lot of these scenes share sources, for example a network folder slideshow of promotional images. Usually, if we update the network folder, the only way of refreshing the images to allow new images to display is to completely unload the directory and then add it back in again as a new slideshow.

Is there a way of setting this up to be automated? I've tried using the scene item visibility but the problem I have is that this doesn't refresh the directory.
 
This is a fantastic piece of kit, thanks for developing! I have a specific use case but apologies if it's been asked and answered before. I use OBS to send multiple scenes to individual TVs around a hospitality venue. These scenes never make it to the program window, they always reside in the preview window and are sent via NDI using a dedicated NDI output filter. A lot of these scenes share sources, for example a network folder slideshow of promotional images. Usually, if we update the network folder, the only way of refreshing the images to allow new images to display is to completely unload the directory and then add it back in again as a new slideshow.

Is there a way of setting this up to be automated? I've tried using the scene item visibility but the problem I have is that this doesn't refresh the directory.
You might be able to refresh the slide show settings automatically with a macro like this:
1782747740989.png
 
This is a fantastic piece of kit, thanks for developing! I have a specific use case but apologies if it's been asked and answered before. I use OBS to send multiple scenes to individual TVs around a hospitality venue. These scenes never make it to the program window, they always reside in the preview window and are sent via NDI using a dedicated NDI output filter. A lot of these scenes share sources, for example a network folder slideshow of promotional images. Usually, if we update the network folder, the only way of refreshing the images to allow new images to display is to completely unload the directory and then add it back in again as a new slideshow.

Is there a way of setting this up to be automated? I've tried using the scene item visibility but the problem I have is that this doesn't refresh the directory.
Here's how I do it (assuming what you have is a folder full of slides, and you want the slides to automatically update when you change something)

So there's a folder called "SLIDES" and there is a OBS Image Slideshow playing the slides in this folder.

Set up your slideshow with the transition speeds and folder you use etc.
1782767294549.png


So now I create a macro

Have it use "Folder Watch" and look for "any changes" in the folder where your slides are.

If it sees a change, we'll have it force the imageslide show to update the folder and restart the slide show.
So create the view as beow, and then for "Set to Fixed Value" click on "Get Current Settings". (this gets whatever values you have for your own image slideshow)

1782767550824.png


Give it a test. If you add/remove a image for that folder, the systems detects the change, and resets the folder that the image slide show uses. This effectively cause the image slide show to restart, but with all the new (or removed) images.
 
Here's how I do it (assuming what you have is a folder full of slides, and you want the slides to automatically update when you change something)

So there's a folder called "SLIDES" and there is a OBS Image Slideshow playing the slides in this folder.

Set up your slideshow with the transition speeds and folder you use etc.
View attachment 120265

So now I create a macro

Have it use "Folder Watch" and look for "any changes" in the folder where your slides are.

If it sees a change, we'll have it force the imageslide show to update the folder and restart the slide show.
So create the view as beow, and then for "Set to Fixed Value" click on "Get Current Settings". (this gets whatever values you have for your own image slideshow)

View attachment 120266

Give it a test. If you add/remove a image for that folder, the systems detects the change, and resets the folder that the image slide show uses. This effectively cause the image slide show to restart, but with all the new (or removed) images.
Oops! Was already answered!
 
This might be a bit out there, but I figured I'd ask here.

I use Youtube Music to play music during my live streams, and I use Amuse to display the current song being played at that time. It also displays the total song length and how far along the current song is as well. YT Music doesn't support crossfade and so I thought I could sort of simulate the fading in/out of music by just increasing/decreasing the volume of the actual music Source in OBS itself.

After attempting various ideas I determined that I could use OCR to "read" the total length of the song, store it as a variable, and then subtract say 10 or 10 seconds to determine when i want the fade out to start and then store that as a separate variable. Since say "4:17" isn't something that can't be subtracted, I'd remove the colon and then get an actual integer. It seemingly worked until I realized that anything that's say 3 minutes long or 3:00 would become 300 and then 290, which doesn't really work when it comes to length of time. I also realized I had no idea how I could reinsert the colon without it being on the far left or right of said number.

I kept chipping at it trying to figure out if i could split the length of time into separate minutes and seconds variables specifically and then try some kind of math to convert the seconds and then somehow combine the numbers back together but it was late and something like this is just a bit out of my expertise.

I'm basically just asking am I over complicating things or is what I'm trying to do even possible? Thanks.
 
This might be a bit out there, but I figured I'd ask here.

I use Youtube Music to play music during my live streams, and I use Amuse to display the current song being played at that time. It also displays the total song length and how far along the current song is as well. YT Music doesn't support crossfade and so I thought I could sort of simulate the fading in/out of music by just increasing/decreasing the volume of the actual music Source in OBS itself.

After attempting various ideas I determined that I could use OCR to "read" the total length of the song, store it as a variable, and then subtract say 10 or 10 seconds to determine when i want the fade out to start and then store that as a separate variable. Since say "4:17" isn't something that can't be subtracted, I'd remove the colon and then get an actual integer. It seemingly worked until I realized that anything that's say 3 minutes long or 3:00 would become 300 and then 290, which doesn't really work when it comes to length of time. I also realized I had no idea how I could reinsert the colon without it being on the far left or right of said number.

I kept chipping at it trying to figure out if i could split the length of time into separate minutes and seconds variables specifically and then try some kind of math to convert the seconds and then somehow combine the numbers back together but it was late and something like this is just a bit out of my expertise.

I'm basically just asking am I over complicating things or is what I'm trying to do even possible? Thanks.
That is indeed rather complicated, but if you have figured out the OCR part to work reliably I think you have already done the most difficult part.
Assuming you have two variables named current time and total time I would suggest to use a condition of type "Script" to do the further string processing and time evaluation.

Something like this should do the trick:

1782931746350.png


Python:
import obspython as obs

def time_to_seconds(time_str: str) -> int:
    """Convert 'M:SS', 'MM:SS', or 'H:MM:SS' into total seconds."""
    parts = [int(p) for p in time_str.strip().split(':')]
    
    if len(parts) == 2:
        minutes, seconds = parts
        return minutes * 60 + seconds
    elif len(parts) == 3:
        hours, minutes, seconds = parts
        return hours * 3600 + minutes * 60 + seconds
    else:
        raise ValueError(f"Unexpected time format: {time_str}")


def seconds_to_time(total_seconds: int) -> str:
    """Convert total seconds back into 'M:SS' format (for display/debugging)."""
    minutes, seconds = divmod(total_seconds, 60)
    return f"{minutes}:{seconds:02d}"


def is_near_end(current_time_str: str, total_time_str: str, threshold: int = 10) -> bool:
    """
    Returns True if 'threshold' seconds or fewer remain in the song.
    current_time_str / total_time_str: e.g. '2:47', '4:17'
    threshold: seconds before the end to trigger (default 10)
    """
    current_seconds = time_to_seconds(current_time_str)
    total_seconds = time_to_seconds(total_time_str)
    remaining = total_seconds - current_seconds
    return remaining <= threshold

def run():
    try:
        return is_near_end("""${current time}""", """${total time}""", threshold=10)
    except Exception:
        return False

I hope that helps!
Let me know if you have questions!
 
Screenshot 2026-07-05 075726.png

I have zero clue what any of this is about, but I felt like posting here in case this is something you can fix this started after I got the recent update 1.34.2 before this update the message had never appeared for me.
 
Back
Top