118 lines
2.5 KiB
Go
118 lines
2.5 KiB
Go
// backend\nsfw_assets.go
|
|
|
|
package main
|
|
|
|
import (
|
|
"embed"
|
|
"fmt"
|
|
"io"
|
|
"io/fs"
|
|
"os"
|
|
"path/filepath"
|
|
"runtime"
|
|
"strings"
|
|
)
|
|
|
|
//go:embed all:assets/nsfw
|
|
var embeddedNSFWAssets embed.FS
|
|
|
|
const nsfwRuntimeVersion = "nsfw-onnx-v1"
|
|
|
|
func nsfwRuntimeBaseDir() (string, error) {
|
|
appName := "nsfwapp"
|
|
|
|
if runtime.GOOS == "windows" {
|
|
base := strings.TrimSpace(os.Getenv("LOCALAPPDATA"))
|
|
if base == "" {
|
|
base = strings.TrimSpace(os.Getenv("TEMP"))
|
|
}
|
|
if base == "" {
|
|
return "", fmt.Errorf("LOCALAPPDATA/TEMP nicht gefunden")
|
|
}
|
|
return filepath.Join(base, appName, nsfwRuntimeVersion), nil
|
|
}
|
|
|
|
base, err := os.UserCacheDir()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return filepath.Join(base, appName, nsfwRuntimeVersion), nil
|
|
}
|
|
|
|
func ensureNSFWAssetsExtracted() (string, error) {
|
|
root, err := nsfwRuntimeBaseDir()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
marker := filepath.Join(root, ".extract-ok")
|
|
if fi, err := os.Stat(marker); err == nil && !fi.IsDir() {
|
|
return root, nil
|
|
}
|
|
|
|
if _, err := fs.Stat(embeddedNSFWAssets, "assets/nsfw"); err != nil {
|
|
return "", fmt.Errorf("embedded assets/nsfw nicht gefunden: %w", err)
|
|
}
|
|
|
|
if err := os.RemoveAll(root); err != nil {
|
|
return "", fmt.Errorf("runtime-ordner konnte nicht bereinigt werden: %w", err)
|
|
}
|
|
if err := os.MkdirAll(root, 0o755); err != nil {
|
|
return "", fmt.Errorf("runtime-ordner konnte nicht erstellt werden: %w", err)
|
|
}
|
|
|
|
if err := extractEmbeddedDir("assets/nsfw", root); err != nil {
|
|
return "", fmt.Errorf("nsfw-assets extrahieren fehlgeschlagen: %w", err)
|
|
}
|
|
|
|
if err := os.WriteFile(marker, []byte("ok"), 0o644); err != nil {
|
|
return "", fmt.Errorf("markerdatei konnte nicht geschrieben werden: %w", err)
|
|
}
|
|
|
|
return root, nil
|
|
}
|
|
|
|
func extractEmbeddedDir(srcRoot, dstRoot string) error {
|
|
return fs.WalkDir(embeddedNSFWAssets, srcRoot, func(p string, d fs.DirEntry, err error) error {
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
rel, err := filepath.Rel(srcRoot, p)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if rel == "." {
|
|
return os.MkdirAll(dstRoot, 0o755)
|
|
}
|
|
|
|
dstPath := filepath.Join(dstRoot, rel)
|
|
|
|
if d.IsDir() {
|
|
return os.MkdirAll(dstPath, 0o755)
|
|
}
|
|
|
|
if err := os.MkdirAll(filepath.Dir(dstPath), 0o755); err != nil {
|
|
return err
|
|
}
|
|
|
|
in, err := embeddedNSFWAssets.Open(p)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer in.Close()
|
|
|
|
out, err := os.OpenFile(dstPath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0o755)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
_, copyErr := io.Copy(out, in)
|
|
closeErr := out.Close()
|
|
if copyErr != nil {
|
|
return copyErr
|
|
}
|
|
return closeErr
|
|
})
|
|
}
|