ScriptPlayer+ — A lightweight, clean desktop funscript player for Handy

Why I built this

I never really found a player in this space that felt properly focused on easy UX, broad compatibility, stable behavior, and fast startup all at once. A lot of tools do one or two of those things well, but not all of them together.

I also got tired of the “manage the library first, use it later” workflow. Library-first tools are great for organizing a large collection, but when adding new content I often found the rescan / reindex step a bit annoying when all I really wanted was to open something and start right away.

So the idea with ScriptPlayer+ is basically the opposite of that. Open a folder and start, or drag a video in and go. Even if the files are sitting on a NAS or shared folder, it scans quickly and picks up the media, matching subtitles, and matching funscripts without turning everything into a heavy library process first.

Key features

  • Instant folder browsing — no library import, no reindexing. Open a folder or drag a file and go
  • Automatic script detection — matches funscripts to media by filename automatically
  • Automatic subtitle detection — finds and loads matching subtitles without manual setup
  • Audio-first support — doujin voice / audio-only content with subtitle, script, and artwork detection
  • Handy support — connects via Wi-Fi (connection key). Main supported device
  • EroScripts integration — login, search, and download scripts directly inside the app
  • Timeline & heatmap views — visual script preview without leaving the player
  • Responsive UI — no freezing or “Not Responding” states, even on large folders or slow storage

Video playback

One thing I wanted to improve was automatic detection. A lot of players still make script loading and subtitle loading feel more manual than they should. If the files are named reasonably, ScriptPlayer+ usually finds what it needs with very little setup.

Audio playback

Audio is treated as a real use case here, not a secondary feature. Doujin voice and audio-only content gets subtitle support, script handling, and artwork detection just like video does.

EroScripts search & download

EroScripts login, search, and download are built in, plus timeline and heatmap views, so it’s easier to stay inside one workflow instead of bouncing between tools.

Handy connection

The Handy connects via Wi-Fi using a connection key. Just enter your key and you’re good to go — no extra setup or pairing steps needed.

Intiface connection (experimental)

Intiface / Buttplug integration is implemented and available as a separate experimental build. Note that I don’t own a compatible device myself, so this hasn’t been verified on real hardware yet. If you’re an Intiface user and can provide ongoing feedback, that would go a long way toward improving this feature.

Details

  • Platform: Windows / MacOS(self-build)
  • Install: Portable (no installer needed, just extract and run)
  • Device: The Handy (Wi-Fi connection via connection key)
  • Intiface / Buttplug: Experimental build available (see above)

Downloads


If anyone wants to try it, I’d really appreciate feedback on playback usability, subtitle/script matching, the EroScripts flow, and device compatibility. Happy to hear suggestions too.

18 Likes

I noticed this was using Electron, can this also be built for Linux? The readme only mentions Windows and Mac.

I hadn’t considered demand for Linux environments. Since I have an Arch Linux laptop, I’ll include a Linux build starting from version 0.1.5. Note that it may not work on Alpine Linux, as it uses musl instead of glibc.

3 Likes

I have problems with fullscreen mode, for some reason the image does not become a full screen, but with black borders(screenshot)… I have 1920x1080 monitor(win10), if that matters.

About intiface, I only have one device, and it worked perfectly with some files, but with others, for some reason my device was active, although there was 0 activity according to the script. I do not know why, but I managed to fix this problem in the “Stroke Range” menu by turning on or off the “Inverse Stroke”. Perhaps this is not a problem of the application, but on the side of the script creator, who knows… Otherwise, I haven’t encountered any problems yet.

I’ll say in advance that I have no real experience in coding and I do not know if this is possible. I would like to suggest an idea to show a preview of the video in the file list(still fine without it btw). May be ability to sort would be nice too, for example, by the last added.
I also apologize for my English, it is not my native language.

In conclusion, I want to say that I like this application more than usual ScriptPlayer. Thank you for your work.



The issue where even 16:9 videos appeared cropped was caused by the layout implementation of the timeline, heatmap, and playback control bar, which intentionally reserved empty space.

