add functionality to clean button

This commit is contained in:
daposy 2019-10-16 16:45:17 -07:00
parent c8e0ac7d20
commit 6aa54c2775
5 changed files with 102 additions and 3 deletions

View file

@ -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
}

View file

@ -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)

42
pkg/manager/task_clean.go Normal file
View file

@ -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()
}

View file

@ -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)
}

View file

@ -75,11 +75,15 @@ export const SettingsTasksPanel: FunctionComponent<IProps> = (props: IProps) =>
<H4>Generated Content</H4>
<GenerateButton />
<FormGroup
helperText="TODO"
helperText="Check for missing files and remove them from the database. This is a destructive action"
labelFor="clean"
inline={true}
>
<Button id="clean" text="Clean" onClick={() => StashService.queryMetadataClean()} />
<Button
id="clean"
text="Clean"
onClick={() => StashService.queryMetadataClean()}
/>
</FormGroup>
<Divider />