FunLibrary Manager - a library for your scripts and videos including toy integration and streaming server

to find possible problems you can do the following:

  • run the environment check from the help menu
  • create a diagnostic-bundle from help menu and send it to me please
    also which device are you using?

does the software need continues patreon membership to stay unclock file limit?

at the moment yes

Pausing behavior seems inconsistent with the solace pro through intiface. Sometimes the toy pauses when the sync does, sometimes it doesn’t at all, and sometimes it just keeps doing whatever pace it had at the moment of the pause.

please send an diagnostic bundle

this is the behavior I encountered with the solace pro myself, I have since moved on to a new device. I believe it has something to do with the update intiface 3.0 as I find it happening when FLM is not running. I have yet to test on the older version.

i did some changes that could possibly fix this or at least would improve it.
Will be in the next release

Release preview:

Release Notes - v0.11.2

TCode Direct Device Backend (BETA)

New direct TCode device backend for controlling OSR2, SR6, and other TCode-compatible devices without requiring Intiface Central.

Features

  • Multi-Transport: Serial (USB) and network (TCP/UDP) connections
  • Multi-Axis: Full support for L0 (stroke), L1/L2 (surge/sway), R0/R1/R2 (twist/roll/pitch), V0 (vibrate), A0 (valve)
  • Direct Serial: Connect directly via COM port — no middleware needed
  • Network Mode: Control devices over TCP or UDP for remote setups
  • Auto-Detection: Scans available COM ports and shows device descriptions
  • Low Latency: Direct communication without Buttplug protocol overhead

Setup

  1. Go to Settings > Device Sync
  2. Select “TCode Direct” as backend
  3. Choose transport: Serial, TCP, or UDP
  4. For Serial: select COM port and baud rate (default: 115200)
  5. For Network: enter host and port
  6. Click “Test Connection” to verify

Supported Devices

Device Connection Axes
OSR2 USB Serial L0, L1, L2, R0, R1, R2
SR6 USB Serial L0, L1, L2, R0, R1, R2
SSR1 USB Serial L0, R0
Custom TCode Serial/TCP/UDP Configurable

BETA: This feature is under active development. Please report issues.

Offline License System

New offline licensing for users who cannot reach Patreon (e.g., behind the Great Firewall of China or on restricted networks).

How It Works

Instead of authenticating via Patreon OAuth, users can import a .license file that grants the same tier benefits. License files are:

  • Email-bound — the license is tied to the email address it was issued for
  • Time-limited — default 90 days, with a 7-day grace period after expiry
  • Cryptographically signed — Ed25519 signatures prevent tampering

For Users

  1. Receive a .license file from the developer
  2. Open Settings > Patreon tab
  3. In the “Offline License” section, enter your email and click “Import .license”
  4. Your tier is activated immediately — no internet connection required

The status bar shows your license source:

  • P: Member — authenticated via Patreon
  • L: Member — authenticated via license file

If both Patreon and a license file are active, the higher tier wins.

How to Get a License

There is currently no purchase or subscription system for offline licenses. A suitable payment and distribution solution is being evaluated. If you have suggestions for a good platform or method, I’d be grateful to hear them! This section will be updated once a method is available.

License Priority

Patreon authentication takes priority over offline licenses. If your Patreon connection is active and gives a higher tier, the offline license is kept as a fallback but the Patreon tier is used.

Fullscreen Pin Controls

New toggle to pin playback controls in fullscreen mode, preventing them from auto-hiding.

  • Pin button in fullscreen controls toolbar with SVG icon
  • Active state visual feedback when controls are pinned
  • Tooltip translations for all 9 supported languages

Bug Fixes

  • Chinese Windows: Fixed encoding errors (stdout/stderr) on Chinese locale Windows systems
  • Oscillate devices: Reliable pause for oscillate-type devices like Solace Pro
  • Callback descriptor: Fixed callback descriptor bug causing log spam
  • Pin button: Replaced emoji with proper SVG icons for cross-platform compatibility
  • Build system: Fixed Nuitka --include-package usage for pyserial and cryptography modules