I was already aware of this, but fixing it as intended caused layout instability and misalignment in those components, so it was left unchanged. However, I revisited the problem and managed to resolve it—now in fullscreen mode, the video no longer gets cropped while all layout elements continue to function properly.

This fix will be included in a new build for version 0.1.7 and distributed as an update.

As for Intiface, it was originally supported as an experimental implementation before native support for funosr was introduced. Because of this, the implementation is not fully complete and does not guarantee perfect compatibility across all features or with all strokers.

Improvements are possible if someone with experience in strokers or Intiface-related development contributes, but for now, please understand that it remains an experimental feature.

1 Like

is there a way to leave fit to screen and the heatmap on as opposed to toggling it for every video?

Finally a good player/playlist manager that works well on Linux! Thank you :heart:

I feel like these buttons should go to previous/next in the playlist and not go back/forward by 5 seconds.

My Handy 2 Pro will connect and everything exept moving of the handy is happening.
Using handy server, not intiface.
How come??

I get error: HSSP play failed: 400

And the app needs a way to alter the sync speed of scripts.
Wonderfull start anyhow :smiley:

1 Like

been getting this HSSP error as well, first day app worked no problems now it cant stay connected

During the process of upgrading to version 0.1.9, we encountered an HSSP path error while adding new features. Although the exact cause is unclear, it seems that the result from that stage of development was mistakenly included in the release.

We have confirmed that this issue occurs when downloading version 0.1.8 from the GitHub releases. Since this problem has already been resolved in the subsequent release we were preparing, we would appreciate it if you could use the upcoming version 0.1.9 once it is published.

1 Like

In the 0.1.7 release, we added a floating UI and keyboard shortcut features for navigating to the next and previous videos, making them easier to use.

Even if you’re not satisfied with the button placement, you can still control these functions using keyboard shortcuts. You’re free to customize and use the shortcuts as you prefer.

In the Settings, under the Timeline tab, there are options for “Show Timeline by Default” and “Show Heatmap by Default.”
If these options are enabled, those elements will automatically be turned on or off when you open media that contains a script.

1 Like

you really thought of everything, goated

Is there a script “Range Extender” like there is in Liquid’s Scriptplayer? If not, can I request that this feature be added?

TLDR: your software has been very good.

I’ve only tested a few things out so far with ScriptPlayer+ v0.1.9 but already it’s looking really good & has been more usable for me than regular ScriptPlayer up to the latest beta v1.2.3.470 or that other one that’s popular. Some things I like in ScriptPlayer+ are:

  • It can play .webm files without any issue - ScriptPlayer always seems to give up trying to open these files for me so then I would have to convert everything or load those videos in MPC-HC.
  • Subtitles that wouldn’t display for me in ScriptPlayer (srt files) even with subtitles ticked so they should be shown… they load fine in ScriptPlayer+ and can be toggled straight from the same window.
  • It looks to have download options for other operating systems, more alternatives are nice to have in case other players have issues.
  • The script variant selector that lets you immediately swap between multiple versions (like a slow, normal or fast speed version / script based on the audio content) is very handy; I often make several versions of the same script with those tools like FunscriptFlow, FunHalver and FunscriptGenerator and having them all be detected is great.
  • Any more future Intiface support will mean easy access for devices without needing to access websites that might get blocked in your region or in case the site disappears or now requires additional ID to be submitted (sites like Xtoys might not always be there and might not work as offline saved copies).
  • It shows a thumbnail of the video you are hovering over if you have a list of videos, so you know what content videos that haven’t been renamed like “87065972.webm“ are without having to open them up.
  • The filter by multi-axis only toggle isn’t usable for my single-axis devices but I can see the benefit.

