package main import ( "encoding/json" "image" "io/ioutil" "log" "net/http" "path/filepath" "text/template" "gocv.io/x/gocv" ) // Server is the main application struct type Server struct { Streams map[string]Stream } func (server Server) index(w http.ResponseWriter, r *http.Request) { if r.FormValue("URL") == "" { indexTemplate, err := template.ParseFiles(filepath.Join("templates", "index.html")) if err != nil { log.Fatal(err) } indexTemplate.Execute(w, nil) return } URL := r.FormValue("URL") stream, exists := server.Streams[URL] if !exists { stream = NewStream(URL) server.Streams[URL] = stream go stream.Update() } streamTemplate, err := template.ParseFiles(filepath.Join("templates", "stream.html")) if err != nil { log.Fatal(err) } streamTemplate.Execute(w, stream) } func (server Server) stream(w http.ResponseWriter, r *http.Request) { if r.FormValue("URL") == "" { return } w.Header().Set("Content-Type", "image/jpeg") URL := r.FormValue("URL") stream, exists := server.Streams[URL] if !exists { return } mat := stream.GetStreamInstant() diff := gocv.NewMat() mat.CopyTo(&diff) gocv.CvtColor(diff, &diff, gocv.ColorBGRAToGray) gocv.GaussianBlur(diff, &diff, image.Point{X: 21, Y: 21}, 0, 0, gocv.BorderReflect) go stream.SaveStreamInstant(mat) if stream.PreviousInstantPathExists() { previous := stream.IMReadPrevious() gocv.GaussianBlur(previous, &previous, image.Point{X: 21, Y: 21}, 0, 0, gocv.BorderReflect) gocv.AbsDiff(previous, diff, &diff) gocv.Threshold(diff, &diff, 25, 255, gocv.ThresholdBinary) } jpg, err := gocv.IMEncode(".jpg", mat) if err != nil { log.Fatal("Could not encode Mat to jpg:", URL) } w.Write(jpg) } func main() { staticFileServer := http.FileServer(http.Dir("./static")) http.Handle("/static/", http.StripPrefix("/static/", staticFileServer)) server := Server{ Streams: make(map[string]Stream), } streams, err := ioutil.ReadDir(GetStreamDirPath()) if err != nil { log.Fatal("Could not read Streamdir") } for _, streamStoreDir := range streams { if !streamStoreDir.IsDir() { continue } streamJSONPath := filepath.Join(GetStreamDirPath(), streamStoreDir.Name(), "stream.json") streamJSONFile, _ := ioutil.ReadFile(streamJSONPath) stream := Stream{} json.Unmarshal([]byte(streamJSONFile), &stream) server.Streams[stream.URL] = stream go stream.UpdateInterval() } http.HandleFunc("/", server.index) http.HandleFunc("/stream", server.stream) log.Fatal(http.ListenAndServe(":8080", nil)) }