Handy-mpv [ Linux player ]

Hello, as mentioned in this thread: https://discuss.eroscripts.com/t/feature-idea/28757

I am sharing with you all the script player I’ve been using. This is a player I made myself after not finding any good player for Linux that fit my needs.

This player requires python and mpv to be installed on your machine. it is also recommended to use it with special actions from your file manager to easily launch it from any video file. seen below.

Here is the readme for more information on how to install and use this script. Enjoy!

handy-mpv

Simple script to play funscripts using mpv and the power of python.

Shortcuts

Q : Quit application

up arrow: pause script playback but keep video playing.

down arrow: Re-sync script / restart script playback. use this if for some reason your script becomes out of sync.

all other mpv shortcuts should work as inteded.

Installation / requirements

  1. clone this repo
  2. create a virtualenv python -m venv venv
  3. activate venv . venv/bin/activate
  4. install dependencies pip install -r requirements.txt
  5. Setup your handy key in the app.py file.
# ...

API_SECRET="YOUR KEY HERE"
API_ENDPOINT="https://www.handyfeeling.com/api/v1/"

#...

Usage

# example usage
$ python app.py yourscript {args}

#arguments

--double: doubles every stroke in the provided script (does not modify the actual file)

This option is mostly created for fapheroes. results may vary for normal scripts but sometimes creates very interesting results.

for fapheroes however, this makes it so every beat is a full stroke. so assuming you have 4 beats such as:

O---O---O---O

the resulting motion will be:

up-down-up-down-up-down-up

instead of:

up---down---up---down


this was created to more closely match the way I would play fapheroes without the handy.

aditional notes

  • on startup, the script will do a time sync with the handy server to insure accurate strokes. The server delay is stored in a file and the sync will no re-happen for an hour after that.

  • on the first sync with the device. it is usually required to run the script twice. if your video never starts. it’s probably for this reason. simply re-run the script.

  • pausing the video will pause the script. however, if you press the resync button. the script will start playing with the video still paused.

  • scrubbing the player automatically scrubs the script to the appropriate timestamp.

  • If you have a looping video, the script will also loop.

12 Likes

Get the script here:

3 Likes

Amazing stuff! Thanks for the share!

I can finally stop using browser for my handy. thanks for this.

1 Like

happy I could help! didn’t think anyone else was in the same boat as me. I’d have shared it sooner.

1 Like

What would be required to enable local playback via bluetooth and/or local handycontrol instance? I just got my unit and wanting to contribute to improving quality of life on *nix.

1 Like

I’m not familiar with how the bluetooth works for the handy, but for local playback, I think it’s just a matter of changing the server for the handy api calls. You just need to keep the endpoint that converts funscripts to csv, since I don’t think this comes with the local server.

Sorry for the late reply, been busy working on other things. I’ll be pushing an update soon, couple stuff broke for me after updating some local libs. probably should figure out how to package this as an executable.

Thank you for this! Can’t wait to get it set up

Also if it’s possible I’d love to check out the vid in the thumbnail

Hello! thanks for the interest!, the video is “Fap Hero - Ero Festival” I think I got it from one of the big script archives torrents that are floating around on the web. I can give you the script tho, believe liquid made it.

Fap Hero - Ero Festival.funscript (97.7 KB)

1 Like

I dunno if this one matches the script but I found this: Watch Fap Hero - Ero Festival - Dragon, Fap Hero, Fap Hero Hentai Porn - SpankBang

1 Like

Works otherwise, but the script will not pause when the video is paused.

yeah, pausing broke with the latest mpv update. I’ll have to go and fix it. thanks for letting me know!

Here’s something I used for pausing:

def video_pause_unpause(property_name, new_value):
    paused = new_value
    if paused:
        sync_play(0, 'false')
    else:
        value = player._get_property('playback-time')
        if value is not None:
            time_ms = int(value * 1000)
            sync_play(time_ms, 'true')

player.observe_property('pause', video_pause_unpause)
1 Like

very nice, finally someone made a linux player
i’m used to play the games in a VM and watch videos on my stashapp server

are you planning to package it into an appimage or something ?

I don’t really have plans for it right now. but I’d be happy to merge it if someone were to make a pull request for it.

Is it possible to run this with your own mpv configs and shaders? Or are you just stuck with the stock version?

So I did some digging, it is possible.
You would need to edit this line in app.py of handy-mpv

And change it to the following:

player = mpv.MPV(config=True, config_dir=..., input_default_bindings=True, input_vo_keyboard=True, osc=True)

config_dir=... takes the directory where mpv.conf is located, not the path of the file itself.

I haven’t tested this but it should work in theory. Let me know.

1 Like

Yup, that worked perfectly fine! Thanks a lot! <3
Ok, I played around with it, and the “config=True” is enough if your mpv configuration is in the default place. (So ~/.config/mpv) If it doesn’t exist then it creates that path, but doesn’t create any files. So the below is enough for the default place:

player = mpv.MPV(config=True, input_default_bindings=True, input_vo_keyboard=True, osc=True)

Also if you put non existent path into the config_dir, then it’ll be created. And for some reason it doesn’t read ~/ as home path, so to be safe it’s better to put the full path.

1 Like