Release is out, links have been updated.

I’m not sure if anyone else has a problem with some parts being in another language, but I’ve got it set to English (double checked even) and parts like intensity tags, and list view columns being in Deutsch. All intensity tags are in Deutsch, and the list view columns it’ll show some in English such as from left to right: Status; Kategorie; Bewertung; Thumbnail; Name; Heatmap; Dauer; Dateigrosse; Geaendert; Format; Aufloesung/VR; Speicherort; Quelle; Hinzugefuegt; ensi.

There might be other areas doing the same but those are the the most noticeable ones. Had this issue in versions 0.9.16.26032 and 0.10.8.26059.

Side note: How difficult would it be to add a function to change scanning/updating cpu priority/usage? I get that it takes a bit to scan when doing deep scans and all, and I’ve got a Ryzen 9 7950x which helps with the ffmpeg load, but it’s using enough of the cpu that basic computer use such as a twitch or youtube stream will lag or hang when minimizing a browser or file explorer window because it’s waiting on the cpu.

Thx for the report.
I will check both and see what i can do on the CPU usage.

Finally spent some decent time trying to get everything to work with HereSphere and the like (especially since the direct connect to the SR6 works amazingly well, Intiface did not want to work with FunLibrary) and wanted to share some thoughts/ideas. I’m thoroughly appreciative of how much better this is compared to other players I’ve used and there’s definitely a lot of potential for it to be the defacto go-to player/all-in-one organizer. So thanks for your work so far! :smiley:

  1. Would it be possible for it to be able to see other axis in the funscript files that are combined through eroscripts, and have it detected as multi-axis? I’ve found that no other player/program I’ve tried can detect these additional axis (as in separate them being labeled multi-axis) if they are merged into the one file, even though said file clearly has descriptors for said axis. This would be a godsend for MA scripts downloaded here, and save having to download each axis on its own.

  2. Not sure if this would be possible because of HereSphere, but would there be a way to label MA scripts as a tag similar to how the intensity tag is shown/displayed in HereSphere? Same for separating between 2D, VR, and present scripts. Using the web player you can use all of these just fine, but the web player in HereSphere and DeoVR can’t play the VR videos that way, probably because of the h265 codec. (8k 60/120fps I’m sure doesn’t help either.)

  3. For thumbnails, if there could be something that could force generate thumbnails for files that did not generate any that would be amazing.

  4. This one may not be a big priority as I’m sure I’m part of a very small minority, but a setting to remember the FunLibrary window size and position would be equally amazing. At least for those of us on superwide 5120x1440 monitors. :smile:

  5. Speaking of HereSphere, I wonder if it’d be feasable to as an option have the heatmaps be merged at the bottom of the thumbnail due to HereSphere not showing any of that.

I’d also like to follow up on my last post, latest 0.11 version still has the issue with different languages, but I noticed using the web browser in HereSphere that is not an issue and works fine. Lastly, not sure if it just hasn’t been coded in yet, but it doesn’t save which COM device that was selected, so I keep having to change it to the correct one before it can connect to the SR6.

1 Like

HI, thx for the detailed findings and ideas, i will see what i can implement.
Heresphere is quite limited in its features when it comes to “customization” i have to “misuse” some things to achieve those features. I will see.
The language related stuff is hopefully complete in the next release.

next release teaser:

New Features

Window Geometry Persistence

The application now remembers its window position and size across sessions.

  • Position & size saved on close, restored on next launch
  • Multi-monitor validation — if the saved position is on a monitor that’s no longer connected, the window resets to center

Thumbnail Regeneration

New context menu action to regenerate thumbnails for videos.

  • Single video: Right-click → “Regenerate Thumbnail”
  • Bulk: Select multiple videos → Right-click → “Regenerate Thumbnails”
  • Replaces existing thumbnails with freshly generated ones

