Scriptplayer+ 0.3.0 — UI Overhaul, Media Library View, FunOSR Low-Noise Mode, Audio Volume Boost, and More

The next version was originally supposed to be v0.2.9, but since I ended up overhauling nearly the entire app, I decided to skip v0.2.9 and go straight to v0.3.0.

The demo screenshots still show v0.2.8 because they were recorded before release, before I updated the version number.

This update includes a redesigned app icon, a new library mode, improved multi-axis timelines, automatic connection for the dedicated remote, more stable Handy synchronization with network diagnostics, improved FunOSR SR1 output with a low-noise option, audio volume boosting, smoother random-script motion, and many other changes.

The biggest addition is the new dedicated library view, which was one of the most frequently requested features. Instead of browsing everything through the file panel, you can now browse your media in a thumbnail grid and quickly find content using search, filters, and sorting.

The Player, Library, and Settings sections have also been consolidated into a workspace sidebar on the left.

To prevent the app from slowing down as the library grows, media duration detection, album-art scanning, and folder scanning now run asynchronously in the background and use caching. Users with large libraries should notice the biggest improvement.


:card_index_dividers: Library Mode

The demo above shows title and path searching.

The long-awaited media library view mode has finally been added.

The previous interface was still based heavily on the original layout, and honestly, I was no longer satisfied with it. This update simplifies the layout with a vertical tab bar, and the existing panels can now be collapsed by clicking their icons again.

This should make it easier to focus on the actual video playback.

  • Player, Library, and Settings are now integrated into the left workspace sidebar

  • Existing file panels can be collapsed and expanded

  • Search by library title or file path

  • Video and audio filters

  • Script availability and rating filters

  • Adjustable card size

  • Script, subtitle, and multi-axis indicators on thumbnails

  • New app icon and internal branding

  • Redesigned About page and updated descriptions

:backhand_index_pointing_right: The rating feature itself already existed. This update simply makes it possible to use ratings as a library filter.


:high_voltage: Library Performance

The demo above shows sorting by media duration.

The library system has been optimized so that it remains responsive even with a large number of files.

  • Video and audio durations are read in the background and cached

  • Added sorting by media duration

  • Delayed library loading reduces player startup overhead

  • Added cancellation support for thumbnail processing

  • Stops unnecessary album-art searches for items that are no longer visible

  • Folder scanning now runs asynchronously to reduce UI freezes

  • Added album-art and media-duration caching


:framed_picture: Adjustable Library Card Size

The size of the library cards can now be adjusted to match your preferred browsing style.

You can make the cards smaller to display more items on screen at once, or enlarge them for bigger thumbnails and easier visual browsing.

  • Adjustable library card and thumbnail size

  • Smaller cards for higher information density

  • Larger cards for more detailed previews

  • The selected size is applied across the library view

:backhand_index_pointing_right: This is especially useful for large libraries, where smaller cards make it easier to browse many items quickly.


:bar_chart: Improved Multi-Axis Timeline

The timeline has been improved so that multi-axis scripts can be viewed more clearly while they are running.

The timeline appears a little too large in the first demo, but its height can be reduced manually.

  • Display two or more axes simultaneously

  • Added an All Axes selection button

  • Double-click an axis button to display only that axis

  • Display the current numeric position of each axis

  • Drag the divider between the video and timeline to adjust timeline height

  • Increased the maximum timeline height from 240px to 360px

  • Improved timeline line colors and speed visualization

:backhand_index_pointing_right: Previously, even when a script contained multiple axes, it still felt like you could only inspect them one at a time. Now you can display L0, L1, L2, and R0 together and compare them on the same screen.


:electric_plug: FunOSR · SR1

I have continued testing and using the FunOSR SR1 2.0 Twist unit that was provided to me.

One issue I noticed was that unless you live alone, the noise can make the device difficult to use. The Twist module is especially noticeable late at night, and even without the module, the device can still sound considerably louder than the Handy.

To improve this, I added an option to limit the speed of the Twist module, along with the random-script motion smoothing option described below.

On the SR1 2.0, these changes produced a noticeable reduction in noise.

  • Added real-time testing that lets you move serial axes directly with sliders

  • Added a center button that moves an axis to position 50

  • SR1 Bluetooth COM output is now limited to a maximum of 25Hz and uses TCode interpolation

  • Disabled unnecessary idle keep-alive output over Bluetooth COM

  • Added an SR1 2.0 Twist Low-Noise Mode

  • R0 Twist speed can be limited between 30–160%/s

