@@ -2,20 +2,62 @@ package main
22
33import (
44 "fmt"
5+ "html/template"
56 "log"
67 "net/http"
7- "strings"
8+ "strconv"
9+ "time"
810
911 "github.com/gorilla/mux"
1012)
1113
1214type ImageResultHander struct {
13- Store * TimelapseStore
14- Capturer * ImageCapturer
15+ SiteInfo * SiteInfo
16+ Store * TimelapseStore
17+ Camera * TimelapseCamera
18+ Templates * Templates
19+ }
20+
21+ type Templates struct {
22+ Index * template.Template
23+ Images * template.Template
24+ }
25+
26+ type SiteInfo struct {
27+ SiteRoot string
28+ SharedAssetsSite string
29+ }
30+
31+ type ImageResponseData struct {
32+ Timestamp string
33+ }
34+
35+ type ImagesPageResponseData struct {
36+ Images []ImageResponseData
37+ SiteInfo * SiteInfo
38+ }
39+
40+ type IndexPageResponseData struct {
41+ SiteInfo * SiteInfo
42+ }
43+
44+ var DEFAULT_CAMERA_SETTINGS CameraSettings = CameraSettings {
45+ HFlip : false ,
46+ VFlip : false ,
47+ Width : 1600 ,
48+ Height : 1080 ,
49+ Rotation : 270 ,
50+ }
51+
52+ var NOW_CAMERA_SETTINGS CameraSettings = CameraSettings {
53+ HFlip : false ,
54+ VFlip : false ,
55+ Width : 320 ,
56+ Height : 240 ,
57+ Rotation : 270 ,
1558}
1659
1760func (ih * ImageResultHander ) GetLatestImage (w http.ResponseWriter , r * http.Request ) {
18- log .Println (r .URL )
1961
2062 w .Header ().Set ("Content-Type" , "image/png" )
2163 w .WriteHeader (http .StatusOK )
@@ -24,20 +66,22 @@ func (ih *ImageResultHander) GetLatestImage(w http.ResponseWriter, r *http.Reque
2466}
2567
2668func (ih * ImageResultHander ) GetImageNamePage (w http.ResponseWriter , r * http.Request ) {
27- log .Println (r .URL )
2869 w .Header ().Set ("Content-Type" , "text/html" )
2970 w .WriteHeader (http .StatusOK )
3071 names , _ := ih .Store .ImageNames ()
31- var builder strings.Builder
3272
33- builder .WriteString ("<ul>" )
34- builder .WriteString ("<li><a href=\" latest/\" >latest</a>" )
35- for _ , n := range names {
36- fmt .Fprintf (& builder , "<li><a href=\" %v/\" >%v</a>" , n , n )
73+ var images []ImageResponseData
74+
75+ for _ , name := range names {
76+ images = append (images , ImageResponseData {
77+ Timestamp : name ,
78+ })
3779 }
38- builder .WriteString ("</ul>" )
3980
40- w .Write ([]byte (builder .String ()))
81+ ih .Templates .Images .Execute (w , ImagesPageResponseData {
82+ Images : images ,
83+ SiteInfo : ih .SiteInfo ,
84+ })
4185
4286}
4387
@@ -46,25 +90,72 @@ func (ih *ImageResultHander) GetImageByName(w http.ResponseWriter, r *http.Reque
4690
4791 name := v ["imageName" ]
4892
49- log .Println (r .URL )
5093 w .Header ().Set ("Content-Type" , "image/png" )
5194
5295 w .WriteHeader (http .StatusOK )
5396
5497 ih .Store .ImageByName (name , w )
5598}
5699
57- func handleRequests (siteRoot string , store * TimelapseStore , capturer * ImageCapturer ) {
100+ func (ih * ImageResultHander ) GetCurrentImage (w http.ResponseWriter , r * http.Request ) {
101+
102+ w .Header ().Set ("Content-Type" , "image/png" )
103+
104+ w .WriteHeader (http .StatusOK )
105+
106+ ih .Camera .CaptureImage (& NOW_CAMERA_SETTINGS , w )
107+ }
108+
109+ func handleRequests (siteInfo * SiteInfo , store * TimelapseStore , capturer * TimelapseCamera ) {
110+
111+ templates := & Templates {
112+ Index : template .Must (template .ParseFiles ("./src/templates/index.html" )),
113+ Images : template .Must (template .ParseFiles ("./src/templates/images.html" )),
114+ }
58115
59116 handler := & ImageResultHander {
60- Store : store ,
61- Capturer : capturer ,
117+ SiteInfo : siteInfo ,
118+ Store : store ,
119+ Camera : capturer ,
120+ Templates : templates ,
62121 }
63122
64123 rootRoute := mux .NewRouter ()
65- rootRoute .HandleFunc (siteRoot + "/images/" , handler .GetImageNamePage )
66- rootRoute .HandleFunc (siteRoot + "/images/latest/" , handler .GetLatestImage )
67- rootRoute .HandleFunc (siteRoot + "/images/{imageName}/" , handler .GetImageByName )
124+ rootRoute .HandleFunc (siteInfo .SiteRoot + "/images/" , handler .GetImageNamePage )
125+ rootRoute .HandleFunc (siteInfo .SiteRoot + "/images/latest/" , handler .GetLatestImage )
126+ rootRoute .HandleFunc (siteInfo .SiteRoot + "/images/now/" , handler .GetCurrentImage )
127+ rootRoute .HandleFunc (siteInfo .SiteRoot + "/images/{imageName}/" , handler .GetImageByName )
128+ rootRoute .
129+ Path (siteInfo .SiteRoot + "/" ).
130+ Methods ("GET" ).
131+ HandlerFunc (func (rw http.ResponseWriter , r * http.Request ) {
132+ templates .Index .Execute (rw , IndexPageResponseData {
133+ SiteInfo : siteInfo ,
134+ })
135+ })
136+ rootRoute .
137+ Path (siteInfo .SiteRoot + "/" ).
138+ Methods ("POST" ).
139+ HandlerFunc (func (rw http.ResponseWriter , r * http.Request ) {
140+
141+ interval , err := strconv .Atoi (r .FormValue ("timelapse-interval" ))
142+ if err != nil {
143+ rw .WriteHeader (http .StatusBadRequest )
144+ fmt .Fprintf (rw , "Interval was not a number" )
145+ return
146+ }
147+
148+ http .Redirect (rw , r , siteInfo .SiteRoot + "/" , http .StatusFound )
149+
150+ timelapse := & TimelapseSettings {
151+ Name : r .FormValue ("timelapse-name" ),
152+ Interval : time .Duration (interval ) * time .Second ,
153+ Camera : DEFAULT_CAMERA_SETTINGS ,
154+ }
155+
156+ store .SetCurrentTimelapse (timelapse )
157+ capturer .StartTimelapse (timelapse )
158+ })
68159
69160 log .Println ("Starting server on port 10000" )
70161
0 commit comments