Skip to content

Commit 4d447c3

Browse files
update merged performer upon batch update (stashapp#5664)
* update merged performer upon batch update * Handle aliases and name for merged performer * Refactor merge performer code Log when merging performers --------- Co-authored-by: WithoutPants <[email protected]>
1 parent 661e9eb commit 4d447c3

File tree

5 files changed

+92
-17
lines changed

5 files changed

+92
-17
lines changed

graphql/stash-box/query.graphql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ fragment PerformerFragment on Performer {
4949
aliases
5050
gender
5151
merged_ids
52+
deleted
53+
merged_into_id
5254
urls {
5355
...URLFragment
5456
}

internal/manager/task_stash_box_tag.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/stashapp/stash/pkg/models"
1010
"github.com/stashapp/stash/pkg/performer"
1111
"github.com/stashapp/stash/pkg/scraper/stashbox"
12+
"github.com/stashapp/stash/pkg/sliceutil"
1213
"github.com/stashapp/stash/pkg/studio"
1314
)
1415

@@ -119,6 +120,18 @@ func (t *StashBoxBatchTagTask) findStashBoxPerformer(ctx context.Context) (*mode
119120
}
120121
if remoteID != "" {
121122
performer, err = client.FindStashBoxPerformerByID(ctx, remoteID)
123+
124+
if performer != nil && performer.RemoteMergedIntoId != nil {
125+
mergedPerformer, err := t.handleMergedPerformer(ctx, performer, client)
126+
if err != nil {
127+
return nil, err
128+
}
129+
130+
if mergedPerformer != nil {
131+
logger.Infof("Performer id %s merged into %s, updating local performer", remoteID, *performer.RemoteMergedIntoId)
132+
performer = mergedPerformer
133+
}
134+
}
122135
}
123136
} else {
124137
var name string
@@ -133,6 +146,21 @@ func (t *StashBoxBatchTagTask) findStashBoxPerformer(ctx context.Context) (*mode
133146
return performer, err
134147
}
135148

149+
func (t *StashBoxBatchTagTask) handleMergedPerformer(ctx context.Context, performer *models.ScrapedPerformer, client *stashbox.Client) (mergedPerformer *models.ScrapedPerformer, err error) {
150+
mergedPerformer, err = client.FindStashBoxPerformerByID(ctx, *performer.RemoteMergedIntoId)
151+
if err != nil {
152+
return nil, fmt.Errorf("loading merged performer %s from stashbox", *performer.RemoteMergedIntoId)
153+
}
154+
155+
if mergedPerformer.StoredID != nil && *mergedPerformer.StoredID != *performer.StoredID {
156+
logger.Warnf("Performer %s merged into %s, but both exist locally, not merging", *performer.StoredID, *mergedPerformer.StoredID)
157+
return nil, nil
158+
}
159+
160+
mergedPerformer.StoredID = performer.StoredID
161+
return mergedPerformer, nil
162+
}
163+
136164
func (t *StashBoxBatchTagTask) processMatchedPerformer(ctx context.Context, p *models.ScrapedPerformer, excluded map[string]bool) {
137165
// Refreshing an existing performer
138166
if t.performer != nil {
@@ -156,6 +184,19 @@ func (t *StashBoxBatchTagTask) processMatchedPerformer(ctx context.Context, p *m
156184

157185
partial := p.ToPartial(t.box.Endpoint, excluded, existingStashIDs)
158186

187+
// if we're setting the performer's aliases, and not the name, then filter out the name
188+
// from the aliases to avoid duplicates
189+
// add the name to the aliases if it's not already there
190+
if partial.Aliases != nil && !partial.Name.Set {
191+
partial.Aliases.Values = sliceutil.Filter(partial.Aliases.Values, func(s string) bool {
192+
return s != t.performer.Name
193+
})
194+
195+
if p.Name != nil && t.performer.Name != *p.Name {
196+
partial.Aliases.Values = sliceutil.AppendUnique(partial.Aliases.Values, *p.Name)
197+
}
198+
}
199+
159200
if err := performer.ValidateUpdate(ctx, t.performer.ID, partial, qb); err != nil {
160201
return err
161202
}

pkg/models/model_scraped_item.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -128,13 +128,15 @@ type ScrapedPerformer struct {
128128
Aliases *string `json:"aliases"`
129129
Tags []*ScrapedTag `json:"tags"`
130130
// This should be a base64 encoded data URL
131-
Image *string `json:"image"` // deprecated: use Images
132-
Images []string `json:"images"`
133-
Details *string `json:"details"`
134-
DeathDate *string `json:"death_date"`
135-
HairColor *string `json:"hair_color"`
136-
Weight *string `json:"weight"`
137-
RemoteSiteID *string `json:"remote_site_id"`
131+
Image *string `json:"image"` // deprecated: use Images
132+
Images []string `json:"images"`
133+
Details *string `json:"details"`
134+
DeathDate *string `json:"death_date"`
135+
HairColor *string `json:"hair_color"`
136+
Weight *string `json:"weight"`
137+
RemoteSiteID *string `json:"remote_site_id"`
138+
RemoteDeleted bool `json:"remote_deleted"`
139+
RemoteMergedIntoId *string `json:"remote_merged_into_id"`
138140
}
139141

140142
func (ScrapedPerformer) IsScrapedContent() {}

pkg/scraper/stashbox/graphql/generated_client.go

Lines changed: 28 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/scraper/stashbox/performer.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -297,16 +297,18 @@ func performerFragmentToScrapedPerformer(p graphql.PerformerFragment) *models.Sc
297297
}
298298

299299
sp := &models.ScrapedPerformer{
300-
Name: &p.Name,
301-
Disambiguation: p.Disambiguation,
302-
Country: p.Country,
303-
Measurements: formatMeasurements(*p.Measurements),
304-
CareerLength: formatCareerLength(p.CareerStartYear, p.CareerEndYear),
305-
Tattoos: formatBodyModifications(p.Tattoos),
306-
Piercings: formatBodyModifications(p.Piercings),
307-
Twitter: findURL(p.Urls, "TWITTER"),
308-
RemoteSiteID: &p.ID,
309-
Images: images,
300+
Name: &p.Name,
301+
Disambiguation: p.Disambiguation,
302+
Country: p.Country,
303+
Measurements: formatMeasurements(*p.Measurements),
304+
CareerLength: formatCareerLength(p.CareerStartYear, p.CareerEndYear),
305+
Tattoos: formatBodyModifications(p.Tattoos),
306+
Piercings: formatBodyModifications(p.Piercings),
307+
Twitter: findURL(p.Urls, "TWITTER"),
308+
RemoteSiteID: &p.ID,
309+
RemoteDeleted: p.Deleted,
310+
RemoteMergedIntoId: p.MergedIntoID,
311+
Images: images,
310312
// TODO - tags not currently supported
311313
// graphql schema change to accommodate this. Leave off for now.
312314
}

0 commit comments

Comments
 (0)