nsfwapp/backend/embed.go
2026-06-26 16:31:08 +02:00

129 lines
2.8 KiB
Go

// backend\embed.go
package main
import (
"embed"
"os"
"path/filepath"
)
//go:embed ml/*.py ml/detection_labels.json ai_server.py 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 trainingMLCacheFilePath(name string) (string, error) {
dir := filepath.Join(os.TempDir(), "nsfwapp-ml")
if err := os.MkdirAll(dir, 0755); err != nil {
return "", err
}
return filepath.Join(dir, name), 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
}