// backend\embed.go package main import ( "embed" "os" "path/filepath" ) //go:embed ml/*.py ml/detection_labels.json ai_server.py .env recorder-cert.pem recorder-key.pem yolo26n-pose.pt var embeddedMLFiles embed.FS func embeddedWriteFileIfNeeded(dstPath string, b []byte, perm os.FileMode) error { if fi, err := os.Stat(dstPath); err == nil && fi != nil && !fi.IsDir() && fi.Size() == int64(len(b)) { return nil } return os.WriteFile(dstPath, b, perm) } func trainingEmbeddedMLDir() (string, error) { dir := filepath.Join(os.TempDir(), "nsfwapp-ml") if err := os.MkdirAll(dir, 0755); err != nil { return "", err } files := []string{ "predict_detector_model.py", "train_detector_model.py", "detection_labels.json", "predict_pose_model.py", "train_pose_model.py", "predict_videomae_model.py", "train_videomae_model.py", } // Falls du die alten Scene-Skripte noch embedded hast, kannst du sie optional mitkopieren. optionalFiles := []string{ "predict_scene_model.py", "train_scene_model.py", } for _, name := range append(files, optionalFiles...) { srcPath := filepath.ToSlash(filepath.Join("ml", name)) b, err := embeddedMLFiles.ReadFile(srcPath) if err != nil { // Pflichtdateien müssen vorhanden sein. if name == "detection_labels.json" || name == "predict_detector_model.py" || name == "train_detector_model.py" { return "", err } // Optionale alte Dateien ignorieren. continue } dstPath := filepath.Join(dir, name) if err := embeddedWriteFileIfNeeded(dstPath, b, 0644); err != nil { return "", err } } if _, err := embeddedPoseModelPath(); err != nil { return "", err } return dir, nil } func embeddedMLScriptExists(name string) bool { srcPath := filepath.ToSlash(filepath.Join("ml", name)) _, err := embeddedMLFiles.ReadFile(srcPath) return err == nil } func embeddedAIServerDir() (string, error) { dir := filepath.Join(os.TempDir(), "nsfwapp-ai-server") if err := os.MkdirAll(dir, 0755); err != nil { return "", err } b, err := embeddedMLFiles.ReadFile("ai_server.py") if err != nil { return "", err } dstPath := filepath.Join(dir, "ai_server.py") if err := embeddedWriteFileIfNeeded(dstPath, b, 0644); err != nil { return "", err } return dir, nil } func embeddedPoseModelPath() (string, error) { dir := filepath.Join(os.TempDir(), "nsfwapp-ml") if err := os.MkdirAll(dir, 0755); err != nil { return "", err } b, err := embeddedMLFiles.ReadFile("yolo26n-pose.pt") if err != nil { return "", err } dstPath := filepath.Join(dir, "yolo26n-pose.pt") if err := embeddedWriteFileIfNeeded(dstPath, b, 0644); err != nil { return "", err } return dstPath, nil } func embeddedDotEnvBytes() ([]byte, error) { return embeddedMLFiles.ReadFile(".env") } func embeddedTLSCertBytes() ([]byte, error) { return embeddedMLFiles.ReadFile("recorder-cert.pem") } func embeddedTLSKeyBytes() ([]byte, error) { return embeddedMLFiles.ReadFile("recorder-key.pem") } func embeddedTLSFilesDir() (string, string, error) { dir := filepath.Join(os.TempDir(), "nsfwapp-tls") if err := os.MkdirAll(dir, 0700); err != nil { return "", "", err } certBytes, err := embeddedTLSCertBytes() if err != nil { return "", "", err } keyBytes, err := embeddedTLSKeyBytes() if err != nil { return "", "", err } certPath := filepath.Join(dir, "recorder-cert.pem") keyPath := filepath.Join(dir, "recorder-key.pem") if err := os.WriteFile(certPath, certBytes, 0600); err != nil { return "", "", err } if err := os.WriteFile(keyPath, keyBytes, 0600); err != nil { return "", "", err } return certPath, keyPath, nil }