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