mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 20:34:37 +03:00
Squashed commits: [e74bbf9] stuff [28476de] stuff [c7efb7b] stuff [2c78f94] stuff [f79338e] stuff [a697876] stuff [85bb60e] stuff [9f108b2] stuff [d8e00c0] stuff [7787ef9] stuff [f7f10b7] stuff [aa266f7] stuff [511ba6b] stuff [7453747] stuff [db55e2d] stuff [b362623] stuff [7288c17] stuff [86638cd] stuff [879dac4] stuff [65a4996] stuff [c6fb361] stuff [d449ce7] stuff [349dffa] stuff [84206ab] stuff [0253c65] stuff [cc0992e] stuff [3289e7d] stuff [d9ab290] stuff [dcc980d] stuff [7787da8] stuff [5bcf7cd] stuff [00e9316] stuff [54c9398] stuff [72b6ee1] stuff [4b4b26c] stuff [4cbdb06] stuff [1a240b3] stuff [650ea08] stuff [37440ef] stuff [9ee66ba] stuff [b430c86] stuff [37159c3] stuff [deba837] stuff [6ac65f6] stuff [a2ca1a1] stuff [c010229] stuff [3fd7306] stuff [cbe6efc] stuff [997a8d0] stuff [d0708a2] stuff [d316aba] stuff [4fe9900] Added initial files
117 lines
2.8 KiB
Go
117 lines
2.8 KiB
Go
package models
|
|
|
|
import (
|
|
"archive/zip"
|
|
"bytes"
|
|
"database/sql"
|
|
"github.com/disintegration/imaging"
|
|
"github.com/stashapp/stash/pkg/api/urlbuilders"
|
|
"github.com/stashapp/stash/pkg/logger"
|
|
"github.com/stashapp/stash/pkg/utils"
|
|
"image"
|
|
"image/jpeg"
|
|
"io/ioutil"
|
|
"path/filepath"
|
|
"sort"
|
|
"strings"
|
|
)
|
|
|
|
type Gallery struct {
|
|
ID int `db:"id" json:"id"`
|
|
Path string `db:"path" json:"path"`
|
|
Checksum string `db:"checksum" json:"checksum"`
|
|
SceneID sql.NullInt64 `db:"scene_id,omitempty" json:"scene_id"`
|
|
CreatedAt SQLiteTimestamp `db:"created_at" json:"created_at"`
|
|
UpdatedAt SQLiteTimestamp `db:"updated_at" json:"updated_at"`
|
|
}
|
|
|
|
func (g *Gallery) GetFiles(baseURL string) []GalleryFilesType {
|
|
var galleryFiles []GalleryFilesType
|
|
filteredFiles, readCloser, err := g.listZipContents()
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
defer readCloser.Close()
|
|
|
|
builder := urlbuilders.NewGalleryURLBuilder(baseURL, g.ID)
|
|
for i, file := range filteredFiles {
|
|
galleryURL := builder.GetGalleryImageURL(i)
|
|
galleryFile := GalleryFilesType{
|
|
Index: i,
|
|
Name: &file.Name,
|
|
Path: &galleryURL,
|
|
}
|
|
galleryFiles = append(galleryFiles, galleryFile)
|
|
}
|
|
|
|
return galleryFiles
|
|
}
|
|
|
|
func (g *Gallery) GetImage(index int) []byte {
|
|
data, _ := g.readZipFile(index)
|
|
return data
|
|
}
|
|
|
|
func (g *Gallery) GetThumbnail(index int) []byte {
|
|
data, _ := g.readZipFile(index)
|
|
srcImage, _, err := image.Decode(bytes.NewReader(data))
|
|
if err != nil {
|
|
return data
|
|
}
|
|
resizedImage := imaging.Resize(srcImage, 100, 0, imaging.NearestNeighbor)
|
|
buf := new(bytes.Buffer)
|
|
err = jpeg.Encode(buf, resizedImage, nil)
|
|
if err != nil {
|
|
return data
|
|
}
|
|
return buf.Bytes()
|
|
}
|
|
|
|
func (g *Gallery) readZipFile(index int) ([]byte, error) {
|
|
filteredFiles, readCloser, err := g.listZipContents()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer readCloser.Close()
|
|
|
|
zipFile := filteredFiles[index]
|
|
zipFileReadCloser, err := zipFile.Open()
|
|
if err != nil {
|
|
logger.Warn("failed to read file inside zip file")
|
|
return nil, err
|
|
}
|
|
defer zipFileReadCloser.Close()
|
|
|
|
return ioutil.ReadAll(zipFileReadCloser)
|
|
}
|
|
|
|
func (g *Gallery) listZipContents() ([]*zip.File, *zip.ReadCloser, error) {
|
|
readCloser, err := zip.OpenReader(g.Path)
|
|
if err != nil {
|
|
logger.Warn("failed to read zip file")
|
|
return nil, nil, err
|
|
}
|
|
|
|
filteredFiles := make([]*zip.File, 0)
|
|
for _, file := range readCloser.File {
|
|
if file.FileInfo().IsDir() {
|
|
continue
|
|
}
|
|
ext := filepath.Ext(file.Name)
|
|
if ext != ".jpg" && ext != ".png" && ext != ".gif" {
|
|
continue
|
|
}
|
|
if strings.Contains(file.Name, "__MACOSX") {
|
|
continue
|
|
}
|
|
filteredFiles = append(filteredFiles, file)
|
|
}
|
|
sort.Slice(filteredFiles, func(i, j int) bool {
|
|
a := filteredFiles[i]
|
|
b := filteredFiles[j]
|
|
return utils.NaturalCompare(a.Name, b.Name)
|
|
})
|
|
|
|
return filteredFiles, readCloser, nil
|
|
}
|