An extended fork of Stash-VR: video rules that turn your Stash tags into the right projection, lens and passthrough in HereSphere, DeoVR and Playa, cover badges with the real resolution, HereSphere profiles that follow you between headsets, “Recommended for you” and more, all set up from a web UI.
The fork keeps everything the original Stash-VR does and adds:
Video rules: your Stash tags decide how a scene plays. Each rule names an ordinary tag from your Stash library (DOME, FISHEYE, RF52, Alpha…) and says what a scene carrying that tag should get in the player: projection, stereo layout, lens and field of view, eye swap, force mono, passthrough. Rules apply top to bottom, work for all players, and are edited on the Setup page, so you can add rules for tags you already use or change what a tag means. The default rules match the tags written by the companion plugin VR Quality Tags, which measures each file, so after one plugin run your library just plays right. Without the plugin, the same rules work on tags you set yourself.
Cover badges: resolution tier, format, passthrough, duration and frame rate drawn on the covers you browse in the headset, each one switchable, with a live preview in the web UI. Tiers with Low Detail get a muted badge, so a real 8K stands out from an upscaled one.
HereSphere profiles that follow you: screen settings you adjust in the headset are saved and handed back on any headset, and can optionally be shared by all scenes of the same studio and lens.
Passthrough: alpha-packed and chroma-key masks with passthrough background, set automatically from the tags.
Smart sections: Continue watching, Recommended for you (scored against your own watch history), Recently added, Random, plus generated per-studio and per-performer sections.
Watch history and resume: watched state and resume position, resume on a different headset.
Funscript variants: alternate scripts next to the video (or from the timestampTrade index) show up in HereSphere’s script picker.
Release dates: missing scene dates looked up from your stash-boxes, optionally written back to Stash.
A web UI for everything: player links and library status, section order, all settings (no more juggling environment variables), and a scene inspector that explains why a scene plays the way it does.
Playa support alongside HereSphere and DeoVR.
Stash-VR is the work of o-fl0w; this fork builds on it, and I have asked upstream whether he would like the changes (#95). The Playa integration was contributed by RGinting367. Bug reports and ideas are welcome as GitHub issues.
Installation
Run it with Docker (ghcr.io/skeel-x/stash-vr:latest) or download a release binary for Linux, Windows or macOS from the releases page (current: v0.11.0)
Open http://<host>:9666 in a browser and check the Stash connection under Setup
I highly suggest installing the VR Quality Tags plugin in Stash and run it once, so the default video rules have tags to act on
In the headset, open the link for your player from the Players page (HereSphere, DeoVR) or add the address as a source in Playa
Full instructions, including Docker volumes and a compose file, are in the README.
thanks, very useful, finally no manual setting in Heresphere.
I observed one issue in Heresphere for RF52 videos where it is not applying the fov 190, since you have disabled discussion and issues on your Github repo fork, writing it here full AI description, it is tested locally:
HereSphere appears to require an explicit lens property to apply fov. For RF52 scenes, stash-vr sends "fov": 190 without a lens, so HereSphere switches to fisheye but keeps FOV at 180. Adding "lens": "Linear" fixes it. MKX200 already works because its response includes "lens": "MKX200".
Thank you for reaching out! I’ts being updated and a new release will be published soon.
Yeah, I haven’t opened it yet because I’m awaiting a response from upstream if they want me to contribute the code to their project or keep developing as a separate fork.
If I get no response or they tell me they don’t want the code - that’s fine. I will then open issue reporting on github directly.
Ps. If you find more issues, please feel free to write here again, I’ll keep an eye out!
afaik heresphere always uses saved video settings where they exist, even if you use the api to tell it to use different ones.
so if you want to change it, you either need to do it manually, or delete the video from the library in heresphere. you lose viewcount, etc. i guess you could make a tool to scrub the video setting data but i was too lazy for this.
I know, not sure what have the priority, but I intentionally removed the Heresphere Media source library context (or how it is called), to have it fresh from the API, as @skeel also introduced the Stash plugin which detects the projection from the source video files, so it is very accurate
This is great, I’ve been lazy in adding more support to stash-vr… But if you would like to add support for multiple scripts (I see you have one with fine name) and ivdb I do have a way you can call the StashInteractiveTool to use it’s resolved and all it’s features (calling to different names, order, etc) via doing a graphql call like so. If I get some time I may make a PR for you to review (hidden behind a resolver flag/env would be my choice to keep the default setup) this will allow support for nas stup storage where you don’t have access to the filesystem. Also may want to switch to a glob lookup via prefix (I have a python script in my repo that does that) vs reading the whole dir.. faster and less elements to handle
Anyways I’m going to check this out… Also if you haven’t add in webp support. I had to make a fork to add this a while back because images wouldn’t show up in hsp.
A resolver that asks StashInteractiveTools through runPluginOperation would be genuinely useful here.
Right now script discovery reads the media directory next to the video (plus an optional sqlite index), so stash-vr has to see the same filesystem Stash does.
My own install only works because the service requires the NAS mounts, and a stalled mount has taken it down before. Behind a flag, defaulting to the current behaviour, is exactly how I’d want it, and getting ivdb and your naming/ordering for free is a bonus.
Only thing I’d ask is that it slots in as a selectable resolver next to the disk and index ones, with the result cached per scene.
That one was considered and ReadDir was kept on purpose: stems like Scene [VR] 8K contain glob metacharacters and filepath.Glob mangles them. The directory read is prefix-filtered and cached per scene, so it hasn’t been a bottleneck.
WebP (and GIF) covers are already supported in this fork, that was actually the first fix in it. If images weren’t showing in HereSphere you were probably on upstream perhaps?