Not sure if we have the same issue but my MFP local repo matching was incredibly slow due to the ACL on my network share. If you are accessing via smb I would double check your ACL isn’t slowing down the recursion.
I can consider adding a static index that you have to manually refresh. But otherwise I’m not sure I can outsmart the amount of optimization that is baked into file systems with caching or file system watchers.
Tho most of the time when the search is slow either the file system is miss configured, or you have a lot of files which is not really a common use case.
It definitely is in part related to my file system. It is ~49k files on a LAN NAS mapped network drive.
Specifically, I am running MFP on windows connected by ethernet to a LAN with a Synology NAS running a Stash container with the scripts all paired with the videos on the NAS filesystem.
A static manual index would probably work and be great for me as I don’t mind front loading processing if it reduces time searching otherwise. Also an ignore folder regex option could possibly help a little (though probably not fully fix it) as a lot of the files are still pictures that are in the artist folders and can be skipped.
hmmm quick question. what is your gui framework? i want to see if its linux compatible. i have been unable to do anything to get MFP working under linux. i am learning C#/.net to see if i can help port it to linux but if your gui framework is not compatible or at least not using something like avaloniaui which is a WPF/XAML compatible framework that is cross platform (windows, linux and mac)
Yea, 10 minutes for 50k files is very bad, like I said I tested with my windows nas and it took <10s for 50k files. It’s not a bottleneck in MFP code, your nas is just very slow to enumerate the files for some reason.
Its WPF, so it requires full rewrite in avalonia for it to be cross platform.
Some people have success with running MFP in linux thru bottles or proton.
It means you have a script loaded, but your motion provider blend slider is set such that it will override the script, I think it has to be set to more than 50%.
I have discovered a solution for multi-script support with Stash + MFP (for now at least). I had forgotten that the StashInteractiveTools plugin caches copies of the scripts for videos when you open them up in
stash\config\plugins\StashInteractiveTools\StashInteractiveTools.scripts\1773\video_name.funscript
I didn’t use this before because it is a separate system for the plugin of serving scripts for the VR implementation and Handy if I remember right and MFP reads from the script that is served by Stash itself.
This means the .scripts folder only includes folders of funscripts and is order’s of magnitude smaller. Setting the .scripts folder as a local script repo allows it to take <1s if it is already cached and usually 5-10s and clicking the refresh script option if it is the first time opening the video for the script to be copied and for MFP to notice that the script library has updated.
For future reference, I am using Stash v0.31.0-2da80743, StashInteractiveTools 1.1.1-next.1, MultiFunPlayer v1.34.2.d01941a
Regarding my previous issues, I did also refresh permission inheritance as suggested above, clear the NAS recycling bin, and make some other network changes that have cut the enumeration down from like 10 minutes to 1 minute the other way on my setup, but it was still kinda annoying (though it did fix an issue I was having with unzipping on the NAS having become drastically slower).
If you’re also using Stash you can just serve a merged funscript directly to MFP over your local network. Turn off all repositories except Stash, select local match type = none, Match Axis to Script = L0. Stash only supports serving a single funscript, but if you use a merged 1.1 or 2.0 funscript you can serve all of them to MFP in that single file.
That’s what I do and it’s pretty much instant. I would double check your Synology ACL isn’t messing with things too, my NAS had the exact same issue you’re describing and when I swapped from POSIX to NSFv4 it pretty much fixed all parsing issues. This was on RAID1 2x8TB sharing via smb to a windows machine.
Yes, that is what I was doing for some multi-axis that I merged (I haven’t gone through and merged all scripts yet, want to find or make a script to do it at some point), but I am talking about having multiple scripts for the same video (i.e. soft, normal, hard or multiple scripters). This allows you to use the dropdown menu to select which one you want.
For instance,
I would only see 1054.funscript served by stash which is just the default TOCC script but this would let me swap to the other scripters’ version.
I will look into NFSv4. My understanding is that it is mostly a parallel service to SMB and especially used for linux and that it wouldn’t really affect SMB usage. Do you mean you swapped the windows from SMB to NFS, or does just enabling the NFS change the ACL system and fix it even for SMB? I do see some info that NSFv4 added a new ACL system that mimics windows. And to enable it, did you just enable the NFS service in File services, leave “Apply Default UNIX permissions” in advanced settings checked, then Edit NFS permission for the shared folder? Or was their more?
I actually run TrueNAS so i’m not familiar with Synology UI tbh. Also my bad but I was trying to remember how I rebuilt the ACL and realized I stripped it and applied a custom one for my SMB shares. So I actually got it backwards in my comment sorry for the confusion, to fix my smb shares being slow I removed my default NSFv4 ACL’s and applied simple POSIX perms that gave only my client username read/write.
The default ACL created when making a new share was what created the long parse times. I’m guessing because it was trying to authenticate through the ACL for each individual file every time it tried searching a directory.
I just covered my light sensor inside the headset so it never knows if it is on my face, manual on and off then!
Quick question, when using a vibe i found that even if i right click and invert the script, the script still plays normally where the super high flat parts you would think would be 100% just end up being 0. It seems like it can build up to 100% but inverting did not change the way it played the script. It does flip the script in the heatmap, but it doesnt seem to change what it considers 100%.
For example : This here will play the long flat part as 0 depite being the top, but when i flip it, it does the same of 0 for the long flat part. Is there some other invert option im missing or is there a setting i need to change to make it reflect the flat as a 100% when inverted ?

