package main import ( "crypto/sha256" "encoding/base64" "fmt" "io/ioutil" "log" "net/http" "os" "path/filepath" "text/template" "gocv.io/x/gocv" ) // StreamURL Unexported type StreamURL struct { URL string } func 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 } streamURL := StreamURL{ URL: r.FormValue("URL"), } streamTemplate, err := template.ParseFiles(filepath.Join("templates", "stream.html")) if err != nil { log.Fatal(err) } streamTemplate.Execute(w, streamURL) } func stream(w http.ResponseWriter, r *http.Request) { if r.FormValue("URL") == "" { return } w.Header().Set("Content-Type", "image/jpeg") URL := r.FormValue("URL") resp, err := http.Get(URL) if err != nil { log.Fatal(err) } img, err := ioutil.ReadAll(resp.Body) defer resp.Body.Close() // TODO async for this? saveStreamInstant(URL, img) w.Write([]byte(img)) gocvImg := gocv.IMRead(filepath.Join(".", "streams", "vERFlpF_5Y-AgJ06PjD8-LtylFJXEjbqJp0g3he5Ngs=", "current.jpg"), gocv.IMReadColor) fmt.Println(gocvImg.Empty()) } func saveStreamInstant(URL string, img []byte) { h := sha256.New() h.Write([]byte(URL)) streamDir := base64.URLEncoding.EncodeToString(h.Sum(nil)) streamStoreDir := filepath.Join(".", "streams", string(streamDir)) os.MkdirAll(streamStoreDir, os.ModePerm) currentStreamInstantPath := filepath.Join(streamStoreDir, "current.jpg") _, err := os.Stat(currentStreamInstantPath) swap := !os.IsNotExist(err) if swap { currentStreamInstantPath = filepath.Join(streamStoreDir, "next.jpg") } err = ioutil.WriteFile(currentStreamInstantPath, img, os.ModePerm) if err != nil { log.Fatal("Can't write latest stream instant.") } if swap { previousStreamInstantPath := filepath.Join(streamStoreDir, "previous.jpg") nextStreamInstantPath := currentStreamInstantPath currentStreamInstantPath = filepath.Join(streamStoreDir, "current.jpg") err = os.Rename(currentStreamInstantPath, previousStreamInstantPath) err = os.Rename(nextStreamInstantPath, currentStreamInstantPath) } } func main() { staticFileServer := http.FileServer(http.Dir("./static")) http.Handle("/static/", http.StripPrefix("/static/", staticFileServer)) http.HandleFunc("/", index) http.HandleFunc("/stream", stream) log.Fatal(http.ListenAndServe(":8080", nil)) }