From b1193227d0133243a7520026c87d56c64985e06d Mon Sep 17 00:00:00 2001 From: JackDawson94 <100418085+JackDawson94@users.noreply.github.com> Date: Tue, 11 Oct 2022 00:40:14 +0200 Subject: [PATCH] Fixes gender-mapping with StashBox (#2992) --- .../stashbox/graphql/generated_client.go | 454 +++++++++--------- .../stashbox/graphql/generated_models.go | 81 +++- pkg/scraper/stashbox/stash_box.go | 2 + 3 files changed, 300 insertions(+), 237 deletions(-) diff --git a/pkg/scraper/stashbox/graphql/generated_client.go b/pkg/scraper/stashbox/graphql/generated_client.go index a41380740..43b68c95c 100644 --- a/pkg/scraper/stashbox/graphql/generated_client.go +++ b/pkg/scraper/stashbox/graphql/generated_client.go @@ -55,8 +55,10 @@ type Query struct { Me *User "json:\"me\" graphql:\"me\"" SearchPerformer []*Performer "json:\"searchPerformer\" graphql:\"searchPerformer\"" SearchScene []*Scene "json:\"searchScene\" graphql:\"searchScene\"" + SearchTag []*Tag "json:\"searchTag\" graphql:\"searchTag\"" FindDraft *Draft "json:\"findDraft\" graphql:\"findDraft\"" FindDrafts []*Draft "json:\"findDrafts\" graphql:\"findDrafts\"" + QueryExistingScene QueryExistingSceneResult "json:\"queryExistingScene\" graphql:\"queryExistingScene\"" Version Version "json:\"version\" graphql:\"version\"" GetConfig StashBoxConfig "json:\"getConfig\" graphql:\"getConfig\"" } @@ -235,72 +237,6 @@ const FindSceneByFingerprintDocument = `query FindSceneByFingerprint ($fingerpri ... SceneFragment } } -fragment URLFragment on URL { - url - type -} -fragment ImageFragment on Image { - id - url - width - height -} -fragment TagFragment on Tag { - name - id -} -fragment MeasurementsFragment on Measurements { - band_size - cup_size - waist - hip -} -fragment FingerprintFragment on Fingerprint { - algorithm - hash - duration -} -fragment SceneFragment on Scene { - id - title - details - duration - date - urls { - ... URLFragment - } - images { - ... ImageFragment - } - studio { - ... StudioFragment - } - tags { - ... TagFragment - } - performers { - ... PerformerAppearanceFragment - } - fingerprints { - ... FingerprintFragment - } -} -fragment StudioFragment on Studio { - name - id - urls { - ... URLFragment - } - images { - ... ImageFragment - } -} -fragment PerformerAppearanceFragment on PerformerAppearance { - as - performer { - ... PerformerFragment - } -} fragment PerformerFragment on Performer { id name @@ -335,14 +271,80 @@ fragment PerformerFragment on Performer { ... BodyModificationFragment } } +fragment FingerprintFragment on Fingerprint { + algorithm + hash + duration +} +fragment SceneFragment on Scene { + id + title + details + duration + date + urls { + ... URLFragment + } + images { + ... ImageFragment + } + studio { + ... StudioFragment + } + tags { + ... TagFragment + } + performers { + ... PerformerAppearanceFragment + } + fingerprints { + ... FingerprintFragment + } +} +fragment URLFragment on URL { + url + type +} +fragment TagFragment on Tag { + name + id +} fragment FuzzyDateFragment on FuzzyDate { date accuracy } +fragment MeasurementsFragment on Measurements { + band_size + cup_size + waist + hip +} fragment BodyModificationFragment on BodyModification { location description } +fragment ImageFragment on Image { + id + url + width + height +} +fragment StudioFragment on Studio { + name + id + urls { + ... URLFragment + } + images { + ... ImageFragment + } +} +fragment PerformerAppearanceFragment on PerformerAppearance { + as + performer { + ... PerformerFragment + } +} ` func (c *Client) FindSceneByFingerprint(ctx context.Context, fingerprint FingerprintQueryInput, httpRequestOptions ...client.HTTPRequestOption) (*FindSceneByFingerprint, error) { @@ -363,70 +365,10 @@ const FindScenesByFullFingerprintsDocument = `query FindScenesByFullFingerprints ... SceneFragment } } -fragment SceneFragment on Scene { - id - title - details - duration - date - urls { - ... URLFragment - } - images { - ... ImageFragment - } - studio { - ... StudioFragment - } - tags { - ... TagFragment - } - performers { - ... PerformerAppearanceFragment - } - fingerprints { - ... FingerprintFragment - } -} fragment URLFragment on URL { url type } -fragment StudioFragment on Studio { - name - id - urls { - ... URLFragment - } - images { - ... ImageFragment - } -} -fragment PerformerAppearanceFragment on PerformerAppearance { - as - performer { - ... PerformerFragment - } -} -fragment BodyModificationFragment on BodyModification { - location - description -} -fragment FingerprintFragment on Fingerprint { - algorithm - hash - duration -} -fragment ImageFragment on Image { - id - url - width - height -} -fragment TagFragment on Tag { - name - id -} fragment PerformerFragment on Performer { id name @@ -461,6 +403,56 @@ fragment PerformerFragment on Performer { ... BodyModificationFragment } } +fragment FingerprintFragment on Fingerprint { + algorithm + hash + duration +} +fragment SceneFragment on Scene { + id + title + details + duration + date + urls { + ... URLFragment + } + images { + ... ImageFragment + } + studio { + ... StudioFragment + } + tags { + ... TagFragment + } + performers { + ... PerformerAppearanceFragment + } + fingerprints { + ... FingerprintFragment + } +} +fragment StudioFragment on Studio { + name + id + urls { + ... URLFragment + } + images { + ... ImageFragment + } +} +fragment TagFragment on Tag { + name + id +} +fragment PerformerAppearanceFragment on PerformerAppearance { + as + performer { + ... PerformerFragment + } +} fragment FuzzyDateFragment on FuzzyDate { date accuracy @@ -471,6 +463,16 @@ fragment MeasurementsFragment on Measurements { waist hip } +fragment BodyModificationFragment on BodyModification { + location + description +} +fragment ImageFragment on Image { + id + url + width + height +} ` func (c *Client) FindScenesByFullFingerprints(ctx context.Context, fingerprints []*FingerprintQueryInput, httpRequestOptions ...client.HTTPRequestOption) (*FindScenesByFullFingerprints, error) { @@ -491,9 +493,30 @@ const FindScenesBySceneFingerprintsDocument = `query FindScenesBySceneFingerprin ... SceneFragment } } -fragment URLFragment on URL { - url - type +fragment SceneFragment on Scene { + id + title + details + duration + date + urls { + ... URLFragment + } + images { + ... ImageFragment + } + studio { + ... StudioFragment + } + tags { + ... TagFragment + } + performers { + ... PerformerAppearanceFragment + } + fingerprints { + ... FingerprintFragment + } } fragment ImageFragment on Image { id @@ -545,41 +568,14 @@ fragment PerformerFragment on Performer { ... BodyModificationFragment } } -fragment MeasurementsFragment on Measurements { - band_size - cup_size - waist - hip -} fragment FingerprintFragment on Fingerprint { algorithm hash duration } -fragment SceneFragment on Scene { - id - title - details - duration - date - urls { - ... URLFragment - } - images { - ... ImageFragment - } - studio { - ... StudioFragment - } - tags { - ... TagFragment - } - performers { - ... PerformerAppearanceFragment - } - fingerprints { - ... FingerprintFragment - } +fragment URLFragment on URL { + url + type } fragment TagFragment on Tag { name @@ -595,6 +591,12 @@ fragment FuzzyDateFragment on FuzzyDate { date accuracy } +fragment MeasurementsFragment on Measurements { + band_size + cup_size + waist + hip +} fragment BodyModificationFragment on BodyModification { location description @@ -619,6 +621,10 @@ const SearchSceneDocument = `query SearchScene ($term: String!) { ... SceneFragment } } +fragment FuzzyDateFragment on FuzzyDate { + date + accuracy +} fragment SceneFragment on Scene { id title @@ -644,10 +650,6 @@ fragment SceneFragment on Scene { ... FingerprintFragment } } -fragment URLFragment on URL { - url - type -} fragment ImageFragment on Image { id url @@ -658,6 +660,35 @@ fragment TagFragment on Tag { name id } +fragment PerformerAppearanceFragment on PerformerAppearance { + as + performer { + ... PerformerFragment + } +} +fragment BodyModificationFragment on BodyModification { + location + description +} +fragment FingerprintFragment on Fingerprint { + algorithm + hash + duration +} +fragment URLFragment on URL { + url + type +} +fragment StudioFragment on Studio { + name + id + urls { + ... URLFragment + } + images { + ... ImageFragment + } +} fragment PerformerFragment on Performer { id name @@ -692,41 +723,12 @@ fragment PerformerFragment on Performer { ... BodyModificationFragment } } -fragment FuzzyDateFragment on FuzzyDate { - date - accuracy -} -fragment FingerprintFragment on Fingerprint { - algorithm - hash - duration -} -fragment StudioFragment on Studio { - name - id - urls { - ... URLFragment - } - images { - ... ImageFragment - } -} -fragment PerformerAppearanceFragment on PerformerAppearance { - as - performer { - ... PerformerFragment - } -} fragment MeasurementsFragment on Measurements { band_size cup_size waist hip } -fragment BodyModificationFragment on BodyModification { - location - description -} ` func (c *Client) SearchScene(ctx context.Context, term string, httpRequestOptions ...client.HTTPRequestOption) (*SearchScene, error) { @@ -825,6 +827,16 @@ const FindPerformerByIDDocument = `query FindPerformerByID ($id: ID!) { ... PerformerFragment } } +fragment MeasurementsFragment on Measurements { + band_size + cup_size + waist + hip +} +fragment BodyModificationFragment on BodyModification { + location + description +} fragment PerformerFragment on Performer { id name @@ -873,16 +885,6 @@ fragment FuzzyDateFragment on FuzzyDate { date accuracy } -fragment MeasurementsFragment on Measurements { - band_size - cup_size - waist - hip -} -fragment BodyModificationFragment on BodyModification { - location - description -} ` func (c *Client) FindPerformerByID(ctx context.Context, id string, httpRequestOptions ...client.HTTPRequestOption) (*FindPerformerByID, error) { @@ -907,20 +909,32 @@ fragment BodyModificationFragment on BodyModification { location description } -fragment URLFragment on URL { - url - type -} fragment ImageFragment on Image { id url width height } +fragment FuzzyDateFragment on FuzzyDate { + date + accuracy +} +fragment MeasurementsFragment on Measurements { + band_size + cup_size + waist + hip +} fragment TagFragment on Tag { name id } +fragment PerformerAppearanceFragment on PerformerAppearance { + as + performer { + ... PerformerFragment + } +} fragment PerformerFragment on Performer { id name @@ -955,15 +969,10 @@ fragment PerformerFragment on Performer { ... BodyModificationFragment } } -fragment FuzzyDateFragment on FuzzyDate { - date - accuracy -} -fragment MeasurementsFragment on Measurements { - band_size - cup_size - waist - hip +fragment FingerprintFragment on Fingerprint { + algorithm + hash + duration } fragment SceneFragment on Scene { id @@ -990,6 +999,10 @@ fragment SceneFragment on Scene { ... FingerprintFragment } } +fragment URLFragment on URL { + url + type +} fragment StudioFragment on Studio { name id @@ -1000,17 +1013,6 @@ fragment StudioFragment on Studio { ... ImageFragment } } -fragment PerformerAppearanceFragment on PerformerAppearance { - as - performer { - ... PerformerFragment - } -} -fragment FingerprintFragment on Fingerprint { - algorithm - hash - duration -} ` func (c *Client) FindSceneByID(ctx context.Context, id string, httpRequestOptions ...client.HTTPRequestOption) (*FindSceneByID, error) { diff --git a/pkg/scraper/stashbox/graphql/generated_models.go b/pkg/scraper/stashbox/graphql/generated_models.go index 341f91d14..eaee65838 100644 --- a/pkg/scraper/stashbox/graphql/generated_models.go +++ b/pkg/scraper/stashbox/graphql/generated_models.go @@ -88,9 +88,9 @@ type DraftEntity struct { ID *string `json:"id,omitempty"` } -func (DraftEntity) IsSceneDraftPerformer() {} func (DraftEntity) IsSceneDraftStudio() {} func (DraftEntity) IsSceneDraftTag() {} +func (DraftEntity) IsSceneDraftPerformer() {} type DraftEntityInput struct { Name string `json:"name"` @@ -583,6 +583,17 @@ type QueryEditsResultType struct { Edits []*Edit `json:"edits,omitempty"` } +type QueryExistingSceneInput struct { + Title *string `json:"title,omitempty"` + StudioID *string `json:"studio_id,omitempty"` + Fingerprints []*FingerprintInput `json:"fingerprints,omitempty"` +} + +type QueryExistingSceneResult struct { + Edits []*Edit `json:"edits,omitempty"` + Scenes []*Scene `json:"scenes,omitempty"` +} + type QueryPerformersResultType struct { Count int `json:"count"` Performers []*Performer `json:"performers,omitempty"` @@ -737,8 +748,7 @@ type SceneEditDetailsInput struct { type SceneEditInput struct { Edit *EditInput `json:"edit,omitempty"` // Not required for destroy type - Details *SceneEditDetailsInput `json:"details,omitempty"` - Duration *int `json:"duration,omitempty"` + Details *SceneEditDetailsInput `json:"details,omitempty"` } type SceneQueryInput struct { @@ -762,10 +772,12 @@ type SceneQueryInput struct { Alias *StringCriterionInput `json:"alias,omitempty"` // Filter to only include scenes with these fingerprints Fingerprints *MultiStringCriterionInput `json:"fingerprints,omitempty"` - Page int `json:"page"` - PerPage int `json:"per_page"` - Direction SortDirectionEnum `json:"direction"` - Sort SceneSortEnum `json:"sort"` + // Filter by favorited entity + Favorites *FavoriteFilter `json:"favorites,omitempty"` + Page int `json:"page"` + PerPage int `json:"per_page"` + Direction SortDirectionEnum `json:"direction"` + Sort SceneSortEnum `json:"sort"` } type SceneUpdateInput struct { @@ -846,8 +858,8 @@ type Studio struct { Updated time.Time `json:"updated"` } -func (Studio) IsEditTarget() {} func (Studio) IsSceneDraftStudio() {} +func (Studio) IsEditTarget() {} type StudioCreateInput struct { Name string `json:"name"` @@ -924,8 +936,8 @@ type Tag struct { Updated time.Time `json:"updated"` } -func (Tag) IsEditTarget() {} func (Tag) IsSceneDraftTag() {} +func (Tag) IsEditTarget() {} type TagCategory struct { ID string `json:"id"` @@ -1467,6 +1479,49 @@ func (e EyeColorEnum) MarshalGQL(w io.Writer) { fmt.Fprint(w, strconv.Quote(e.String())) } +type FavoriteFilter string + +const ( + FavoriteFilterPerformer FavoriteFilter = "PERFORMER" + FavoriteFilterStudio FavoriteFilter = "STUDIO" + FavoriteFilterAll FavoriteFilter = "ALL" +) + +var AllFavoriteFilter = []FavoriteFilter{ + FavoriteFilterPerformer, + FavoriteFilterStudio, + FavoriteFilterAll, +} + +func (e FavoriteFilter) IsValid() bool { + switch e { + case FavoriteFilterPerformer, FavoriteFilterStudio, FavoriteFilterAll: + return true + } + return false +} + +func (e FavoriteFilter) String() string { + return string(e) +} + +func (e *FavoriteFilter) UnmarshalGQL(v interface{}) error { + str, ok := v.(string) + if !ok { + return fmt.Errorf("enums must be strings") + } + + *e = FavoriteFilter(str) + if !e.IsValid() { + return fmt.Errorf("%s is not a valid FavoriteFilter", str) + } + return nil +} + +func (e FavoriteFilter) MarshalGQL(w io.Writer) { + fmt.Fprint(w, strconv.Quote(e.String())) +} + type FingerprintAlgorithm string const ( @@ -1518,6 +1573,7 @@ const ( GenderEnumTransgenderMale GenderEnum = "TRANSGENDER_MALE" GenderEnumTransgenderFemale GenderEnum = "TRANSGENDER_FEMALE" GenderEnumIntersex GenderEnum = "INTERSEX" + GenderEnumNonBinary GenderEnum = "NON_BINARY" ) var AllGenderEnum = []GenderEnum{ @@ -1526,11 +1582,12 @@ var AllGenderEnum = []GenderEnum{ GenderEnumTransgenderMale, GenderEnumTransgenderFemale, GenderEnumIntersex, + GenderEnumNonBinary, } func (e GenderEnum) IsValid() bool { switch e { - case GenderEnumMale, GenderEnumFemale, GenderEnumTransgenderMale, GenderEnumTransgenderFemale, GenderEnumIntersex: + case GenderEnumMale, GenderEnumFemale, GenderEnumTransgenderMale, GenderEnumTransgenderFemale, GenderEnumIntersex, GenderEnumNonBinary: return true } return false @@ -1566,6 +1623,7 @@ const ( GenderFilterEnumTransgenderMale GenderFilterEnum = "TRANSGENDER_MALE" GenderFilterEnumTransgenderFemale GenderFilterEnum = "TRANSGENDER_FEMALE" GenderFilterEnumIntersex GenderFilterEnum = "INTERSEX" + GenderFilterEnumNonBinary GenderFilterEnum = "NON_BINARY" ) var AllGenderFilterEnum = []GenderFilterEnum{ @@ -1575,11 +1633,12 @@ var AllGenderFilterEnum = []GenderFilterEnum{ GenderFilterEnumTransgenderMale, GenderFilterEnumTransgenderFemale, GenderFilterEnumIntersex, + GenderFilterEnumNonBinary, } func (e GenderFilterEnum) IsValid() bool { switch e { - case GenderFilterEnumUnknown, GenderFilterEnumMale, GenderFilterEnumFemale, GenderFilterEnumTransgenderMale, GenderFilterEnumTransgenderFemale, GenderFilterEnumIntersex: + case GenderFilterEnumUnknown, GenderFilterEnumMale, GenderFilterEnumFemale, GenderFilterEnumTransgenderMale, GenderFilterEnumTransgenderFemale, GenderFilterEnumIntersex, GenderFilterEnumNonBinary: return true } return false diff --git a/pkg/scraper/stashbox/stash_box.go b/pkg/scraper/stashbox/stash_box.go index 6b20d9342..f87e4a9fe 100644 --- a/pkg/scraper/stashbox/stash_box.go +++ b/pkg/scraper/stashbox/stash_box.go @@ -491,6 +491,8 @@ func translateGender(gender *graphql.GenderEnum) *string { res = models.GenderEnumTransgenderFemale case graphql.GenderEnumTransgenderMale: res = models.GenderEnumTransgenderMale + case graphql.GenderEnumNonBinary: + res = models.GenderEnumNonBinary } if res != "" {