mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 12:24:38 +03:00
Fix json filename generation (#2887)
This commit is contained in:
@@ -5,6 +5,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -116,3 +117,25 @@ func Touch(path string) error {
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
replaceCharsRE = regexp.MustCompile(`[&=\\/:*"?_ ]`)
|
||||||
|
removeCharsRE = regexp.MustCompile(`[^[:alnum:]-.]`)
|
||||||
|
multiHyphenRE = regexp.MustCompile(`\-+`)
|
||||||
|
)
|
||||||
|
|
||||||
|
// SanitiseBasename returns a file basename removing any characters that are illegal or problematic to use in the filesystem.
|
||||||
|
func SanitiseBasename(v string) string {
|
||||||
|
v = strings.TrimSpace(v)
|
||||||
|
|
||||||
|
// replace illegal filename characters with -
|
||||||
|
v = replaceCharsRE.ReplaceAllString(v, "-")
|
||||||
|
|
||||||
|
// remove other characters
|
||||||
|
v = removeCharsRE.ReplaceAllString(v, "")
|
||||||
|
|
||||||
|
// remove multiple hyphens
|
||||||
|
v = multiHyphenRE.ReplaceAllString(v, "-")
|
||||||
|
|
||||||
|
return strings.TrimSpace(v)
|
||||||
|
}
|
||||||
|
|||||||
26
pkg/fsutil/file_test.go
Normal file
26
pkg/fsutil/file_test.go
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
package fsutil
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestSanitiseBasename(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
v string
|
||||||
|
want string
|
||||||
|
}{
|
||||||
|
{"basic", "basic", "basic"},
|
||||||
|
{"spaces", `spaced name`, "spaced-name"},
|
||||||
|
{"leading/trailing spaces", ` spaced name `, "spaced-name"},
|
||||||
|
{"hyphen name", `hyphened-name`, "hyphened-name"},
|
||||||
|
{"multi-hyphen", `hyphened--name`, "hyphened-name"},
|
||||||
|
{"replaced characters", `a&b=c\d/:e*"f?_ g`, "a-b-c-d-e-f-g"},
|
||||||
|
{"removed characters", `foo!!bar@@and, more`, "foobarand-more"},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if got := SanitiseBasename(tt.v); got != tt.want {
|
||||||
|
t.Errorf("SanitiseBasename() = %v, want %v", got, tt.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
jsoniter "github.com/json-iterator/go"
|
||||||
|
"github.com/stashapp/stash/pkg/fsutil"
|
||||||
"github.com/stashapp/stash/pkg/models/json"
|
"github.com/stashapp/stash/pkg/models/json"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -26,7 +27,7 @@ type Gallery struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s Gallery) Filename(basename string, hash string) string {
|
func (s Gallery) Filename(basename string, hash string) string {
|
||||||
ret := basename
|
ret := fsutil.SanitiseBasename(basename)
|
||||||
|
|
||||||
if ret != "" {
|
if ret != "" {
|
||||||
ret += "."
|
ret += "."
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
jsoniter "github.com/json-iterator/go"
|
||||||
|
"github.com/stashapp/stash/pkg/fsutil"
|
||||||
"github.com/stashapp/stash/pkg/models/json"
|
"github.com/stashapp/stash/pkg/models/json"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -23,7 +24,7 @@ type Image struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s Image) Filename(basename string, hash string) string {
|
func (s Image) Filename(basename string, hash string) string {
|
||||||
ret := s.Title
|
ret := fsutil.SanitiseBasename(s.Title)
|
||||||
if ret == "" {
|
if ret == "" {
|
||||||
ret = basename
|
ret = basename
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
jsoniter "github.com/json-iterator/go"
|
||||||
|
|
||||||
|
"github.com/stashapp/stash/pkg/fsutil"
|
||||||
"github.com/stashapp/stash/pkg/logger"
|
"github.com/stashapp/stash/pkg/logger"
|
||||||
"github.com/stashapp/stash/pkg/models/json"
|
"github.com/stashapp/stash/pkg/models/json"
|
||||||
)
|
)
|
||||||
@@ -27,7 +28,7 @@ type Movie struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s Movie) Filename() string {
|
func (s Movie) Filename() string {
|
||||||
return s.Name + ".json"
|
return fsutil.SanitiseBasename(s.Name) + ".json"
|
||||||
}
|
}
|
||||||
|
|
||||||
// Backwards Compatible synopsis for the movie
|
// Backwards Compatible synopsis for the movie
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
jsoniter "github.com/json-iterator/go"
|
||||||
|
"github.com/stashapp/stash/pkg/fsutil"
|
||||||
"github.com/stashapp/stash/pkg/models"
|
"github.com/stashapp/stash/pkg/models"
|
||||||
"github.com/stashapp/stash/pkg/models/json"
|
"github.com/stashapp/stash/pkg/models/json"
|
||||||
)
|
)
|
||||||
@@ -41,7 +42,7 @@ type Performer struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s Performer) Filename() string {
|
func (s Performer) Filename() string {
|
||||||
return s.Name + ".json"
|
return fsutil.SanitiseBasename(s.Name) + ".json"
|
||||||
}
|
}
|
||||||
|
|
||||||
func LoadPerformerFile(filePath string) (*Performer, error) {
|
func LoadPerformerFile(filePath string) (*Performer, error) {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
jsoniter "github.com/json-iterator/go"
|
||||||
|
"github.com/stashapp/stash/pkg/fsutil"
|
||||||
"github.com/stashapp/stash/pkg/models"
|
"github.com/stashapp/stash/pkg/models"
|
||||||
"github.com/stashapp/stash/pkg/models/json"
|
"github.com/stashapp/stash/pkg/models/json"
|
||||||
)
|
)
|
||||||
@@ -58,7 +59,7 @@ type Scene struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s Scene) Filename(basename string, hash string) string {
|
func (s Scene) Filename(basename string, hash string) string {
|
||||||
ret := s.Title
|
ret := fsutil.SanitiseBasename(s.Title)
|
||||||
if ret == "" {
|
if ret == "" {
|
||||||
ret = basename
|
ret = basename
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
jsoniter "github.com/json-iterator/go"
|
||||||
|
"github.com/stashapp/stash/pkg/fsutil"
|
||||||
"github.com/stashapp/stash/pkg/models"
|
"github.com/stashapp/stash/pkg/models"
|
||||||
"github.com/stashapp/stash/pkg/models/json"
|
"github.com/stashapp/stash/pkg/models/json"
|
||||||
)
|
)
|
||||||
@@ -24,7 +25,7 @@ type Studio struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s Studio) Filename() string {
|
func (s Studio) Filename() string {
|
||||||
return s.Name + ".json"
|
return fsutil.SanitiseBasename(s.Name) + ".json"
|
||||||
}
|
}
|
||||||
|
|
||||||
func LoadStudioFile(filePath string) (*Studio, error) {
|
func LoadStudioFile(filePath string) (*Studio, error) {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
jsoniter "github.com/json-iterator/go"
|
||||||
|
"github.com/stashapp/stash/pkg/fsutil"
|
||||||
"github.com/stashapp/stash/pkg/models/json"
|
"github.com/stashapp/stash/pkg/models/json"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -19,7 +20,7 @@ type Tag struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s Tag) Filename() string {
|
func (s Tag) Filename() string {
|
||||||
return s.Name + ".json"
|
return fsutil.SanitiseBasename(s.Name) + ".json"
|
||||||
}
|
}
|
||||||
|
|
||||||
func LoadTagFile(filePath string) (*Tag, error) {
|
func LoadTagFile(filePath string) (*Tag, error) {
|
||||||
|
|||||||
Reference in New Issue
Block a user