HereSphere Improvements

  • Heatmap-overlaid thumbnails: New /thumb_hm/ endpoint serves thumbnails with funscript heatmaps overlaid — HereSphere shows richer previews
  • 2D and Multi-Axis tags: Videos are now tagged with “2D” or “Multi-Axis” in HereSphere scan and video metadata responses
  • Encoding fix: Added charset=utf-8 header and ensure_ascii=False to fix display of non-ASCII characters (e.g., Japanese, Chinese titles)

Scan CPU Priority Setting

New performance setting to reduce system lag during deep scans.

  • Three priority levels: Normal, Below Normal, Idle
  • Lowers ffmpeg/ffprobe process priority so your system stays responsive during scans
  • Found in Settings → Performance section

TCode V1 (vib1) Axis Mapping

Added vib1 (V1) axis mapping for TCode multi-axis support, enabling a second vibration channel for compatible devices.

Handy API v3 Support

Full support for the Handy API v3 alongside the existing v2 implementation.

  • Automatic API version selection: Choose between v2 and v3 in Settings — v2 remains the default
  • Bearer token authentication: Secure token-based auth via /auth/token/issue endpoint
  • Non-blocking device setup: Script upload, HSSP setup, and HSTP calibration run in a background thread — no more UI freezes
  • SSE real-time events: Server-Sent Events for device status (connect/disconnect, temperature warnings, slider blocked)
  • Improved resync: Instant resync without redundant setup — only the play command is re-sent
  • Status icon improvements: Calibration state now shows green indicator instead of neutral gray

Note: v2 implementation is fully preserved and unaffected. Both API versions use the same hosting upload and HSSP playback flow.

Embedded Multi-Axis Funscript Channels (BETA)

Support for funscript files that contain multiple axes in a single file via the channels key (OFS/MultiFunPlayer format).

  • Automatic detection: Scanner detects embedded channels (roll, pitch, surge, twist, etc.) during library scan
  • Per-channel heatmaps: Each embedded channel gets its own intensity heatmap and intensity score
  • Full playback support: Internal player sends all embedded axes to TCode devices simultaneously
  • API integration: HereSphere and MultiFunPlayer receive embedded channels as separate virtual funscripts — fully transparent
  • Priority rule: Separate axis files (e.g., video.roll.funscript) always take priority over embedded channels with the same name
  • Axis mapping: Channel names map directly to TCode axes (roll→R1, pitch→R2, surge→L1, twist→R0, etc.)

BETA: This feature is under active development. Please report issues.

Server Security (HTTPS & Authentication)

Optional HTTPS and Basic Authentication for all server endpoints, granularly configurable.

  • HTTPS (HereSphere Server): Encrypts HTTP traffic with a self-signed certificate (auto-generated on first enable)
  • WSS (Web Remote Server): Encrypts WebSocket connections for the Web Remote player
  • Basic Authentication: Require username and password for all server access (shared credentials for both servers)
  • Granular toggles: Each feature independently configurable in Settings → Streaming → Server Security
  • IP-based session caching: After initial login, authenticated clients are cached for 1 hour — no repeated auth challenges for thumbnails/heatmaps
  • WebSocket token auth: Secure token-based authentication for WebSocket connections, transparently passed via the config endpoint
  • Certificate auto-regeneration: Self-signed certificate automatically regenerates when the local IP changes

Note: Self-signed certificates may trigger a browser security warning on first connection. Accept the warning to proceed.

Bug Fixes

  • Hardcoded German strings: Replaced all remaining hardcoded German column headers and status texts with the translation system (tr() calls)
  • Intensity labels: Replaced INTENSITY_LEVEL_LABELS_DE with locale-aware get_intensity_label() function
  • COM port settings: Fixed COM port selection not being restored on settings reload (switched from findText to findData)
  • Missing translation keys: Added header_duration, header_added, header_intensity, and other missing keys to all 9 languages
