stash/pkg/manager/image.go

102 lines
2.0 KiB
Go

package manager
import (
"archive/zip"
"os"
"strings"
"github.com/jmoiron/sqlx"
"github.com/stashapp/stash/pkg/logger"
"github.com/stashapp/stash/pkg/models"
"github.com/stashapp/stash/pkg/utils"
)
// DestroyImage deletes an image and its associated relationships from the
// database.
func DestroyImage(imageID int, tx *sqlx.Tx) error {
qb := models.NewImageQueryBuilder()
jqb := models.NewJoinsQueryBuilder()
_, err := qb.Find(imageID)
if err != nil {
return err
}
if err := jqb.DestroyImagesTags(imageID, tx); err != nil {
return err
}
if err := jqb.DestroyPerformersImages(imageID, tx); err != nil {
return err
}
if err := jqb.DestroyImageGalleries(imageID, tx); err != nil {
return err
}
if err := qb.Destroy(imageID, tx); err != nil {
return err
}
return nil
}
// DeleteGeneratedImageFiles deletes generated files for the provided image.
func DeleteGeneratedImageFiles(image *models.Image) {
thumbPath := GetInstance().Paths.Generated.GetThumbnailPath(image.Checksum, models.DefaultGthumbWidth)
exists, _ := utils.FileExists(thumbPath)
if exists {
err := os.Remove(thumbPath)
if err != nil {
logger.Warnf("Could not delete file %s: %s", thumbPath, err.Error())
}
}
}
// DeleteImageFile deletes the image file from the filesystem.
func DeleteImageFile(image *models.Image) {
err := os.Remove(image.Path)
if err != nil {
logger.Warnf("Could not delete file %s: %s", image.Path, err.Error())
}
}
func walkGalleryZip(path string, walkFunc func(file *zip.File) error) error {
readCloser, err := zip.OpenReader(path)
if err != nil {
return err
}
for _, file := range readCloser.File {
if file.FileInfo().IsDir() {
continue
}
if strings.Contains(file.Name, "__MACOSX") {
continue
}
if !isImage(file.Name) {
continue
}
err := walkFunc(file)
if err != nil {
return err
}
}
return nil
}
func countImagesInZip(path string) int {
ret := 0
walkGalleryZip(path, func(file *zip.File) error {
ret++
return nil
})
return ret
}