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:
JoeSmithStarkers
2020-11-25 12:45:10 +11:00
committed by GitHub
parent 502e9297ad
commit e3eb550a7d
25 changed files with 445 additions and 73 deletions

View File

@@ -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>

View File

@@ -0,0 +1,3 @@
### 🎨 Improvements
* Support optional preview and sprite generation during scanning.
* Support configurable number of threads for scanning and generation.

View File

@@ -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>

View File

@@ -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