From 777978a2a2ac2232050ba44521f107b85646081b Mon Sep 17 00:00:00 2001
From: yinbangzhong <zhongbangyin@126.com>
Date: 星期五, 14 六月 2024 15:40:45 +0800
Subject: [PATCH] watch preloads file to autoload

---
 go.sum             |    2 
 service/process.go |  115 ++++++++++++++++++++++++++++++++++++++
 conf/config.go     |    3 
 go.mod             |    3 
 main.go            |    6 ++
 conf/config.yaml   |    1 
 6 files changed, 128 insertions(+), 2 deletions(-)

diff --git a/conf/config.go b/conf/config.go
index 76a13b6..f6d5ed9 100644
--- a/conf/config.go
+++ b/conf/config.go
@@ -39,7 +39,8 @@
 	}
 
 	localConf struct {
-		StorePath string // 鏈湴鏂囦欢瀛樺偍璺緞
+		StorePath   string // 鏈湴鏂囦欢瀛樺偍璺緞
+		PreLoadPath string // 鏈湴鏂囦欢棰勫姞杞借矾寰�
 	}
 	Analysis struct {
 		Url string // 鏈湴鏂囦欢瀛樺偍璺緞
diff --git a/conf/config.yaml b/conf/config.yaml
index d2f5493..19ec80e 100644
--- a/conf/config.yaml
+++ b/conf/config.yaml
@@ -18,5 +18,6 @@
   RotateDays: 5  # 鏃ュ織鏂囦欢鐨勬渶澶т繚鐣欏ぉ鏁�
 local:
   storePath: uploads
+  preLoadPath: preloads
 analysis:
   url: http://192.168.20.116:5000/recognition
diff --git a/go.mod b/go.mod
index 24c0b5f..b2a32ee 100644
--- a/go.mod
+++ b/go.mod
@@ -5,6 +5,7 @@
 require (
 	basic.com/aps/nsqclient.git v0.0.0-20230517072415-37491f4a5d25
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible
+	github.com/fsnotify/fsnotify v1.7.0
 	github.com/gin-gonic/gin v1.10.0
 	github.com/nsqio/go-nsq v1.1.0
 	github.com/spf13/viper v1.18.2
@@ -14,6 +15,7 @@
 	go.uber.org/zap v1.27.0
 	golang.org/x/crypto v0.23.0
 	google.golang.org/grpc v1.63.2
+	gopkg.in/fsnotify.v1 v1.4.7
 	gopkg.in/natefinch/lumberjack.v2 v2.2.1
 	gorm.io/driver/mysql v1.5.6
 	gorm.io/gorm v1.25.10
@@ -28,7 +30,6 @@
 	github.com/bytedance/sonic/loader v0.1.1 // indirect
 	github.com/cloudwego/base64x v0.1.4 // indirect
 	github.com/cloudwego/iasm v0.2.0 // indirect
-	github.com/fsnotify/fsnotify v1.7.0 // indirect
 	github.com/gabriel-vasile/mimetype v1.4.3 // indirect
 	github.com/gin-contrib/sse v0.1.0 // indirect
 	github.com/go-openapi/jsonpointer v0.19.5 // indirect
diff --git a/go.sum b/go.sum
index 378b07d..f978762 100644
--- a/go.sum
+++ b/go.sum
@@ -225,6 +225,8 @@
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
 gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
diff --git a/main.go b/main.go
index a9819f7..cfe0598 100644
--- a/main.go
+++ b/main.go
@@ -10,6 +10,7 @@
 	"speechAnalysis/models"
 	"speechAnalysis/pkg/logx"
 	"speechAnalysis/router"
+	"speechAnalysis/service"
 	"syscall"
 	"time"
 )
@@ -31,6 +32,11 @@
 		return
 	}
 
+	//鐩戞帶棰勫姞杞介煶棰戞枃浠�
+	cxt, cancel := context.WithCancel(context.Background())
+	defer cancel()
+	go service.PreLoad(cxt)
+
 	logx.Infof("server start serve...")
 	server := &http.Server{
 		Addr:         ":" + conf.WebConf.Port,
diff --git a/service/process.go b/service/process.go
index 29eb5f3..1c08e55 100644
--- a/service/process.go
+++ b/service/process.go
@@ -2,18 +2,24 @@
 
 import (
 	"bytes"
+	"context"
 	"encoding/json"
 	"errors"
+	"fmt"
+	"github.com/fsnotify/fsnotify"
 	"gorm.io/gorm"
 	"io"
+	"log"
 	"mime/multipart"
 	"net/http"
 	"os"
+	"path/filepath"
 	"speechAnalysis/conf"
 	"speechAnalysis/constvar"
 	"speechAnalysis/models"
 	"speechAnalysis/pkg/logx"
 	"strings"
+	"time"
 )
 
 // Response 缁撴瀯浣撶敤浜庡瓨鍌ㄥ搷搴斾綋鐨勫唴瀹�
@@ -153,3 +159,112 @@
 	}
 	return words
 }
