2021-04-26 02:51:31 +00:00
package autotag
import (
2022-05-19 07:49:32 +00:00
"context"
2021-10-11 12:06:06 +00:00
2022-05-19 07:49:32 +00:00
"github.com/stashapp/stash/pkg/gallery"
"github.com/stashapp/stash/pkg/image"
2022-03-09 01:01:56 +00:00
"github.com/stashapp/stash/pkg/match"
2021-04-26 02:51:31 +00:00
"github.com/stashapp/stash/pkg/models"
2022-05-19 07:49:32 +00:00
"github.com/stashapp/stash/pkg/scene"
2022-11-14 06:07:24 +00:00
"github.com/stashapp/stash/pkg/txn"
2021-04-26 02:51:31 +00:00
)
2022-11-14 06:07:24 +00:00
// the following functions aren't used in Tagger because they assume
// use within a transaction
2022-07-13 06:30:54 +00:00
func addSceneStudio ( ctx context . Context , sceneWriter scene . PartialUpdater , o * models . Scene , studioID int ) ( bool , error ) {
2021-04-26 02:51:31 +00:00
// don't set if already set
2022-07-13 06:30:54 +00:00
if o . StudioID != nil {
2021-04-26 02:51:31 +00:00
return false , nil
}
// set the studio id
scenePartial := models . ScenePartial {
2022-07-13 06:30:54 +00:00
StudioID : models . NewOptionalInt ( studioID ) ,
2021-04-26 02:51:31 +00:00
}
2022-07-13 06:30:54 +00:00
if _ , err := sceneWriter . UpdatePartial ( ctx , o . ID , scenePartial ) ; err != nil {
2021-04-26 02:51:31 +00:00
return false , err
}
return true , nil
}
2022-07-13 06:30:54 +00:00
func addImageStudio ( ctx context . Context , imageWriter image . PartialUpdater , i * models . Image , studioID int ) ( bool , error ) {
2021-05-03 03:09:46 +00:00
// don't set if already set
2022-07-13 06:30:54 +00:00
if i . StudioID != nil {
2021-05-03 03:09:46 +00:00
return false , nil
}
// set the studio id
imagePartial := models . ImagePartial {
2022-07-13 06:30:54 +00:00
StudioID : models . NewOptionalInt ( studioID ) ,
2021-05-03 03:09:46 +00:00
}
2022-07-13 06:30:54 +00:00
if _ , err := imageWriter . UpdatePartial ( ctx , i . ID , imagePartial ) ; err != nil {
2021-05-03 03:09:46 +00:00
return false , err
}
return true , nil
}
2022-07-13 06:30:54 +00:00
func addGalleryStudio ( ctx context . Context , galleryWriter GalleryFinderUpdater , o * models . Gallery , studioID int ) ( bool , error ) {
2021-05-03 03:09:46 +00:00
// don't set if already set
2022-07-13 06:30:54 +00:00
if o . StudioID != nil {
2021-05-03 03:09:46 +00:00
return false , nil
}
// set the studio id
galleryPartial := models . GalleryPartial {
2022-07-13 06:30:54 +00:00
StudioID : models . NewOptionalInt ( studioID ) ,
2021-05-03 03:09:46 +00:00
}
2022-07-13 06:30:54 +00:00
if _ , err := galleryWriter . UpdatePartial ( ctx , o . ID , galleryPartial ) ; err != nil {
2021-05-03 03:09:46 +00:00
return false , err
}
return true , nil
}
2022-03-09 01:01:56 +00:00
func getStudioTagger ( p * models . Studio , aliases [ ] string , cache * match . Cache ) [ ] tagger {
2021-09-09 08:13:42 +00:00
ret := [ ] tagger { {
2022-03-09 01:01:56 +00:00
ID : p . ID ,
Type : "studio" ,
Name : p . Name . String ,
cache : cache ,
2021-09-09 08:13:42 +00:00
} }
for _ , a := range aliases {
ret = append ( ret , tagger {
ID : p . ID ,
Type : "studio" ,
Name : a ,
} )
2021-04-26 02:51:31 +00:00
}
2021-09-09 08:13:42 +00:00
return ret
2021-04-26 02:51:31 +00:00
}
2022-05-19 07:49:32 +00:00
type SceneFinderUpdater interface {
scene . Queryer
2022-07-13 06:30:54 +00:00
scene . PartialUpdater
2022-05-19 07:49:32 +00:00
}
2021-04-26 02:51:31 +00:00
// StudioScenes searches for scenes whose path matches the provided studio name and tags the scene with the studio, if studio is not already set on the scene.
2022-11-14 06:07:24 +00:00
func ( tagger * Tagger ) StudioScenes ( ctx context . Context , p * models . Studio , paths [ ] string , aliases [ ] string , rw SceneFinderUpdater ) error {
t := getStudioTagger ( p , aliases , tagger . Cache )
2021-09-09 08:13:42 +00:00
for _ , tt := range t {
2022-07-13 06:30:54 +00:00
if err := tt . tagScenes ( ctx , paths , rw , func ( o * models . Scene ) ( bool , error ) {
2022-11-14 06:07:24 +00:00
// don't set if already set
if o . StudioID != nil {
return false , nil
}
// set the studio id
scenePartial := models . ScenePartial {
StudioID : models . NewOptionalInt ( p . ID ) ,
}
if err := txn . WithTxn ( ctx , tagger . TxnManager , func ( ctx context . Context ) error {
_ , err := rw . UpdatePartial ( ctx , o . ID , scenePartial )
return err
} ) ; err != nil {
return false , err
}
return true , nil
2021-09-09 08:13:42 +00:00
} ) ; err != nil {
return err
}
}
2021-04-26 02:51:31 +00:00
2021-09-09 08:13:42 +00:00
return nil
2021-04-26 02:51:31 +00:00
}
2021-05-03 03:09:46 +00:00
2022-05-19 07:49:32 +00:00
type ImageFinderUpdater interface {
image . Queryer
Find ( ctx context . Context , id int ) ( * models . Image , error )
2022-07-13 06:30:54 +00:00
UpdatePartial ( ctx context . Context , id int , partial models . ImagePartial ) ( * models . Image , error )
2022-05-19 07:49:32 +00:00
}
2021-05-03 03:09:46 +00:00
// StudioImages searches for images whose path matches the provided studio name and tags the image with the studio, if studio is not already set on the image.
2022-11-14 06:07:24 +00:00
func ( tagger * Tagger ) StudioImages ( ctx context . Context , p * models . Studio , paths [ ] string , aliases [ ] string , rw ImageFinderUpdater ) error {
t := getStudioTagger ( p , aliases , tagger . Cache )
2021-09-09 08:13:42 +00:00
for _ , tt := range t {
2022-07-13 06:30:54 +00:00
if err := tt . tagImages ( ctx , paths , rw , func ( i * models . Image ) ( bool , error ) {
2022-11-14 06:07:24 +00:00
// don't set if already set
if i . StudioID != nil {
return false , nil
}
// set the studio id
imagePartial := models . ImagePartial {
StudioID : models . NewOptionalInt ( p . ID ) ,
}
if err := txn . WithTxn ( ctx , tagger . TxnManager , func ( ctx context . Context ) error {
_ , err := rw . UpdatePartial ( ctx , i . ID , imagePartial )
return err
} ) ; err != nil {
return false , err
}
return true , nil
2021-09-09 08:13:42 +00:00
} ) ; err != nil {
return err
}
}
2021-05-03 03:09:46 +00:00
2021-09-09 08:13:42 +00:00
return nil
2021-05-03 03:09:46 +00:00
}
2022-05-19 07:49:32 +00:00
type GalleryFinderUpdater interface {
gallery . Queryer
2022-07-13 06:30:54 +00:00
gallery . PartialUpdater
2022-05-19 07:49:32 +00:00
Find ( ctx context . Context , id int ) ( * models . Gallery , error )
}
2021-05-03 03:09:46 +00:00
// StudioGalleries searches for galleries whose path matches the provided studio name and tags the gallery with the studio, if studio is not already set on the gallery.
2022-11-14 06:07:24 +00:00
func ( tagger * Tagger ) StudioGalleries ( ctx context . Context , p * models . Studio , paths [ ] string , aliases [ ] string , rw GalleryFinderUpdater ) error {
t := getStudioTagger ( p , aliases , tagger . Cache )
2021-09-09 08:13:42 +00:00
for _ , tt := range t {
2022-07-13 06:30:54 +00:00
if err := tt . tagGalleries ( ctx , paths , rw , func ( o * models . Gallery ) ( bool , error ) {
2022-11-14 06:07:24 +00:00
// don't set if already set
if o . StudioID != nil {
return false , nil
}
// set the studio id
galleryPartial := models . GalleryPartial {
StudioID : models . NewOptionalInt ( p . ID ) ,
}
if err := txn . WithTxn ( ctx , tagger . TxnManager , func ( ctx context . Context ) error {
_ , err := rw . UpdatePartial ( ctx , o . ID , galleryPartial )
return err
} ) ; err != nil {
return false , err
}
return true , nil
2021-09-09 08:13:42 +00:00
} ) ; err != nil {
return err
}
}
2021-05-03 03:09:46 +00:00
2021-09-09 08:13:42 +00:00
return nil
2021-05-03 03:09:46 +00:00
}