160 lines
3.5 KiB
Go
160 lines
3.5 KiB
Go
// 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",
|
|
}
|
|
|
|
// 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
|
|
}
|