+
+func PreLoad(cxt context.Context) {
+	mkdirErr := os.MkdirAll(conf.LocalConf.PreLoadPath, os.ModePerm)
+	if mkdirErr != nil {
+		logx.Errorf("function os.MkdirAll() err:%v", mkdirErr)
+	}
+	//鏂囦欢澶逛笅鏂板闊抽鏂囦欢鏃惰Е鍙�
+	watcher, err := fsnotify.NewWatcher()
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer watcher.Close()
+	err = watcher.Add(conf.LocalConf.PreLoadPath)
+	if err != nil {
+		log.Fatal(err)
+	}
+	for {
+		select {
+		case <-cxt.Done():
+			fmt.Println("preload stop")
+		case event, ok := <-watcher.Events:
+			if !ok {
+				continue
+			}
+			if event.Op&fsnotify.Create == fsnotify.Create {
+				// 鍒ゆ柇鏂囦欢绫诲瀷鏄惁涓�.mp3鎴�.wav
+				if filepath.Ext(event.Name) == ".mp3" || filepath.Ext(event.Name) == ".wav" {
+					// 鏂囦欢鍚�
+					fileName := filepath.Base(event.Name)
+					// 鏂囦欢澶у皬
+					bs, _ := os.ReadFile(event.Name)
+					size := len(bs)
+					//鏍¢獙鏂囦欢鍛藉悕
+					arr := strings.Split(fileName, "_")
+					if len(arr) != 6 {
+						logx.Errorf(fmt.Sprintf("%s:%s", fileName, "鏂囦欢鍚嶇О閿欒"))
+						continue
+					}
+					timeStr := arr[4] + strings.Split(arr[5], ".")[0]
+					t, err := time.ParseInLocation("20060102150405", timeStr, time.Local)
+					if err != nil {
+						logx.Errorf(fmt.Sprintf("%s:%s", fileName, "鏃堕棿鏍煎紡涓嶅"))
+					}
+
+					//鏌ラ噸
+					_, err = models.NewAudioSearch().SetName(fileName).First()
+					if err != gorm.ErrRecordNotFound {
+						logx.Errorf(fmt.Sprintf("%s:%s", fileName, "閲嶅涓婁紶"))
+						continue
+					}
+
+					//灏嗘枃浠剁Щ鍔ㄥ埌uploads鏂囦欢澶逛笅
+					src := conf.LocalConf.StorePath + "/" + fileName
+					err = os.Rename(event.Name, src)
+					if err != nil {
+						logx.Errorf(fmt.Sprintf("%s:%s", fileName, "绉诲姩鏂囦欢澶辫触"))
+						continue
+					}
+
+					audio := &models.Audio{
+						Name:             fileName,
+						Size:             int64(size),
+						FilePath:         src,
+						AudioStatus:      constvar.AudioStatusUploadOk,
+						LocomotiveNumber: arr[0],
+						TrainNumber:      arr[1],
+						DriverNumber:     arr[2],
+						Station:          arr[3],
+						OccurrenceAt:     t,
+						IsFollowed:       0,
+					}
+
+					if err = models.NewAudioSearch().Create(audio); err != nil {
+						logx.Errorf(fmt.Sprintf("%s:%s", fileName, "鏁版嵁搴揷reate澶辫触"))
+						continue
+					}
+
+					go func() {
+						var trainInfoNames = []string{arr[0], arr[1], arr[3]} //
+						var (
+							info   *models.TrainInfo
+							err    error
+							parent models.TrainInfo
+						)
+						for i := 0; i < 3; i++ {
+							name := trainInfoNames[i]
+							class := constvar.Class(i + 1)
+							info, err = models.NewTrainInfoSearch().SetName(name).SetClass(class).First()
+							if err == gorm.ErrRecordNotFound {
+								info = &models.TrainInfo{
+									Name:     name,
+									Class:    class,
+									ParentID: parent.ID,
+								}
+								_ = models.NewTrainInfoSearch().Create(info)
+							}
+							parent = *info
+						}
+
+					}()
+				}
+			}
+		case err, ok := <-watcher.Errors:
+			if !ok {
+				logx.Errorf(err.Error())
+			}
+		}
+	}
+}

--
Gitblit v1.8.0