stash/internal/identify/performer.go

58 lines
1.6 KiB
Go

package identify
import (
"context"
"fmt"
"strconv"
"strings"
"github.com/stashapp/stash/pkg/models"
)
type PerformerCreator interface {
Create(ctx context.Context, newPerformer *models.Performer) error
UpdateImage(ctx context.Context, performerID int, image []byte) error
}
func getPerformerID(ctx context.Context, endpoint string, w PerformerCreator, p *models.ScrapedPerformer, createMissing bool, skipSingleNamePerformers bool) (*int, error) {
if p.StoredID != nil {
// existing performer, just add it
performerID, err := strconv.Atoi(*p.StoredID)
if err != nil {
return nil, fmt.Errorf("error converting performer ID %s: %w", *p.StoredID, err)
}
return &performerID, nil
} else if createMissing && p.Name != nil { // name is mandatory
// skip single name performers with no disambiguation
if skipSingleNamePerformers && !strings.Contains(*p.Name, " ") && (p.Disambiguation == nil || len(*p.Disambiguation) == 0) {
return nil, ErrSkipSingleNamePerformer
}
return createMissingPerformer(ctx, endpoint, w, p)
}
return nil, nil
}
func createMissingPerformer(ctx context.Context, endpoint string, w PerformerCreator, p *models.ScrapedPerformer) (*int, error) {
newPerformer := p.ToPerformer(endpoint, nil)
performerImage, err := p.GetImage(ctx, nil)
if err != nil {
return nil, err
}
err = w.Create(ctx, newPerformer)
if err != nil {
return nil, fmt.Errorf("error creating performer: %w", err)
}
// update image table
if len(performerImage) > 0 {
if err := w.UpdateImage(ctx, newPerformer.ID, performerImage); err != nil {
return nil, err
}
}
return &newPerformer.ID, nil
}