Stash-VR (skeel edition)

:placard: Summary 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.
:link: Repository https://github.com/skeel-x/stash-vr

Features

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

  1. 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)
  2. Open http://<host>:9666 in a browser and check the Stash connection under Setup
  3. 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
  4. 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.

Screenshots


Covers as the headset shows them: resolution tier, format, passthrough, duration and frame rate. (Covers blurred for the forum.)


Six of the default video rules. The name on each card is a Stash tag; everything below it is what Stash-VR tells the player for scenes with that tag.


Choose the badges in Setup and preview them on a real scene before saving.


Two 8K files: one with real 8K detail (gold badge), one with 8K pixels but not the detail (slate badge).


The Players page: one link per player, plus the connection status.

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

stash-vr v0.12.0 released.

  • A malformed saved filter no longer crashes the server into a restart loop.
  • A scene with a missing video file no longer breaks the whole library.
  • A brief Stash outage no longer leaves you with an empty library.
  • The setup page loads immediately, even while Stash is still indexing.
  • Scenes resume at their own position, not at a sibling scene’s.
  • RF52 and other fisheye scenes get the correct field of view in HereSphere.
  • Generated profiles use the correct camera separation and stereo alignment.
  • Play counts and watch time survive a restart and are tracked per headset.
  • Scene descriptions now show in HereSphere.
  • Sorting by length works (it was off by 1000x).
  • Copy-link buttons work over plain http.
  • Reset asks for confirmation before wiping your rules.
  • A bare Stash address works without adding /graphql.
  • Self-signed HTTPS on Stash now works.
  • API key no longer appears in logs.

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.

Thanks, and yes please on the PR.

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?