diff --git a/graphql/documents/mutations/performer.graphql b/graphql/documents/mutations/performer.graphql index a74a3a5f7..ec785f5f2 100644 --- a/graphql/documents/mutations/performer.graphql +++ b/graphql/documents/mutations/performer.graphql @@ -15,7 +15,7 @@ mutation PerformerCreate( $twitter: String, $instagram: String, $favorite: Boolean, - $image: String!) { + $image: String) { performerCreate(input: { name: $name, diff --git a/graphql/documents/mutations/studio.graphql b/graphql/documents/mutations/studio.graphql index d0032c8e2..19ece5bb7 100644 --- a/graphql/documents/mutations/studio.graphql +++ b/graphql/documents/mutations/studio.graphql @@ -1,7 +1,7 @@ mutation StudioCreate( $name: String!, $url: String, - $image: String!) { + $image: String) { studioCreate(input: { name: $name, url: $url, image: $image }) { ...StudioData diff --git a/graphql/schema/types/performer.graphql b/graphql/schema/types/performer.graphql index af52b704c..a1ba8e6f7 100644 --- a/graphql/schema/types/performer.graphql +++ b/graphql/schema/types/performer.graphql @@ -41,7 +41,7 @@ input PerformerCreateInput { instagram: String favorite: Boolean """This should be base64 encoded""" - image: String! + image: String } input PerformerUpdateInput { diff --git a/graphql/schema/types/studio.graphql b/graphql/schema/types/studio.graphql index bda41b914..fc6579794 100644 --- a/graphql/schema/types/studio.graphql +++ b/graphql/schema/types/studio.graphql @@ -12,7 +12,7 @@ input StudioCreateInput { name: String! url: String """This should be base64 encoded""" - image: String! + image: String } input StudioUpdateInput { diff --git a/pkg/api/images.go b/pkg/api/images.go new file mode 100644 index 000000000..48b5d18d5 --- /dev/null +++ b/pkg/api/images.go @@ -0,0 +1,19 @@ +package api + +import ( + "math/rand" + + "github.com/gobuffalo/packr/v2" +) + +var performerBox *packr.Box + +func initialiseImages() { + performerBox = packr.New("Performer Box", "../../static/performer") +} + +func getRandomPerformerImage() ([]byte, error) { + imageFiles := performerBox.List() + index := rand.Intn(len(imageFiles)) + return performerBox.Find(imageFiles[index]) +} diff --git a/pkg/api/resolver_mutation_performer.go b/pkg/api/resolver_mutation_performer.go index 54a7693e4..65c089525 100644 --- a/pkg/api/resolver_mutation_performer.go +++ b/pkg/api/resolver_mutation_performer.go @@ -3,16 +3,27 @@ package api import ( "context" "database/sql" + "strconv" + "time" + "github.com/stashapp/stash/pkg/database" "github.com/stashapp/stash/pkg/models" "github.com/stashapp/stash/pkg/utils" - "strconv" - "time" ) func (r *mutationResolver) PerformerCreate(ctx context.Context, input models.PerformerCreateInput) (*models.Performer, error) { - // Process the base 64 encoded image string - checksum, imageData, err := utils.ProcessBase64Image(input.Image) + // generate checksum from performer name rather than image + checksum := utils.MD5FromString(*input.Name) + + var imageData []byte + var err error + + if input.Image == nil { + imageData, err = getRandomPerformerImage() + } else { + _, imageData, err = utils.ProcessBase64Image(*input.Image) + } + if err != nil { return nil, err } @@ -101,15 +112,18 @@ func (r *mutationResolver) PerformerUpdate(ctx context.Context, input models.Per UpdatedAt: models.SQLiteTimestamp{Timestamp: time.Now()}, } if input.Image != nil { - checksum, imageData, err := utils.ProcessBase64Image(*input.Image) + _, imageData, err := utils.ProcessBase64Image(*input.Image) if err != nil { return nil, err } updatedPerformer.Image = imageData - updatedPerformer.Checksum = checksum } if input.Name != nil { + // generate checksum from performer name rather than image + checksum := utils.MD5FromString(*input.Name) + updatedPerformer.Name = sql.NullString{String: *input.Name, Valid: true} + updatedPerformer.Checksum = checksum } if input.URL != nil { updatedPerformer.URL = sql.NullString{String: *input.URL, Valid: true} @@ -188,4 +202,3 @@ func (r *mutationResolver) PerformerDestroy(ctx context.Context, input models.Pe } return true, nil } - diff --git a/pkg/api/resolver_mutation_studio.go b/pkg/api/resolver_mutation_studio.go index c79622448..1d07a809c 100644 --- a/pkg/api/resolver_mutation_studio.go +++ b/pkg/api/resolver_mutation_studio.go @@ -12,8 +12,18 @@ import ( ) func (r *mutationResolver) StudioCreate(ctx context.Context, input models.StudioCreateInput) (*models.Studio, error) { + // generate checksum from studio name rather than image + checksum := utils.MD5FromString(input.Name) + + var imageData []byte + var err error + + if input.Image == nil { + input.Image = &models.DefaultStudioImage + } + // Process the base 64 encoded image string - checksum, imageData, err := utils.ProcessBase64Image(input.Image) + _, imageData, err = utils.ProcessBase64Image(*input.Image) if err != nil { return nil, err } @@ -56,15 +66,17 @@ func (r *mutationResolver) StudioUpdate(ctx context.Context, input models.Studio UpdatedAt: models.SQLiteTimestamp{Timestamp: time.Now()}, } if input.Image != nil { - checksum, imageData, err := utils.ProcessBase64Image(*input.Image) + _, imageData, err := utils.ProcessBase64Image(*input.Image) if err != nil { return nil, err } updatedStudio.Image = imageData - updatedStudio.Checksum = checksum } if input.Name != nil { + // generate checksum from studio name rather than image + checksum := utils.MD5FromString(*input.Name) updatedStudio.Name = sql.NullString{String: *input.Name, Valid: true} + updatedStudio.Checksum = checksum } if input.URL != nil { updatedStudio.URL = sql.NullString{String: *input.URL, Valid: true} diff --git a/pkg/api/server.go b/pkg/api/server.go index 560f46e32..baa3c1dfe 100644 --- a/pkg/api/server.go +++ b/pkg/api/server.go @@ -66,6 +66,8 @@ func Start() { //legacyUiBox = packr.New("UI Box", "../../ui/v1/dist/stash-frontend") setupUIBox = packr.New("Setup UI Box", "../../ui/setup") + initialiseImages() + r := chi.NewRouter() r.Use(authenticateHandler()) diff --git a/pkg/manager/task_import.go b/pkg/manager/task_import.go index 398968ce2..29bc68ff4 100644 --- a/pkg/manager/task_import.go +++ b/pkg/manager/task_import.go @@ -64,8 +64,11 @@ func (t *ImportTask) ImportPerformers(ctx context.Context) { logger.Progressf("[performers] %d of %d", index, len(t.Mappings.Performers)) + // generate checksum from performer name rather than image + checksum := utils.MD5FromString(performerJSON.Name) + // Process the base 64 encoded image string - checksum, imageData, err := utils.ProcessBase64Image(performerJSON.Image) + _, imageData, err := utils.ProcessBase64Image(performerJSON.Image) if err != nil { _ = tx.Rollback() logger.Errorf("[performers] <%s> invalid image: %s", mappingJSON.Checksum, err.Error()) @@ -159,8 +162,11 @@ func (t *ImportTask) ImportStudios(ctx context.Context) { logger.Progressf("[studios] %d of %d", index, len(t.Mappings.Studios)) + // generate checksum from studio name rather than image + checksum := utils.MD5FromString(studioJSON.Name) + // Process the base 64 encoded image string - checksum, imageData, err := utils.ProcessBase64Image(studioJSON.Image) + _, imageData, err := utils.ProcessBase64Image(studioJSON.Image) if err != nil { _ = tx.Rollback() logger.Errorf("[studios] <%s> invalid image: %s", mappingJSON.Checksum, err.Error()) diff --git a/pkg/models/model_studio.go b/pkg/models/model_studio.go index 2c545bd3d..51ec69ba0 100644 --- a/pkg/models/model_studio.go +++ b/pkg/models/model_studio.go @@ -13,3 +13,5 @@ type Studio struct { CreatedAt SQLiteTimestamp `db:"created_at" json:"created_at"` UpdatedAt SQLiteTimestamp `db:"updated_at" json:"updated_at"` } + +var DefaultStudioImage string = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4wgVBQsJl1CMZAAAASJJREFUeNrt3N0JwyAYhlEj3cj9R3Cm5rbkqtAP+qrnGaCYHPwJpLlaa++mmLpbAERAgAgIEAEBIiBABERAgAgIEAEBIiBABERAgAgIEAHZuVflj40x4i94zhk9vqsVvEq6AsQqMP1EjORx20OACAgQRRx7T+zzcFBxcjNDfoB4ntQqTm5Awo7MlqywZxcgYQ+RlqywJ3ozJAQCSBiEJSsQA0gYBpDAgAARECACAkRAgAgIEAERECACAmSjUv6eAOSB8m8YIGGzBUjYbAESBgMkbBkDEjZbgITBAClcxiqQvEoatreYIWEBASIgJ4Gkf11ntXH3nS9uxfGWfJ5J9hAgAgJEQAQEiIAAERAgAgJEQAQEiIAAERAgAgJEQAQEiL7qBuc6RKLHxr0CAAAAAElFTkSuQmCC" diff --git a/pkg/utils/crypto.go b/pkg/utils/crypto.go index efa124a34..4fd911ccb 100644 --- a/pkg/utils/crypto.go +++ b/pkg/utils/crypto.go @@ -12,6 +12,11 @@ func MD5FromBytes(data []byte) string { return fmt.Sprintf("%x", result) } +func MD5FromString(str string) string { + data := []byte(str) + return MD5FromBytes(data) +} + func MD5FromFilePath(filePath string) (string, error) { f, err := os.Open(filePath) if err != nil { diff --git a/static/performer/NoName01.png b/static/performer/NoName01.png new file mode 100644 index 000000000..954267c9a Binary files /dev/null and b/static/performer/NoName01.png differ diff --git a/static/performer/NoName02.png b/static/performer/NoName02.png new file mode 100644 index 000000000..5e053bfed Binary files /dev/null and b/static/performer/NoName02.png differ diff --git a/static/performer/NoName03.png b/static/performer/NoName03.png new file mode 100644 index 000000000..a3919229b Binary files /dev/null and b/static/performer/NoName03.png differ diff --git a/static/performer/NoName04.png b/static/performer/NoName04.png new file mode 100644 index 000000000..342ab750a Binary files /dev/null and b/static/performer/NoName04.png differ diff --git a/static/performer/NoName05.png b/static/performer/NoName05.png new file mode 100644 index 000000000..a917922b5 Binary files /dev/null and b/static/performer/NoName05.png differ diff --git a/static/performer/NoName06.png b/static/performer/NoName06.png new file mode 100644 index 000000000..efc92ff1d Binary files /dev/null and b/static/performer/NoName06.png differ diff --git a/static/performer/NoName07.png b/static/performer/NoName07.png new file mode 100644 index 000000000..7c80d4240 Binary files /dev/null and b/static/performer/NoName07.png differ diff --git a/static/performer/NoName08.png b/static/performer/NoName08.png new file mode 100644 index 000000000..034c0a02a Binary files /dev/null and b/static/performer/NoName08.png differ diff --git a/static/performer/NoName09.png b/static/performer/NoName09.png new file mode 100644 index 000000000..ef68106f9 Binary files /dev/null and b/static/performer/NoName09.png differ diff --git a/static/performer/NoName10.png b/static/performer/NoName10.png new file mode 100644 index 000000000..8ca954825 Binary files /dev/null and b/static/performer/NoName10.png differ diff --git a/static/performer/NoName11.png b/static/performer/NoName11.png new file mode 100644 index 000000000..54b3cf370 Binary files /dev/null and b/static/performer/NoName11.png differ diff --git a/static/performer/NoName12.png b/static/performer/NoName12.png new file mode 100644 index 000000000..0e6854491 Binary files /dev/null and b/static/performer/NoName12.png differ diff --git a/static/performer/NoName13.png b/static/performer/NoName13.png new file mode 100644 index 000000000..2a93676f7 Binary files /dev/null and b/static/performer/NoName13.png differ diff --git a/static/performer/NoName14.png b/static/performer/NoName14.png new file mode 100644 index 000000000..44add655f Binary files /dev/null and b/static/performer/NoName14.png differ diff --git a/static/performer/NoName15.png b/static/performer/NoName15.png new file mode 100644 index 000000000..003cea40e Binary files /dev/null and b/static/performer/NoName15.png differ diff --git a/static/performer/NoName16.png b/static/performer/NoName16.png new file mode 100644 index 000000000..c76b4b71c Binary files /dev/null and b/static/performer/NoName16.png differ diff --git a/static/performer/NoName17.png b/static/performer/NoName17.png new file mode 100644 index 000000000..96fbd481f Binary files /dev/null and b/static/performer/NoName17.png differ diff --git a/static/performer/NoName18.png b/static/performer/NoName18.png new file mode 100644 index 000000000..13efa3da8 Binary files /dev/null and b/static/performer/NoName18.png differ diff --git a/static/performer/NoName19.png b/static/performer/NoName19.png new file mode 100644 index 000000000..c821fa39a Binary files /dev/null and b/static/performer/NoName19.png differ diff --git a/static/performer/NoName20.png b/static/performer/NoName20.png new file mode 100644 index 000000000..e1dbfa975 Binary files /dev/null and b/static/performer/NoName20.png differ diff --git a/static/performer/NoName21.png b/static/performer/NoName21.png new file mode 100644 index 000000000..5b961a4e5 Binary files /dev/null and b/static/performer/NoName21.png differ diff --git a/static/performer/NoName22.png b/static/performer/NoName22.png new file mode 100644 index 000000000..e6b16f908 Binary files /dev/null and b/static/performer/NoName22.png differ diff --git a/static/performer/NoName23.png b/static/performer/NoName23.png new file mode 100644 index 000000000..0ff5e9019 Binary files /dev/null and b/static/performer/NoName23.png differ diff --git a/static/performer/NoName24.png b/static/performer/NoName24.png new file mode 100644 index 000000000..a971dae43 Binary files /dev/null and b/static/performer/NoName24.png differ diff --git a/static/performer/NoName25.png b/static/performer/NoName25.png new file mode 100644 index 000000000..2439e14fc Binary files /dev/null and b/static/performer/NoName25.png differ diff --git a/static/performer/NoName26.png b/static/performer/NoName26.png new file mode 100644 index 000000000..b12f19c87 Binary files /dev/null and b/static/performer/NoName26.png differ diff --git a/static/performer/NoName27.png b/static/performer/NoName27.png new file mode 100644 index 000000000..91ff3c027 Binary files /dev/null and b/static/performer/NoName27.png differ diff --git a/static/performer/NoName28.png b/static/performer/NoName28.png new file mode 100644 index 000000000..24c104e42 Binary files /dev/null and b/static/performer/NoName28.png differ diff --git a/static/performer/NoName29.png b/static/performer/NoName29.png new file mode 100644 index 000000000..f3cc718ca Binary files /dev/null and b/static/performer/NoName29.png differ diff --git a/static/performer/NoName30.png b/static/performer/NoName30.png new file mode 100644 index 000000000..343e8cf0f Binary files /dev/null and b/static/performer/NoName30.png differ diff --git a/static/performer/NoName31.png b/static/performer/NoName31.png new file mode 100644 index 000000000..284903fe8 Binary files /dev/null and b/static/performer/NoName31.png differ diff --git a/static/performer/NoName32.png b/static/performer/NoName32.png new file mode 100644 index 000000000..ab0c8deb3 Binary files /dev/null and b/static/performer/NoName32.png differ diff --git a/static/performer/NoName33.png b/static/performer/NoName33.png new file mode 100644 index 000000000..ad9fcb8a8 Binary files /dev/null and b/static/performer/NoName33.png differ diff --git a/static/performer/NoName34.png b/static/performer/NoName34.png new file mode 100644 index 000000000..3e25c5622 Binary files /dev/null and b/static/performer/NoName34.png differ diff --git a/static/performer/NoName35.png b/static/performer/NoName35.png new file mode 100644 index 000000000..d9f8cf040 Binary files /dev/null and b/static/performer/NoName35.png differ diff --git a/static/performer/NoName36.png b/static/performer/NoName36.png new file mode 100644 index 000000000..ac2d8b89d Binary files /dev/null and b/static/performer/NoName36.png differ diff --git a/static/performer/NoName37.png b/static/performer/NoName37.png new file mode 100644 index 000000000..d10fd47e9 Binary files /dev/null and b/static/performer/NoName37.png differ diff --git a/static/performer/NoName38.png b/static/performer/NoName38.png new file mode 100644 index 000000000..7609ef61f Binary files /dev/null and b/static/performer/NoName38.png differ diff --git a/static/performer/NoName39.png b/static/performer/NoName39.png new file mode 100644 index 000000000..d87790e0f Binary files /dev/null and b/static/performer/NoName39.png differ diff --git a/static/performer/NoName40.png b/static/performer/NoName40.png new file mode 100644 index 000000000..0b13071cb Binary files /dev/null and b/static/performer/NoName40.png differ