MultiFunPlayer v1.29.4 - Multi axis funscript player - Now with SLR script streaming

What client are you using?

I know Plex for Windows doesnt work.
I know Plex Media Player and Plex on iOS work, Plex for HTPC should work too.
Don’t know about other clients.

windows. so that is the issue then.

what media player do you recommend using on Windows ?

If you mean plex then dunno, I use plex for windows.
If you mean in general then for VR HereSphere, for 2D mpv or mpc-hc (clsid2 builds).

Hi. I am trying to figure out how to get multi-axis scripts to automatically work with MFP + SR6 + HereSphere + XBVR. I host my videos and funscripts in XBVR and play them using HereSphere. I connect MFP to my SR6 and HereSphere. MFP receives video info but does not load funscripts automatically. Funscripts may be in different paths and use different names than the original video, and HereSphere / XBVR will convert the sent video name anyway into a different format.

I think HereSphere should send metadata in json format via API to MFP, and MFP should be able to read the funscript file path from there. Why does it not work? Is there any simple way to automatically load XBVR configured funscripts in MFP? Thanks.

I wish not to manually rename each funscript file to match with the video file names since I’ve already done the linking in XBVR.

EDIT: Maybe the easiest way to implement support for XBVR served funscript files is to get funscripts via XBVR HereSphere web API. It is really easy to use JSON API. Maybe consider this integration? It would make lives a lot easier. Thanks.

I implemented support for getting multi-axis funscripts automatically from XBVR by adding the following to the end of ScriptViewModel.cs → SearchForScripts() method:

        // Try to get from XBVR
        if (MediaResource.Remote && MediaResource.Name.Contains(" - "))
        {
            var xbvrID = MediaResource.Name.Split(" - ")[0];
            var xbvrURL = $"http://localhost:9999/heresphere/{xbvrID}";
            using var client = NetUtils.CreateHttpClient();
            var response = client.GetStringAsync(xbvrURL).Result;

            var info = JsonConvert.DeserializeObject<XBVRMediaInfo>(response);
            foreach (var funscriptFile in info.scripts)
                TryMatchName(funscriptFile.name, FunscriptReader.Default.FromStream(funscriptFile.name, "C:\\Interactive", client.GetStreamAsync(funscriptFile.url).Result));
        }

You will also need these classes:

 public class XBVRMediaInfo
 {
     public string title { get; set; }
     public List<XBVRFunscriptMetadata> scripts { get; set; }
 }

 public class XBVRFunscriptMetadata
 {
     /// <summary>
     /// File name with extension.
     /// </summary>
     public string name { get; set; }

     /// <summary>
     /// File URL.
     /// </summary>
     public string url { get; set; }
 }

Maybe not the safest or best approach but it works. Have fun!

The code above is granted to you with MIT license - use it however you want. I will not create a Github pull request or tidy the code in any way since I don’t want to link my personal Github account to pr0n. :wink:

2 Likes

It’s a bit of a pain because XBVR serves a different name to the video player. For single axis scripts it’s not too bad, just use the export funscripts function and save them somewhere (that XBVR wont scan else it will try add them again), then add that folder to the script libraries in MFP.

Multi-Axis makes things more complicated because XBVR currently doesn’t support them so will require some manual renaming. It’s not a huge issue because I don’t have too many multi-axis scripts.

What I do is add the base script to to Stash (my VR MA folder), the exported scripts go in the XBVR folder, then I move the MA scripts to the XBVR MA folder along with the other axis scripts. I then have to rename the scripts for the other axis to be the same as the one from XBVR.

image

1 Like

Haha I just got rid of the pain, check my code above and apply it to MFP :wink:

1 Like

Oh, nice work :+1:

Also, if you want to use MFP for single-axis use as well, add this (hacky) code to the end of DeviceAxisUtils.cs → FindAxesMatchingName() method:

// If no matches were found, set this script for stroke axis (i.e. single axis script)
if (!axes.Any(axis => axis.FunscriptNames.Any(n => scriptWithoutExtension.EndsWith(n, StringComparison.OrdinalIgnoreCase))))
{
    yield return axes.First(axis => axis.Name == "L0");
}

With the code above, you can use MFP with, for example, Kiiroo Keon:

Love this app so much. I’m struggling lately though as any new shortcuts I add don’t save, they’ve gone next time I start the app. I searched the thread but can’t find anything. Any help? Using 1.26.1 Patreon edition

MFP probably doesnt have permissions to save for some reason.
You can try running as admin, and check the end of log files for any errors when saving the configuration.

2 Likes

Thanks man, this was the case. I’m not entirely sure how to give it back permission in regular use but I’ve just run it as admin and made the changes I wanted. In fact it hadn’t even been able to update the log for the last week in regular mode.

MultiFunPlayer v1.27.0:

Download:
Patreon build:

  • Update to .NET 8
  • Add VLC player support (#135)
  • Add dark theme (#8)
    MultiFunPlayer_nlqkJ4y63O
  • Add horizontal app layout (#144)
  • Add support for multi button gamepad gestures (#142)
  • Allow plugins to read application state (#139)
  • Add support for TCode button and TCode analog input
  • Add theme reset button
  • Force seek on each OFS position change message (#131)
  • Fix UI freezing when opening application settings
  • Fix high memory usage when compiling plugins
  • Fix plugin list not responding correctly to file system events
  • Fix buffer corruption when using DeoVR or HereSphere with TCP output
  • Fix point canvas preview scrubber getting out of bounds
  • Fix mouse axis gesture delta getting clamped
  • Fix custom axis transition value not getting clamped
  • Fix custom axis transition not behaving correctly for short durations

If you like what I’m doing, please consider supporting me on Patreon

2 Likes

Is it possible when there isn’t a script available for a particular video, it just uses a fallback directory with scripts and just picks one?

What does this do?

image

Not really, could be done via a plugin tho.

Its a sample/preview of the random motion, it responds to changes to octave/persistance/lacunarity settings, it generates a new one when you click it.

Brand new to this, so apologies in advance if this is a dumb question:

Trying to use MFP with DeoVR and SLR on a single-axis machine (Hismith). Everything is connected and green. What I have tried now is using Device Map with Axis L0, Hismith, Oscillate, 0. However the motion doesn’t seem to line up great, what should I be looking to adjust? The Axis Values? A different axis than L0? An offset somewhere? Or is MFP not the best choice because it is meant for multi-axis machines?

Also, when I pause DeoVR, the machine keeps going. I have tried turning of Auto-home, but that didn’t fix it.

TIA, amazing work!

The motion will never line up because you are controlling hismith RPM while scripts are designed for stroke height.
But go to device settings via the cog button at the top of the window, clone a device and set L0 default value to 0. Then restart and enable auto-home and check auto-home inside script. You might want to play with different auto-home delay values to see what works best, 0s will instantly stop when you pause the video.

1 Like

Thanks. Is there anything I can do to improve how well it lines up or is what I have done with Device Map setting Axis to L0 the best I can do?

I have looked for something that converts multi-axis scripts to single-axis scripts, but only found something for the other way around. Or is multi/single-axis not the core issue, but rather that Hismith is focused on RPMs?