From 6ceb7554067142bf83207c18e9d72d4b0ff83fea Mon Sep 17 00:00:00 2001 From: Andinus Date: Thu, 12 Mar 2020 02:33:13 +0530 Subject: Add Astronomy Picture of the Day support --- main.go | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 94 insertions(+), 6 deletions(-) (limited to 'main.go') diff --git a/main.go b/main.go index aa1e639..9f506f4 100644 --- a/main.go +++ b/main.go @@ -15,40 +15,128 @@ package main import ( + "encoding/json" "flag" "fmt" + "io/ioutil" "log" + "net/http" "os/exec" + "time" +) + +var ( + err error + timeout time.Duration ) func main() { var ( imgPath string - err error + + apod bool + apodAPI string + apodAPIKey string ) // Parse flags passed to program flag.StringVar(&imgPath, "img-path", "", "Image to set as wallpaper") + + flag.BoolVar(&apod, "apod", false, "Set Astronomy Picture of the Day as wallpaper") + flag.StringVar(&apodAPI, "apod-api", "https://api.nasa.gov/planetary/apod", "APOD API URL") + flag.StringVar(&apodAPIKey, "apod-api-key", "DEMO_KEY", "APOD API Key") + + flag.DurationVar(&timeout, "timeout", 16, "Timeout for http client") + flag.Parse() if len(imgPath) > 0 { err = setWall(imgPath) - if err != nil { - log.Fatal(err) - } + errChk(err) + return + } + + if apod != false { + apodI := make(map[string]string) + apodI["api"] = apodAPI + apodI["apiKey"] = apodAPIKey + + err = setWallFromAPOD(apodI) + errChk(err) return } } +// Calls feh to set the wallpaper func setWall(imgPath string) error { - var err error - feh, err := exec.LookPath("feh") if err != nil { fmt.Println("Error: feh is not in $PATH") return err } + fmt.Printf("Path to set as Wallpaper: %s\n", imgPath) + err = exec.Command(feh, "--bg-fill", imgPath).Run() return err } + +// Get url of Astronomy Picture of the Day & pass it to setWall() +func setWallFromAPOD(apodI map[string]string) error { + type apodRes struct { + Copyright string `json:"copyright"` + Date string `json:"string"` + Explanation string `json:"explanation"` + HDURL string `json:"hdurl"` + MediaType string `json:"media_type"` + ServiceVersion string `json:"service_version"` + Title string `json:"title"` + URL string `json:"url"` + } + + apodNow := apodRes{} + + req, err := http.NewRequest(http.MethodGet, apodI["api"], nil) + if err != nil { + return err + } + q := req.URL.Query() + q.Add("api_key", apodI["apiKey"]) + req.URL.RawQuery = q.Encode() + + res, err := getRes(req) + if err != nil { + fmt.Printf("Error: GET %s\n", apodI["api"]) + return err + } + defer res.Body.Close() + + apiBody, err := ioutil.ReadAll(res.Body) + if err != nil { + return err + } + + err = json.Unmarshal([]byte(apiBody), &apodNow) + if err != nil { + return err + } + + // Set Astronomy Picture of the Day as wallpaper + err = setWall(apodNow.HDURL) + return err +} + +func getRes(req *http.Request) (*http.Response, error) { + client := http.Client{ + Timeout: time.Second * timeout, + } + res, err := client.Do(req) + + return res, err +} + +func errChk(err error) { + if err != nil { + log.Fatal(err) + } +} -- cgit 1.4.1-2-gfad0