Merge branch 'main' into More-concise-auto-tagging-docs
66
.github/ISSUE_TEMPLATE/add-new-add-on.yml
vendored
Normal file
@ -0,0 +1,66 @@
|
||||
---
|
||||
name: Add new add-on
|
||||
description: Template for new add-ons
|
||||
labels: ["add-ons"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for taking the time to fill out this form!
|
||||
- type: dropdown
|
||||
id: type
|
||||
attributes:
|
||||
label: Type
|
||||
description: Add-on type?
|
||||
options:
|
||||
- Plugin
|
||||
- Script
|
||||
- Userscript
|
||||
- Utility
|
||||
- Third-party Integration
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: aname
|
||||
attributes:
|
||||
label: Add-on name
|
||||
description: Provide the add-on name to use in the documentation
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: alink
|
||||
attributes:
|
||||
label: Add-on link
|
||||
description: Provide the add-on link to use in the documentation
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: adescription
|
||||
attributes:
|
||||
label: Add-on description
|
||||
description: Provide the add-on description to use in the documentation
|
||||
placeholder: A sentence or two about your add-on
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: aauthor
|
||||
attributes:
|
||||
label: Author name
|
||||
description: Provide the author name to use in the documentation
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: aauthor-link
|
||||
attributes:
|
||||
label: Author link
|
||||
description: Provide the author link to use in the documentation
|
||||
validations:
|
||||
required: false
|
||||
- type: textarea
|
||||
id: ascreenshot
|
||||
attributes:
|
||||
label: Add-on screenshots
|
||||
description: Provide the add-on screenshots to use in the documentation
|
||||
validations:
|
||||
required: false
|
||||
---
|
||||
@ -2,25 +2,25 @@
|
||||
|
||||
## Contributing from the site via `Edit this page on GitHub`
|
||||
|
||||
1. On the bottom of every page you will find a link `Edit this page on GitHub`.
|
||||
1. On the bottom of every page you will find a link `Edit this page on GitHub`.
|
||||
2. Cliking on it will open GitHub where you will be met with a message about not being able to edit directly.
|
||||
3. Click `Fork this repository`.
|
||||
4. You should see the text editor now.
|
||||
5. Make the changes to the page you want and scroll to the bottom.
|
||||
6. Add a short comment to explains your changes and click `Propose changes`.
|
||||
4. You should see the text editor now.
|
||||
5. Make the changes to the page you want and scroll to the bottom.
|
||||
6. Add a short comment to explains your changes and click `Propose changes`.
|
||||
7. Next page might look complicated, but all you need to do next is click `Create pull request`.
|
||||
8. Here you can adjust the title and/or add extra comment and then click `Create pull request`.
|
||||
9. That's it!
|
||||
8. Here you can adjust the title and/or add extra comment and then click `Create pull request`.
|
||||
9. That's it!
|
||||
|
||||
## Contributing directly from the repository
|
||||
|
||||
1. Go to the `docs` folder.
|
||||
2. Open any .md file and click 🖉 (or `E` on your keyboard) to start editing.
|
||||
3. Make the changes to the page you want and scroll to the bottom.
|
||||
3. Make the changes to the page you want and scroll to the bottom.
|
||||
4. Add a short comment to explains your changes and click `Propose changes`.
|
||||
5. Next page might look complicated, but all you need to do next is click `Create pull request`.
|
||||
6. Here you can adjust the title and/or add extra comment and then click `Create pull request`.
|
||||
7. That's it!
|
||||
6. Here you can adjust the title and/or add extra comment and then click `Create pull request`.
|
||||
7. That's it!
|
||||
|
||||
## Contributing from the forked repository
|
||||
|
||||
@ -28,9 +28,9 @@
|
||||
2. Click `Create fork`.
|
||||
3. Go to the `docs` folder.
|
||||
4. Open any .md file and click 🖉 (or `E` on your keyboard) to start editing.
|
||||
5. Make the changes to the page you want and scroll to the bottom.
|
||||
5. Make the changes to the page you want and scroll to the bottom.
|
||||
6. Add a short comment to explains your changes and select `Create a new branch for this commit and start a pull request.`. You can name the branch whatever you want or leave the default.
|
||||
7. Click `Propose changes`.
|
||||
7. Next page might look complicated, but all you need to do next is click `Create pull request`.
|
||||
8. Here you can adjust the title and/or add extra comment and then click `Create pull request`.
|
||||
9. That's it!
|
||||
7. Click `Propose changes`.
|
||||
8. Next page might look complicated, but all you need to do next is click `Create pull request`.
|
||||
9. Here you can adjust the title and/or add extra comment and then click `Create pull request`.
|
||||
10. That's it!
|
||||
|
||||
@ -89,4 +89,4 @@ callouts:
|
||||
kramdown:
|
||||
syntax_highlighter_opts:
|
||||
block:
|
||||
line_numbers: false
|
||||
line_numbers: false
|
||||
@ -91,4 +91,13 @@ These scripts are created by third parties and not officially affiliated or supp
|
||||
|Script|[blurryCardBackground](https://github.com/philpw99/StashCustomJavascripts){:target="_blank"}|
|
||||
|Description|Add blurry background to scene/movie/gallery/image/studio.|
|
||||
|Author|[philpw99](https://github.com/philpw99){:target="_blank"}|
|
||||
|Screenshots||
|
||||
|Screenshots|
|
||||
|
||||
## plex-to-stash-ratings
|
||||
|
||||
|-|-|
|
||||
|Category|Metadata|
|
||||
|Script|[plex-to-stash-ratings](https://github.com/oikmeg/plex-to-stash-ratings){:target="_blank"}|
|
||||
|Description|Transfers scene ratings and view counts from Plex to Stash.|
|
||||
|Author|[oikmeg](https://github.com/oikmeg){:target="_blank"}|
|
||||
|Screenshots||
|
||||
@ -309,9 +309,18 @@ These userscripts are created by third parties and not officially affiliated or
|
||||
|-|-|
|
||||
|Category|Stash|
|
||||
|Userscript|[Stash Userscript Alphabet Selector](https://github.com/elkorol/Stash-App-Script-Alphabet-Selector){:target="_blank"}|
|
||||
|Description|Adds a button to the toolbar for an Alphabet keyboard, on Scenes, Movies, Performers, Studios and Tags page that when clicked adds a visible keyboard, allowing you to select letters or numerical value, that can either limit, aliases, name or both to whichever letter selected or number. .|
|
||||
|Description|Adds a button to the toolbar for an Alphabet keyboard, on Scenes, Movies, Performers, Studios and Tags page that when clicked adds a visible keyboard, allowing you to select letters or numerical value, that can either limit, aliases, name or both to whichever letter selected or number.|
|
||||
|Author|[elkorol](https://github.com/elkorol){:target="_blank"}|
|
||||
|Screenshots|[](/assets/add-ons/Stash-App-Script-Alphabet-Selector-2.png)|
|
||||
|Screenshots||
|
||||
|
||||
## Stash Userscript Performer Image Upscaler
|
||||
|
||||
|-|-|
|
||||
|Category|Stash|
|
||||
|Userscript|[Stash Userscript Performer Image Upscaler](https://github.com/elkorol/Stash-Userscript-Upscaler){:target="_blank"}|
|
||||
|Description|Adds an upscale button on the performer page, that upon clicking allows you to select an appriate upcaling model then upscale and update the image.|
|
||||
|Author|[elkorol](https://github.com/elkorol){:target="_blank"}|
|
||||
|Screenshots||
|
||||
|
||||
## StashDB Copy StashID
|
||||
|
||||
|
||||
@ -63,4 +63,13 @@ These utilities are created by third parties and not officially affiliated or su
|
||||
|Utility|[stash-compilation-maker](https://github.com/soundchaser128/stash-compilation-maker){:target="_blank"}|
|
||||
|Description|Connects to your Stash instance and creates simple compilation videos from scene markers. You select one or more tags, or one or more performers and it will take (currently) the first 15 seconds of video after the marker start and compile all of the markers into one video.|
|
||||
|Author|[soundchaser128](https://github.com/soundchaser128){:target="_blank"}|
|
||||
|Screenshots||
|
||||
|
||||
## ClipMash
|
||||
|
||||
|-|-|
|
||||
|Category|Compilations|
|
||||
|Utility|[clip-mash](https://github.com/soundchaser128/clip-mash){:target="_blank"}|
|
||||
|Description|Video editing app that allows you to automate creating compilations from multiple videos. It runs in your browser. It's mostly made for, ahem, adult content, which is why it can connect to Stash and fetch videos and scene markers from there to guide the video creation process. You can also use local files and set the markers in ClipMash itself and then generate a compilation based on that.|
|
||||
|Author|[soundchaser128](https://github.com/soundchaser128){:target="_blank"}|
|
||||
|Screenshots||
|
||||
BIN
assets/add-ons/Stash-Userscript-Upscaler-1.png
Normal file
|
After Width: | Height: | Size: 274 KiB |
BIN
assets/add-ons/Stash-Userscript-Upscaler-2.png
Normal file
|
After Width: | Height: | Size: 290 KiB |
BIN
assets/add-ons/Stash-Userscript-Upscaler-3.png
Normal file
|
After Width: | Height: | Size: 3.2 MiB |
|
Before Width: | Height: | Size: 89 KiB |
BIN
assets/add-ons/blurryCardBackground.png
Normal file
|
After Width: | Height: | Size: 562 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
BIN
assets/user-interface-ui/more_studio_item_after.jpg
Normal file
|
After Width: | Height: | Size: 188 KiB |
BIN
assets/user-interface-ui/more_studio_item_before.jpg
Normal file
|
After Width: | Height: | Size: 181 KiB |
BIN
assets/user-interface-ui/more_tag_after_1.jpg
Normal file
|
After Width: | Height: | Size: 217 KiB |
BIN
assets/user-interface-ui/more_tag_after_2.jpg
Normal file
|
After Width: | Height: | Size: 173 KiB |
BIN
assets/user-interface-ui/more_tag_before.jpg
Normal file
|
After Width: | Height: | Size: 158 KiB |
BIN
assets/user-interface-ui/more_tag_subtag.jpg
Normal file
|
After Width: | Height: | Size: 164 KiB |
BIN
assets/user-interface-ui/themes/mobile-layout-overhaul-1.png
Normal file
|
After Width: | Height: | Size: 272 KiB |
BIN
assets/user-interface-ui/themes/neon-dark-1.png
Normal file
|
After Width: | Height: | Size: 247 KiB |
BIN
assets/user-interface-ui/themes/neon-dark-2.png
Normal file
|
After Width: | Height: | Size: 837 KiB |
BIN
assets/user-interface-ui/themes/neon-dark-3.png
Normal file
|
After Width: | Height: | Size: 692 KiB |
BIN
assets/user-interface-ui/themes/neon-dark-4.png
Normal file
|
After Width: | Height: | Size: 145 KiB |
BIN
assets/user-interface-ui/themes/neon-dark-5.png
Normal file
|
After Width: | Height: | Size: 447 KiB |
BIN
assets/user-interface-ui/themes/neon-dark-6.png
Normal file
|
After Width: | Height: | Size: 733 KiB |
@ -21,7 +21,7 @@ The following is our recommended procedure for new Stash users who want to get i
|
||||
|
||||
# Generate pHashes
|
||||
|
||||
1. Navigate to the Settings page (⚙ icon in top right), make sure you're on "Tasks" in the sidebar to the left, then find the first heading "Library" in the middle of the page. Make sure "Generate perceptual hashes" is turned on so pHashes will be created automatically each time you run a scan to add new scenes. This will slow down the scanning process, but for most users [it's worth it](https://guidelines.stashdb.org/docs/getting-started-stashdb/#whats-a-phash){:target="_blank"}. pHashes are the main way to match your scenes with our data on StashDB.
|
||||
1. Navigate to the Settings page (⚙ icon in top right), make sure you're on "Tasks" in the sidebar to the left, then find the first heading "Library" in the middle of the page. Make sure "Generate perceptual hashes" is turned on so pHashes will be created automatically each time you run a scan to add new scenes. This will slow down the scanning process, but for most users [it's worth it](https://guidelines.stashdb.org/docs/faq_getting-started/stashdb/whats-a-phash){:target="_blank"}. pHashes are the main way to match your scenes with our data on StashDB.
|
||||
|
||||

|
||||
<br/><br/>
|
||||
@ -33,7 +33,7 @@ The following is our recommended procedure for new Stash users who want to get i
|
||||
|
||||
# Join StashDB
|
||||
|
||||
If you haven't set up StashDB in your Stash settings yet, now's the time to do it. Get an invite code in the **#stashdb-invites** channel on [Discord](https://discord.com/channels/559159668438728723){:target="_blank"}. Check the pinned messages (📌 icon in top right) there for details and up-to-date instructions on how to create an account and connect to it from Stash.
|
||||
If you haven't set up StashDB in your Stash settings yet, now's the time to do it. Get an invite code in the **#stashdb-invites** channel on [Discord](https://discord.gg/gHwFj8neaa){:target="_blank"}. Check the pinned messages (📌 icon in top right) there for details and up-to-date instructions on how to create an account and connect to it from Stash.
|
||||
|
||||
## How to connect your account to Stash
|
||||
|
||||
@ -53,13 +53,13 @@ If you haven't set up StashDB in your Stash settings yet, now's the time to do i
|
||||
<br/><br/>
|
||||
|
||||
{:style="counter-reset:none"}
|
||||
1. First, click the "Scrape All" button. This will use your pHashes to find matching scenes on StashDB for every scene on the current page. The "Scrape by fragment" buttons will do the same thing but just for one scene at a time. Also, you may want to change your Scene Tagger settings with the ⚙ icon next to "Scrape All." You can tell it to Merge (keep all) tags, Overwrite (keep only new) tags, or ignore StashDB's tags entirely (leave box unchecked). If you plan on [contributing to StashDB](https://guidelines.stashdb.org/docs/getting-started-stashdb/#contributing-to-stashdb){:target="_blank"}, you should have "Show male performers" turned on to better follow [these guidelines](https://guidelines.stashdb.org/docs/scenes/scene-performers/#missing-scene-performers){:target="_blank"}.
|
||||
1. First, click the "Scrape All" button. This will use your pHashes to find matching scenes on StashDB for every scene on the current page. The "Scrape by fragment" buttons will do the same thing but just for one scene at a time. Also, you may want to change your Scene Tagger settings with the ⚙ icon next to "Scrape All." You can tell it to Merge (keep all) tags, Overwrite (keep only new) tags, or ignore StashDB's tags entirely (leave box unchecked). If you plan on [contributing to StashDB](https://guidelines.stashdb.org/docs/faq_getting-started/stashdb/contributing-to-stashdb){:target="_blank"}, you should have "Show male performers" turned on to better follow [these guidelines](https://guidelines.stashdb.org/docs/scenes/edit/scene-performers/missing-performers){:target="_blank"}.
|
||||
|
||||

|
||||
<br/><br/>
|
||||
|
||||
{:style="counter-reset:none"}
|
||||
1. If your fingerprint search doesn't return a correct result for your scene, you can try searching with the "Query" field using title, performer, release date, or studio. Try to use as little text as possible to find your scene. Otherwise, unnecessary words that do not match StashDB's info may block correct results. If you can find the matching scene on StashDB.org but can't find it using the Scene Tagger, you can use the scene's [StashID](https://guidelines.stashdb.org/docs/getting-started-stashdb/#whats-a-stashid){:target="_blank"} as your Tagger query.
|
||||
1. If your fingerprint search doesn't return a correct result for your scene, you can try searching with the "Query" field using title, performer, release date, or studio. Try to use as little text as possible to find your scene. Otherwise, unnecessary words that do not match StashDB's info may block correct results. If you can find the matching scene on StashDB.org but can't find it using the Scene Tagger, you can use the scene's [StashID](https://guidelines.stashdb.org/docs/faq_getting-started/stashdb/whats-a-stashid){:target="_blank"} as your Tagger query.
|
||||
|
||||

|
||||
<br/><br/>
|
||||
@ -109,7 +109,7 @@ If you haven't set up StashDB in your Stash settings yet, now's the time to do i
|
||||

|
||||
<br/><br/>
|
||||
|
||||
- **For those wanting to contribute to StashDB**: As noted before, ThePornDB leans heavily on automated scrapers to pull all of their info. Often that data is incomplete or inaccurate compared to what we'd want on StashDB. Before you [submit your scene to StashDB](https://guidelines.stashdb.org/docs/getting-started-stashdb/#submitting-drafts-to-stashdb){:target="_blank"}, you'll need to double-check your info, clean it up a bit first, and make sure you're following [these guidelines](https://guidelines.stashdb.org/docs/scenes/){:target="_blank"}. Submitting to StashDB is discussed further in the [last step](#submit-to-stashdb) of this guide.
|
||||
- **For those wanting to contribute to StashDB**: As noted before, ThePornDB leans heavily on automated scrapers to pull all of their info. Often that data is incomplete or inaccurate compared to what we'd want on StashDB. Before you [submit your scene to StashDB](https://guidelines.stashdb.org/docs/faq_getting-started/drafts/submit-from-stash){:target="_blank"}, you'll need to double-check your info, clean it up a bit first, and make sure you're following [these guidelines](https://guidelines.stashdb.org/docs/scenes){:target="_blank"}. Submitting to StashDB is discussed further in the [last step](#submit-to-stashdb) of this guide.
|
||||
|
||||
# Use Site-Specific Scrapers
|
||||
|
||||
@ -121,8 +121,8 @@ If you haven't set up StashDB in your Stash settings yet, now's the time to do i
|
||||
|
||||
# Submit to StashDB
|
||||
|
||||
1. If you're certain a scene isn't on StashDB and you've found the info using ThePornDB or some other scraper, please consider submitting it to StashDB yourself. That way nobody else will have to duplicate the same work you've done for that particular scene if they can match their [pHash](#generate-phashes) with yours. You'll need to ask for edit privileges in our [Discord](https://discord.com/channels/559159668438728723){:target="_blank"} and follow the guidelines on [this website](https://guidelines.stashdb.org/docs/scenes/){:target="_blank"}. In particular, please note that [not every scene can be added to StashDB](https://guidelines.stashdb.org/docs/scenes/adding-scenes/){:target="_blank"} at this time. Some [studios aren't allowed](https://guidelines.stashdb.org/docs/scenes/movies-dvds/){:target="_blank"} and [full movies likely won't be eligible](https://guidelines.stashdb.org/docs/scenes/movies-dvds/){:target="_blank"} either.
|
||||
1. If you're certain a scene isn't on StashDB and you've found the info using ThePornDB or some other scraper, please consider submitting it to StashDB yourself. That way nobody else will have to duplicate the same work you've done for that particular scene if they can match their [pHash](#generate-phashes) with yours. You'll need to ask for edit privileges in our [Discord](https://discord.com/channels/559159668438728723){:target="_blank"} and follow the guidelines on [this website](https://guidelines.stashdb.org/docs/scenes){:target="_blank"}. In particular, please note that [not every scene can be added to StashDB](https://guidelines.stashdb.org/docs/scenes/create){:target="_blank"} at this time. Some [studios aren't allowed](https://guidelines.stashdb.org/docs/studios/create){:target="_blank"} and [full movies likely won't be eligible](https://guidelines.stashdb.org/docs/scenes/create/full-movie-entries){:target="_blank"} either.
|
||||
<br/><br/>
|
||||
|
||||
{:style="counter-reset:none"}
|
||||
1. Also, please don't blindly submit data from ThePornDB. You should verify the data is correct and complete first, make sure the URL is right, check for any [missing performers](https://guidelines.stashdb.org/docs/scenes/scene-performers/#missing-scene-performers){:target="_blank"}, and look up any relevant [guidelines](https://guidelines.stashdb.org/docs/scenes/){:target="_blank"} if something else seems funky to you. You can update your data within Stash before submitting a draft or you can edit the draft on StashDB itself before creating the edit. You should also have the studio URL now, so you should also compare with that page manually or even scrape again with a site-specific scraper as explained in the [previous step](#use-site-specific-scrapers) of this guide. Also please note in your [edit comment](https://guidelines.stashdb.org/docs/scenes/getting-started-scenes/#scene-edit-comments){:target="_blank"} where your data is coming from.
|
||||
1. Also, please don't blindly submit data from ThePornDB. You should verify the data is correct and complete first, make sure the URL is right, check for any [missing performers](https://guidelines.stashdb.org/docs/scenes/edit/scene-performers/missing-performers){:target="_blank"}, and look up any relevant [guidelines](https://guidelines.stashdb.org/docs/scenes){:target="_blank"} if something else seems funky to you. You can update your data within Stash before submitting a draft or you can edit the draft on StashDB itself before creating the edit. You should also have the studio URL now, so you should also compare with that page manually or even scrape again with a site-specific scraper as explained in the [previous step](#use-site-specific-scrapers) of this guide. Also please note in your [edit comment](https://guidelines.stashdb.org/docs/faq_getting-started/scenes/scene-edit-comments){:target="_blank"} where your data is coming from.
|
||||
@ -67,7 +67,7 @@ Stash uses 2 different methods to track your scenes: oshash and filename/path.
|
||||
|
||||
## How do I add galleries?
|
||||
|
||||
For gallery-related issues check the relevant Documentation [section](/in-app-manual/galleries).
|
||||
For gallery-related issues check the relevant Documentation [section](/in-app-manual/images).
|
||||
|
||||
## How to add performers in bulk?
|
||||
|
||||
@ -111,8 +111,19 @@ The `ffmpeg` and `ffprobe` files should be placed in `~/.stash` on macOS / Linux
|
||||
|
||||
Third-party Docker images are more likely to be misconfigured and makes it harder to get support from the core Stash team. For best experience you should stay with official Stash Docker image. [Stash repository](https://github.com/stashapp/stash/tree/master/docker/production){:target="_blank"} and [DockerHub](https://hub.docker.com/r/stashapp/stash){:target="_blank"}.
|
||||
|
||||
# Other FAQs
|
||||
## I'm getting "Migration failed"
|
||||
|
||||
## I have a question not answered here.
|
||||
It can mean that you database got corrupted. You can verify that by running a few SQL statements. The easiest way to do so is to install a simple program called [DB Browser for SQLite](https://sqlitebrowser.org){:target="_blank"}. Start the program and in the menu select `File` > `Open Database...` and select your Stash .sqlite database file. Then navigate to the `Execute SQL` tab and run:
|
||||
- `PRAGMA integrity_check;` - it should return `ok`.
|
||||
- `PRAGMA foreign_key_check;` - it should return nothing.
|
||||
|
||||
Join the Stash [Discord server](https://discord.gg/2TsNFKt){:target="_blank"}.
|
||||
If you get something different it means there is an issue with your database. It's still possible that it can be recovered. You can ask for more help in one of the [support channels](#support).
|
||||
Another option would be to try using an older backup if you have one.
|
||||
|
||||
# Support
|
||||
|
||||
## I have a question not answered here
|
||||
|
||||
- Join our [Matrix space](https://matrix.to/#/#stashapp:unredacted.org){:target="_blank"}
|
||||
- Join our [Discord server](https://discord.gg/2TsNFKt){:target="_blank"}
|
||||
- Start a [discussion on GitHub](https://github.com/stashapp/stash/discussions){:target="_blank"}
|
||||
@ -36,6 +36,7 @@ Now, follow the installation instructions based on whether you [can use Docker](
|
||||
| docker/Stash/metadata | /metadata | Database |
|
||||
| docker/Stash/config | /root/.stash | Configuration Files |
|
||||
| docker/Stash/cache | /cache | Cache Files |
|
||||
| docker/Stash/blobs | /blobs | Binary data for scene covers, performer images, etc |
|
||||
| (where your porn lives) | /data | Location of your porn |
|
||||
|
||||
## "Environment" Tab
|
||||
|
||||
4
home.md
@ -8,6 +8,7 @@ permalink: /
|
||||
# Stash
|
||||
|
||||
[](https://translate.stashapp.cc/engage/stash/){:target="_blank"}
|
||||
[](https://github.com/sponsors/stashapp)
|
||||
[](https://opencollective.com/stashapp){:target="_blank"}
|
||||
[](https://matrix.to/#/#stashapp:unredacted.org){:target="_blank"}
|
||||
[](https://discord.gg/2TsNFKt){:target="_blank"}
|
||||
@ -35,4 +36,5 @@ To get started go to [Getting Started](/getting-started) and grab the latest ver
|
||||
- **Finds bugs**: test the software for bugs and create GitHub issues for them to help developers confirm and fix them faster.
|
||||
- **Write scrapers**: if there is a site that isn't being scraped properly or at all, head on over to scrapers channel/room and see if you can't help scrape some metadata from a site.
|
||||
- **Populate StashDB**: StashDB is our canonical database where we store metadata and hashes. You can submit info from your Stash instance to the database or just help tyo improve the already existing information.
|
||||
- **Support financially**: Stash development runs on donations. Donations are collected through OpenCollective. You can do anonymous donations, recurring donations, or even contribute towards a specific feature, incentivizing that bit to get done potentially faster.
|
||||
- **Support financially**: Stash development runs on donations. Donations are collected through OpenCollective. You can do anonymous donations, recurring donations, or even contribute towards a specific feature, incentivizing that bit to get done potentially faster.
|
||||
- **Sponsor on GitHub**: You can sponsor the [stashapp organization on GitHub](https://github.com/sponsors/stashapp) via one-time or monthly donation.
|
||||
@ -22,7 +22,7 @@ Internal Stash documentation, mirrored from [Stash repository](https://github.co
|
||||
- [Scene Filename Parser](/in-app-manual/tasks/scenefilenameparser)
|
||||
- [JSON Specification](/in-app-manual/tasks/jsonspec)
|
||||
5. [Browsing](/in-app-manual/browsing)
|
||||
6. [Image Galleries](/in-app-manual/galleries)
|
||||
6. [Images and Galleries](/in-app-manual/images)
|
||||
7. [Metadata Scraping](/in-app-manual/scraping)
|
||||
- [Scraper Development](/in-app-manual/scraping/scraperdevelopment)
|
||||
8. [Plugins](/in-app-manual/plugins)
|
||||
|
||||
@ -50,6 +50,18 @@ exclude:
|
||||
|
||||
_a useful [link](https://regex101.com/){:target="_blank"} to experiment with regexps_
|
||||
|
||||
# Gallery Creation From Folders
|
||||
|
||||
In the Library section you can find an option to create a gallery from each folder containing images. This will be applied on all libraries when activated, including the base folder of a library.
|
||||
|
||||
If you wish to apply this on a per folder basis, you can create a file called **.nogallery** or **.forcegallery** in a folder that should act different than this global setting.
|
||||
|
||||
This will either exclude the folder from becoming a gallery even if the setting is set, or create a gallery from the folder even if the setting is not set.
|
||||
|
||||
The file will only be recognized if written in lower case letters.
|
||||
|
||||
Files with a dot in front are handled as hidden in the Linux OS and Mac OS, so you will not see those files after creation on your system without setting your file manager accordingly.
|
||||
|
||||
# Hashing algorithms
|
||||
|
||||
Stash identifies video files by calculating a hash of the file. There are two algorithms available for hashing: `oshash` and `MD5`. `MD5` requires reading the entire file, and can therefore be slow, particularly when reading files over a network. `oshash` (which uses OpenSubtitle's hashing algorithm) only reads 64k from each end of the file.
|
||||
|
||||
@ -1,17 +0,0 @@
|
||||
---
|
||||
layout: clean
|
||||
title: Galleries
|
||||
nav_order: 6
|
||||
parent: In-app Manual
|
||||
|
||||
---
|
||||
|
||||
**Note:** images are now included during the scan process and are loaded independently of galleries. It is _no longer necessary_ to have images in zip files to be scanned into your library.
|
||||
|
||||
Galleries are automatically created from zip files found during scanning that contain images. It is also possible to automatically create galleries from folders containing images, by selecting the "Create galleries from folders containing images" checkbox in the Configuration page. It is also possible to manually create galleries.
|
||||
|
||||
For best results, images in zip file should be stored without compression (copy, store or no compression options depending on the software you use. Eg on linux: `zip -0 -r gallery.zip foldertozip/`). This impacts **heavily** on the zip read performance.
|
||||
|
||||
If a filename of an image in the gallery zip file ends with `cover.jpg`, it will be treated like a cover and presented first in the gallery view page and as a gallery cover in the gallery list view. If more than one images match the name the first one found in natural sort order is selected.
|
||||
|
||||
Images can be added to a gallery by navigating to the gallery's page, selecting the "Add" tab, querying for and selecting the images to add, then selecting "Add to Gallery" from the `...` menu button. Likewise, images may be removed from a gallery by selecting the "Images" tab, selecting the images to remove and selecting "Remove from Gallery" from the `...` menu button.
|
||||
32
in-app-manual/images.md
Normal file
@ -0,0 +1,32 @@
|
||||
---
|
||||
layout: clean
|
||||
title: Images and Galleries
|
||||
nav_order: 6
|
||||
parent: In-app Manual
|
||||
|
||||
---
|
||||
|
||||
Images are the parts which make up galleries, but you can also have them be scanned independently. To declare an image part of a gallery, there are four ways:
|
||||
|
||||
1. Group them in a folder together and activate the **Create galleries from folders containing images** option in the library section of your settings. The gallery will get the name of the folder.
|
||||
2. Group them in a folder together and create a file in the folder called .forcegallery. The gallery will get the name of the folder.
|
||||
3. Group them into a zip archive together. The gallery will get the name of the archive.
|
||||
4. You can simply create a gallery in stash itself by clicking on **New** in the Galleries tab.
|
||||
|
||||
You can add images to every gallery manually in the gallery detail page. Deleting can be done by selecting the according images in the same view and clicking on the minus next to the edit button.
|
||||
|
||||
For best results, images in zip file should be stored without compression (copy, store or no compression options depending on the software you use. Eg on linux: `zip -0 -r gallery.zip foldertozip/`). This impacts **heavily** on the zip read performance.
|
||||
|
||||
If a filename of an image in the gallery zip file ends with `cover.jpg`, it will be treated like a cover and presented first in the gallery view page and as a gallery cover in the gallery list view. If more than one images match the name the first one found in natural sort order is selected.
|
||||
|
||||
## Image clips/gifs
|
||||
|
||||
Images can also be clips/gifs. These are meant to be short video loops. Right now they are not possible in zipfiles. To declare video files to be images, there are two ways:
|
||||
|
||||
1. Deactivate video scanning for all libraries that contain clips/gifs, but keep image scanning active. Set the **Scan Video Extensions as Image Clip** option in the library section of your settings.
|
||||
2. Make sure none of the file endings used by your clips/gifs are present in the **Video Extensions** and add them to the **Image Extensions** in the library section of your settings.
|
||||
|
||||
A clip/gif will be a stillframe in the wall and grid view by default. To view the loop, you can go into the Lightbox Carousel (e.g. by clicking on an image in the wall view) or the image detail page.
|
||||
|
||||
If you want the loop to be used as a preview on the wall and grid view, you will have to generate them.
|
||||
You can do this as you scan for the new clip file by activating **Generate previews for image clips** on the scan settings, or do it after by going to the **Generated Content** section in the task section of your settings, activating **Image Clip Previews** and clicking generate. This takes a while, as the files are transcoded.
|
||||
@ -39,7 +39,7 @@ parent: In-app Manual
|
||||
|
||||
| Keyboard sequence | Action |
|
||||
|-------------------|--------|
|
||||
| `/` | Focus search field |
|
||||
| `/` | Focus search field / focus query field in filter dialog |
|
||||
| `f` | Show Add Filter dialog |
|
||||
| `r` | Reshuffle if sorted by random |
|
||||
| `v g` | Set view to grid |
|
||||
@ -79,6 +79,8 @@ parent: In-app Manual
|
||||
| `p n` | Play next scene in queue |
|
||||
| `p p` | Play previous scene in queue |
|
||||
| `p r` | Play random scene in queue |
|
||||
| `Space` | Play/pause player |
|
||||
| `Enter` | Play/pause player |
|
||||
| `←` | Seek backwards by 10 seconds |
|
||||
| `→` | Seek forwards by 10 seconds |
|
||||
| `Shift + ←` | Seek backwards by 5 seconds |
|
||||
@ -88,6 +90,10 @@ parent: In-app Manual
|
||||
| `{1-9}` | Seek to 10-90% duration |
|
||||
| `[` | Scrub backwards 10% duration |
|
||||
| `]` | Scrub forwards 10% duration |
|
||||
| `↑` | Increase volume 10% |
|
||||
| `↓` | Decrease volume 10% |
|
||||
| `m` | Toggle mute |
|
||||
| `Shift + l` | Toggle player looping |
|
||||
|
||||
## Scene Markers tab shortcuts
|
||||
|
||||
|
||||
@ -37,7 +37,8 @@ The scan task accepts the following options:
|
||||
| Generate animated image previews | Generates animated webp previews. Only required if the Preview Type is set to Animated Image. Requires Generate previews to be enabled. |
|
||||
| Generate scrubber sprites | Generates sprites for the scene scrubber. |
|
||||
| Generate perceptual hashes | Generates perceptual hashes for scene deduplication and identification. |
|
||||
| Generate thumbnails for images | Generates thumbnails for image files. |
|
||||
| Generate thumbnails for images | Generates thumbnails for image files. |
|
||||
| Generate previews for image clips | Generates a gif/looping video as thumbnail for image clips/gifs. |
|
||||
|
||||
# Auto Tagging
|
||||
|
||||
@ -49,13 +50,15 @@ See the [Scene Filename Parser](/in-app-manual/tasks/scenefilenameparser) page.
|
||||
|
||||
# Generated Content
|
||||
|
||||
The scanning function automatically generates a screenshot of each scene. The generated content provides the following:
|
||||
The generated content provides the following:
|
||||
* Scene covers for video files
|
||||
* Video or image previews that are played when mousing over the scene card
|
||||
* Perceptual hashes - helps match against StashDB, and feeds the duplicate finder
|
||||
* Sprites (scene stills for parts of each scene) that are shown in the scene scrubber
|
||||
* Marker video previews that are shown in the markers page
|
||||
* Transcoded versions of scenes. See below
|
||||
* Image thumbnails of galleries
|
||||
* Image clip previews
|
||||
|
||||
The generate task accepts the following options:
|
||||
|
||||
@ -71,6 +74,7 @@ The generate task accepts the following options:
|
||||
| Transcodes | MP4 conversions of unsupported video formats. Allows direct streaming instead of live transcoding. |
|
||||
| Perceptual hashes (for deduplication) | Generates perceptual hashes for scene deduplication and identification. |
|
||||
| Generate heatmaps and speeds for interactive scenes | Generates heatmaps and speeds for interactive scenes. |
|
||||
| Image Clip Previews | Generates a gif/looping video as thumbnail for image clips/gifs. |
|
||||
| Overwrite existing generated files | By default, where a generated file exists, it is not regenerated. When this flag is enabled, then the generated files are regenerated. |
|
||||
|
||||
## Transcodes
|
||||
|
||||
@ -31,6 +31,10 @@ The following options can be set:
|
||||
| Include male performers | If false, then male performers will not be created or set on scenes. |
|
||||
| Set cover images | If false, then scene cover images will not be modified. |
|
||||
| Set organised flag | If true, the organised flag is set to true when a scene is organised. |
|
||||
| Skip matches that have more than one result | If this is not enabled and more than one result is returned, one will be randomly chosen to match |
|
||||
| Tag skipped matches with | If the above option is set and a scene is skipped, this will add the tag so that you can filter for it in the Scene Tagger view and choose the correct match by hand |
|
||||
| Skip single name performers with no disambiguation | If this is not enabled, performers that are often generic like Samantha or Olga will be matched |
|
||||
| Tag skipped performers with | If the above options is set and a performer is skipped, this will add the tag so that you can filter for in it the Scene Tagger view and choose how you want to handle those performers |
|
||||
|
||||
Field specific options may be set as well. Each field may have a Strategy. The behaviour for each strategy value is as follows:
|
||||
|
||||
|
||||
@ -82,7 +82,9 @@ We are using a bridge bot that relays Discord and Matrix messages both ways in s
|
||||
## NSFW explicit rooms
|
||||
|
||||
- [#stash-general-nsfw:unredacted.org](https://matrix.to/#/#stash-general-nsfw:unredacted.org){:target="_blank"} (bridged) - Discussions about anything related to NSFW
|
||||
- [#stash-favorites-nsfw:unredacted.org](https://matrix.to/#/#stash-favorites-nsfw:unredacted.org){:target="_blank"} (bridged) - Showcase your favorites
|
||||
- [#stash-favorites-female-nsfw:unredacted.org](https://matrix.to/#/#stash-favorites-female-nsfw:unredacted.org){:target="_blank"} (bridged) - Showcase your favorite female performers
|
||||
- [#stash-favorites-male-nsfw:unredacted.org](https://matrix.to/#/#stash-favorites-male-nsfw:unredacted.org){:target="_blank"} (bridged) - Showcase your favorite male performers
|
||||
- [#stash-favorites-everyone-nsfw:unredacted.org](https://matrix.to/#/#stash-favorites-everyone-nsfw:unredacted.org){:target="_blank"} (bridged) - Showcase your favorite performers
|
||||
- [#stash-x-ray:unredacted.org](https://matrix.to/#/#stash-x-ray:unredacted.org){:target="_blank"} (bridged) - Scene or performer identification
|
||||
- [#stash-performer-facial-recognition:unredacted.org](https://matrix.to/#/#stash-performer-facial-recognition:unredacted.org){:target="_blank"} (bridged) - Facial recognition based tagginer of performers in scenes
|
||||
- [#stash-ai-tagging:unredacted.org](https://matrix.to/#/#stash-ai-tagging:unredacted.org){:target="_blank"} (bridged) - AI in metadata tagging
|
||||
|
||||
@ -53,6 +53,22 @@ You just need to add the key you generated in stash ( for more info about the AP
|
||||
curl -X POST -H "ApiKey: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJiaWxsIiwiaWF0IjoxNjE3MDkzMDYwLCJzdWIiOiJBUElLZXkifQ.WhUyvmnVeW8wGV5fkVyje3xLfz5A97HFwyZy-4i8Q-I" -H "Content-Type: application/json" --data '{ "query": "mutation { metadataScan (input:{})}" }' localhost:9998/graphql
|
||||
```
|
||||
|
||||
# Create Backup
|
||||
|
||||
Request: `HTTP-POST`
|
||||
|
||||
```json
|
||||
{
|
||||
"query": "mutation { backupDatabase(input: {download: false})}"
|
||||
}
|
||||
```
|
||||
|
||||
_Example using curl_
|
||||
|
||||
`curl -X POST -H "Content-Type: application/json" --data '{ "query": "mutation {backupDatabase(input: {download: false})}" }' localhost:9999/graphql`
|
||||
|
||||
If `download:` is `true` the created backup is returned and not stored locally.
|
||||
|
||||
# Generate content
|
||||
|
||||
Request: `HTTP-POST`
|
||||
|
||||
@ -30,8 +30,3 @@ You may use several methods to safely access Stash from outside of your home net
|
||||
## Using an external authentication provider
|
||||
|
||||
If you are an advanced user, and have secured your Stash instance behind an authwall provided by a reverse proxy or hosting solution, you may continue to use that. You simply have to edit `.stash/config/config.yml` and set `dangerous_allow_public_without_auth` to `true`. If you have already tripped the security feature, you will also have to remove the `security_tripwire_accessed_from_public_internet` key in order to allow Stash to serve requests.
|
||||
|
||||
## Using a reverse proxy located outside of your private network
|
||||
|
||||
By default, all private IPs are trusted proxies, so you almost certainly do not need to edit your settings.
|
||||
However, if you are using a reverse proxy outside of your private network (uncommon), it should be added to `trustedProxies` in your Configuration tab to allow it to serve requests.
|
||||
@ -430,7 +430,7 @@ form#performer-edit {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
#performer-edit > .row:nth-child(21) {
|
||||
#performer-edit > .row:nth-child(24) {
|
||||
order: -1;
|
||||
}
|
||||
#performer-edit > .row:first-child {
|
||||
@ -478,6 +478,27 @@ form#performer-edit {
|
||||
}
|
||||
```
|
||||
|
||||
## More studio per row
|
||||
|
||||
|-|-|
|
||||
|Description|Display more studio per row|
|
||||
|Author|[hijack_hornet](https://github.com/HijackHornet)|
|
||||
|Screenshots||
|
||||
|
||||
```css
|
||||
/* [Studios tab] Show more item per row */
|
||||
:not(.recommendation-row .studio-card).studio-card {
|
||||
width: 15%
|
||||
}
|
||||
:not(.recommendation-row .studio-card-image).studio-card-image {
|
||||
width: 100%
|
||||
}
|
||||
.studio-card h5 {
|
||||
text-align: center !important;
|
||||
display: block;
|
||||
}
|
||||
```
|
||||
|
||||
# Tags
|
||||
|
||||
## Different tag cards layout
|
||||
@ -542,7 +563,286 @@ form#performer-edit {
|
||||
stroke-width: 15;
|
||||
}
|
||||
```
|
||||
## Alternative tag layout
|
||||
|
||||
|-|-|
|
||||
|Description|Changes the tags layout to show more images, and details on hover|
|
||||
|Author|[hijack_hornet](https://github.com/HijackHornet)|
|
||||
|Screenshots||
|
||||
|
||||
```css
|
||||
/*Tag layout changes*/
|
||||
.tag-card {
|
||||
width: 16rem;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.tag-card .card-section {
|
||||
height: 2.5rem;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
background: #0000007a;
|
||||
line-height: none;
|
||||
}
|
||||
.tag-card .card-section .TruncatedText {
|
||||
-webkit-line-clamp: 1 !important;
|
||||
}
|
||||
.tag-card h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6,
|
||||
.h1,
|
||||
.h2,
|
||||
.h3,
|
||||
.h4,
|
||||
.h5,
|
||||
.h6 {
|
||||
line-height: normal;
|
||||
}
|
||||
.tag-card hr,
|
||||
.tag-description {
|
||||
display: none;
|
||||
}
|
||||
.tag-card .btn-group {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
bottom: 2.5rem;
|
||||
margin-bottom: 0;
|
||||
opacity: 0;
|
||||
transition: ease 0.2s;
|
||||
}
|
||||
.tag-card .btn-group:hover {
|
||||
opacity: 1;
|
||||
transition: ease 0.2s;
|
||||
background: #0000007a;
|
||||
}
|
||||
|
||||
.tag-card-image {
|
||||
object-fit: cover;
|
||||
object-position: center;
|
||||
}
|
||||
|
||||
.zoom-0 .tag-card-image {
|
||||
max-height: none;
|
||||
height: 16rem;
|
||||
width: 12rem;
|
||||
}
|
||||
|
||||
.zoom-1 .tag-card-image {
|
||||
max-height: none;
|
||||
height: 20rem;
|
||||
width: 15rem;
|
||||
}
|
||||
|
||||
.zoom-2 .tag-card-image {
|
||||
max-height: none;
|
||||
height: 24rem;
|
||||
width: 18rem;
|
||||
}
|
||||
|
||||
.zoom-3 .tag-card-image {
|
||||
max-height: none;
|
||||
height: 28rem;
|
||||
width: 21rem;
|
||||
}
|
||||
|
||||
.zoom-0.tag-card,
|
||||
.zoom-1.tag-card,
|
||||
.zoom-2.tag-card,
|
||||
.zoom-3.tag-card {
|
||||
width: initial;
|
||||
}
|
||||
|
||||
.tag-card .card-section > a {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: block;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
padding: 7px 14px 0px 14px;
|
||||
}
|
||||
.tag-card .card-section .tag-sub-tags {
|
||||
position: relative;
|
||||
margin-top: 2rem;
|
||||
z-index: 1;
|
||||
}
|
||||
.tag-sub-tags {
|
||||
font-size: 0;
|
||||
}
|
||||
.tag-parent-tags {
|
||||
display: none;
|
||||
}
|
||||
```
|
||||
## Subtag explorer
|
||||
|
||||
|-|-|
|
||||
|Description|This snipset includes the above tag layout snipset with a twist. Its meant to be used for people who use subtags as a hierachy. For example Watermelon is a subtag of Fruits, so when i click Fruits i want to see both oranges and watermelons, but i might want to get into the list of fruits subtags more easily. That what this snipset is used for. Any tag that has a subtag will show a (...) icon. When clicking its name you will show all subtags of this tag. if you click its image, it will instead open the tag itself normaly. You can change '137cbd' in the icon url to any color you want to match you theme|
|
||||
|Author|[hijack_hornet](https://github.com/HijackHornet)|
|
||||
|Screenshots||
|
||||
|
||||
```css
|
||||
/*Tag layout changes*/
|
||||
.tag-card {
|
||||
width: 16rem;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.tag-card .card-section {
|
||||
height: 2.5rem;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
background: #0000007a;
|
||||
line-height: none;
|
||||
}
|
||||
.tag-card .card-section .TruncatedText {
|
||||
-webkit-line-clamp: 1 !important;
|
||||
}
|
||||
.tag-card h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6,
|
||||
.h1,
|
||||
.h2,
|
||||
.h3,
|
||||
.h4,
|
||||
.h5,
|
||||
.h6 {
|
||||
line-height: normal;
|
||||
}
|
||||
.tag-card hr,
|
||||
.tag-description {
|
||||
display: none;
|
||||
}
|
||||
.tag-card .btn-group {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
bottom: 2.5rem;
|
||||
margin-bottom: 0;
|
||||
opacity: 0;
|
||||
transition: ease 0.2s;
|
||||
}
|
||||
.tag-card .btn-group:hover {
|
||||
opacity: 1;
|
||||
transition: ease 0.2s;
|
||||
background: #0000007a;
|
||||
}
|
||||
|
||||
.tag-card-image {
|
||||
object-fit: cover;
|
||||
object-position: center;
|
||||
}
|
||||
|
||||
.zoom-0 .tag-card-image {
|
||||
max-height: none;
|
||||
height: 16rem;
|
||||
width: 12rem;
|
||||
}
|
||||
|
||||
.zoom-1 .tag-card-image {
|
||||
max-height: none;
|
||||
height: 20rem;
|
||||
width: 15rem;
|
||||
}
|
||||
|
||||
.zoom-2 .tag-card-image {
|
||||
max-height: none;
|
||||
height: 24rem;
|
||||
width: 18rem;
|
||||
}
|
||||
|
||||
.zoom-3 .tag-card-image {
|
||||
max-height: none;
|
||||
height: 28rem;
|
||||
width: 21rem;
|
||||
}
|
||||
|
||||
.zoom-0.tag-card,
|
||||
.zoom-1.tag-card,
|
||||
.zoom-2.tag-card,
|
||||
.zoom-3.tag-card {
|
||||
width: initial;
|
||||
}
|
||||
|
||||
.tag-card .card-section > a {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: block;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
padding: 7px 14px 0px 14px;
|
||||
}
|
||||
.tag-card .card-section .tag-sub-tags {
|
||||
position: relative;
|
||||
margin-top: 2rem;
|
||||
z-index: 1;
|
||||
}
|
||||
.tag-sub-tags {
|
||||
font-size: 0;
|
||||
}
|
||||
.tag-parent-tags {
|
||||
display: none;
|
||||
}
|
||||
/*Tag subtag exploration snipset*/
|
||||
.tag-card .card-section > a {
|
||||
cursor: default;
|
||||
pointer-events: none;
|
||||
}
|
||||
.tag-card .card-section > hr {
|
||||
margin-top: 2rem;
|
||||
}
|
||||
.tag-card .card-section .tag-sub-tags {
|
||||
position: absolute !important;
|
||||
margin-top: 0 !important;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: block;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
padding: 0;
|
||||
}
|
||||
.tag-sub-tags::before {
|
||||
content: "";
|
||||
display: block;
|
||||
background: url("https://img.icons8.com/material-outlined/24/137cbd/connection-status-off.png")
|
||||
no-repeat;
|
||||
background-size: 1.5rem 1.5rem;
|
||||
width: 1.5rem;
|
||||
height: 1.5rem;
|
||||
float: right;
|
||||
margin: 0.5rem 0.5rem 0 0;
|
||||
}
|
||||
.tag-sub-tags > a {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.tag-card .btn-group a {
|
||||
z-index: 10;
|
||||
}
|
||||
.tag-sub-tags {
|
||||
font-size: 0;
|
||||
}
|
||||
.tag-parent-tags {
|
||||
display: none;
|
||||
}
|
||||
```
|
||||
# Global
|
||||
|
||||
## Change the order of navigation bar buttons
|
||||
@ -601,6 +901,7 @@ div.nav-link[data-rb-event-key="/scenes"] {
|
||||
.image-thumbnail,
|
||||
.gallery-card-image,
|
||||
.performer-card-image,
|
||||
.tag-card-image,
|
||||
img.performer,
|
||||
.movie-card-image,
|
||||
.gallery .flexbin img,
|
||||
@ -614,7 +915,7 @@ img.performer,
|
||||
#scene-tabs-tabpane-scene-file-info-panel span.col-8.text-truncate > a,
|
||||
.gallery .flexbin img,
|
||||
.movie-details .logo {
|
||||
filter: blur(8px);
|
||||
filter: blur(12px);
|
||||
}
|
||||
|
||||
.scene-card-video {
|
||||
@ -762,7 +1063,7 @@ img.performer:hover,
|
||||
|-|-|
|
||||
|Description|Hide 0 count badges.|
|
||||
|Author|echo6ix|
|
||||
|Screenshots||
|
||||
|Screenshots||
|
||||
|
||||
```css
|
||||
/* [Global changes] Hide 0 count badges */
|
||||
|
||||
564
user-interface-ui/themes/mobile-layout-overhaul.md
Normal file
@ -0,0 +1,564 @@
|
||||
---
|
||||
layout: clean
|
||||
title: Mobile Layout Overhaul
|
||||
nav_order: 8
|
||||
parent: Themes
|
||||
grand_parent: User Interface (UI)
|
||||
---
|
||||
|
||||
<details markdown="block">
|
||||
<summary>
|
||||
Table of Contents
|
||||
</summary>
|
||||
{: .text-delta }
|
||||
1. TOC
|
||||
{:toc}
|
||||
</details>
|
||||
|
||||
Made by [@Dankonite](https://github.com/Dankonite)
|
||||
|
||||
Took some of the mobile ui overhauls I made for my other theme (Neon Dark) and reverted them back to the default stash color scheme at the request of someone on discord. Figured someone else might want this aswell. All changes are screen width dependant and dont change anything on the main desktop ui.
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||
|
||||
## Install
|
||||
|
||||
1. Open User **Interface** Configuration panel in **settings**. (http://localhost:9999/settings?tab=interface)
|
||||
2. Tick/Enable Custom CSS ✅
|
||||
3. Copy&Paste [CSS Code](#css-code) to the Custom CSS text area.
|
||||
|
||||
Enjoy!
|
||||
|
||||
## CSS Code
|
||||
|
||||
```css
|
||||
/* Mobile Layout Overhaul by Dankonite */
|
||||
:root
|
||||
{
|
||||
--card-radius:.75rem;
|
||||
--font-color:#fff;
|
||||
--menu-rounding:1rem;
|
||||
--not-card-radius:.25rem;
|
||||
}
|
||||
@media(max-width: 576px) {
|
||||
.btn
|
||||
{
|
||||
border-radius:var(--not-card-radius)
|
||||
}
|
||||
.dropdown-item
|
||||
{
|
||||
border-radius:var(--menu-rounding)
|
||||
}
|
||||
.edit-buttons-container>*
|
||||
{
|
||||
margin-bottom:1rem
|
||||
}
|
||||
.form-control
|
||||
{
|
||||
border-radius:var(--not-card-radius);
|
||||
padding-right:1.3rem
|
||||
}
|
||||
.input-group-text
|
||||
{
|
||||
color:var(--font-color)
|
||||
}
|
||||
.input-group.has-validation>.input-group-append>div>div>button
|
||||
{
|
||||
border-bottom-left-radius:0!important;
|
||||
border-top-left-radius:0!important
|
||||
}
|
||||
.nav-pills .nav-link
|
||||
{
|
||||
border-radius:var(--not-card-radius)
|
||||
}
|
||||
.row
|
||||
{
|
||||
margin-left:0;
|
||||
margin-right:0
|
||||
}
|
||||
.saved-filter-list-menu>div>div
|
||||
{
|
||||
margin-bottom:1rem
|
||||
}
|
||||
.search-item
|
||||
{
|
||||
border-radius:.25rem;
|
||||
padding:1rem
|
||||
}
|
||||
.set-as-default-button
|
||||
{
|
||||
margin-top:1rem
|
||||
}
|
||||
button.brand-link
|
||||
{
|
||||
font-size:0;
|
||||
visibility:hidden!important
|
||||
}
|
||||
button.brand-link:after
|
||||
{
|
||||
align-items:center;
|
||||
border-radius:var(--not-card-radius);
|
||||
content:"Home";
|
||||
display:inline-block;
|
||||
font-size:1rem;
|
||||
height:40px;
|
||||
padding:7px 12px;
|
||||
position:relative;
|
||||
top:-1px;
|
||||
vertical-align:middle;
|
||||
visibility:visible
|
||||
}
|
||||
div.row>h4
|
||||
{
|
||||
margin:0;
|
||||
padding:1rem
|
||||
}
|
||||
div.row>hr.w-100
|
||||
{
|
||||
padding-bottom:1rem
|
||||
}
|
||||
input.bg-secondary.text-white.border-secondary.form-control,.date-input.form-control,.text-input.form-control
|
||||
{
|
||||
height:33.5px
|
||||
}
|
||||
.brand-link:after
|
||||
{
|
||||
margin-left:-16px
|
||||
}
|
||||
.top-nav .btn
|
||||
{
|
||||
padding:0 12px
|
||||
}
|
||||
.bs-popover-bottom>.arrow:after,.bs-popover-auto[x-placement^=bottom]>.arrow:after
|
||||
{
|
||||
border-width:0 .5rem .5rem;
|
||||
top:1px
|
||||
}
|
||||
.btn-toolbar>.btn-group>.dropdown>button,.query-text-field,.form-control,.dropdown,.dropdown-toggle
|
||||
{
|
||||
height:100%
|
||||
}
|
||||
.navbar-brand
|
||||
{
|
||||
display:inline-block;
|
||||
font-size:1.25rem;
|
||||
line-height:inherit;
|
||||
margin-right:0;
|
||||
padding-bottom:.3125rem;
|
||||
padding-top:.3125rem;
|
||||
white-space:nowrap
|
||||
}
|
||||
.navbar-expand-xl .navbar-nav .nav-link
|
||||
{
|
||||
padding-left:.5rem;
|
||||
padding-right:0
|
||||
}
|
||||
h6.col-md-2.col-4
|
||||
{
|
||||
display:flex;
|
||||
justify-content:center
|
||||
}
|
||||
.TruncatedText.scene-card__description
|
||||
{
|
||||
font-size:.9rem
|
||||
}
|
||||
.brand-link
|
||||
{
|
||||
padding:0
|
||||
}
|
||||
.btn-toolbar
|
||||
{
|
||||
justify-content:flex-start;
|
||||
padding-top:.5rem
|
||||
}
|
||||
.dropdown-item.disabled,.dropdown-item:disabled
|
||||
{
|
||||
color:#adb5bd
|
||||
}
|
||||
.dropdown-menu.show
|
||||
{
|
||||
display:block;
|
||||
padding:1rem
|
||||
}
|
||||
body
|
||||
{
|
||||
text-align:left
|
||||
}
|
||||
div.navbar-buttons>:not(.mr-2)
|
||||
{
|
||||
border-radius:var(--not-card-radius)
|
||||
}
|
||||
h5,.h5
|
||||
{
|
||||
font-size:1.1rem
|
||||
}
|
||||
.gallery-card
|
||||
{
|
||||
width:unset!important
|
||||
}
|
||||
.performer-card
|
||||
{
|
||||
width:unset!important
|
||||
}
|
||||
.tag-card-image
|
||||
{
|
||||
height:120px
|
||||
}
|
||||
#scrubber-current-position
|
||||
{
|
||||
height:30px;
|
||||
left:50%;
|
||||
position:absolute;
|
||||
width:2px;
|
||||
z-index:1
|
||||
}
|
||||
#scrubber-position-indicator
|
||||
{
|
||||
height:20px;
|
||||
left:-100%;
|
||||
position:absolute;
|
||||
width:100%;
|
||||
z-index:0
|
||||
}
|
||||
.badge-secondary
|
||||
{
|
||||
border-radius:.25rem;
|
||||
}
|
||||
.filter-button .badge
|
||||
{
|
||||
border-radius:999px;
|
||||
right:-7px;
|
||||
top:-6px;
|
||||
z-index:3!important
|
||||
}
|
||||
.gallery-card
|
||||
{
|
||||
height:min-content!important
|
||||
}
|
||||
.gallery-card.card
|
||||
{
|
||||
padding-bottom:0
|
||||
}
|
||||
.modal-footer
|
||||
{
|
||||
border-radius:1rem;
|
||||
border-top-left-radius:0;
|
||||
border-top-right-radius:0
|
||||
}
|
||||
.modal-header
|
||||
{
|
||||
border-bottom-left-radius:0!important;
|
||||
border-bottom-right-radius:0!important;
|
||||
border-radius:1rem
|
||||
}
|
||||
.performer-card .fi
|
||||
{
|
||||
bottom:.3rem;
|
||||
filter:drop-shadow(0 0 2px rgba(0,0,0,.9));
|
||||
height:2rem;
|
||||
position:absolute;
|
||||
right:.2rem;
|
||||
width:3rem
|
||||
}
|
||||
.scene-header>h3>.TruncatedText
|
||||
{
|
||||
text-align:left
|
||||
}
|
||||
.scene-specs-overlay,.scene-interactive-speed-overlay,.scene-studio-overlay,span.scene-card__date
|
||||
{
|
||||
font-weight:900!important
|
||||
}
|
||||
.scrubber-tags-background
|
||||
{
|
||||
height:20px;
|
||||
left:0;
|
||||
position:absolute;
|
||||
right:0
|
||||
}
|
||||
hr
|
||||
{
|
||||
margin:0
|
||||
}
|
||||
.card.performer-card
|
||||
{
|
||||
padding:0
|
||||
}
|
||||
.performer-card__age
|
||||
{
|
||||
text-align:center
|
||||
}
|
||||
.slick-list .gallery-card
|
||||
{
|
||||
width:min-content
|
||||
}
|
||||
.slick-slide .card
|
||||
{
|
||||
height:min-content
|
||||
}
|
||||
.slick-track
|
||||
{
|
||||
margin-bottom:1rem;
|
||||
top:0
|
||||
}
|
||||
.tag-sub-tags,.studio-child-studios
|
||||
{
|
||||
display:none
|
||||
}
|
||||
.card-popovers
|
||||
{
|
||||
justify-content:space-around;
|
||||
margin-bottom:2px;
|
||||
margin-top:2px
|
||||
}
|
||||
.card-section
|
||||
{
|
||||
height:100%;
|
||||
padding:0 .2rem
|
||||
}
|
||||
.scene-specs-overlay
|
||||
{
|
||||
bottom:.2rem;
|
||||
right:.2rem
|
||||
}
|
||||
.scene-studio-overlay
|
||||
{
|
||||
line-height:.8rem;
|
||||
max-width:50%;
|
||||
right:.2rem;
|
||||
top:.2rem
|
||||
}
|
||||
.edit-buttons>button
|
||||
{
|
||||
margin-left:1px
|
||||
}
|
||||
.scene-card__details,.gallery-card__details
|
||||
{
|
||||
margin-bottom:0!important
|
||||
}
|
||||
.setting-section .setting>div:last-child
|
||||
{
|
||||
display:flex;
|
||||
justify-content:center;
|
||||
text-align:right
|
||||
}
|
||||
span.scene-card__date
|
||||
{
|
||||
display:flex;
|
||||
font-size:.8em;
|
||||
justify-content:flex-end;
|
||||
margin-right:.2rem
|
||||
}
|
||||
a.marker-count
|
||||
{
|
||||
display:none
|
||||
}
|
||||
a[target='_blank']
|
||||
{
|
||||
display:none
|
||||
}
|
||||
button.collapse-button.btn-primary:not(:disabled):not(.disabled):hover,button.collapse-button.btn-primary:not(:disabled):not(.disabled):focus,button.collapse-button.btn-primary:not(:disabled):not(.disabled):active
|
||||
{
|
||||
color:var(--font-color)
|
||||
}
|
||||
.TruncatedText
|
||||
{
|
||||
text-align:center;
|
||||
white-space:pre-line;
|
||||
word-break:break-word
|
||||
}
|
||||
.gallery-card
|
||||
{
|
||||
width:min-content!important
|
||||
}
|
||||
.gallery-card-image
|
||||
{
|
||||
max-height:240px!important;
|
||||
width:auto!important
|
||||
}
|
||||
.grid-card .progress-bar
|
||||
{
|
||||
bottom:0
|
||||
}
|
||||
.grid-card a .card-section-title
|
||||
{
|
||||
color:var(--font-color);
|
||||
display:flex;
|
||||
justify-content:center
|
||||
}
|
||||
.ml-2.mb-2.d-none.d-sm-inline-flex
|
||||
{
|
||||
display:none!important
|
||||
}
|
||||
.tag-card
|
||||
{
|
||||
padding:0;
|
||||
width:auto!important
|
||||
}
|
||||
body
|
||||
{
|
||||
color:var(--font-color);
|
||||
padding:3.6rem 0 0
|
||||
}
|
||||
div.mb-2
|
||||
{
|
||||
height:auto
|
||||
}
|
||||
.card
|
||||
{
|
||||
padding:0
|
||||
}
|
||||
.container,.container-fluid,.container-xl,.container-lg,.container-md,.container-sm
|
||||
{
|
||||
padding-left:0;
|
||||
padding-right:0
|
||||
}
|
||||
.d-flex.justify-content-center.mb-2.wrap-tags.filter-tags
|
||||
{
|
||||
margin:0!important
|
||||
}
|
||||
.input-control,.text-input
|
||||
{
|
||||
color:var(--font-color)
|
||||
}
|
||||
.navbar-buttons>.mr-2,.card hr
|
||||
{
|
||||
margin:0!important
|
||||
}
|
||||
.preview-button .fa-icon
|
||||
{
|
||||
color:var(--font-color)
|
||||
}
|
||||
.rating-banner
|
||||
{
|
||||
display:none!important
|
||||
}
|
||||
.scene-card-preview,.gallery-card-image,.tag-card-image,.image-card-preview
|
||||
{
|
||||
width:100%
|
||||
}
|
||||
.slick-dots li button:before
|
||||
{
|
||||
content:"."
|
||||
}
|
||||
.slick-dots li.slick-active button:before
|
||||
{
|
||||
opacity:.75
|
||||
}
|
||||
.tag-item
|
||||
{
|
||||
color:var(--font-color)
|
||||
}
|
||||
.tag-item .btn
|
||||
{
|
||||
color:var(--font-color)
|
||||
}
|
||||
.top-nav
|
||||
{
|
||||
padding:0 2rem!important
|
||||
}
|
||||
a.nav-utility,button[title='Help'],.nav-menu-toggle
|
||||
{
|
||||
margin-left:.5rem
|
||||
}
|
||||
button.brand-link,.top-nav .navbar-buttons .btn
|
||||
{
|
||||
height:40px
|
||||
}
|
||||
div.react-select__control
|
||||
{
|
||||
color:var(--font-color)
|
||||
}
|
||||
div.react-select__control .react-select__multi-value,div.react-select__multi-value__label,div.react-select__multi-value__remove
|
||||
{
|
||||
color:var(--font-color)!important
|
||||
}
|
||||
div.react-select__menu,div.dropdown-menu
|
||||
{
|
||||
color:var(--font-color)
|
||||
}
|
||||
div.react-select__multi-value
|
||||
{
|
||||
border-radius:999px
|
||||
}
|
||||
div.react-select__multi-value__label
|
||||
{
|
||||
border-bottom-left-radius:999px;
|
||||
border-top-left-radius:999px;
|
||||
padding-right:8px
|
||||
}
|
||||
div.react-select__multi-value__remove
|
||||
{
|
||||
border-bottom-right-radius:999px;
|
||||
border-top-right-radius:999px;
|
||||
padding-left:0
|
||||
}
|
||||
div.react-select__placeholder
|
||||
{
|
||||
color:var(--font-color)
|
||||
}
|
||||
div[id='settings-menu-container']
|
||||
{
|
||||
padding-top:.5rem
|
||||
}
|
||||
div[role='group'].ml-auto.btn-group>div
|
||||
{
|
||||
margin-right:.5rem;
|
||||
margin-top:.5rem
|
||||
}
|
||||
.grid-card a .card-section-title
|
||||
{
|
||||
display:flex;
|
||||
justify-content:center
|
||||
}
|
||||
dl.details-list {
|
||||
grid-column-gap:0;
|
||||
}
|
||||
dt {
|
||||
padding-right: .5rem;
|
||||
}
|
||||
dd {
|
||||
margin-bottom: 0;
|
||||
padding-left: .5rem;
|
||||
}
|
||||
#performer-page .performer-image-container .performer {
|
||||
border-radius:var(--menu-rounding);
|
||||
border: 0!important;
|
||||
}
|
||||
.recommendations-container-edit .recommendation-row {
|
||||
border-radius: 1rem;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.recommendations-container-edit.recommendations-container>div>div:first-of-type {
|
||||
margin-top: calc(1rem + 10px);
|
||||
}
|
||||
}
|
||||
@media (max-width: 575.98px) and (orientation: portrait) {
|
||||
.container,.container-fluid,.container-xl,.container-lg,.container-nd,.container-sm
|
||||
{
|
||||
padding-top:3.5rem!important
|
||||
}
|
||||
.top-nav
|
||||
{
|
||||
bottom:unset;
|
||||
top:auto
|
||||
}
|
||||
.performer-card-image
|
||||
{
|
||||
height:25vh
|
||||
}
|
||||
body
|
||||
{
|
||||
padding:0
|
||||
}
|
||||
.grid-card
|
||||
{
|
||||
width:47vw
|
||||
}
|
||||
.grid-card
|
||||
{
|
||||
width:47vw
|
||||
}
|
||||
}
|
||||
```
|
||||