diff --git a/graphql/documents/data/config.graphql b/graphql/documents/data/config.graphql index 3fb5b6714..1e5040f09 100644 --- a/graphql/documents/data/config.graphql +++ b/graphql/documents/data/config.graphql @@ -7,6 +7,7 @@ fragment ConfigGeneralData on ConfigGeneralResult { databasePath generatedPath metadataPath + scrapersPath cachePath calculateMD5 videoFileNamingAlgorithm diff --git a/graphql/schema/types/config.graphql b/graphql/schema/types/config.graphql index b1c91a207..0bab8fd93 100644 --- a/graphql/schema/types/config.graphql +++ b/graphql/schema/types/config.graphql @@ -41,6 +41,8 @@ input ConfigGeneralInput { generatedPath: String """Path to import/export files""" metadataPath: String + """Path to scrapers""" + scrapersPath: String """Path to cache""" cachePath: String """Whether to calculate MD5 checksums for scene video files""" diff --git a/pkg/api/resolver_mutation_configure.go b/pkg/api/resolver_mutation_configure.go index eef6f5651..48f074769 100644 --- a/pkg/api/resolver_mutation_configure.go +++ b/pkg/api/resolver_mutation_configure.go @@ -57,6 +57,20 @@ func (r *mutationResolver) ConfigureGeneral(ctx context.Context, input models.Co return nil } + validateDir := func(key string, value string, optional bool) error { + if err := checkConfigOverride(config.Metadata); err != nil { + return err + } + + if !optional || value != "" { + if err := utils.EnsureDir(value); err != nil { + return err + } + } + + return nil + } + existingDBPath := c.GetDatabasePath() if input.DatabasePath != nil && existingDBPath != *input.DatabasePath { if err := checkConfigOverride(config.Database); err != nil { @@ -72,41 +86,39 @@ func (r *mutationResolver) ConfigureGeneral(ctx context.Context, input models.Co existingGeneratedPath := c.GetGeneratedPath() if input.GeneratedPath != nil && existingGeneratedPath != *input.GeneratedPath { - if err := checkConfigOverride(config.Generated); err != nil { + if err := validateDir(config.Generated, *input.GeneratedPath, false); err != nil { return makeConfigGeneralResult(), err } - if err := utils.EnsureDir(*input.GeneratedPath); err != nil { + c.Set(config.Generated, input.GeneratedPath) + } + + refreshScraperCache := false + existingScrapersPath := c.GetScrapersPath() + if input.ScrapersPath != nil && existingScrapersPath != *input.ScrapersPath { + if err := validateDir(config.ScrapersPath, *input.ScrapersPath, false); err != nil { return makeConfigGeneralResult(), err } - c.Set(config.Generated, input.GeneratedPath) + + refreshScraperCache = true + c.Set(config.ScrapersPath, input.ScrapersPath) } existingMetadataPath := c.GetMetadataPath() if input.MetadataPath != nil && existingMetadataPath != *input.MetadataPath { - if err := checkConfigOverride(config.Metadata); err != nil { + if err := validateDir(config.Metadata, *input.MetadataPath, true); err != nil { return makeConfigGeneralResult(), err } - if *input.MetadataPath != "" { - if err := utils.EnsureDir(*input.MetadataPath); err != nil { - return makeConfigGeneralResult(), err - } - } c.Set(config.Metadata, input.MetadataPath) } existingCachePath := c.GetCachePath() if input.CachePath != nil && existingCachePath != *input.CachePath { - if err := checkConfigOverride(config.Metadata); err != nil { + if err := validateDir(config.Cache, *input.CachePath, true); err != nil { return makeConfigGeneralResult(), err } - if *input.CachePath != "" { - if err := utils.EnsureDir(*input.CachePath); err != nil { - return makeConfigGeneralResult(), err - } - } c.Set(config.Cache, input.CachePath) } @@ -235,7 +247,6 @@ func (r *mutationResolver) ConfigureGeneral(ctx context.Context, input models.Co initialiseCustomImages() } - refreshScraperCache := false if input.ScraperUserAgent != nil { c.Set(config.ScraperUserAgent, input.ScraperUserAgent) refreshScraperCache = true diff --git a/ui/v2.5/src/components/Changelog/versions/v0120.md b/ui/v2.5/src/components/Changelog/versions/v0120.md index 103686d79..047e57eb9 100644 --- a/ui/v2.5/src/components/Changelog/versions/v0120.md +++ b/ui/v2.5/src/components/Changelog/versions/v0120.md @@ -7,6 +7,7 @@ * Added forward jump 10 second button to video player. ([#1973](https://github.com/stashapp/stash/pull/1973)) ### 🎨 Improvements +* Added support for setting scrapers path in the settings page. ([#2124](https://github.com/stashapp/stash/pull/2124)) * Added keyboard shortcuts to hide scene page sidebar and scene scrubber. ([#2099](https://github.com/stashapp/stash/pull/2099)) * Overhauled, restructured and added auto-save to the settings pages. ([#2086](https://github.com/stashapp/stash/pull/2086)) * Include path and hashes in destroy scene/image/gallery post hook input. ([#2102](https://github.com/stashapp/stash/pull/2102/files)) diff --git a/ui/v2.5/src/components/Settings/SettingsSystemPanel.tsx b/ui/v2.5/src/components/Settings/SettingsSystemPanel.tsx index 20dc853a8..7190afa98 100644 --- a/ui/v2.5/src/components/Settings/SettingsSystemPanel.tsx +++ b/ui/v2.5/src/components/Settings/SettingsSystemPanel.tsx @@ -116,6 +116,14 @@ export const SettingsConfigurationPanel: React.FC = () => { onChange={(v) => saveGeneral({ generatedPath: v })} /> + saveGeneral({ scrapersPath: v })} + /> +