stash/pkg/match/scraped.go

174 lines
3.8 KiB
Go

package match
import (
"context"
"strconv"
"github.com/stashapp/stash/pkg/models"
"github.com/stashapp/stash/pkg/performer"
"github.com/stashapp/stash/pkg/studio"
"github.com/stashapp/stash/pkg/tag"
)
type PerformerFinder interface {
models.PerformerQueryer
FindByNames(ctx context.Context, names []string, nocase bool) ([]*models.Performer, error)
FindByStashID(ctx context.Context, stashID models.StashID) ([]*models.Performer, error)
}
type GroupNamesFinder interface {
FindByNames(ctx context.Context, names []string, nocase bool) ([]*models.Group, error)
}
// ScrapedPerformer matches the provided performer with the
// performers in the database and sets the ID field if one is found.
func ScrapedPerformer(ctx context.Context, qb PerformerFinder, p *models.ScrapedPerformer, stashBoxEndpoint *string) error {
if p.StoredID != nil || p.Name == nil {
return nil
}
// Check if a performer with the StashID already exists
if stashBoxEndpoint != nil && p.RemoteSiteID != nil {
performers, err := qb.FindByStashID(ctx, models.StashID{
StashID: *p.RemoteSiteID,
Endpoint: *stashBoxEndpoint,
})
if err != nil {
return err
}
if len(performers) > 0 {
id := strconv.Itoa(performers[0].ID)
p.StoredID = &id
return nil
}
}
performers, err := qb.FindByNames(ctx, []string{*p.Name}, true)
if err != nil {
return err
}
if len(performers) == 0 {
// if no names matched, try match an exact alias
performers, err = performer.ByAlias(ctx, qb, *p.Name)
if err != nil {
return err
}
}
if len(performers) != 1 {
// ignore - cannot match
return nil
}
id := strconv.Itoa(performers[0].ID)
p.StoredID = &id
return nil
}
type StudioFinder interface {
models.StudioQueryer
FindByStashID(ctx context.Context, stashID models.StashID) ([]*models.Studio, error)
}
// ScrapedStudio matches the provided studio with the studios
// in the database and sets the ID field if one is found.
func ScrapedStudio(ctx context.Context, qb StudioFinder, s *models.ScrapedStudio, stashBoxEndpoint *string) error {
if s.StoredID != nil {
return nil
}
// Check if a studio with the StashID already exists
if stashBoxEndpoint != nil && s.RemoteSiteID != nil {
studios, err := qb.FindByStashID(ctx, models.StashID{
StashID: *s.RemoteSiteID,
Endpoint: *stashBoxEndpoint,
})
if err != nil {
return err
}
if len(studios) > 0 {
id := strconv.Itoa(studios[0].ID)
s.StoredID = &id
return nil
}
}
st, err := studio.ByName(ctx, qb, s.Name)
if err != nil {
return err
}
if st == nil {
// try matching by alias
st, err = studio.ByAlias(ctx, qb, s.Name)
if err != nil {
return err
}
}
if st == nil {
// ignore - cannot match
return nil
}
id := strconv.Itoa(st.ID)
s.StoredID = &id
return nil
}
// ScrapedGroup matches the provided movie with the movies
// in the database and returns the ID field if one is found.
func ScrapedGroup(ctx context.Context, qb GroupNamesFinder, storedID *string, name *string) (matchedID *string, err error) {
if storedID != nil || name == nil {
return
}
movies, err := qb.FindByNames(ctx, []string{*name}, true)
if err != nil {
return
}
if len(movies) != 1 {
// ignore - cannot match
return
}
id := strconv.Itoa(movies[0].ID)
matchedID = &id
return
}
// ScrapedTag matches the provided tag with the tags
// in the database and sets the ID field if one is found.
func ScrapedTag(ctx context.Context, qb models.TagQueryer, s *models.ScrapedTag) error {
if s.StoredID != nil {
return nil
}
t, err := tag.ByName(ctx, qb, s.Name)
if err != nil {
return err
}
if t == nil {
// try matching by alias
t, err = tag.ByAlias(ctx, qb, s.Name)
if err != nil {
return err
}
}
if t == nil {
// ignore - cannot match
return nil
}
id := strconv.Itoa(t.ID)
s.StoredID = &id
return nil
}