A companion web application to connect stash to deovr

Overview

stash-vr-companion

This is a companion web application to connect stash to deovr.

Stash is a self hosted web application to manage your porn collection. Deovr is a VR video player avalable for most platforms.

This web application creates a set of json files allowing you to stream vr videos to your oculus, vive, google carboard etc.

Scene configuration

This web application uses tags to configure what is included in the index. Scenes must be tagged with export_deovr to be visible. Scenes are assumed 2d by default and to explicitly mark a scene as 2d apply the tag FLAT. Most VR scenes are 180° with the left and right eye side by side, apply the tags export_deovr, DOME and optionally SBS to mark the video as VR.

  • export_deovr - apply this tag to include it in the index
  • FLAT - Mark the video as 2d. This is the default if other projection tags are not configured.
  • DOME - 3D 180° projection, this is what most VR video's use.
  • SPHERE - 3D 360° projection used by some earlier videos
  • FISHEYE - Fish Eye lense projection
  • MKX200 - 3D 200° projection used by SLR
  • SBS - Side by Side with the left eye taking up the left half of the video. This is the default for 3d video's.
  • TB - Up Down with the left eye taking up the top half of the video.

Additional filter categories

The default categories are Recent, 2D and VR. You can pin a studio and performers by adding a string to the studio description and a tag to the performer.

To pin a studio edit the studio in stash and add the string EXPORT_DEOVR to the description field for the studio.

To Pin a performer edit the performer and add the tag export_deovr to the performer.

To Pin a tag the tag must be a sub tag of export_deovr. Edit export_deovr and add the tag as a child.

Running in docker

Configuration is done by providing environment variables to the docker container. The web server is running on port 5000 in the container.

