diff --git a/.golangci.yml b/.golangci.yml index dba992cda..0fb188a5c 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -20,7 +20,7 @@ linters: # Linters added by the stash project. # - contextcheck - dogsled - # - errchkjson + - errchkjson - errorlint # - exhaustive - exportloopref diff --git a/internal/api/resolver_mutation_metadata.go b/internal/api/resolver_mutation_metadata.go index 04626d9b4..b8154614f 100644 --- a/internal/api/resolver_mutation_metadata.go +++ b/internal/api/resolver_mutation_metadata.go @@ -61,7 +61,7 @@ func (r *mutationResolver) ExportObjects(ctx context.Context, input models.Expor var wg sync.WaitGroup wg.Add(1) - t.Start(&wg) + t.Start(ctx, &wg) if t.DownloadHash != "" { baseURL, _ := ctx.Value(BaseURLCtxKey).(string) diff --git a/internal/manager/manager.go b/internal/manager/manager.go index 3314e20ed..5fe5b8d68 100644 --- a/internal/manager/manager.go +++ b/internal/manager/manager.go @@ -121,7 +121,7 @@ func Initialize() *singleton { logger.Warnf("config file %snot found. Assuming new system...", cfgFile) } - if err = initFFMPEG(); err != nil { + if err = initFFMPEG(ctx); err != nil { logger.Warnf("could not initialize FFMPEG subsystem: %v", err) } @@ -189,9 +189,7 @@ func initProfiling(cpuProfilePath string) { } } -func initFFMPEG() error { - ctx := context.TODO() - +func initFFMPEG(ctx context.Context) error { // only do this if we have a config file set if instance.Config.GetConfigFile() != "" { // use same directory as config path @@ -404,7 +402,7 @@ func (s *singleton) Setup(ctx context.Context, input models.SetupInput) error { s.Config.FinalizeSetup() - if err := initFFMPEG(); err != nil { + if err := initFFMPEG(ctx); err != nil { return fmt.Errorf("error initializing FFMPEG subsystem: %v", err) } diff --git a/internal/manager/manager_tasks.go b/internal/manager/manager_tasks.go index b2cac4c32..a81614fa2 100644 --- a/internal/manager/manager_tasks.go +++ b/internal/manager/manager_tasks.go @@ -108,7 +108,7 @@ func (s *singleton) Export(ctx context.Context) (int, error) { full: true, fileNamingAlgorithm: config.GetVideoFileNamingAlgorithm(), } - task.Start(&wg) + task.Start(ctx, &wg) }) return s.JobManager.Add(ctx, "Exporting...", j), nil @@ -192,7 +192,7 @@ func (s *singleton) generateScreenshot(ctx context.Context, sceneId string, at * } var scene *models.Scene - if err := s.TxnManager.WithReadTxn(context.TODO(), func(r models.ReaderRepository) error { + if err := s.TxnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error { var err error scene, err = r.Scene().Find(sceneIdInt) return err @@ -241,7 +241,7 @@ func (s *singleton) MigrateHash(ctx context.Context) int { logger.Infof("Migrating generated files for %s naming hash", fileNamingAlgo.String()) var scenes []*models.Scene - if err := s.TxnManager.WithReadTxn(context.TODO(), func(r models.ReaderRepository) error { + if err := s.TxnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error { var err error scenes, err = r.Scene().All() return err @@ -303,7 +303,7 @@ func (s *singleton) StashBoxBatchPerformerTag(ctx context.Context, input models. // This is why we mark this section nolint. In principle, we should look to // rewrite the section at some point, to avoid the linter warning. if len(input.PerformerIds) > 0 { //nolint:gocritic - if err := s.TxnManager.WithReadTxn(context.TODO(), func(r models.ReaderRepository) error { + if err := s.TxnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error { performerQuery := r.Performer() for _, performerID := range input.PerformerIds { @@ -343,7 +343,7 @@ func (s *singleton) StashBoxBatchPerformerTag(ctx context.Context, input models. // However, this doesn't really help with readability of the current section. Mark it // as nolint for now. In the future we'd like to rewrite this code by factoring some of // this into separate functions. - if err := s.TxnManager.WithReadTxn(context.TODO(), func(r models.ReaderRepository) error { + if err := s.TxnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error { performerQuery := r.Performer() var performers []*models.Performer var err error @@ -384,7 +384,7 @@ func (s *singleton) StashBoxBatchPerformerTag(ctx context.Context, input models. for _, task := range tasks { wg.Add(1) progress.ExecuteTask(task.Description(), func() { - task.Start() + task.Start(ctx) wg.Done() }) diff --git a/internal/manager/task_autotag.go b/internal/manager/task_autotag.go index cdb330bba..369d31754 100644 --- a/internal/manager/task_autotag.go +++ b/internal/manager/task_autotag.go @@ -55,13 +55,12 @@ func (j *autoTagJob) autoTagFiles(ctx context.Context, progress *job.Progress, p performers: performers, studios: studios, tags: tags, - ctx: ctx, progress: progress, txnManager: j.txnManager, cache: &j.cache, } - t.process() + t.process(ctx) } func (j *autoTagJob) autoTagSpecific(ctx context.Context, progress *job.Progress) { @@ -74,7 +73,7 @@ func (j *autoTagJob) autoTagSpecific(ctx context.Context, progress *job.Progress studioCount := len(studioIds) tagCount := len(tagIds) - if err := j.txnManager.WithReadTxn(context.TODO(), func(r models.ReaderRepository) error { + if err := j.txnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error { performerQuery := r.Performer() studioQuery := r.Studio() tagQuery := r.Tag() @@ -124,7 +123,7 @@ func (j *autoTagJob) autoTagPerformers(ctx context.Context, progress *job.Progre for _, performerId := range performerIds { var performers []*models.Performer - if err := j.txnManager.WithReadTxn(context.TODO(), func(r models.ReaderRepository) error { + if err := j.txnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error { performerQuery := r.Performer() ignoreAutoTag := false perPage := -1 @@ -162,7 +161,7 @@ func (j *autoTagJob) autoTagPerformers(ctx context.Context, progress *job.Progre return nil } - if err := j.txnManager.WithTxn(context.TODO(), func(r models.Repository) error { + if err := j.txnManager.WithTxn(ctx, func(r models.Repository) error { if err := autotag.PerformerScenes(performer, paths, r.Scene(), &j.cache); err != nil { return err } @@ -197,7 +196,7 @@ func (j *autoTagJob) autoTagStudios(ctx context.Context, progress *job.Progress, for _, studioId := range studioIds { var studios []*models.Studio - if err := j.txnManager.WithReadTxn(context.TODO(), func(r models.ReaderRepository) error { + if err := j.txnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error { studioQuery := r.Studio() ignoreAutoTag := false perPage := -1 @@ -235,7 +234,7 @@ func (j *autoTagJob) autoTagStudios(ctx context.Context, progress *job.Progress, return nil } - if err := j.txnManager.WithTxn(context.TODO(), func(r models.Repository) error { + if err := j.txnManager.WithTxn(ctx, func(r models.Repository) error { aliases, err := r.Studio().GetAliases(studio.ID) if err != nil { return err @@ -274,7 +273,7 @@ func (j *autoTagJob) autoTagTags(ctx context.Context, progress *job.Progress, pa for _, tagId := range tagIds { var tags []*models.Tag - if err := j.txnManager.WithReadTxn(context.TODO(), func(r models.ReaderRepository) error { + if err := j.txnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error { tagQuery := r.Tag() ignoreAutoTag := false perPage := -1 @@ -307,7 +306,7 @@ func (j *autoTagJob) autoTagTags(ctx context.Context, progress *job.Progress, pa return nil } - if err := j.txnManager.WithTxn(context.TODO(), func(r models.Repository) error { + if err := j.txnManager.WithTxn(ctx, func(r models.Repository) error { aliases, err := r.Tag().GetAliases(tag.ID) if err != nil { return err @@ -345,7 +344,6 @@ type autoTagFilesTask struct { studios bool tags bool - ctx context.Context progress *job.Progress txnManager models.TransactionManager cache *match.Cache @@ -467,8 +465,8 @@ func (t *autoTagFilesTask) getCount(r models.ReaderRepository) (int, error) { return sceneCount + imageCount + galleryCount, nil } -func (t *autoTagFilesTask) processScenes(r models.ReaderRepository) error { - if job.IsCancelled(t.ctx) { +func (t *autoTagFilesTask) processScenes(ctx context.Context, r models.ReaderRepository) error { + if job.IsCancelled(ctx) { return nil } @@ -485,7 +483,7 @@ func (t *autoTagFilesTask) processScenes(r models.ReaderRepository) error { } for _, ss := range scenes { - if job.IsCancelled(t.ctx) { + if job.IsCancelled(ctx) { return nil } @@ -500,7 +498,7 @@ func (t *autoTagFilesTask) processScenes(r models.ReaderRepository) error { var wg sync.WaitGroup wg.Add(1) - go tt.Start(&wg) + go tt.Start(ctx, &wg) wg.Wait() t.progress.Increment() @@ -520,8 +518,8 @@ func (t *autoTagFilesTask) processScenes(r models.ReaderRepository) error { return nil } -func (t *autoTagFilesTask) processImages(r models.ReaderRepository) error { - if job.IsCancelled(t.ctx) { +func (t *autoTagFilesTask) processImages(ctx context.Context, r models.ReaderRepository) error { + if job.IsCancelled(ctx) { return nil } @@ -538,7 +536,7 @@ func (t *autoTagFilesTask) processImages(r models.ReaderRepository) error { } for _, ss := range images { - if job.IsCancelled(t.ctx) { + if job.IsCancelled(ctx) { return nil } @@ -553,7 +551,7 @@ func (t *autoTagFilesTask) processImages(r models.ReaderRepository) error { var wg sync.WaitGroup wg.Add(1) - go tt.Start(&wg) + go tt.Start(ctx, &wg) wg.Wait() t.progress.Increment() @@ -573,8 +571,8 @@ func (t *autoTagFilesTask) processImages(r models.ReaderRepository) error { return nil } -func (t *autoTagFilesTask) processGalleries(r models.ReaderRepository) error { - if job.IsCancelled(t.ctx) { +func (t *autoTagFilesTask) processGalleries(ctx context.Context, r models.ReaderRepository) error { + if job.IsCancelled(ctx) { return nil } @@ -591,7 +589,7 @@ func (t *autoTagFilesTask) processGalleries(r models.ReaderRepository) error { } for _, ss := range galleries { - if job.IsCancelled(t.ctx) { + if job.IsCancelled(ctx) { return nil } @@ -606,7 +604,7 @@ func (t *autoTagFilesTask) processGalleries(r models.ReaderRepository) error { var wg sync.WaitGroup wg.Add(1) - go tt.Start(&wg) + go tt.Start(ctx, &wg) wg.Wait() t.progress.Increment() @@ -626,8 +624,8 @@ func (t *autoTagFilesTask) processGalleries(r models.ReaderRepository) error { return nil } -func (t *autoTagFilesTask) process() { - if err := t.txnManager.WithReadTxn(context.TODO(), func(r models.ReaderRepository) error { +func (t *autoTagFilesTask) process(ctx context.Context) { + if err := t.txnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error { total, err := t.getCount(r) if err != nil { return err @@ -638,21 +636,21 @@ func (t *autoTagFilesTask) process() { logger.Infof("Starting autotag of %d files", total) logger.Info("Autotagging scenes...") - if err := t.processScenes(r); err != nil { + if err := t.processScenes(ctx, r); err != nil { return err } logger.Info("Autotagging images...") - if err := t.processImages(r); err != nil { + if err := t.processImages(ctx, r); err != nil { return err } logger.Info("Autotagging galleries...") - if err := t.processGalleries(r); err != nil { + if err := t.processGalleries(ctx, r); err != nil { return err } - if job.IsCancelled(t.ctx) { + if job.IsCancelled(ctx) { logger.Info("Stopping due to user request") } @@ -673,9 +671,9 @@ type autoTagSceneTask struct { cache *match.Cache } -func (t *autoTagSceneTask) Start(wg *sync.WaitGroup) { +func (t *autoTagSceneTask) Start(ctx context.Context, wg *sync.WaitGroup) { defer wg.Done() - if err := t.txnManager.WithTxn(context.TODO(), func(r models.Repository) error { + if err := t.txnManager.WithTxn(ctx, func(r models.Repository) error { if t.performers { if err := autotag.ScenePerformers(t.scene, r.Scene(), r.Performer(), t.cache); err != nil { return fmt.Errorf("error tagging scene performers for %s: %v", t.scene.Path, err) @@ -709,9 +707,9 @@ type autoTagImageTask struct { cache *match.Cache } -func (t *autoTagImageTask) Start(wg *sync.WaitGroup) { +func (t *autoTagImageTask) Start(ctx context.Context, wg *sync.WaitGroup) { defer wg.Done() - if err := t.txnManager.WithTxn(context.TODO(), func(r models.Repository) error { + if err := t.txnManager.WithTxn(ctx, func(r models.Repository) error { if t.performers { if err := autotag.ImagePerformers(t.image, r.Image(), r.Performer(), t.cache); err != nil { return fmt.Errorf("error tagging image performers for %s: %v", t.image.Path, err) @@ -745,9 +743,9 @@ type autoTagGalleryTask struct { cache *match.Cache } -func (t *autoTagGalleryTask) Start(wg *sync.WaitGroup) { +func (t *autoTagGalleryTask) Start(ctx context.Context, wg *sync.WaitGroup) { defer wg.Done() - if err := t.txnManager.WithTxn(context.TODO(), func(r models.Repository) error { + if err := t.txnManager.WithTxn(ctx, func(r models.Repository) error { if t.performers { if err := autotag.GalleryPerformers(t.gallery, r.Gallery(), r.Performer(), t.cache); err != nil { return fmt.Errorf("error tagging gallery performers for %s: %v", t.gallery.Path.String, err) diff --git a/internal/manager/task_clean.go b/internal/manager/task_clean.go index c3b9c480d..2853e612c 100644 --- a/internal/manager/task_clean.go +++ b/internal/manager/task_clean.go @@ -29,7 +29,7 @@ func (j *cleanJob) Execute(ctx context.Context, progress *job.Progress) { logger.Infof("Running in Dry Mode") } - if err := j.txnManager.WithReadTxn(context.TODO(), func(r models.ReaderRepository) error { + if err := j.txnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error { total, err := j.getCount(r) if err != nil { return fmt.Errorf("error getting count: %w", err) @@ -401,7 +401,7 @@ func (j *cleanJob) deleteScene(ctx context.Context, fileNamingAlgorithm models.H Paths: GetInstance().Paths, } var s *models.Scene - if err := j.txnManager.WithTxn(context.TODO(), func(repo models.Repository) error { + if err := j.txnManager.WithTxn(ctx, func(repo models.Repository) error { qb := repo.Scene() var err error @@ -431,7 +431,7 @@ func (j *cleanJob) deleteScene(ctx context.Context, fileNamingAlgorithm models.H func (j *cleanJob) deleteGallery(ctx context.Context, galleryID int) { var g *models.Gallery - if err := j.txnManager.WithTxn(context.TODO(), func(repo models.Repository) error { + if err := j.txnManager.WithTxn(ctx, func(repo models.Repository) error { qb := repo.Gallery() var err error @@ -459,7 +459,7 @@ func (j *cleanJob) deleteImage(ctx context.Context, imageID int) { } var i *models.Image - if err := j.txnManager.WithTxn(context.TODO(), func(repo models.Repository) error { + if err := j.txnManager.WithTxn(ctx, func(repo models.Repository) error { qb := repo.Image() var err error diff --git a/internal/manager/task_export.go b/internal/manager/task_export.go index ca86a049f..c94932ed3 100644 --- a/internal/manager/task_export.go +++ b/internal/manager/task_export.go @@ -96,7 +96,7 @@ func CreateExportTask(a models.HashAlgorithm, input models.ExportObjectsInput) * } } -func (t *ExportTask) Start(wg *sync.WaitGroup) { +func (t *ExportTask) Start(ctx context.Context, wg *sync.WaitGroup) { defer wg.Done() // @manager.total = Scene.count + Gallery.count + Performer.count + Studio.count + Movie.count workerCount := runtime.GOMAXPROCS(0) // set worker count to number of cpus available @@ -129,7 +129,7 @@ func (t *ExportTask) Start(wg *sync.WaitGroup) { paths.EnsureJSONDirs(t.baseDir) - txnErr := t.txnManager.WithReadTxn(context.TODO(), func(r models.ReaderRepository) error { + txnErr := t.txnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error { // include movie scenes and gallery images if !t.full { // only include movie scenes if includeDependencies is also set diff --git a/internal/manager/task_generate.go b/internal/manager/task_generate.go index 44bc63eec..8299eb74f 100644 --- a/internal/manager/task_generate.go +++ b/internal/manager/task_generate.go @@ -75,7 +75,7 @@ func (j *GenerateJob) Execute(ctx context.Context, progress *job.Progress) { if len(j.input.SceneIDs) > 0 { scenes, err = qb.FindMany(sceneIDs) for _, s := range scenes { - j.queueSceneJobs(s, queue, &totals) + j.queueSceneJobs(ctx, s, queue, &totals) } } @@ -165,7 +165,7 @@ func (j *GenerateJob) queueTasks(ctx context.Context, queue chan<- Task) totalsG return context.Canceled } - j.queueSceneJobs(ss, queue, &totals) + j.queueSceneJobs(ctx, ss, queue, &totals) } if len(scenes) != batchSize { @@ -185,7 +185,7 @@ func (j *GenerateJob) queueTasks(ctx context.Context, queue chan<- Task) totalsG return totals } -func (j *GenerateJob) queueSceneJobs(scene *models.Scene, queue chan<- Task, totals *totalsGenerate) { +func (j *GenerateJob) queueSceneJobs(ctx context.Context, scene *models.Scene, queue chan<- Task, totals *totalsGenerate) { if utils.IsTrue(j.input.Sprites) { task := &GenerateSpriteTask{ Scene: *scene, @@ -243,7 +243,7 @@ func (j *GenerateJob) queueSceneJobs(scene *models.Scene, queue chan<- Task, tot Screenshot: utils.IsTrue(j.input.MarkerScreenshots), } - markers := task.markersNeeded() + markers := task.markersNeeded(ctx) if markers > 0 { totals.markers += int64(markers) totals.tasks++ diff --git a/internal/manager/task_generate_interactive_heatmap_speed.go b/internal/manager/task_generate_interactive_heatmap_speed.go index 4b2952d50..f6ca0a04e 100644 --- a/internal/manager/task_generate_interactive_heatmap_speed.go +++ b/internal/manager/task_generate_interactive_heatmap_speed.go @@ -47,7 +47,7 @@ func (t *GenerateInteractiveHeatmapSpeedTask) Start(ctx context.Context) { var s *models.Scene - if err := t.TxnManager.WithReadTxn(context.TODO(), func(r models.ReaderRepository) error { + if err := t.TxnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error { var err error s, err = r.Scene().FindByPath(t.Scene.Path) return err @@ -56,7 +56,7 @@ func (t *GenerateInteractiveHeatmapSpeedTask) Start(ctx context.Context) { return } - if err := t.TxnManager.WithTxn(context.TODO(), func(r models.Repository) error { + if err := t.TxnManager.WithTxn(ctx, func(r models.Repository) error { qb := r.Scene() scenePartial := models.ScenePartial{ ID: s.ID, diff --git a/internal/manager/task_generate_markers.go b/internal/manager/task_generate_markers.go index e1d96f0eb..285ad0680 100644 --- a/internal/manager/task_generate_markers.go +++ b/internal/manager/task_generate_markers.go @@ -35,12 +35,12 @@ func (t *GenerateMarkersTask) GetDescription() string { func (t *GenerateMarkersTask) Start(ctx context.Context) { if t.Scene != nil { - t.generateSceneMarkers() + t.generateSceneMarkers(ctx) } if t.Marker != nil { var scene *models.Scene - if err := t.TxnManager.WithReadTxn(context.TODO(), func(r models.ReaderRepository) error { + if err := t.TxnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error { var err error scene, err = r.Scene().Find(int(t.Marker.SceneID.Int64)) return err @@ -65,9 +65,9 @@ func (t *GenerateMarkersTask) Start(ctx context.Context) { } } -func (t *GenerateMarkersTask) generateSceneMarkers() { +func (t *GenerateMarkersTask) generateSceneMarkers(ctx context.Context) { var sceneMarkers []*models.SceneMarker - if err := t.TxnManager.WithReadTxn(context.TODO(), func(r models.ReaderRepository) error { + if err := t.TxnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error { var err error sceneMarkers, err = r.SceneMarker().FindBySceneID(t.Scene.ID) return err @@ -167,10 +167,10 @@ func (t *GenerateMarkersTask) generateMarker(videoFile *ffmpeg.VideoFile, scene } } -func (t *GenerateMarkersTask) markersNeeded() int { +func (t *GenerateMarkersTask) markersNeeded(ctx context.Context) int { markers := 0 var sceneMarkers []*models.SceneMarker - if err := t.TxnManager.WithReadTxn(context.TODO(), func(r models.ReaderRepository) error { + if err := t.TxnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error { var err error sceneMarkers, err = r.SceneMarker().FindBySceneID(t.Scene.ID) return err diff --git a/internal/manager/task_generate_phash.go b/internal/manager/task_generate_phash.go index 30b863cf7..899256ed4 100644 --- a/internal/manager/task_generate_phash.go +++ b/internal/manager/task_generate_phash.go @@ -45,7 +45,7 @@ func (t *GeneratePhashTask) Start(ctx context.Context) { return } - if err := t.txnManager.WithTxn(context.TODO(), func(r models.Repository) error { + if err := t.txnManager.WithTxn(ctx, func(r models.Repository) error { qb := r.Scene() hashValue := sql.NullInt64{Int64: int64(*hash), Valid: true} scenePartial := models.ScenePartial{ diff --git a/internal/manager/task_generate_screenshot.go b/internal/manager/task_generate_screenshot.go index baa3ab107..fd5c2f517 100644 --- a/internal/manager/task_generate_screenshot.go +++ b/internal/manager/task_generate_screenshot.go @@ -59,7 +59,7 @@ func (t *GenerateScreenshotTask) Start(ctx context.Context) { return } - if err := t.txnManager.WithTxn(context.TODO(), func(r models.Repository) error { + if err := t.txnManager.WithTxn(ctx, func(r models.Repository) error { qb := r.Scene() updatedTime := time.Now() updatedScene := models.ScenePartial{ diff --git a/internal/manager/task_scan.go b/internal/manager/task_scan.go index cfee44564..c48949ce5 100644 --- a/internal/manager/task_scan.go +++ b/internal/manager/task_scan.go @@ -97,7 +97,6 @@ func (j *ScanJob) Execute(ctx context.Context, progress *job.Progress) { GenerateThumbnails: utils.IsTrue(input.ScanGenerateThumbnails), progress: progress, CaseSensitiveFs: f.caseSensitiveFs, - ctx: ctx, mutexManager: mutexManager, } @@ -135,7 +134,7 @@ func (j *ScanJob) Execute(ctx context.Context, progress *job.Progress) { UseFileMetadata: false, } - go task.associateGallery(&wg) + go task.associateGallery(ctx, &wg) wg.Wait() } logger.Info("Finished gallery association") @@ -187,7 +186,7 @@ func (j *ScanJob) queueFiles(ctx context.Context, paths []*models.StashConfig, s } total++ - if !j.doesPathExist(path) { + if !j.doesPathExist(ctx, path) { newFiles++ } @@ -212,14 +211,14 @@ func (j *ScanJob) queueFiles(ctx context.Context, paths []*models.StashConfig, s return } -func (j *ScanJob) doesPathExist(path string) bool { +func (j *ScanJob) doesPathExist(ctx context.Context, path string) bool { config := config.GetInstance() vidExt := config.GetVideoExtensions() imgExt := config.GetImageExtensions() gExt := config.GetGalleryExtensions() ret := false - txnErr := j.txnManager.WithReadTxn(context.TODO(), func(r models.ReaderRepository) error { + txnErr := j.txnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error { switch { case fsutil.MatchExtension(path, gExt): g, _ := r.Gallery().FindByPath(path) @@ -248,7 +247,6 @@ func (j *ScanJob) doesPathExist(path string) bool { } type ScanTask struct { - ctx context.Context TxnManager models.TransactionManager file file.SourceFile UseFileMetadata bool @@ -275,9 +273,9 @@ func (t *ScanTask) Start(ctx context.Context) { case isGallery(path): t.scanGallery(ctx) case isVideo(path): - s = t.scanScene() + s = t.scanScene(ctx) case isImage(path): - t.scanImage() + t.scanImage(ctx) } }) diff --git a/internal/manager/task_scan_gallery.go b/internal/manager/task_scan_gallery.go index 9a8887db8..25bd1f17d 100644 --- a/internal/manager/task_scan_gallery.go +++ b/internal/manager/task_scan_gallery.go @@ -42,7 +42,6 @@ func (t *ScanTask) scanGallery(ctx context.Context) { Scanner: gallery.FileScanner(&file.FSHasher{}), ImageExtensions: instance.Config.GetImageExtensions(), StripFileExtension: t.StripFileExtension, - Ctx: t.ctx, CaseSensitiveFs: t.CaseSensitiveFs, TxnManager: t.TxnManager, Paths: instance.Paths, @@ -52,7 +51,7 @@ func (t *ScanTask) scanGallery(ctx context.Context) { var err error if g != nil { - g, scanImages, err = scanner.ScanExisting(g, t.file) + g, scanImages, err = scanner.ScanExisting(ctx, g, t.file) if err != nil { logger.Error(err.Error()) return @@ -61,7 +60,7 @@ func (t *ScanTask) scanGallery(ctx context.Context) { // scan the zip files if the gallery has no images scanImages = scanImages || images == 0 } else { - g, scanImages, err = scanner.ScanNew(t.file) + g, scanImages, err = scanner.ScanNew(ctx, t.file) if err != nil { logger.Error(err.Error()) } @@ -69,18 +68,18 @@ func (t *ScanTask) scanGallery(ctx context.Context) { if g != nil { if scanImages { - t.scanZipImages(g) + t.scanZipImages(ctx, g) } else { // in case thumbnails have been deleted, regenerate them - t.regenerateZipImages(g) + t.regenerateZipImages(ctx, g) } } } // associates a gallery to a scene with the same basename -func (t *ScanTask) associateGallery(wg *sizedwaitgroup.SizedWaitGroup) { +func (t *ScanTask) associateGallery(ctx context.Context, wg *sizedwaitgroup.SizedWaitGroup) { path := t.file.Path() - if err := t.TxnManager.WithTxn(context.TODO(), func(r models.Repository) error { + if err := t.TxnManager.WithTxn(ctx, func(r models.Repository) error { qb := r.Gallery() sqb := r.Scene() g, err := qb.FindByPath(path) @@ -133,7 +132,7 @@ func (t *ScanTask) associateGallery(wg *sizedwaitgroup.SizedWaitGroup) { wg.Done() } -func (t *ScanTask) scanZipImages(zipGallery *models.Gallery) { +func (t *ScanTask) scanZipImages(ctx context.Context, zipGallery *models.Gallery) { err := walkGalleryZip(zipGallery.Path.String, func(f *zip.File) error { // copy this task and change the filename subTask := *t @@ -143,7 +142,7 @@ func (t *ScanTask) scanZipImages(zipGallery *models.Gallery) { subTask.zipGallery = zipGallery // run the subtask and wait for it to complete - subTask.Start(context.TODO()) + subTask.Start(ctx) return nil }) if err != nil { @@ -151,9 +150,9 @@ func (t *ScanTask) scanZipImages(zipGallery *models.Gallery) { } } -func (t *ScanTask) regenerateZipImages(zipGallery *models.Gallery) { +func (t *ScanTask) regenerateZipImages(ctx context.Context, zipGallery *models.Gallery) { var images []*models.Image - if err := t.TxnManager.WithReadTxn(context.TODO(), func(r models.ReaderRepository) error { + if err := t.TxnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error { iqb := r.Image() var err error diff --git a/internal/manager/task_scan_image.go b/internal/manager/task_scan_image.go index 9994c81c2..87aae87eb 100644 --- a/internal/manager/task_scan_image.go +++ b/internal/manager/task_scan_image.go @@ -18,11 +18,11 @@ import ( "github.com/stashapp/stash/pkg/plugin" ) -func (t *ScanTask) scanImage() { +func (t *ScanTask) scanImage(ctx context.Context) { var i *models.Image path := t.file.Path() - if err := t.TxnManager.WithReadTxn(context.TODO(), func(r models.ReaderRepository) error { + if err := t.TxnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error { var err error i, err = r.Image().FindByPath(path) return err @@ -34,7 +34,6 @@ func (t *ScanTask) scanImage() { scanner := image.Scanner{ Scanner: image.FileScanner(&file.FSHasher{}), StripFileExtension: t.StripFileExtension, - Ctx: t.ctx, TxnManager: t.TxnManager, Paths: GetInstance().Paths, PluginCache: instance.PluginCache, @@ -43,13 +42,13 @@ func (t *ScanTask) scanImage() { var err error if i != nil { - i, err = scanner.ScanExisting(i, t.file) + i, err = scanner.ScanExisting(ctx, i, t.file) if err != nil { logger.Error(err.Error()) return } } else { - i, err = scanner.ScanNew(t.file) + i, err = scanner.ScanNew(ctx, t.file) if err != nil { logger.Error(err.Error()) return @@ -58,7 +57,7 @@ func (t *ScanTask) scanImage() { if i != nil { if t.zipGallery != nil { // associate with gallery - if err := t.TxnManager.WithTxn(context.TODO(), func(r models.Repository) error { + if err := t.TxnManager.WithTxn(ctx, func(r models.Repository) error { return gallery.AddImage(r.Gallery(), t.zipGallery.ID, i.ID) }); err != nil { logger.Error(err.Error()) @@ -69,7 +68,7 @@ func (t *ScanTask) scanImage() { logger.Infof("Associating image %s with folder gallery", i.Path) var galleryID int var isNewGallery bool - if err := t.TxnManager.WithTxn(context.TODO(), func(r models.Repository) error { + if err := t.TxnManager.WithTxn(ctx, func(r models.Repository) error { var err error galleryID, isNewGallery, err = t.associateImageWithFolderGallery(i.ID, r.Gallery()) return err @@ -79,7 +78,7 @@ func (t *ScanTask) scanImage() { } if isNewGallery { - GetInstance().PluginCache.ExecutePostHooks(t.ctx, galleryID, plugin.GalleryCreatePost, nil, nil) + GetInstance().PluginCache.ExecutePostHooks(ctx, galleryID, plugin.GalleryCreatePost, nil, nil) } } } diff --git a/internal/manager/task_scan_scene.go b/internal/manager/task_scan_scene.go index f0d97ca20..75db244da 100644 --- a/internal/manager/task_scan_scene.go +++ b/internal/manager/task_scan_scene.go @@ -9,7 +9,7 @@ import ( "github.com/stashapp/stash/pkg/scene" ) -func (t *ScanTask) scanScene() *models.Scene { +func (t *ScanTask) scanScene(ctx context.Context) *models.Scene { logError := func(err error) *models.Scene { logger.Error(err.Error()) return nil @@ -18,7 +18,7 @@ func (t *ScanTask) scanScene() *models.Scene { var retScene *models.Scene var s *models.Scene - if err := t.TxnManager.WithReadTxn(context.TODO(), func(r models.ReaderRepository) error { + if err := t.TxnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error { var err error s, err = r.Scene().FindByPath(t.file.Path()) return err @@ -31,7 +31,6 @@ func (t *ScanTask) scanScene() *models.Scene { Scanner: scene.FileScanner(&file.FSHasher{}, t.fileNamingAlgorithm, t.calculateMD5), StripFileExtension: t.StripFileExtension, FileNamingAlgorithm: t.fileNamingAlgorithm, - Ctx: t.ctx, TxnManager: t.TxnManager, Paths: GetInstance().Paths, Screenshotter: &instance.FFMPEG, @@ -42,7 +41,7 @@ func (t *ScanTask) scanScene() *models.Scene { } if s != nil { - if err := scanner.ScanExisting(s, t.file); err != nil { + if err := scanner.ScanExisting(ctx, s, t.file); err != nil { return logError(err) } @@ -50,7 +49,7 @@ func (t *ScanTask) scanScene() *models.Scene { } var err error - retScene, err = scanner.ScanNew(t.file) + retScene, err = scanner.ScanNew(ctx, t.file) if err != nil { return logError(err) } diff --git a/internal/manager/task_stash_box_tag.go b/internal/manager/task_stash_box_tag.go index f13b28119..2932a3167 100644 --- a/internal/manager/task_stash_box_tag.go +++ b/internal/manager/task_stash_box_tag.go @@ -22,8 +22,8 @@ type StashBoxPerformerTagTask struct { excluded_fields []string } -func (t *StashBoxPerformerTagTask) Start() { - t.stashBoxPerformerTag(context.TODO()) +func (t *StashBoxPerformerTagTask) Start(ctx context.Context) { + t.stashBoxPerformerTag(ctx) } func (t *StashBoxPerformerTagTask) Description() string { @@ -156,7 +156,7 @@ func (t *StashBoxPerformerTagTask) stashBoxPerformerTag(ctx context.Context) { partial.URL = &value } - txnErr := t.txnManager.WithTxn(context.TODO(), func(r models.Repository) error { + txnErr := t.txnManager.WithTxn(ctx, func(r models.Repository) error { _, err := r.Performer().Update(partial) if !t.refresh { @@ -218,7 +218,7 @@ func (t *StashBoxPerformerTagTask) stashBoxPerformerTag(ctx context.Context) { URL: getNullString(performer.URL), UpdatedAt: models.SQLiteTimestamp{Timestamp: currentTime}, } - err := t.txnManager.WithTxn(context.TODO(), func(r models.Repository) error { + err := t.txnManager.WithTxn(ctx, func(r models.Repository) error { createdPerformer, err := r.Performer().Create(newPerformer) if err != nil { return err diff --git a/pkg/gallery/scan.go b/pkg/gallery/scan.go index 2c65cd302..3528c8b93 100644 --- a/pkg/gallery/scan.go +++ b/pkg/gallery/scan.go @@ -24,7 +24,6 @@ type Scanner struct { ImageExtensions []string StripFileExtension bool - Ctx context.Context CaseSensitiveFs bool TxnManager models.TransactionManager Paths *paths.Paths @@ -39,7 +38,7 @@ func FileScanner(hasher file.Hasher) file.Scanner { } } -func (scanner *Scanner) ScanExisting(existing file.FileBased, file file.SourceFile) (retGallery *models.Gallery, scanImages bool, err error) { +func (scanner *Scanner) ScanExisting(ctx context.Context, existing file.FileBased, file file.SourceFile) (retGallery *models.Gallery, scanImages bool, err error) { scanned, err := scanner.Scanner.ScanExisting(existing, file) if err != nil { return nil, false, err @@ -76,7 +75,7 @@ func (scanner *Scanner) ScanExisting(existing file.FileBased, file file.SourceFi done := make(chan struct{}) scanner.MutexManager.Claim(mutexType, scanned.New.Checksum, done) - if err := scanner.TxnManager.WithTxn(context.TODO(), func(r models.Repository) error { + if err := scanner.TxnManager.WithTxn(ctx, func(r models.Repository) error { // free the mutex once transaction is complete defer close(done) @@ -94,13 +93,13 @@ func (scanner *Scanner) ScanExisting(existing file.FileBased, file file.SourceFi return nil, false, err } - scanner.PluginCache.ExecutePostHooks(scanner.Ctx, retGallery.ID, plugin.GalleryUpdatePost, nil, nil) + scanner.PluginCache.ExecutePostHooks(ctx, retGallery.ID, plugin.GalleryUpdatePost, nil, nil) } return } -func (scanner *Scanner) ScanNew(file file.SourceFile) (retGallery *models.Gallery, scanImages bool, err error) { +func (scanner *Scanner) ScanNew(ctx context.Context, file file.SourceFile) (retGallery *models.Gallery, scanImages bool, err error) { scanned, err := scanner.Scanner.ScanNew(file) if err != nil { return nil, false, err @@ -117,7 +116,7 @@ func (scanner *Scanner) ScanNew(file file.SourceFile) (retGallery *models.Galler scanner.MutexManager.Claim(mutexType, checksum, done) defer close(done) - if err := scanner.TxnManager.WithTxn(context.TODO(), func(r models.Repository) error { + if err := scanner.TxnManager.WithTxn(ctx, func(r models.Repository) error { qb := r.Gallery() g, _ = qb.FindByChecksum(checksum) @@ -183,9 +182,9 @@ func (scanner *Scanner) ScanNew(file file.SourceFile) (retGallery *models.Galler } if isNewGallery { - scanner.PluginCache.ExecutePostHooks(scanner.Ctx, g.ID, plugin.GalleryCreatePost, nil, nil) + scanner.PluginCache.ExecutePostHooks(ctx, g.ID, plugin.GalleryCreatePost, nil, nil) } else if isUpdatedGallery { - scanner.PluginCache.ExecutePostHooks(scanner.Ctx, g.ID, plugin.GalleryUpdatePost, nil, nil) + scanner.PluginCache.ExecutePostHooks(ctx, g.ID, plugin.GalleryUpdatePost, nil, nil) } scanImages = isNewGallery diff --git a/pkg/image/scan.go b/pkg/image/scan.go index c356e4697..8fa2f24a6 100644 --- a/pkg/image/scan.go +++ b/pkg/image/scan.go @@ -22,7 +22,6 @@ type Scanner struct { StripFileExtension bool - Ctx context.Context CaseSensitiveFs bool TxnManager models.TransactionManager Paths *paths.Paths @@ -37,7 +36,7 @@ func FileScanner(hasher file.Hasher) file.Scanner { } } -func (scanner *Scanner) ScanExisting(existing file.FileBased, file file.SourceFile) (retImage *models.Image, err error) { +func (scanner *Scanner) ScanExisting(ctx context.Context, existing file.FileBased, file file.SourceFile) (retImage *models.Image, err error) { scanned, err := scanner.Scanner.ScanExisting(existing, file) if err != nil { return nil, err @@ -72,7 +71,7 @@ func (scanner *Scanner) ScanExisting(existing file.FileBased, file file.SourceFi done := make(chan struct{}) scanner.MutexManager.Claim(mutexType, scanned.New.Checksum, done) - if err := scanner.TxnManager.WithTxn(context.TODO(), func(r models.Repository) error { + if err := scanner.TxnManager.WithTxn(ctx, func(r models.Repository) error { // free the mutex once transaction is complete defer close(done) var err error @@ -100,13 +99,13 @@ func (scanner *Scanner) ScanExisting(existing file.FileBased, file file.SourceFi } } - scanner.PluginCache.ExecutePostHooks(scanner.Ctx, retImage.ID, plugin.ImageUpdatePost, nil, nil) + scanner.PluginCache.ExecutePostHooks(ctx, retImage.ID, plugin.ImageUpdatePost, nil, nil) } return } -func (scanner *Scanner) ScanNew(f file.SourceFile) (retImage *models.Image, err error) { +func (scanner *Scanner) ScanNew(ctx context.Context, f file.SourceFile) (retImage *models.Image, err error) { scanned, err := scanner.Scanner.ScanNew(f) if err != nil { return nil, err @@ -122,7 +121,7 @@ func (scanner *Scanner) ScanNew(f file.SourceFile) (retImage *models.Image, err // check for image by checksum var existingImage *models.Image - if err := scanner.TxnManager.WithReadTxn(context.TODO(), func(r models.ReaderRepository) error { + if err := scanner.TxnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error { var err error existingImage, err = r.Image().FindByChecksum(checksum) return err @@ -152,14 +151,14 @@ func (scanner *Scanner) ScanNew(f file.SourceFile) (retImage *models.Image, err Path: &path, } - if err := scanner.TxnManager.WithTxn(context.TODO(), func(r models.Repository) error { + if err := scanner.TxnManager.WithTxn(ctx, func(r models.Repository) error { retImage, err = r.Image().Update(imagePartial) return err }); err != nil { return nil, err } - scanner.PluginCache.ExecutePostHooks(scanner.Ctx, existingImage.ID, plugin.ImageUpdatePost, nil, nil) + scanner.PluginCache.ExecutePostHooks(ctx, existingImage.ID, plugin.ImageUpdatePost, nil, nil) } } else { logger.Infof("%s doesn't exist. Creating new item...", pathDisplayName) @@ -177,7 +176,7 @@ func (scanner *Scanner) ScanNew(f file.SourceFile) (retImage *models.Image, err return nil, err } - if err := scanner.TxnManager.WithTxn(context.TODO(), func(r models.Repository) error { + if err := scanner.TxnManager.WithTxn(ctx, func(r models.Repository) error { var err error retImage, err = r.Image().Create(newImage) return err @@ -185,7 +184,7 @@ func (scanner *Scanner) ScanNew(f file.SourceFile) (retImage *models.Image, err return nil, err } - scanner.PluginCache.ExecutePostHooks(scanner.Ctx, retImage.ID, plugin.ImageCreatePost, nil, nil) + scanner.PluginCache.ExecutePostHooks(ctx, retImage.ID, plugin.ImageCreatePost, nil, nil) } return diff --git a/pkg/job/manager.go b/pkg/job/manager.go index e5d3d239a..1af604f7d 100644 --- a/pkg/job/manager.go +++ b/pkg/job/manager.go @@ -92,7 +92,7 @@ func (m *Manager) Start(ctx context.Context, description string, e JobExec) int m.queue = append(m.queue, &j) - m.dispatch(&j) + m.dispatch(ctx, &j) return j.ID } @@ -145,7 +145,7 @@ func (m *Manager) dispatcher() { } } - done := m.dispatch(j) + done := m.dispatch(j.outerCtx, j) // unlock the mutex and wait for the job to finish m.mutex.Unlock() @@ -169,15 +169,13 @@ func (m *Manager) newProgress(j *Job) *Progress { } } -func (m *Manager) dispatch(j *Job) (done chan struct{}) { +func (m *Manager) dispatch(ctx context.Context, j *Job) (done chan struct{}) { // assumes lock held t := time.Now() j.StartTime = &t j.Status = StatusRunning - ctx, cancelFunc := context.WithCancel(valueOnlyContext{ - j.outerCtx, - }) + ctx, cancelFunc := context.WithCancel(valueOnlyContext{ctx}) j.cancelFunc = cancelFunc done = make(chan struct{}) diff --git a/pkg/plugin/js/log.go b/pkg/plugin/js/log.go index 9f5acde89..5156d6599 100644 --- a/pkg/plugin/js/log.go +++ b/pkg/plugin/js/log.go @@ -15,7 +15,10 @@ func argToString(call otto.FunctionCall) string { arg := call.Argument(0) if arg.IsObject() { o, _ := arg.Export() - data, _ := json.Marshal(o) + data, err := json.Marshal(o) + if err != nil { + logger.Warnf("Couldn't json encode object") + } return string(data) } diff --git a/pkg/plugin/raw.go b/pkg/plugin/raw.go index 95ffa46f3..55516072c 100644 --- a/pkg/plugin/raw.go +++ b/pkg/plugin/raw.go @@ -71,7 +71,10 @@ func (t *rawPluginTask) Start() error { go func() { defer stdin.Close() - inBytes, _ := json.Marshal(t.input) + inBytes, err := json.Marshal(t.input) + if err != nil { + logger.Warnf("error marshalling raw command input") + } if k, err := io.WriteString(stdin, string(inBytes)); err != nil { logger.Warnf("error writing input to plugins stdin (wrote %v bytes out of %v): %v", k, len(string(inBytes)), err) } diff --git a/pkg/scene/scan.go b/pkg/scene/scan.go index 04c7d67a7..96de4d6ff 100644 --- a/pkg/scene/scan.go +++ b/pkg/scene/scan.go @@ -32,7 +32,6 @@ type Scanner struct { UseFileMetadata bool FileNamingAlgorithm models.HashAlgorithm - Ctx context.Context CaseSensitiveFs bool TxnManager models.TransactionManager Paths *paths.Paths @@ -50,7 +49,7 @@ func FileScanner(hasher file.Hasher, fileNamingAlgorithm models.HashAlgorithm, c } } -func (scanner *Scanner) ScanExisting(existing file.FileBased, file file.SourceFile) (err error) { +func (scanner *Scanner) ScanExisting(ctx context.Context, existing file.FileBased, file file.SourceFile) (err error) { scanned, err := scanner.Scanner.ScanExisting(existing, file) if err != nil { return err @@ -110,7 +109,7 @@ func (scanner *Scanner) ScanExisting(existing file.FileBased, file file.SourceFi scanner.MutexManager.Claim(mutexType, scanned.New.Checksum, done) } - if err := scanner.TxnManager.WithTxn(context.TODO(), func(r models.Repository) error { + if err := scanner.TxnManager.WithTxn(ctx, func(r models.Repository) error { defer close(done) qb := r.Scene() @@ -144,7 +143,7 @@ func (scanner *Scanner) ScanExisting(existing file.FileBased, file file.SourceFi MigrateHash(scanner.Paths, oldHash, newHash) } - scanner.PluginCache.ExecutePostHooks(scanner.Ctx, s.ID, plugin.SceneUpdatePost, nil, nil) + scanner.PluginCache.ExecutePostHooks(ctx, s.ID, plugin.SceneUpdatePost, nil, nil) } // We already have this item in the database @@ -154,7 +153,7 @@ func (scanner *Scanner) ScanExisting(existing file.FileBased, file file.SourceFi return nil } -func (scanner *Scanner) ScanNew(file file.SourceFile) (retScene *models.Scene, err error) { +func (scanner *Scanner) ScanNew(ctx context.Context, file file.SourceFile) (retScene *models.Scene, err error) { scanned, err := scanner.Scanner.ScanNew(file) if err != nil { return nil, err @@ -178,7 +177,7 @@ func (scanner *Scanner) ScanNew(file file.SourceFile) (retScene *models.Scene, e // check for scene by checksum and oshash - MD5 should be // redundant, but check both var s *models.Scene - if err := scanner.TxnManager.WithReadTxn(context.TODO(), func(r models.ReaderRepository) error { + if err := scanner.TxnManager.WithReadTxn(ctx, func(r models.ReaderRepository) error { qb := r.Scene() if checksum != "" { s, _ = qb.FindByChecksum(checksum) @@ -220,7 +219,7 @@ func (scanner *Scanner) ScanNew(file file.SourceFile) (retScene *models.Scene, e Path: &path, Interactive: &interactive, } - if err := scanner.TxnManager.WithTxn(context.TODO(), func(r models.Repository) error { + if err := scanner.TxnManager.WithTxn(ctx, func(r models.Repository) error { _, err := r.Scene().Update(scenePartial) return err }); err != nil { @@ -228,7 +227,7 @@ func (scanner *Scanner) ScanNew(file file.SourceFile) (retScene *models.Scene, e } scanner.makeScreenshots(path, nil, sceneHash) - scanner.PluginCache.ExecutePostHooks(scanner.Ctx, s.ID, plugin.SceneUpdatePost, nil, nil) + scanner.PluginCache.ExecutePostHooks(ctx, s.ID, plugin.SceneUpdatePost, nil, nil) } } else { logger.Infof("%s doesn't exist. Creating new item...", path) @@ -265,7 +264,7 @@ func (scanner *Scanner) ScanNew(file file.SourceFile) (retScene *models.Scene, e _ = newScene.Date.Scan(videoFile.CreationTime) } - if err := scanner.TxnManager.WithTxn(context.TODO(), func(r models.Repository) error { + if err := scanner.TxnManager.WithTxn(ctx, func(r models.Repository) error { var err error retScene, err = r.Scene().Create(newScene) return err @@ -274,7 +273,7 @@ func (scanner *Scanner) ScanNew(file file.SourceFile) (retScene *models.Scene, e } scanner.makeScreenshots(path, videoFile, sceneHash) - scanner.PluginCache.ExecutePostHooks(scanner.Ctx, retScene.ID, plugin.SceneCreatePost, nil, nil) + scanner.PluginCache.ExecutePostHooks(ctx, retScene.ID, plugin.SceneCreatePost, nil, nil) } return retScene, nil diff --git a/pkg/scraper/script.go b/pkg/scraper/script.go index e2847b9cd..4a9074fc2 100644 --- a/pkg/scraper/script.go +++ b/pkg/scraper/script.go @@ -32,7 +32,7 @@ func newScriptScraper(scraper scraperTypeConfig, config config, globalConfig Glo } } -func (s *scriptScraper) runScraperScript(inString string, out interface{}) error { +func (s *scriptScraper) runScraperScript(ctx context.Context, inString string, out interface{}) error { command := s.scraper.Script var cmd *exec.Cmd @@ -46,7 +46,7 @@ func (s *scriptScraper) runScraperScript(inString string, out interface{}) error } if p != nil { - cmd = p.Command(context.TODO(), command[1:]) + cmd = p.Command(ctx, command[1:]) } // if could not find python, just use the command args as-is @@ -133,7 +133,7 @@ func (s *scriptScraper) scrapeByName(ctx context.Context, name string, ty models switch ty { case models.ScrapeContentTypePerformer: var performers []models.ScrapedPerformer - err = s.runScraperScript(input, &performers) + err = s.runScraperScript(ctx, input, &performers) if err == nil { for _, p := range performers { v := p @@ -142,7 +142,7 @@ func (s *scriptScraper) scrapeByName(ctx context.Context, name string, ty models } case models.ScrapeContentTypeScene: var scenes []models.ScrapedScene - err = s.runScraperScript(input, &scenes) + err = s.runScraperScript(ctx, input, &scenes) if err == nil { for _, s := range scenes { v := s @@ -187,19 +187,19 @@ func (s *scriptScraper) scrape(ctx context.Context, input string, ty models.Scra switch ty { case models.ScrapeContentTypePerformer: var performer *models.ScrapedPerformer - err := s.runScraperScript(input, &performer) + err := s.runScraperScript(ctx, input, &performer) return performer, err case models.ScrapeContentTypeGallery: var gallery *models.ScrapedGallery - err := s.runScraperScript(input, &gallery) + err := s.runScraperScript(ctx, input, &gallery) return gallery, err case models.ScrapeContentTypeScene: var scene *models.ScrapedScene - err := s.runScraperScript(input, &scene) + err := s.runScraperScript(ctx, input, &scene) return scene, err case models.ScrapeContentTypeMovie: var movie *models.ScrapedMovie - err := s.runScraperScript(input, &movie) + err := s.runScraperScript(ctx, input, &movie) return movie, err } @@ -215,7 +215,7 @@ func (s *scriptScraper) scrapeSceneByScene(ctx context.Context, scene *models.Sc var ret *models.ScrapedScene - err = s.runScraperScript(string(inString), &ret) + err = s.runScraperScript(ctx, string(inString), &ret) return ret, err } @@ -229,7 +229,7 @@ func (s *scriptScraper) scrapeGalleryByGallery(ctx context.Context, gallery *mod var ret *models.ScrapedGallery - err = s.runScraperScript(string(inString), &ret) + err = s.runScraperScript(ctx, string(inString), &ret) return ret, err }