Letting you drag funscript files and SP+ loading the video that way might be nice. Maybe being able to create a video playlists would be a good addition or some might like an option to keep the window always on top (good for single monitor) but it seems pretty complete for playing content already.

  1. A bug I found is that if you load a video file > click the options cog wheel and select Timeline > toggle either one of the Show … by default sliders > exit the menu and then try to click the seek bar of the video somewhere (such as to jump to the middle of the video); the seek bar and timeline won’t work and instead the video will only let you playback from the very beginning until you change to a different video where the timeline works again.
  2. The audio in a few videos wouldn’t output (audio in the program wasn’t muted and the videos played back audio fine in other players).
  3. If you have multiple funscripts that are different case (FILE123.mp4, file123.funscript, file123 (0).funscript) then some or all of the funscript files might not be detected. Having scripts with names like (YK_yosonoko05_C_large.funscript) and (YK_yosonoko05_C_large audio.funscript) will only show the first script and not let you choose the second.

Thank you for the detailed feedback. I’ll look into the cause of the bugs you reported when I have time.

Thanks again for the helpful feedback, and I hope you have a great day.

1 Like

Tried this new scriptplayer+, works fantastic, but script can’t load automatically. I will have to search for the script to run it manually. Am I missing something?
What’s really interesting is that there is a “green icon” beside the filename that script is detected, but it just fail to load.
image
image

The fastest way to work around is to Open File location, then drag drop the script into the player.

Thanks for the report.

The green icon means the app detected that there is probably a matching script near that media file.

However, detection and actual auto-loading are slightly different steps.
So it is possible that the app detects a script candidate, but fails to decide which exact script should be loaded automatically.

This can happen if there are multiple script variants, slightly different filenames, separate script folders, network/NAS paths, or multi-axis script files without a clear main L0 file.

Could you provide:

  1. The video filename
  2. The script filename
  3. Whether the script is in the same folder as the video or in a separate script folder
  4. Whether there are multiple scripts with similar names
  5. Whether the path is local disk or network/NAS
  6. If possible, a screenshot of the file list showing the green icon and the script variant panel

For now, the safest naming is:

video.mp4
video.funscript

For multi-axis:

video.funscript
video.roll.funscript
video.pitch.funscript
video.twist.funscript

I’ll check the auto-load logic so that if the app shows the green icon, it should also either load the script automatically or clearly show why it could not.

I’ve noticed that there is a playback quality difference in ScriptPlayer+ if you connect via provider (Intiface) that doesn’t happen if you connect this way using ScriptPlayer.
This happens on the current version of Intiface Central and ScriptPlayer+ as well as older versions.
The simulated device function in the newest version (Intiface 3.1.0+42) is helpful for seeing the playback differences without hardware but I’ve also attached some images below when using a Handy 2.

  • * ScriptPlayer+ with provider (Handy) - playback is smooth as expected.
  • * ScriptPlayer with provider (Handy) - playback is smooth as expected.
  • * ScriptPlayer+ with provider (Intiface) - playback is jittery even when using lower intensity scripts made using FunHalver that are fine in ScriptPlayer.
  • * ScriptPlayer with provider (Intiface) - playback is smooth as expected.

This first image shows what the output is like when connecting from ScriptPlayer, this output plays smoothly:
ScriptPlayer playback

This second image shows what the output is like when connecting from ScriptPlayer+, lots of stops and starts. I’ve tried adjusting settings but not managed to match smoothness:

This is what the timeline is like for the video section playing:


Attached are device & playback diagnostics and issue report files that include most details like video name, the video was placed on a local ssd drive and in the same location. Let me know if anything else is needed.
ScriptPlayer+ Device Diagnostics.txt (1.5 KB)
ScriptPlayer+ issue report.txt (1.3 KB)
ScriptPlayer+ playback diagnostics.txt (1.1 KB)

Thanks, the diagnostics help a lot.

This looks like an Intiface/Buttplug LinearCmd smoothness issue in ScriptPlayer+, especially with The Handy 2 Pro through Intiface. Handy direct mode uses a different sync/upload path, which explains why it stays smooth there.

I don’t think this is a video playback issue. It is more likely that ScriptPlayer+ is sending short LinearCmd updates with timing that can become slightly irregular, causing the device to finish one small movement before the next command arrives. That would appear as repeated stop/start motion.

This fix is not in the currently posted build yet, but I’ll work on it for the next release candidate by improving the Intiface command timing / movement duration and adding better Intiface timing diagnostics.

Thanks again for the detailed report.

1 Like