1 Like

After doing the initial full scan + full deep scan. On succeeding app usage, do we need to always do update scan + deep update scan or just update scan is enough?

The normal scan methods do not create thumbnails, heatmaps and are not extracting metadata from the video file itself (ffprobe/ffmpeg).
Those are meant if you just wan to do an quick update.
Deep Update is doing the full set of work including thumbnails, heatmaps and file metadata extraction.

sidenote:
i’m thinking about making it possible to do that to specific folders optionally like it is in the enrichment widget (would shorten the scan)

1 Like

Not sure if someone has mentioned this already but it would be nice if we can add metadata in Media Browser where adding a category/performer/studio in the folder automatically adds it to all the files under that folder. Metadata Enrichment does a good job but it is not enough especially if you have your own weird way of categorizing your things.

Also question regarding the Sorting in the Library. Am I correct in my understanding that “Added” meant sorting by the date it was added in the FunLibrary Manager? Also what is meant by sorting by “Date” there? Is it Date Created? Date Modified? perhaps can we have “Date Created” and “Date Modified” in the sorting instead?

Yes, you’re correct:

  • “Added” = sorted by the date the video was added to FunLibrary Manager’s database
    (added_at timestamp, set on first scan)
  • “Date” = sorted by the file’s last modified time (mtime from the filesystem via
    stat.st_mtime)

So “Date” is the file’s Date Modified, not Date Created. This is a deliberate choice because
mtime is reliably available across all operating systems and filesystems, while creation
time (ctime) behaves differently on different platforms — on Linux ctime is actually the
last metadata change time, not the creation time, and many filesystems don’t preserve
original creation dates when files are copied or moved.

That said, adding a “Date Created” sort option is possible on Windows (where st_birthtime is
available). I’ll note it as a feature request.


Great suggestion! Currently, categories/performers/studios are assigned per-video, and the
Media Browser doesn’t have folder-level metadata assignment that propagates down to child
videos.

What you’re describing would work like this: right-click a folder in Media Browser → assign
a category (e.g. “Anal”) or performer → all videos inside that folder (and subfolders)
automatically inherit those assignments. This is essentially “bulk categorization by folder
structure” — which makes a lot of sense if you’ve organized your library by studio or
performer folders.

This is on the roadmap. The building blocks are already there (bulk category assignment
works in the Library tab, and the Media Browser already has folder context menus), so it’s
mainly about connecting them — adding a “Assign Category to All Videos” option in the Media
Browser folder context menu that recursively applies to all videos underneath.

In the meantime, you can do this manually in the Library tab:

  1. Use the search/filter to show videos from a specific folder
  2. Select All (Ctrl+A) [ there is a bug! klick on one checkox and then use the select all button]
  3. Right-click → Assign Categories
  4. Apply

Not as convenient as a one-click folder assignment, but it gets the job done for now.

1 Like

So I tried the built-in intiface integration to sync my Lovense Solace Pro but there seems to be an issue on slow parts of the scripts.
So this is how the heatmap look like


Whenever it reaches that part where I marked red, it sometimes causes a weird extra fast short up down stroke. The issue happens regardless if the processing mode is raw or smooth.
I had this same issue on heresphere’s built-in integration as well (already reported there as well but still not yet also fixed today) but somehow I don’t have this issue on MultiFunPlayer + intiface integration which makes me think its not an issue on my toy.

sounds strange, can you please send me the test video with the test script?

Found the bug!
On slow funscript movements, the oscillation speed was calculated using a clamped 400ms duration instead of the real duration.
So a 2-second slow stroke was being treated as a 400ms fast stroke — causing the Solace to suddenly speed up at slow parts.

Fixed in the next version.
The speed calculation now uses the full movement duration for oscillator devices (Solace, etc.).
This should eliminate the random fast strokes during slow sections.