Parameter Function
-e API_URL=http://192.168.0.22:9999/graphql Specify the stash instance to connect to
-e API_KEY=xxxxxxxxx Specify the api key used to connect to stash if you have password protected your instance
docker stop stash-vr-companion
docker rm stash-vr-companion
docker pull ghcr.io/tweeticoats/stash-vr-companion:latest
docker run -d  --name=stash-vr-companion --restart=unless-stopped -p 5000:5000 -e API_URL=http://192.168.0.22:9999/graphql ghcr.io/tweeticoats/stash-vr-companion:latest
Comments
  • Error on Synology

    Error on Synology

    Hi there. First off, this is amazing. I've been hoping for something to bring stash over to the VR realm since I became aware of it. Thanks so much for your efforts.

    I'm trying to stand this up on Synology and I'm getting an Internal Server error when I attempt to connect in. I did have to update several of the ports but I don't think that is the issue. Maybe python version?

    The only change I made to the recommended creation script was to update the 5000 ext port to 10002 as Synology uses 5000 for host access and stash to port 10000 as I have XBVR on 9999.

    docker run -d --name=stash-vr-companion --restart=unless-stopped -p 10002:5000 -e API_URL=http://192.168.1.199:10000/graphql ghcr.io/tweeticoats/stash-vr-companion:latest

    Logging has it looping the below GET error (post boot logging - it's not cycling or anything).

    • Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
    • Debug mode: off
    • Running on all addresses. WARNING: This is a development server. Do not use it in a production deployment.
    • Running on http://172.17.0.8:5000/ (Press CTRL+C to quit) [2021-12-15 12:07:33,938] ERROR in app: Exception on /filter/Recent [GET] Traceback (most recent call last): File "/usr/local/lib/python3.10/site-packages/flask/app.py", line 2073, in wsgi_app response = self.full_dispatch_request() File "/usr/local/lib/python3.10/site-packages/flask/app.py", line 1518, in full_dispatch_request rv = self.handle_user_exception(e) File "/usr/local/lib/python3.10/site-packages/flask/app.py", line 1516, in full_dispatch_request rv = self.dispatch_request() File "/usr/local/lib/python3.10/site-packages/flask/app.py", line 1502, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args) File "/app/app.py", line 659, in show_category filters=filter() File "/app/app.py", line 616, in filter flat_filter['filter'] = {"tags": {"value": [tags_cache['export_deovr']['id'],tags_cache['FLAT']['id']], "depth": 0, "modifier": "INCLUDES_ALL"}} KeyError: 'FLAT' 172.17.0.1 - - [15/Dec/2021 12:07:33] "GET /filter/Recent HTTP/1.1" 500 - [2021-12-15 12:07:37,974] ERROR in app: Exception on /filter/Recent [GET] Traceback (most recent call last): File "/usr/local/lib/python3.10/site-packages/flask/app.py", line 2073, in wsgi_app response = self.full_dispatch_request() File "/usr/local/lib/python3.10/site-packages/flask/app.py", line 1518, in full_dispatch_request rv = self.handle_user_exception(e) File "/usr/local/lib/python3.10/site-packages/flask/app.py", line 1516, in full_dispatch_request rv = self.dispatch_request() File "/usr/local/lib/python3.10/site-packages/flask/app.py", line 1502, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args) File "/app/app.py", line 659, in show_category filters=filter() File "/app/app.py", line 616, in filter flat_filter['filter'] = {"tags": {"value": [tags_cache['export_deovr']['id'],tags_cache['FLAT']['id']], "depth": 0, "modifier": "INCLUDES_ALL"}} KeyError: 'FLAT' 172.17.0.1 - - [15/Dec/2021 12:07:37] "GET /filter/Recent HTTP/1.1" 500 - 172.17.0.1 - - [15/Dec/2021 12:07:51] "GET / HTTP/1.1" 302 - [2021-12-15 12:07:51,226] ERROR in app: Exception on /filter/Recent [GET]
    opened by nerfdaderp 4
  • Added support for disabling certificate validation when connecting to…

    Added support for disabling certificate validation when connecting to…

    … stash, and ability to prompt for username and password when logging in with DeoVR

    I found when I went to use stash-vr-companion, it failed due to using HTTPS on my stash instance (certificate validation errors). While theoretically the app could be configured to set custom trust stores, that's a lot of work when in practice the only endpoint it's connecting to is the one you specify that's presumably on your localhost or local network.

    Similarly, stash-vr-companion doesn't allow for username/password, but I believe DeoVR does support basic auth flows.

    I haven't tested these flows yet (don't have docker locally, and my server can't do builds), but I'll fake update the docker image later and test.

    opened by devloch 3
  • Transcode Problem

    Transcode Problem

    I've had the below issue since I moved over from DeoVR to Heresphere. If I just go to stash directly in Heresphere, the file plays with no issues.

    Using stash vr companion however, there is a significant delay in starting the video, it transcodes, and the progress bar for the video is full at a reported 00:00 of run time. The video will play and the count will increment but any action to toggle a backwards or forward time seek or clicking within the progress bar, will reset the video to start over. I should be on the latest branch for both apps; just not seeing what the blocker may be.

    opened by nerfdaderp 1
  • Handy integration with Heresphere

    Handy integration with Heresphere

    Hey, is stash-vr-companion supposed to work with Heresphere and the Handy? I'm running into trouble with this.

    I'm able to load the site in Heresphere, and can toggle the API to get the "VR" version of the website. Videos play well, and I think are tagged properly (I opened #4, but I think I mostly figured it out). When I play a video that's interactive, the video loads, Herespehere connects to the Handy, but the interface says something like "script not found." I can successfully play the same video/script with XBVR, so I don't think it's either of those.

    I've scanned all of the same videos in Stash, made sure the funscripts show up in both Stash and stash-vr-companion, and even generated the heatmaps. Where's a good place to start troubleshooting this? I very much prefer the stash-vr-companion interface over XBVR, especially since there's a tab specific to "Interactive" videos in stash-vr-companion.

    Also, I haven't been logging into SLR, as #2 mentioned. I don't have an account with SLR, but I'm assuming that's not necessary to use Heresphere with the Handy (since things work with XBVR).

    Thanks!

    opened by slabking 1
  • Not Starting

    Not Starting

    Any idea why my docker setup isn't working? I updated today and its failing. Log below...

    *** Starting uWSGI 2.0.20 (64bit) on [Thu Dec 1 10:52:53 2022] ***

    compiled with version: 8.3.0 on 01 December 2022 06:13:19

    os: Linux-5.10.0-18-amd64 #1 SMP Debian 5.10.140-1 (2022-09-02)

    nodename: 56baf5a952e1

    machine: x86_64

    clock source: unix

    pcre jit disabled

    detected number of CPU cores: 4

    current working directory: /app

    detected binary path: /usr/local/bin/uwsgi

    uWSGI running as root, you can use --uid/--gid/--chroot options

    *** WARNING: you are running uWSGI as root !!! (use the --uid flag) ***

    *** WARNING: you are running uWSGI without its master process manager ***

    your memory page size is 4096 bytes

    detected max file descriptor number: 1048576

    lock engine: pthread robust mutexes

    thunder lock: disabled (you can enable it with --thunder-lock)

    uWSGI http bound on :5000 fd 4

    spawned uWSGI http 1 (pid: 7)

    uwsgi socket 0 bound to TCP address 127.0.0.1:35255 (port auto-assigned) fd 3

    uWSGI running as root, you can use --uid/--gid/--chroot options

    *** WARNING: you are running uWSGI as root !!! (use the --uid flag) ***

    Python version: 3.8.15 (default, Nov 15 2022, 22:19:38) [GCC 8.3.0]

    Python main interpreter initialized at 0x55fd0a3a8860

    uWSGI running as root, you can use --uid/--gid/--chroot options

    *** WARNING: you are running uWSGI as root !!! (use the --uid flag) ***

    python threads support enabled

    your server socket listen backlog is limited to 100 connections

    your mercy for graceful operations on workers is 60 seconds

    mapped 72920 bytes (71 KB) for 1 cores

    *** Operational MODE: single process ***

    Loading config from stash: {"filters": [{"name": "Recent", "type": "BUILTIN", "filter_name": "default", "sort_name": "date", "enabled": false}, {"name": "VR", "type": "BUILTIN", "filter_name": "3d", "sort_name": "date", "enabled": true}, {"name": "2D", "type": "BUILTIN", "filter_name": "2d", "sort_name": "date", "enabled": true}, {"name": "5star", "type": "BUILTIN", "filter_name": "star", "sort_name": "date", "enabled": true}, {"name": "Random", "type": "BUILTIN", "filter_name": "random", "sort_name": "random", "enabled": true}, {"name": "Interactive", "type": "BUILTIN", "filter_name": "interactive", "sort_name": "date", "enabled": true}, {"name": "Markers", "type": "BUILTIN", "filter_name": "markers", "sort_name": "date", "enabled": false}]}

    final config:{'config_studio': 222, 'filters': [{'name': 'Recent', 'type': 'BUILTIN', 'filter_name': 'default', 'sort_name': 'date', 'enabled': False}, {'name': 'VR', 'type': 'BUILTIN', 'filter_name': '3d', 'sort_name': 'date', 'enabled': True}, {'name': '2D', 'type': 'BUILTIN', 'filter_name': '2d', 'sort_name': 'date', 'enabled': True}, {'name': '5star', 'type': 'BUILTIN', 'filter_name': 'star', 'sort_name': 'date', 'enabled': True}, {'name': 'Random', 'type': 'BUILTIN', 'filter_name': 'random', 'sort_name': 'random', 'enabled': True}, {'name': 'Interactive', 'type': 'BUILTIN', 'filter_name': 'interactive', 'sort_name': 'date', 'enabled': True}, {'name': 'Markers', 'type': 'BUILTIN', 'filter_name': 'markers', 'sort_name': 'date', 'enabled': False}]}

    Cache currently contains 0

    refreshing cache

    Fetching 100 scenes

    Fetching 200 scenes

    Fetching 300 scenes

    Fetching 400 scenes

    Fetching 500 scenes

    Fetching 600 scenes

    Fetching 700 scenes

    Fetching 800 scenes

    Fetching 900 scenes

    Fetching 1000 scenes

    Fetching 1100 scenes

    Fetching 1200 scenes

    Cache currently contains 1165 scenes, checking image cache

    fetching image: 2333

    Traceback (most recent call last):

    File "app.py", line 2214, in

    refreshCache()
    

    File "app.py", line 1790, in refreshCache

    with Image.open(f) as im:
    

    File "/usr/local/lib/python3.8/site-packages/PIL/Image.py", line 3135, in open

    fp.seek(0)
    

    ValueError: seek of closed file

    unable to load app 0 (mountpoint='') (callable not found or import error)

    *** no app loaded. going in full dynamic mode ***

    uWSGI running as root, you can use --uid/--gid/--chroot options

    *** WARNING: you are running uWSGI as root !!! (use the --uid flag) ***

    *** uWSGI is running in multiple interpreter mode ***

    spawned uWSGI worker 1 (and the only) (pid: 1, cores: 1)

    --- no python application found, check your startup logs for errors ---

    [pid: 1|app: -1|req: -1/1] 10.1.1.112 () {38 vars in 1329 bytes} [Thu Dec 1 10:56:47 2022] GET / => generated 21 bytes in 0 msecs (HTTP/1.1 500) 2 headers in 83 bytes (0 switches on core 0)

    opened by dotslashsuperstar 0
  • stash-vr-companion fails when tags already exist with different case

    stash-vr-companion fails when tags already exist with different case

    If your stash instance already has some of the export tags configured except with a different case, it will fail to start up, as if t not in tags_cache.keys(): print("creating tag " +t) createTagWithName(t)

    will attempt to create the tag, which will then fail, because Stash does not allow for tags that are identical except for case.

    It's an easy fix on the stash side, just wanted to document that I ran into it for any help/complaints (particularly, it showed up because 'Fisheye' is a saved/managed tag in some scenes in stashdb). While it would be simple to fix the for loop that's going through tags, that would invisibly break later flows as scenes wouldn't pick up on having the tag.

    But like I mentioned, very easy for a user to fix - just check tags (particularly 'Fisheye' to make sure none of them are present but with the wrong case.

    opened by devloch 0
  • Get

    Get "unsupported file type" when streaming stash video over HTTPS

    When connecting to a Stash instance running on HTTPS, stash-vr-companion is able to correctly populate the cache, but there's an "unsupported file type" error when actually attempting to stream videos.

    I'll look into this, just wanted to document it in case anyone tries using the HTTPS flow and runs into the error.

    opened by devloch 0
  • Tagging scenes as VR

    Tagging scenes as VR

    Thanks again for this! I think I've mostly gotten things working, but I'm having trouble tagging VR scenes in Stash. Could I ask for some help?

    From the README, every VR scene needs to have export_deovr applied, correct? Since I keep my VR files in their own folder, and I'm using Docker, I've managed this by adding it to my volume's path: /path/to/vr/files:/vr_files/export_deovr. Stash's autotagger picks up on export_deovr being in the path and adds the tag automatically. :)

    For the other tags, I'm having some trouble figuring out how to apply them. It looks like I need one of these:

    FLAT
    DOME
    SPHERE
    FISHEYE
    MKX200
    

    And one of these:

    SBS
    TB
    

    I can pretty easily figure out if a scene is SBS or TB (it's even easier that scenes default to SBS even without the tag), but the first list has me stumped. Is there a good way to tell the difference between them, just by watching the video? It'd be great if the README contained examples of each, or linked to an explanation somewhere else, but I totally understand if that's outside of the scope of this project. I haven't been able to find anything in my own searching.

    opened by slabking 0
  • Max retries exceeded!

    Max retries exceeded!

    Hi,

    after a while of runntime the following error occured:

    raise ConnectionError(e, request=request)
    requests.exceptions.ConnectionError: HTTPConnectionPool(host='192.168.178.79', port=9999): Max retries exceeded with url: /graphql (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f75879e62f0>: Failed to establish a new connection: [Errno 111] Connection refused'))
    unable to load app 0 (mountpoint='') (callable not found or import error)
    *** no app loaded. going in full dynamic mode ***
    uWSGI running as root, you can use --uid/--gid/--chroot options
    *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** 
    *** uWSGI is running in multiple interpreter mode ***
    spawned uWSGI worker 1 (and the only) (pid: 1, cores: 1)
    --- no python application found, check your startup logs for errors ---
    [pid: 1|app: -1|req: -1/1] 172.17.0.1 () {38 vars in 1011 bytes} [Mon May 30 16:56:08 2022] GET / => generated 21 bytes in 0 msecs (HTTP/1.1 500) 2 headers in 83 bytes (0 switches on core 0)
    --- no python application found, check your startup logs for errors ---
    [pid: 1|app: -1|req: -1/2] 172.17.0.1 () {38 vars in 962 bytes} [Mon May 30 16:56:08 2022] GET /favicon.ico => genera``
    

    After restarting the docker container, it works a while, then the error occured again.

    Any idea?

    thx and regards

    opened by peterpannimmerland 0
Owner
null
HomeAssistant Linux Companion

Application to run on linux desktop computer to provide sensors data to homeasssistant, and get notifications as if it was a mobile device.

Javier Lopez 10 Dec 27, 2022
A smart personal companion and health assistant.

Steps to Install : Clone the repository Go to ResQ-Sources Execute ResQ-Lite.py --: Manual Controls : DanceRobot.py --: You can call functions like fo

Tuhinadri Banerjee 1 May 25, 2022
This is sample project needed for security course to connect web service to database

secufaku This is sample project needed for security course to "connect web service to database". Why it suits alignment purpose It connects to postgre

Mark Nicholson 6 May 15, 2022
Type Persian without confusing words for yourself and others, in Adobe Connect

About In the Adobe Connect chat section, to type in Persian or Arabic, the written words will be confused and will be written and sent illegibly (This

Matin Najafi 23 Nov 26, 2021
Connect Playground - easy way to fill in your account with production-like objects

Just set of scripts to initialise accpunt with production-like data: A - Basic Distributor Account Initialization INPUT Distributor Account Token ACTI

CloudBlue 5 Jun 25, 2021
💻 Algo-Phantoms-Backend is an Application that provides pathways and quizzes along with a code editor to help you towards your DSA journey.📰🔥 This repository contains the REST APIs of the application.✨

Algo-Phantom-Backend ?? Algo-Phantoms-Backend is an Application that provides pathways and quizzes along with a code editor to help you towards your D

Algo Phantoms 44 Nov 15, 2022
ArinjoyTheDev 1 Jul 17, 2022
A Python Web Application for Checking vaccine slots by pincodes and auto slot booking.

The Dashboard is developed using Bokeh and python 3.5+. This dashboard is useful for you if you are looking for something which will help you to book the vaccine slot once slots become available. Other Vaccine Finders will notify you once slots become available but you will still need to login to the portal and book the slot manually. This dashboard will look for slot availability continuously and will send the OTP itself once slots become available.

Suraj Deshmukh 10 Jan 23, 2022
A passive recon suite designed for fetching the information about web application

FREAK Suite designed for passive recon Usage: python3 setup.py python3 freak.py warning This tool will throw error if you doesn't provide valid api ke

toxic v3nom 7 Feb 17, 2022
Comics/doujinshi reader application. Web-based, will work on desktop and tablet devices with swipe interface.

Yomiko Comics/doujinshi reader application. Web-based, will work on desktop and tablet devices with swipe interface. Scans one or more directories of

Kyubi Systems 26 Aug 10, 2022
Simple Python-based web application to allow UGM students to fill their QR presence list without having another device in hand.

Praesentia Praesentia is a simple Python-based web application to allow UGM students to fill their QR presence list without having another device in h

loncat 20 Sep 29, 2022
KUIZ is a web application quiz where you can create/take a quiz for learning and sharing knowledge from various subjects, questions and answers.

KUIZ KUIZ is a web application quiz where you can create/take a quiz for learning and sharing knowledge from various subjects, questions and answers.

Thanatibordee Sihaboonthong 3 Sep 12, 2022
A web application which you can search, buy or sell shares with current prices which provided by IEX.

CS50 - Stock Exchange A web application which you can search, buy or sell shares with current prices which provided by IEX. Table of Contents Setup St

null 1 May 28, 2022
Simple web application, which has a single endpoint, dedicated to annotation parsing and convertion.

Simple web application, which has a single endpoint, dedicated to annotation parsing and conversion.

Pavel Paranin 1 Nov 1, 2021
Flask-built web application that simulates a time and cost calculator for charging Electric Vehicles.

ev_charging_calculator Flask-built web application that simulates a time and cost calculator for charging Electric Vehicles. The project aims to simul

null 1 Nov 3, 2021
A web-based chat application that enables multiple users to interact with one another

A web-based chat application that enables multiple users to interact with one another, in the same chat room or different ones according to their choosing.

null 3 Apr 22, 2022
FollowSpot is a comprehensive audition tracking fullstack web application for entertainment industry professionals.

FollowSpot is a comprehensive audition tracking fullstack web application for entertainment industry professionals. This app allows users to store information/media for all of their auditions while also compiling data and displaying statistics to help track progress.

Jen Brissman 9 Jul 12, 2022
Check broken access control exists in the Java web application

javaEeAccessControlCheck Check broken access control exists in the Java web application. 检查 Java Web 应用程序中是否存在访问控制绕过问题。 使用 python3 javaEeAccessControl

kw0ng 3 May 4, 2022
A web application (with multiple API project options) that uses MariaDB HTAP!

Bookings Bookings is a web application that, backed by the power of the MariaDB Connectors and the MariaDB X4 Platform, unleashes the power of smart t

MariaDB Corporation 4 Dec 28, 2022