mirror of
https://github.com/stashapp/stash.git
synced 2025-12-18 12:54:38 +03:00
Parallel scanning/generation, and combined scanning/preview/sprite (#820)
* Implement parallel scanning and generation, and combined scanning/preview/sprite generation. * Added UI component for preview/sprite generation during scan, and configurable number of parallel tasks. * Add v050 changelog entry
This commit is contained in:
@@ -7,6 +7,7 @@ import V020 from "./versions/v020.md";
|
||||
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 { MarkdownPage } from "../Shared/MarkdownPage";
|
||||
|
||||
const Changelog: React.FC = () => {
|
||||
@@ -36,11 +37,20 @@ const Changelog: React.FC = () => {
|
||||
<>
|
||||
<h1 className="mb-4">Changelog:</h1>
|
||||
<Version
|
||||
version={stashVersion || "v0.4.0"}
|
||||
version={stashVersion || "v0.5.0"}
|
||||
date={buildDate}
|
||||
openState={openState}
|
||||
setOpenState={setVersionOpenState}
|
||||
defaultOpen
|
||||
>
|
||||
<MarkdownPage page={V050} />
|
||||
</Version>
|
||||
<Version
|
||||
version="v0.4.0"
|
||||
date="2020-11-24"
|
||||
openState={openState}
|
||||
setOpenState={setVersionOpenState}
|
||||
defaultOpen
|
||||
>
|
||||
<MarkdownPage page={V040} />
|
||||
</Version>
|
||||
|
||||
3
ui/v2.5/src/components/Changelog/versions/v050.md
Normal file
3
ui/v2.5/src/components/Changelog/versions/v050.md
Normal file
@@ -0,0 +1,3 @@
|
||||
### 🎨 Improvements
|
||||
* Support optional preview and sprite generation during scanning.
|
||||
* Support configurable number of threads for scanning and generation.
|
||||
@@ -79,6 +79,7 @@ export const SettingsConfigurationPanel: React.FC = () => {
|
||||
const [videoFileNamingAlgorithm, setVideoFileNamingAlgorithm] = useState<
|
||||
GQL.HashAlgorithm | undefined
|
||||
>(undefined);
|
||||
const [parallelTasks, setParallelTasks] = useState<number>(0);
|
||||
const [previewSegments, setPreviewSegments] = useState<number>(0);
|
||||
const [previewSegmentDuration, setPreviewSegmentDuration] = useState<number>(
|
||||
0
|
||||
@@ -139,6 +140,7 @@ export const SettingsConfigurationPanel: React.FC = () => {
|
||||
calculateMD5,
|
||||
videoFileNamingAlgorithm:
|
||||
(videoFileNamingAlgorithm as GQL.HashAlgorithm) ?? undefined,
|
||||
parallelTasks,
|
||||
previewSegments,
|
||||
previewSegmentDuration,
|
||||
previewExcludeStart,
|
||||
@@ -182,6 +184,7 @@ export const SettingsConfigurationPanel: React.FC = () => {
|
||||
setCachePath(conf.general.cachePath);
|
||||
setVideoFileNamingAlgorithm(conf.general.videoFileNamingAlgorithm);
|
||||
setCalculateMD5(conf.general.calculateMD5);
|
||||
setParallelTasks(conf.general.parallelTasks);
|
||||
setPreviewSegments(conf.general.previewSegments);
|
||||
setPreviewSegmentDuration(conf.general.previewSegmentDuration);
|
||||
setPreviewExcludeStart(conf.general.previewExcludeStart);
|
||||
@@ -567,6 +570,31 @@ export const SettingsConfigurationPanel: React.FC = () => {
|
||||
|
||||
<hr />
|
||||
|
||||
<Form.Group>
|
||||
<h4>Parallel Scan/Generation</h4>
|
||||
|
||||
<Form.Group id="parallel-tasks">
|
||||
<h6>Number of parallel task for scan/generation</h6>
|
||||
<Form.Control
|
||||
className="col col-sm-6 text-input"
|
||||
type="number"
|
||||
value={parallelTasks}
|
||||
onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
|
||||
setParallelTasks(
|
||||
Number.parseInt(e.currentTarget.value || "0", 10)
|
||||
)
|
||||
}
|
||||
/>
|
||||
<Form.Text className="text-muted">
|
||||
Set to 0 for auto-detection. Warning running more tasks than is
|
||||
required to achieve 100% cpu utilisation will decrease performance
|
||||
and potentially cause other issues.
|
||||
</Form.Text>
|
||||
</Form.Group>
|
||||
</Form.Group>
|
||||
|
||||
<hr />
|
||||
|
||||
<Form.Group>
|
||||
<h4>Preview Generation</h4>
|
||||
|
||||
|
||||
@@ -31,6 +31,16 @@ export const SettingsTasksPanel: React.FC = () => {
|
||||
const [isImportDialogOpen, setIsImportDialogOpen] = useState<boolean>(false);
|
||||
const [isScanDialogOpen, setIsScanDialogOpen] = useState<boolean>(false);
|
||||
const [useFileMetadata, setUseFileMetadata] = useState<boolean>(false);
|
||||
const [scanGeneratePreviews, setScanGeneratePreviews] = useState<boolean>(
|
||||
false
|
||||
);
|
||||
const [scanGenerateSprites, setScanGenerateSprites] = useState<boolean>(
|
||||
false
|
||||
);
|
||||
const [scanGenerateImagePreviews, setScanGenerateImagePreviews] = useState<
|
||||
boolean
|
||||
>(false);
|
||||
|
||||
const [status, setStatus] = useState<string>("");
|
||||
const [progress, setProgress] = useState<number>(0);
|
||||
|
||||
@@ -166,8 +176,11 @@ export const SettingsTasksPanel: React.FC = () => {
|
||||
async function onScan(paths?: string[]) {
|
||||
try {
|
||||
await mutateMetadataScan({
|
||||
useFileMetadata,
|
||||
paths,
|
||||
useFileMetadata,
|
||||
scanGeneratePreviews,
|
||||
scanGenerateImagePreviews,
|
||||
scanGenerateSprites,
|
||||
});
|
||||
Toast.success({ content: "Started scan" });
|
||||
jobStatus.refetch();
|
||||
@@ -304,6 +317,31 @@ export const SettingsTasksPanel: React.FC = () => {
|
||||
label="Set name, date, details from metadata (if present)"
|
||||
onChange={() => setUseFileMetadata(!useFileMetadata)}
|
||||
/>
|
||||
<Form.Check
|
||||
id="scan-generate-previews"
|
||||
checked={scanGeneratePreviews}
|
||||
label="Generate previews during scan (video previews which play when hovering over a scene)"
|
||||
onChange={() => setScanGeneratePreviews(!scanGeneratePreviews)}
|
||||
/>
|
||||
<div className="d-flex flex-row">
|
||||
<div>↳</div>
|
||||
<Form.Check
|
||||
id="scan-generate-image-previews"
|
||||
checked={scanGenerateImagePreviews}
|
||||
disabled={!scanGeneratePreviews}
|
||||
label="Generate image previews during scan (animated WebP previews, only required if Preview Type is set to Animated Image)"
|
||||
onChange={() =>
|
||||
setScanGenerateImagePreviews(!scanGenerateImagePreviews)
|
||||
}
|
||||
className="ml-2 flex-grow"
|
||||
/>
|
||||
</div>
|
||||
<Form.Check
|
||||
id="scan-generate-sprites"
|
||||
checked={scanGenerateSprites}
|
||||
label="Generate sprites during scan (for the scene scrubber)"
|
||||
onChange={() => setScanGenerateSprites(!scanGenerateSprites)}
|
||||
/>
|
||||
</Form.Group>
|
||||
<Form.Group>
|
||||
<Button
|
||||
|
||||
Reference in New Issue
Block a user