:backhand_index_pointing_right: The SR1 2.0 Twist profile itself was already available in the previous version. This update adds the improved output method using 25Hz TCode interpolation and the new low-noise mode.

The low-noise mode only applies to the R0 Twist axis. It does not affect L0 or other profiles.


:game_die: Random-Script Motion Optimization

When using the existing random-script feature with the SR1 2.0, the movement could sometimes feel extremely rough, almost like the mechanism was scraping against a surface.

After comparing it with manually authored scripts, I found that random scripts often contained many small curves and abrupt transitions, causing the device to move too aggressively.

To improve this, I added a motion-smoothing option. I strongly recommend enabling it when using the random-script feature.

Since normal scripts generally do not need this kind of processing, the option only applies to randomly generated motion.

  • Added a Random-Script Motion Optimization option

  • Supports Off / Light / Balanced / Strong

  • Converts linear back-and-forth movement into cosine and S-curve acceleration

  • Preserves the original maximum and minimum positions

  • Preserves the original stroke timing

  • Random pause sections now correctly maintain the current position

  • Applied to both no-script random mode and random gap-filling

:backhand_index_pointing_right: Previously, random motion could feel like it was snapping sharply between the top and bottom positions. Acceleration and deceleration are now applied, making the movement feel much more natural.

The movement range and timing remain unchanged, so the overall intensity should not be reduced.

This option does not apply to normal funscripts.


:antenna_bars: Handy Stability and Network Diagnostics

A new Handy Network Diagnostics tool has been added to Settings.

It measures median latency, P95 latency, jitter, success rate, and server time offset, making it easier to determine whether synchronization problems are caused by your own connection or by the Handy servers.

In South Korea, latency in the 200ms range is generally normal because of the physical distance to the servers.

If your results are significantly higher than that, or if several of the 12 test attempts show unusually large spikes, there may be an issue with the Handy server or your home internet connection.


:video_game: Automatic Dedicated Remote Connection

The dedicated player remote that I previously developed can now reconnect automatically when the player starts.

I originally planned to include this behavior when the remote was first implemented, but forgot about it until I recently found myself needing it again.

  • Automatically connects to the saved remote when the app starts

  • Uses staged automatic retries after disconnection

  • Prevents duplicate connection requests between automatic and manual connection attempts

  • Fixed an issue where a second click was required after the first connection attempt failed

  • Added status polling to verify pairing responses

  • Important BLE commands now use a write method that guarantees a response

  • M5Stick S3 now displays only the A and B buttons that physically exist on the device

  • S3 no longer sends mappings for nonexistent C and PWR buttons

:backhand_index_pointing_right: Previously, the remote had to be reconnected manually every time the app was launched. Once saved, it should now reconnect automatically.


:headphone: Audio

  • Added experimental Audio Volume Boost

  • Supports up to 150% volume for audio files

  • A peak limiter is applied above 100%

  • Smoothed volume-slider input

  • Reduced main-process freezes during album-art searches

:backhand_index_pointing_right: This is intended for media that was recorded at a very low volume.

A limiter is applied above 100% to reduce clipping and distortion, but this is still an experimental feature and currently only applies to audio files, not videos.


:magnifying_glass_tilted_left: Automatic Script Matching

  • External script-folder indexes are now merged during the initial folder load

  • Improved cases where the list showed a green script icon, but playback reported No Script

  • Axis information from both local folders and separate script folders is now displayed together


:new_button: External Player Icons and App Icon

When the external-player feature was first added, I used the original commercial application icons directly.

To avoid potential copyright issues, the PotPlayer and JAVPlayer icons have now been replaced with newly drawn icons that retain a similar visual concept without directly using the originals.

The mpv and VLC icons remain unchanged because both projects are open source.

The Scriptplayer+ icon has also been redesigned. The previous icon was originally generated quickly with GPT because the app was not initially intended for public distribution.

The new icon now looks much more appropriate for a media player.


The Koeplayer and Scriptplayer+ Android versions are planned for release once my business registration process is complete.

The PC version of Koeplayer is also finished, but I am still deciding whether it should be sold separately or included as a benefit for supporters.

:package: Download

GitHub

Release

Feedback

7 Likes

Feature request: Saving Folders as favorites, opening a folder as a playlist, and clearing previous media so that one can control which folder/s are being shown.

i keep my different category videos in separated folders as thats how the Old Scriptplayer worked (GitHub - FredTungsten/ScriptPlayer: ScriptPlayer is a video player that controls the Handy and lots of other toys in sync with videos. · GitHub) which allowed loading adding a Folder as a favorite, Loading contents of that Folder as playlist, Moving files between folders via rightclicking the video, and a simple way to clear the playlist.