The invert option on the heatmap is only visual.
You need to use script invert toggle that is in the per axis settings below.
Ah thank you, yeah missed that.
MultiFunPlayer v1.34.4:
Download: timed patreon only exclusive
Patreon build: https://www.patreon.com/posts/152640087
1.34.4
- Fix crash when trying to edit device funscript names
- Fix unable to clone or rename devices
1.34.3
Additional patreon only changelog:
- Fix SLR video not getting detected after navigating the page when using Web source
Changelog:
- Show axes used in script groups
- Add support for videojs-vr players in Web source, used for example in Stash
- Add AdditionalDuration to PolledUpdate
- Process script repositories in parallel
- Fix Plex accounts list showing duplicates and empty names
- Fix script group color not updating when changing theme
- Fix json logging causing UI lag when deserializing even when disabled
- Fix funscript reader doing a lot of unnecessary deserializations
- Fix script libraries not streaming search results
- Fix local script repository causing the script refresh task to still run after cancelling
1.34.2
- Fix potential crash when changing media
- Fix possibility of wrong scripts or no scripts getting matched when rapidly changing media
- Fix mpv generating unnecessary path change events when using playlists
- Fix script drag-drop not adding scripts to the list
- Fix scroll wheel not changing scripts when hovering over script list popup box
- Fix selected script clear button not working
- Fix changing link axis target not causing the script to be updated
- Fix bypass all/none buttons not working
- Fix ability to set smart limit input axis to self
- Fix ability to set motion provider update with axis to self
- Use accurate UTC time for logging
1.34.1
- Allow saving passwords in Web window when not in private mode
- Create config backups when migrating to new config version
- Fix unable to connect to outputs due to exception when generating TCode
- Fix Web window only having 1px resize border
1.34.0
Additional patreon only changelog:
- Add support for matching all scene scripts in SLR repository, previously only latest user made or ai made script was used
- Add support for watching SLR 2D/VR videos in Web source with script streaming
- Add support for multi-axis scripts in SLR repository
- Add support for multi-axis scripts in FapTap repository
- Add support for matching all scripts in HereSphere repository, previously only first script was used
- Fix SLR repository not working with hls_h265 videos
Changelog:
- Update to .net 10 (performance improvements)
- Add support for matching multiple scripts per axis
- Allows matching scripts from multiple sources to a single axis, for example multiple script libraries or HereSphere/SLR repotiory scripts.
- Matched scripts are organized into colored groups (except when a group contains a single script, then the group has no color). When switching between groups all other axes also switch to that group, when switching to a script within a group only that axis script changes.
- For example when switching L0 from orange to purple group, other axes like R0/R1/R2 will switch to the first script in purple group, while switching L0 from first to second script in orange group will not change scripts in other axes.
- Users can add shortcuts for easily switching scripts (actions Axis::Script::):
- Next/Previous script
- Next/Previous script within current group
- Next/Previous group
- Add support for alternative script names (#145)
- MultiFunPlayer now matches script files that start with video file name, so additional text can be added after. For example if the currently played video file is
MyVideo.mp4, valid script file names for the L0 axis would beMyVideo.funscript,MyVideo.slow.funscript,MyVideo [fast].funscriptetc., andMyVideo.twist.funscript,MyVideo.slow.twist.funscript,MyVideo [fast].twist.funscriptetc. for R0 axis.
- MultiFunPlayer now matches script files that start with video file name, so additional text can be added after. For example if the currently played video file is
- Rework sync settings to allow ignoring sync per setting/event
- Allow hiding unused heatmaps when heatmap is split per axis (#205)
- Rework Plex source to use user sessions instead of clients
- This allows use of all Plex clients instead of only few select ones, but control (seek, play/pause etc.) from MultiFunPlayer UI can still only happen for those select clients (needs “Advertise as player” enabled)
- Add ZoomPlayer support (#134)
- Optimize TCode command generation for high frequency updates
- Improve UI responsiveness
- Fix possibility of some migrations to not run by changing config version from integer to date
- Fix additional elapsed time could cause devices to exceed range limits
- Fix stuck keyframes preview when media is reset while the popup is open
- Fix heatmap “split axes” and “normalize heat” settings not loading
- Fix shortcut action configurations not getting marked as valid when missing action gets registered
- Fix pasting actions from clipboard not preserving enabled state
- Fix duplicated JSON logging
- Fix keyframes tooltip content overflowing available space
- Fix motion providers not updating time in UI
- Fix possibility of unwanted motion when keyframe collection changes at current script position
- Fix The Handy output ignoring range settings
- Fix custom curve motion provider time overshooting set duration
- Fix Plex timeout exception when using auto-connect
- Fix ability to shrink output range size below 1% using actions
- Fix mpv downloader using old boostrapper script
- Fix mpv download popup showing when trying to connect to external instance with auto-start disabled
- Fix keyframes tooltip performance degradation when showing script end
- Many other small fixes and improvements
Additional plugin changelog: (plugin samples):
- Use ignored preprocessor directives for references (
#:reference) - Add ability to set plugin metadata which will be visible in UI (
#:name,#:version,#:author,#:description,#:url) - Add OnLaunch() method, called after settings are loaded
- Call Close() method before saving settings
- Add new helper methods to DynamicKeyframeCollection
- Add ability to broadcast PolledUpdate events from actions
- Prevent possible object disposed exception in PluginBase when using CancellationToken property
- Force actions invoked inside other actions to be run directly to prevent dead locks (#196)
- Fix plugin compile/dispose race condition when handling file events
- Fix DynamicKeyframeCollection RemoveRange removing additional items
If you like what I’m doing, please consider supporting me on Patreon
https://www.patreon.com/yoooi
Just FYI in v1.34.3 I made some improvements that might give a boost to large libraries.
I don’t know how much or if at all it will be faster, let me know if you manage to test it.
I’ll check it out, thanks for the heads up.
It does seem to find scripts faster now, around 3-7 seconds when changing scenes playing from mpv popup with MFP. Local repository matched to smb network shared drive.
It’s a little longer with Stash web popup local repo matching, about 5-10 seconds. This was with Stash plugin on, localScriptMatch on match to axis off, local repo on mapped to smb shared drive.
The fastest for me is still stash plugin on, local repo off, localScriptMatch off, matchToAxis on and set to L0. 1-2 seconds.
My stash instance uses NFS share, then serves that file to MFP via query call. So i’m wondering if MFP local repo via network share might have improved performance if I swapped to NFS from SMB. Will do some experimenting and let you know.
I have a samsung tizen with Jellyfin and the jellyfin server is broadcasting from my PC which also has MultiFunplayer.
Anyway to play scripts so that if i play a video on my tv or vr inside jellyfin player/app the scripts automatically start playing on handy?
I am not even able to connect to the jellyfin inside the MultiFun app.
Jellyfin TV app only works in v1.33.10 or later because it required some special handling I didn’t know of.
You need to enter the api key then refresh the clients. Then you should see the Jellyfin TV client in the list, and you should be able to connect, but you won’t receive any playback information.
Other clients should work fine.
I think I will rework Jellyfin/Emby so that you are selecting users not clients like I did with Plex, that should simplify things.
For The Handy you need to use Intiface/buttplug.io and connect it using bluetooth to your PC.
Then in MFP under buttplug.io output, map L0 to The Handy and switch it from FixedUpdate to PolledUpdate.
Hello! I know this isn’t technically the right place to put this, but I figured this might get someone who can guide me in the right direction to get the recent public release of MFP 1.32.1 with the mod done for Aria Sucubus. I posted about this in the thread dedicated to that mod a little while ago but haven’t gotten a response, so I figured I’d try my luck here since it seems a little more active.
thank you for any help in advance!



