From 53ecbbc03b8cd8e54479c2d90cbdae9921eaa127 Mon Sep 17 00:00:00 2001 From: Andinus Date: Mon, 16 Mar 2020 00:57:28 +0530 Subject: Add dump option & rewrite bpod response retrieval function --- cmd/cetus-bing/cetus-bing.go | 103 +++++++++++++++++++++++++------------------ pkg/bing/bpod.go | 77 +++++--------------------------- pkg/cetus/req.go | 43 ++++++++++++++++++ 3 files changed, 114 insertions(+), 109 deletions(-) create mode 100644 pkg/cetus/req.go diff --git a/cmd/cetus-bing/cetus-bing.go b/cmd/cetus-bing/cetus-bing.go index 3cc3850..871c96a 100644 --- a/cmd/cetus-bing/cetus-bing.go +++ b/cmd/cetus-bing/cetus-bing.go @@ -1,6 +1,7 @@ package main import ( + "encoding/json" "flag" "fmt" "log" @@ -12,19 +13,31 @@ import ( "framagit.org/andinus/cetus/pkg/cetus" ) +type photo struct { + startDate string `json:"startdate"` + fullStartDate string `json:"fullstartdate"` + endDate string `json:"enddate"` + url string `json:"url"` + urlBase string `json:"urlbase"` + copyright string `json:"copyright"` + copyrightLink string `json:"copyrightlink"` + title string `json:"title"` + hsh string `json:"hsh"` +} + +type bpod struct { + photos []photo `json:"images"` +} + var ( + t time.Duration + api string + dump bool quiet bool + random bool version bool - fetchOnly bool pathOnly bool - - api string - random bool - timeout time.Duration - - err error - bpodRes bing.BPOD - bpodPhoto bing.Photo + fetchOnly bool ) func main() { @@ -37,29 +50,30 @@ func main() { rand.Seed(time.Now().Unix()) // Convert timeout to seconds - timeout = timeout * time.Second + t = t * time.Second - // get response from api - bpodRes, err = getBPODRes() - if err != nil { - log.Fatal(err) + body, err := bpodBody() + if dump { + fmt.Println(body) + return } + bpod := bpod{} + err = json.Unmarshal([]byte(body), &bpod) + errChk("body unmarshal failed", err) + // if random was set then bpodRes holds list of multiple // responses, choose a random response from the list - var i int = rand.Intn(len(bpodRes.Photos)) - bpodPhoto = bpodRes.Photos[i] + var i int = rand.Intn(len(bpod.photos)) + bpodPhoto := bpod.photos[i] // correct image path - bpodPhoto.URL = fmt.Sprintf("%s%s", "https://www.bing.com", bpodPhoto.URL) + bpodPhoto.url = fmt.Sprintf("%s%s", "https://www.bing.com", bpodPhoto.url) // correct date format - var dt time.Time - dt, err = time.Parse("20060102", bpodPhoto.StartDate) - if err != nil { - log.Fatal(err) - } - bpodPhoto.StartDate = dt.Format("2006-01-02") + dt, err := time.Parse("20060102", bpodPhoto.startDate) + errChk("bpodPhoto.startDate parse failed", err) + bpodPhoto.startDate = dt.Format("2006-01-02") printDetails(bpodPhoto) @@ -68,51 +82,52 @@ func main() { return } - // if media type is an image then set background - err = background.Set(bpodPhoto.URL) - if err != nil { - log.Fatal(err) - } + err = background.Set(bpodPhoto.url) + errChk("setting background failed", err) } func parseFlags() { flag.BoolVar(&quiet, "quiet", false, "No output") flag.BoolVar(&version, "version", false, "Cetus version") flag.BoolVar(&fetchOnly, "fetch-only", false, "Don't set background, only fetch info") - + flag.BoolVar(&dump, "dump", false, "Only dump received response") flag.BoolVar(&random, "random", false, "Choose a random image (from 7 images)") flag.BoolVar(&pathOnly, "path-only", false, "Print only path of the image") flag.StringVar(&api, "api", "https://www.bing.com/HPImageArchive.aspx", "BPOD API URL") - flag.DurationVar(&timeout, "timeout", 32*time.Second, "Timeout for http client in seconds") + flag.DurationVar(&t, "timeout", 32*time.Second, "Timeout for http client in seconds") flag.Parse() } -func printDetails(bpodPhoto bing.Photo) { +func printDetails(bpodPhoto photo) { if quiet { return } if pathOnly { - cetus.PrintPath(bpodPhoto.URL) + cetus.PrintPath(bpodPhoto.url) return } - fmt.Printf("Title: %s\n\n", bpodPhoto.Title) - fmt.Printf("Copyright: %s\n", bpodPhoto.Copyright) - fmt.Printf("Copyright Link: %s\n", bpodPhoto.CopyrightLink) - fmt.Printf("Date: %s\n\n", bpodPhoto.StartDate) - fmt.Printf("URL: %s\n", bpodPhoto.URL) + fmt.Printf("Title: %s\n\n", bpodPhoto.title) + fmt.Printf("Copyright: %s\n", bpodPhoto.copyright) + fmt.Printf("Copyright Link: %s\n", bpodPhoto.copyrightLink) + fmt.Printf("Date: %s\n\n", bpodPhoto.startDate) + fmt.Printf("URL: %s\n", bpodPhoto.url) } -func getBPODRes() (bing.BPOD, error) { - var bpodInfo map[string]string - bpodInfo = make(map[string]string) - bpodInfo["api"] = api +func bpodBody() (string, error) { + reqInfo := make(map[string]string) + reqInfo["api"] = api if random { - bpodInfo["random"] = "true" + reqInfo["random"] = "true" } - bpodRes, err = bing.BPODPath(bpodInfo, timeout) - return bpodRes, err + body, err := bing.GetBpodJson(reqInfo, t) + return body, err +} + +func errChk(ctx string, err error) { + log.Println(ctx) + log.Fatal(err) } diff --git a/pkg/bing/bpod.go b/pkg/bing/bpod.go index 041eef7..c7ee79d 100644 --- a/pkg/bing/bpod.go +++ b/pkg/bing/bpod.go @@ -1,76 +1,23 @@ package bing import ( - "encoding/json" - "fmt" - "io/ioutil" - "net/http" "time" -) - -// Photo holds responses -type Photo struct { - StartDate string `json:"startdate"` - FullStartDate string `json:"fullstartdate"` - EndDate string `json:"enddate"` - URL string `json:"url"` - URLBase string `json:"urlbase"` - Copyright string `json:"copyright"` - CopyrightLink string `json:"copyrightlink"` - Title string `json:"title"` - Hsh string `json:"hsh"` -} - -// BPOD holds list of response -type BPOD struct { - Photos []Photo `json:"images"` -} -// BPODPath returns Bing Photo of the Day responses -func BPODPath(bpodInfo map[string]string, timeout time.Duration) (BPOD, error) { - var err error - bpodRes := BPOD{} - - client := http.Client{ - Timeout: time.Second * timeout, - } - - req, err := http.NewRequest(http.MethodGet, bpodInfo["api"], nil) - if err != nil { - return bpodRes, err - } - q := req.URL.Query() - q.Add("format", "js") - - // if random flag is passed then fetch 7 photos - if bpodInfo["random"] == "true" { - q.Add("n", "7") - } else { - q.Add("n", "1") - } - req.URL.RawQuery = q.Encode() - - res, err := client.Do(req) - - if err != nil { - return bpodRes, err - } - defer res.Body.Close() + "framagit.org/andinus/cetus/pkg/cetus" +) - resBody, err := ioutil.ReadAll(res.Body) - if err != nil { - return bpodRes, err - } +// GetBpodJson returns json response received from the api +func GetBpodJson(reqInfo map[string]string, t time.Duration) (string, error) { + params := make(map[string]string) + params["format"] = "js" + params["n"] = "1" - err = json.Unmarshal([]byte(resBody), &bpodRes) - if err != nil { - return bpodRes, err - } + // if random is true then fetch 7 photos + if reqInfo["random"] == "true" { + params["n"] = "7" - if res.StatusCode != 200 { - return bpodRes, fmt.Errorf("Unexpected response status code received: %d %s", - res.StatusCode, http.StatusText(res.StatusCode)) } - return bpodRes, err + body, err := cetus.GetRes(reqInfo["api"], params, t) + return string(body), err } diff --git a/pkg/cetus/req.go b/pkg/cetus/req.go new file mode 100644 index 0000000..84e52a5 --- /dev/null +++ b/pkg/cetus/req.go @@ -0,0 +1,43 @@ +package cetus + +import ( + "fmt" + "io/ioutil" + "net/http" + "time" +) + +// GetRes returns api response +func GetRes(api string, params map[string]string, t time.Duration) (string, error) { + c := http.Client{ + Timeout: time.Second * t, + } + + req, err := http.NewRequest(http.MethodGet, api, nil) + if err != nil { + return "", err + } + + q := req.URL.Query() + for k, v := range params { + q.Add(k, v) + } + req.URL.RawQuery = q.Encode() + + res, err := c.Do(req) + if err != nil { + return "", err + } + defer res.Body.Close() + + if res.StatusCode != 200 { + return "", fmt.Errorf("Unexpected response status code received: %d %s", + res.StatusCode, http.StatusText(res.StatusCode)) + } + + body, err := ioutil.ReadAll(res.Body) + if err != nil { + return "", err + } + return string(body), err +} -- cgit 1.4.1-2-gfad0