package main import ( "io/ioutil" "log" "net/http" "os" "path/filepath" ) // Stream Unexported type Stream struct { URL string base64 string streamDirPath string } // NewStream creates a new Stream Object func NewStream(URL string) Stream { base64 := URLToBase64(URL) streamDirPath := filepath.Join(".", "streams", base64) return Stream{ URL: URL, base64: base64, streamDirPath: streamDirPath, } } // GetStreamInstant http.Get(URL) and returns the response func (s Stream) GetStreamInstant(URL string) []byte { resp, err := http.Get(URL) if err != nil { log.Fatal(err) } img, err := ioutil.ReadAll(resp.Body) defer resp.Body.Close() return img } // SaveStreamInstant writes the img to the CurrentStreamInstantPath, moves existing instant to PreviousStreamInstantPath func (s Stream) SaveStreamInstant(URL string, img []byte) { streamDir := URLToBase64(URL) streamStoreDir := filepath.Join(".", "streams", string(streamDir)) os.MkdirAll(streamStoreDir, os.ModePerm) currentStreamInstantPath := filepath.Join(streamStoreDir, "current.jpg") swap := FileExists(streamStoreDir) 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) } } // GetStreamDirPath returns filepath.Join(".", "streams") func (s Stream) GetStreamDirPath() string { return filepath.Join(".", "streams") } // GetPreviousInstantPath returns filepath.Join(GetStreamDirPath(), s.base64, "previous.jpg") func (s Stream) GetPreviousInstantPath() string { return filepath.Join(s.GetStreamDirPath(), s.base64, "previous.jpg") } // GetCurrentInstantPath returns filepath.Join(s.GetStreamDirPath(), s.base64, "current.jpg") func (s Stream) GetCurrentInstantPath() string { return filepath.Join(s.GetStreamDirPath(), s.base64, "current.jpg") } // GetLastInstantPath returns filepath.Join(s.GetStreamDirPath(), s.base64, "last.jpg") func (s Stream) GetLastInstantPath() string { return filepath.Join(s.GetStreamDirPath(), s.base64, "last.jpg") }