From 6aa54c2775ad86528e3f7a1314b9d4aa180a920c Mon Sep 17 00:00:00 2001 From: daposy Date: Wed, 16 Oct 2019 16:45:17 -0700 Subject: [PATCH 1/7] add functionality to clean button --- pkg/api/resolver_query_metadata.go | 3 +- pkg/manager/manager_tasks.go | 35 ++++++++++++++++ pkg/manager/task_clean.go | 42 +++++++++++++++++++ pkg/models/querybuilder_scene.go | 17 ++++++++ .../SettingsTasksPanel/SettingsTasksPanel.tsx | 8 +++- 5 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 pkg/manager/task_clean.go diff --git a/pkg/api/resolver_query_metadata.go b/pkg/api/resolver_query_metadata.go index 925d86d8e..3dfea9698 100644 --- a/pkg/api/resolver_query_metadata.go +++ b/pkg/api/resolver_query_metadata.go @@ -28,5 +28,6 @@ func (r *queryResolver) MetadataGenerate(ctx context.Context, input models.Gener } func (r *queryResolver) MetadataClean(ctx context.Context) (string, error) { - panic("not implemented") + manager.GetInstance().Clean() + return "todo", nil } diff --git a/pkg/manager/manager_tasks.go b/pkg/manager/manager_tasks.go index 0d8580fa0..877b54c1b 100644 --- a/pkg/manager/manager_tasks.go +++ b/pkg/manager/manager_tasks.go @@ -133,6 +133,41 @@ func (s *singleton) Generate(sprites bool, previews bool, markers bool, transcod }() } +func (s *singleton) Clean() { + if s.Status != Idle { + return + } + s.Status = Clean + + qb := models.NewSceneQueryBuilder() + go func() { + defer s.returnToIdleState() + + logger.Infof("Starting cleaning of tracked files") + scenes, err := qb.All() + if err != nil { + logger.Errorf("failed to fetch list of scenes for cleaning") + return + } + + var wg sync.WaitGroup + for _, scene := range scenes { + if scene == nil { + logger.Errorf("nil scene, skipping generate") + continue + } + + wg.Add(1) + + task := CleanTask{Scene: *scene} + go task.Start(&wg) + wg.Wait() + } + + logger.Info("Finished Cleaning") + }() +} + func (s *singleton) returnToIdleState() { if r := recover(); r != nil { logger.Info("recovered from ", r) diff --git a/pkg/manager/task_clean.go b/pkg/manager/task_clean.go new file mode 100644 index 000000000..198ba1260 --- /dev/null +++ b/pkg/manager/task_clean.go @@ -0,0 +1,42 @@ +package manager + +import ( + "context" + "github.com/stashapp/stash/pkg/database" + "github.com/stashapp/stash/pkg/logger" + "github.com/stashapp/stash/pkg/models" + "os" + "strconv" + "sync" +) + +type CleanTask struct { + Scene models.Scene +} + +func (t *CleanTask) Start(wg *sync.WaitGroup) { + defer wg.Done() + + if t.fileExists(t.Scene.Path) { + logger.Debugf("Found: %s", t.Scene.Path) + } else { + logger.Debugf("Deleting missing file: %s", t.Scene.Path) + t.deleteScene(strconv.Itoa(t.Scene.ID)) + } +} + +func (t *CleanTask) deleteScene(id string) { + ctx := context.TODO() + qb := models.NewSceneQueryBuilder() + tx := database.DB.MustBeginTx(ctx, nil) + defer tx.Commit() + qb.Destroy(strconv.Itoa(t.Scene.ID), tx) +} + +func (t *CleanTask) fileExists(filename string) bool { + info, err := os.Stat(filename) + if os.IsNotExist(err) { + return false + } + return !info.IsDir() +} diff --git a/pkg/models/querybuilder_scene.go b/pkg/models/querybuilder_scene.go index a6d3fc6f9..544546e72 100644 --- a/pkg/models/querybuilder_scene.go +++ b/pkg/models/querybuilder_scene.go @@ -7,6 +7,7 @@ import ( "github.com/jmoiron/sqlx" "github.com/stashapp/stash/pkg/database" + "github.com/stashapp/stash/pkg/logger" ) const scenesForPerformerQuery = ` @@ -292,3 +293,19 @@ func (qb *SceneQueryBuilder) queryScenes(query string, args []interface{}, tx *s return scenes, nil } + +func (qb *SceneQueryBuilder) Destroy(id string, tx *sqlx.Tx) error { + + _, err := tx.Exec("DELETE FROM performers_scenes WHERE scene_id = ?", id) + if err != nil { + logger.Debugf("error deleting performers_scenes for scene_id: %s", err) + return err + } + _, err = tx.Exec("DELETE FROM scenes_tags WHERE scene_id = ?", id) + if err != nil { + logger.Debugf("error deleting scenes_tags for scene_id: %s", err) + return err + } + + return executeDeleteQuery("scenes", id, tx) +} diff --git a/ui/v2/src/components/Settings/SettingsTasksPanel/SettingsTasksPanel.tsx b/ui/v2/src/components/Settings/SettingsTasksPanel/SettingsTasksPanel.tsx index d1c5e5ab4..449fd42ad 100644 --- a/ui/v2/src/components/Settings/SettingsTasksPanel/SettingsTasksPanel.tsx +++ b/ui/v2/src/components/Settings/SettingsTasksPanel/SettingsTasksPanel.tsx @@ -75,11 +75,15 @@ export const SettingsTasksPanel: FunctionComponent = (props: IProps) =>

Generated Content

-