nsfwapp/backend/nsfw_assets.go
2026-03-14 14:28:33 +01:00

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