only downsides with that player was that it only allowed videos of certain mp4 codec and some wav files.

if you would make this Script player of your have this functionality it would be great.

currently i cannot find a button to clear added media only to move it to rubbish bin.

and to move files from one folder to another (moving the script, any preview gifs and timeline visualization png, and the video/audio itself)

as when i get new videos / scripts i first place them into folder “New - Sort first” in which folder i will go through any new scripts and test their functionality and move them to appropriate folder from there using the Old Scriptplayers ability to move files one folder to another. either from favorite folders list or manually selecting it.

Thanks for the detailed explanation. I understand the folder-based workflow you’re requesting, and I agree that it would be useful for organizing large media libraries.

I plan to add the following features without replacing the current library workflow:

  • Save frequently used folders as favorites
  • Open a folder as the current media list
  • Clear the current list without deleting the actual files
  • Move a video or audio file together with its matched scripts, subtitles, thumbnails, preview GIFs, and timeline images
  • Select the destination from favorite folders or browse for another folder

The favorite-folder section will be collapsible so it does not take up unnecessary space for existing users. Related-file moves will also include a confirmation screen and collision checks to prevent files from being moved or overwritten incorrectly.

Thank you for explaining your “New - Sort first” workflow. It makes the intended use case very clear, and I’ll use it as the basis for implementing this feature.

Thank you for bring us such a good player, its been 3rd day i got my device and enjoying it.

my feedback

  1. ‘Script Offset’ using hardcoded offsets, it would be good to have both quick preset levels and customize offset.
    Example scene: certain mmd video using a same motion file, but creator may adds a intro clip to the video, so the script will mismatch to the video.
  2. It would be good if the player remembers recent files, i don’t use Library tab personally for keep things simple, but at the same time i wish it remembers my recent plays automatically.

I also saw your comment about the player being closed-source. This kills possiblility of people doing their own modification, but i respect personal choices, keep it up!

Thank you for the kind words. I’m glad to hear that you’re enjoying the player with your new device.

Regarding Script Offset, I agree that fixed presets alone are not enough. The upcoming update will keep the quick offset buttons while also allowing users to enter an exact custom value, including offsets larger than the current range. This should help with videos that have additional intros or other timing differences.

A lightweight Recent Media list is also a useful suggestion, especially for users who prefer not to manage their files through the Library tab. I’ll look into automatically remembering recently played files, along with options to remove individual entries or clear the history.

I also appreciate your understanding regarding the project being closed-source. Feedback and detailed use cases like these are still very helpful for improving the player. Thank you!

I was about to sit and wait till next update, but just found a bug lol.

For unknown reason, merged multi-axis single file funscript seems playing only one axis.
But if I expand it to multiple funscript file, it works well… not sure if this has already been reported

Here is the script bugged:
https://discuss.eroscripts.com/t/multi-axis-neneg-ammy-full-video/309414

I’m using Kubuntu 25.10


Thanks for reporting this. A fix for combined multi-axis funscript files was already included in the July 17 hotfix, including the Linux packages.

Could you please reinstall the latest Linux build from the v0.3.0 release page and test the same file again? If it still detects only L0, the file may use a different merged-script structure that the previous fix does not cover. In that case, please attach the .funscript file directly so I can inspect its exact format and extend the parser accordingly.

I am writing here because I’m using 0.3.0.
The script is a free script on the thread I’ve written above

Thanks for reporting this. I tested the exact merged .funscript file you linked.

The file is a valid Funscript v1.1 file, and the parser included in the July 17 hotfix detects all of its axes correctly:

  • L0: 1367 actions
  • L1: 436 actions
  • R0: 139 actions
  • R2: 436 actions

This exact format was already covered by the combined multi-axis fix. Since the hotfix kept the version number at 0.3.0, an older and newer installation will display the same version.

Please completely close ScriptPlayer+, download the latest Linux package again from the v0.3.0 release page, replace or reinstall the existing application, and rescan the script folder.

If it still displays only L0, please send the Script Match Report and playback diagnostics from that installation. That will help me determine whether an older executable is still being launched or whether stale scan data is being retained.

My fault, it works now.
Saying ‘July 17 hotfix’ confused me a lot, as i thought the 0.3.0 itself is a hotfix. I guess it’s better to use Major[.]Minor[.]Patch version numbering which did not lead to ambiguous.
Anyway thank you for your patience