Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions graphql/schema/schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -560,10 +560,8 @@ type Mutation {
stopJob(job_id: ID!): Boolean!
stopAllJobs: Boolean!

"Submit fingerprints to stash-box instance"
submitStashBoxFingerprints(
input: StashBoxFingerprintSubmissionInput!
): Boolean!
"Submit fingerprints to stash-box instance. Returns the ID of the job that performs the submission."
submitStashBoxFingerprints(input: StashBoxFingerprintSubmissionInput!): ID!

"Submit scene as draft to stash-box instance"
submitStashBoxSceneDraft(input: StashBoxDraftSubmissionInput!): ID
Expand Down
8 changes: 8 additions & 0 deletions graphql/stash-box/query.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,14 @@ mutation SubmitFingerprint($input: FingerprintSubmission!) {
submitFingerprint(input: $input)
}

mutation SubmitFingerprints($input: [FingerprintBatchSubmission!]!) {
submitFingerprints(input: $input) {
scene_id
hash
error
}
}

query Me {
me {
name
Expand Down
21 changes: 5 additions & 16 deletions internal/api/resolver_mutation_stash_box.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,34 +8,23 @@ import (
"github.com/stashapp/stash/internal/manager"
"github.com/stashapp/stash/pkg/logger"
"github.com/stashapp/stash/pkg/models"
"github.com/stashapp/stash/pkg/scene"
"github.com/stashapp/stash/pkg/sliceutil/stringslice"
"github.com/stashapp/stash/pkg/stashbox"
)

func (r *mutationResolver) SubmitStashBoxFingerprints(ctx context.Context, input StashBoxFingerprintSubmissionInput) (bool, error) {
func (r *mutationResolver) SubmitStashBoxFingerprints(ctx context.Context, input StashBoxFingerprintSubmissionInput) (string, error) {
b, err := resolveStashBox(input.StashBoxIndex, input.StashBoxEndpoint)
if err != nil {
return false, err
return "", err
}

ids, err := stringslice.StringSliceToIntSlice(input.SceneIds)
if err != nil {
return false, err
}

client := r.newStashBoxClient(*b)

var scenes []*models.Scene

if err := r.withReadTxn(ctx, func(ctx context.Context) error {
scenes, err = r.sceneService.FindByIDs(ctx, ids, scene.LoadStashIDs, scene.LoadFiles)
return err
}); err != nil {
return false, err
return "", err
}

return client.SubmitFingerprints(ctx, scenes)
jobID := manager.GetInstance().SubmitStashBoxFingerprints(ctx, b, ids)
return strconv.Itoa(jobID), nil
}

func (r *mutationResolver) StashBoxBatchPerformerTag(ctx context.Context, input manager.StashBoxBatchTagInput) (string, error) {
Expand Down
33 changes: 33 additions & 0 deletions internal/manager/manager_tasks.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import (
"github.com/stashapp/stash/pkg/job"
"github.com/stashapp/stash/pkg/logger"
"github.com/stashapp/stash/pkg/models"
"github.com/stashapp/stash/pkg/scene"
"github.com/stashapp/stash/pkg/stashbox"
)

func useAsVideo(pathname string) bool {
Expand Down Expand Up @@ -554,6 +556,37 @@ func (s *Manager) batchTagAllPerformers(ctx context.Context, input StashBoxBatch
return tasks, err
}

func (s *Manager) SubmitStashBoxFingerprints(ctx context.Context, box *models.StashBox, sceneIDs []int) int {
j := job.MakeJobExec(func(ctx context.Context, progress *job.Progress) error {
logger.Infof("Submitting fingerprints for %d scene(s) to stash-box endpoint %s", len(sceneIDs), box.Endpoint)

var scenes []*models.Scene
if err := s.Repository.WithReadTxn(ctx, func(ctx context.Context) error {
var err error
scenes, err = s.SceneService.FindByIDs(ctx, sceneIDs, scene.LoadStashIDs, scene.LoadFiles)
return err
}); err != nil {
return fmt.Errorf("failed to load scenes for fingerprint submission: %w", err)
}

client := stashbox.NewClient(*box, stashbox.ExcludeTagPatterns(s.Config.GetScraperExcludeTagPatterns()))

result, err := client.SubmitFingerprints(ctx, scenes, progress)

// log the summary on all paths, including when the submission aborts
// part-way through, so the outcome is always visible
if result.Failed > 0 {
logger.Warnf("Submitted %d fingerprint(s) to stash-box, %d failed", result.Succeeded, result.Failed)
} else {
logger.Infof("Submitted %d fingerprint(s) to stash-box", result.Succeeded)
}

return err
})

return s.JobManager.Add(ctx, "Submitting fingerprints to stash-box...", j)
}

func (s *Manager) StashBoxBatchPerformerTag(ctx context.Context, box *models.StashBox, input StashBoxBatchTagInput) int {
j := job.MakeJobExec(func(ctx context.Context, progress *job.Progress) error {
logger.Infof("Initiating stash-box batch performer tag")
Expand Down
64 changes: 64 additions & 0 deletions pkg/stashbox/graphql/generated_client.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading