From afcadd941b90af2260a054b2e8b789aa4e9f73eb Mon Sep 17 00:00:00 2001 From: WithoutPants <53250216+WithoutPants@users.noreply.github.com> Date: Sat, 12 Oct 2019 19:20:27 +1100 Subject: [PATCH] Make title from file metadata optional --- .../queries/settings/metadata.graphql | 4 +- graphql/schema/schema.graphql | 2 +- graphql/schema/types/metadata.graphql | 4 ++ pkg/api/resolver_query_metadata.go | 5 +- pkg/ffmpeg/ffprobe.go | 6 +- pkg/manager/manager_tasks.go | 4 +- pkg/manager/task_scan.go | 8 ++- pkg/models/generated_exec.go | 62 +++++++++++++++++-- pkg/models/generated_models.go | 4 ++ .../SettingsTasksPanel/SettingsTasksPanel.tsx | 13 ++-- ui/v2/src/core/StashService.ts | 3 +- ui/v2/src/core/generated-graphql.tsx | 14 +++-- 12 files changed, 105 insertions(+), 24 deletions(-) diff --git a/graphql/documents/queries/settings/metadata.graphql b/graphql/documents/queries/settings/metadata.graphql index 603ecaadb..ef45011f9 100644 --- a/graphql/documents/queries/settings/metadata.graphql +++ b/graphql/documents/queries/settings/metadata.graphql @@ -6,8 +6,8 @@ query MetadataExport { metadataExport } -query MetadataScan { - metadataScan +query MetadataScan($input: ScanMetadataInput!) { + metadataScan(input: $input) } query MetadataGenerate($input: GenerateMetadataInput!) { diff --git a/graphql/schema/schema.graphql b/graphql/schema/schema.graphql index 1bac03071..466c406e3 100644 --- a/graphql/schema/schema.graphql +++ b/graphql/schema/schema.graphql @@ -57,7 +57,7 @@ type Query { """Start an export. Returns the job ID""" metadataExport: String! """Start a scan. Returns the job ID""" - metadataScan: String! + metadataScan(input: ScanMetadataInput!): String! """Start generating content. Returns the job ID""" metadataGenerate(input: GenerateMetadataInput!): String! """Clean metadata. Returns the job ID""" diff --git a/graphql/schema/types/metadata.graphql b/graphql/schema/types/metadata.graphql index f332c0b2c..28190c487 100644 --- a/graphql/schema/types/metadata.graphql +++ b/graphql/schema/types/metadata.graphql @@ -3,4 +3,8 @@ input GenerateMetadataInput { previews: Boolean! markers: Boolean! transcodes: Boolean! +} + +input ScanMetadataInput { + nameFromMetadata: Boolean! } \ No newline at end of file diff --git a/pkg/api/resolver_query_metadata.go b/pkg/api/resolver_query_metadata.go index 1e00000f9..925d86d8e 100644 --- a/pkg/api/resolver_query_metadata.go +++ b/pkg/api/resolver_query_metadata.go @@ -2,12 +2,13 @@ package api import ( "context" + "github.com/stashapp/stash/pkg/manager" "github.com/stashapp/stash/pkg/models" ) -func (r *queryResolver) MetadataScan(ctx context.Context) (string, error) { - manager.GetInstance().Scan() +func (r *queryResolver) MetadataScan(ctx context.Context, input models.ScanMetadataInput) (string, error) { + manager.GetInstance().Scan(input.NameFromMetadata) return "todo", nil } diff --git a/pkg/ffmpeg/ffprobe.go b/pkg/ffmpeg/ffprobe.go index 98f2f9dc3..cbddb14d3 100644 --- a/pkg/ffmpeg/ffprobe.go +++ b/pkg/ffmpeg/ffprobe.go @@ -89,7 +89,7 @@ func parse(filePath string, probeJSON *FFProbeJSON) (*VideoFile, error) { if result.Title == "" { // default title to filename - result.Title = filepath.Base(result.Path) + result.SetTitleFromPath() } result.Comment = probeJSON.Format.Tags.Comment @@ -161,3 +161,7 @@ func (v *VideoFile) getStreamIndex(fileType string, probeJSON FFProbeJSON) int { return -1 } + +func (v *VideoFile) SetTitleFromPath() { + v.Title = filepath.Base(v.Path) +} diff --git a/pkg/manager/manager_tasks.go b/pkg/manager/manager_tasks.go index 3d64e1c03..0d8580fa0 100644 --- a/pkg/manager/manager_tasks.go +++ b/pkg/manager/manager_tasks.go @@ -11,7 +11,7 @@ import ( "github.com/stashapp/stash/pkg/utils" ) -func (s *singleton) Scan() { +func (s *singleton) Scan(nameFromMetadata bool) { if s.Status != Idle { return } @@ -31,7 +31,7 @@ func (s *singleton) Scan() { var wg sync.WaitGroup for _, path := range results { wg.Add(1) - task := ScanTask{FilePath: path} + task := ScanTask{FilePath: path, NameFromMetadata: nameFromMetadata} go task.Start(&wg) wg.Wait() } diff --git a/pkg/manager/task_scan.go b/pkg/manager/task_scan.go index b2e11d7cc..795d02d51 100644 --- a/pkg/manager/task_scan.go +++ b/pkg/manager/task_scan.go @@ -16,7 +16,8 @@ import ( ) type ScanTask struct { - FilePath string + FilePath string + NameFromMetadata bool } func (t *ScanTask) Start(wg *sync.WaitGroup) { @@ -90,6 +91,11 @@ func (t *ScanTask) scanScene() { return } + // Override title to be filename if nameFromMetadata is false + if !t.NameFromMetadata { + videoFile.SetTitleFromPath() + } + checksum, err := t.calculateChecksum() if err != nil { logger.Error(err.Error()) diff --git a/pkg/models/generated_exec.go b/pkg/models/generated_exec.go index a3a1aa11c..41d0c4dc2 100644 --- a/pkg/models/generated_exec.go +++ b/pkg/models/generated_exec.go @@ -175,7 +175,7 @@ type ComplexityRoot struct { MetadataExport func(childComplexity int) int MetadataGenerate func(childComplexity int, input GenerateMetadataInput) int MetadataImport func(childComplexity int) int - MetadataScan func(childComplexity int) int + MetadataScan func(childComplexity int, input ScanMetadataInput) int SceneMarkerTags func(childComplexity int, sceneID string) int SceneWall func(childComplexity int, q *string) int ScrapeFreeones func(childComplexity int, performerName string) int @@ -351,7 +351,7 @@ type QueryResolver interface { Directories(ctx context.Context, path *string) ([]string, error) MetadataImport(ctx context.Context) (string, error) MetadataExport(ctx context.Context) (string, error) - MetadataScan(ctx context.Context) (string, error) + MetadataScan(ctx context.Context, input ScanMetadataInput) (string, error) MetadataGenerate(ctx context.Context, input GenerateMetadataInput) (string, error) MetadataClean(ctx context.Context) (string, error) AllPerformers(ctx context.Context) ([]*Performer, error) @@ -1156,7 +1156,12 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in break } - return e.complexity.Query.MetadataScan(childComplexity), true + args, err := ec.field_Query_metadataScan_args(context.TODO(), rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Query.MetadataScan(childComplexity, args["input"].(ScanMetadataInput)), true case "Query.sceneMarkerTags": if e.complexity.Query.SceneMarkerTags == nil { @@ -1887,7 +1892,7 @@ type Query { """Start an export. Returns the job ID""" metadataExport: String! """Start a scan. Returns the job ID""" - metadataScan: String! + metadataScan(input: ScanMetadataInput!): String! """Start generating content. Returns the job ID""" metadataGenerate(input: GenerateMetadataInput!): String! """Clean metadata. Returns the job ID""" @@ -2070,6 +2075,10 @@ type FindGalleriesResultType { previews: Boolean! markers: Boolean! transcodes: Boolean! +} + +input ScanMetadataInput { + nameFromMetadata: Boolean! }`}, &ast.Source{Name: "graphql/schema/types/performer.graphql", Input: `type Performer { id: ID! @@ -2803,6 +2812,20 @@ func (ec *executionContext) field_Query_metadataGenerate_args(ctx context.Contex return args, nil } +func (ec *executionContext) field_Query_metadataScan_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { + var err error + args := map[string]interface{}{} + var arg0 ScanMetadataInput + if tmp, ok := rawArgs["input"]; ok { + arg0, err = ec.unmarshalNScanMetadataInput2githubᚗcomᚋstashappᚋstashᚋpkgᚋmodelsᚐScanMetadataInput(ctx, tmp) + if err != nil { + return nil, err + } + } + args["input"] = arg0 + return args, nil +} + func (ec *executionContext) field_Query_sceneMarkerTags_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { var err error args := map[string]interface{}{} @@ -5357,10 +5380,17 @@ func (ec *executionContext) _Query_metadataScan(ctx context.Context, field graph IsMethod: true, } ctx = graphql.WithResolverContext(ctx, rctx) + rawArgs := field.ArgumentMap(ec.Variables) + args, err := ec.field_Query_metadataScan_args(ctx, rawArgs) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + rctx.Args = args ctx = ec.Tracer.StartFieldResolverExecution(ctx, rctx) resTmp := ec.FieldMiddleware(ctx, nil, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().MetadataScan(rctx) + return ec.resolvers.Query().MetadataScan(rctx, args["input"].(ScanMetadataInput)) }) if resTmp == nil { if !ec.HasError(rctx) { @@ -8623,6 +8653,24 @@ func (ec *executionContext) unmarshalInputPerformerUpdateInput(ctx context.Conte return it, nil } +func (ec *executionContext) unmarshalInputScanMetadataInput(ctx context.Context, v interface{}) (ScanMetadataInput, error) { + var it ScanMetadataInput + var asMap = v.(map[string]interface{}) + + for k, v := range asMap { + switch k { + case "nameFromMetadata": + var err error + it.NameFromMetadata, err = ec.unmarshalNBoolean2bool(ctx, v) + if err != nil { + return it, err + } + } + } + + return it, nil +} + func (ec *executionContext) unmarshalInputSceneFilterType(ctx context.Context, v interface{}) (SceneFilterType, error) { var it SceneFilterType var asMap = v.(map[string]interface{}) @@ -11454,6 +11502,10 @@ func (ec *executionContext) unmarshalNPerformerUpdateInput2githubᚗcomᚋstasha return ec.unmarshalInputPerformerUpdateInput(ctx, v) } +func (ec *executionContext) unmarshalNScanMetadataInput2githubᚗcomᚋstashappᚋstashᚋpkgᚋmodelsᚐScanMetadataInput(ctx context.Context, v interface{}) (ScanMetadataInput, error) { + return ec.unmarshalInputScanMetadataInput(ctx, v) +} + func (ec *executionContext) marshalNScene2githubᚗcomᚋstashappᚋstashᚋpkgᚋmodelsᚐScene(ctx context.Context, sel ast.SelectionSet, v Scene) graphql.Marshaler { return ec._Scene(ctx, sel, &v) } diff --git a/pkg/models/generated_models.go b/pkg/models/generated_models.go index 6967b914a..129b1cd5a 100644 --- a/pkg/models/generated_models.go +++ b/pkg/models/generated_models.go @@ -153,6 +153,10 @@ type PerformerUpdateInput struct { Image *string `json:"image"` } +type ScanMetadataInput struct { + NameFromMetadata bool `json:"nameFromMetadata"` +} + type SceneFileType struct { Size *string `json:"size"` Duration *float64 `json:"duration"` diff --git a/ui/v2/src/components/Settings/SettingsTasksPanel/SettingsTasksPanel.tsx b/ui/v2/src/components/Settings/SettingsTasksPanel/SettingsTasksPanel.tsx index d98062bf9..d1c5e5ab4 100644 --- a/ui/v2/src/components/Settings/SettingsTasksPanel/SettingsTasksPanel.tsx +++ b/ui/v2/src/components/Settings/SettingsTasksPanel/SettingsTasksPanel.tsx @@ -1,13 +1,10 @@ import { Alert, Button, + Checkbox, Divider, FormGroup, - H1, H4, - H6, - InputGroup, - Tag, } from "@blueprintjs/core"; import React, { FunctionComponent, useState } from "react"; import * as GQL from "../../../core/generated-graphql"; @@ -21,6 +18,7 @@ interface IProps {} export const SettingsTasksPanel: FunctionComponent = (props: IProps) => { const [isImportAlertOpen, setIsImportAlertOpen] = useState(false); + const [nameFromMetadata, setNameFromMetadata] = useState(true); function onImport() { setIsImportAlertOpen(false); @@ -48,7 +46,7 @@ export const SettingsTasksPanel: FunctionComponent = (props: IProps) => async function onScan() { try { - await StashService.queryMetadataScan(); + await StashService.queryMetadataScan({nameFromMetadata}); ToastUtils.success("Started scan"); } catch (e) { ErrorUtils.handle(e); @@ -65,6 +63,11 @@ export const SettingsTasksPanel: FunctionComponent = (props: IProps) => labelFor="scan" inline={true} > + setNameFromMetadata(!nameFromMetadata)} + />