diff --git a/graphql/schema/types/metadata.graphql b/graphql/schema/types/metadata.graphql index d00e2846c..f83f3ad78 100644 --- a/graphql/schema/types/metadata.graphql +++ b/graphql/schema/types/metadata.graphql @@ -33,15 +33,15 @@ input GeneratePreviewOptionsInput { input ScanMetadataInput { paths: [String!] """Set name, date, details from metadata (if present)""" - useFileMetadata: Boolean! + useFileMetadata: Boolean """Strip file extension from title""" - stripFileExtension: Boolean! + stripFileExtension: Boolean """Generate previews during scan""" - scanGeneratePreviews: Boolean! + scanGeneratePreviews: Boolean """Generate image previews during scan""" - scanGenerateImagePreviews: Boolean! + scanGenerateImagePreviews: Boolean """Generate sprites during scan""" - scanGenerateSprites: Boolean! + scanGenerateSprites: Boolean } input CleanMetadataInput { diff --git a/pkg/image/image.go b/pkg/image/image.go index ec781afb7..f11579a0f 100644 --- a/pkg/image/image.go +++ b/pkg/image/image.go @@ -59,6 +59,13 @@ func ZipFilename(zipFilename, filenameInZip string) string { return zipFilename + zipSeparator + filenameInZip } +// IsZipPath returns true if the path includes the zip separator byte, +// indicating it is within a zip file. +// TODO - this should be moved to utils +func IsZipPath(p string) bool { + return strings.Contains(p, zipSeparator) +} + type imageReadCloser struct { src io.ReadCloser zrc *zip.ReadCloser diff --git a/pkg/manager/manager_tasks.go b/pkg/manager/manager_tasks.go index cf36f4c67..28e42022b 100644 --- a/pkg/manager/manager_tasks.go +++ b/pkg/manager/manager_tasks.go @@ -215,13 +215,13 @@ func (s *singleton) Scan(input models.ScanMetadataInput) { task := ScanTask{ TxnManager: s.TxnManager, FilePath: path, - UseFileMetadata: input.UseFileMetadata, - StripFileExtension: input.StripFileExtension, + UseFileMetadata: utils.IsTrue(input.UseFileMetadata), + StripFileExtension: utils.IsTrue(input.StripFileExtension), fileNamingAlgorithm: fileNamingAlgo, calculateMD5: calculateMD5, - GeneratePreview: input.ScanGeneratePreviews, - GenerateImagePreview: input.ScanGenerateImagePreviews, - GenerateSprite: input.ScanGenerateSprites, + GeneratePreview: utils.IsTrue(input.ScanGeneratePreviews), + GenerateImagePreview: utils.IsTrue(input.ScanGenerateImagePreviews), + GenerateSprite: utils.IsTrue(input.ScanGenerateSprites), } go task.Start(&wg) diff --git a/pkg/manager/task_scan.go b/pkg/manager/task_scan.go index f89600149..e2ac3834c 100644 --- a/pkg/manager/task_scan.go +++ b/pkg/manager/task_scan.go @@ -1044,6 +1044,12 @@ func walkFilesToScan(s *models.StashConfig, f filepath.WalkFunc) error { excludeVidRegex := generateRegexps(config.GetExcludes()) excludeImgRegex := generateRegexps(config.GetImageExcludes()) + // don't scan zip images directly + if image.IsZipPath(s.Path) { + logger.Warnf("Cannot rescan zip image %s. Rescan zip gallery instead.", s.Path) + return nil + } + generatedPath := config.GetGeneratedPath() return utils.SymWalk(s.Path, func(path string, info os.FileInfo, err error) error { diff --git a/pkg/utils/boolean.go b/pkg/utils/boolean.go index f0abd02c3..a5f23733b 100644 --- a/pkg/utils/boolean.go +++ b/pkg/utils/boolean.go @@ -7,3 +7,8 @@ func Btoi(b bool) int { } return 0 } + +// IsTrue returns true if the bool pointer is not nil and true. +func IsTrue(b *bool) bool { + return b != nil && *b +} diff --git a/ui/v2.5/src/components/Changelog/Changelog.tsx b/ui/v2.5/src/components/Changelog/Changelog.tsx index 1d8d321e8..7d0434a3c 100644 --- a/ui/v2.5/src/components/Changelog/Changelog.tsx +++ b/ui/v2.5/src/components/Changelog/Changelog.tsx @@ -8,6 +8,7 @@ import V021 from "./versions/v021.md"; import V030 from "./versions/v030.md"; import V040 from "./versions/v040.md"; import V050 from "./versions/v050.md"; +import V060 from "./versions/v060.md"; import { MarkdownPage } from "../Shared/MarkdownPage"; const Changelog: React.FC = () => { @@ -37,11 +38,19 @@ const Changelog: React.FC = () => { <>