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 --- README.org | 25 ++++++++++++---- main.go | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 114 insertions(+), 11 deletions(-) diff --git a/README.org b/README.org index 9cfe979..82b21ea 100644 --- a/README.org +++ b/README.org @@ -2,14 +2,29 @@ Cetus is a wallpaper setting tool written in Go. This is a work in-progress. +* Dependency +** [[https://feh.finalrewind.org/][feh]] +Required to set the wallpaper. +* Examples +** Image of the Day +*** Astronomy Picture of the Day +#+BEGIN_SRC sh +cetus -apod -apod-api=https://api.nasa.gov/planetary/apod \ + -apod-api-key=DEMO_KEY +#+END_SRC +** Set given wallpaper +#+BEGIN_SRC sh +# Local image as wallpaper +cetus -img-path=/path/to/img + +# Remote image as wallpaper +cetus -img-path=http://127.0.0.1 +#+END_SRC + * Features ** Supports various Image of the Day services There are several Image of the Day services on the web, cetus will pull the latest image & set it as wallpaper. -*** TODO [[http://apod.nasa.gov/apod/astropix.html][Astronomy Picture of the Day]] +*** DONE [[http://apod.nasa.gov/apod/astropix.html][Astronomy Picture of the Day]] ** DONE Set given wallpaper Takes a path as input & sets it as wallpaper. - -* Dependency -** [[https://feh.finalrewind.org/][feh]] -Required to set the wallpaper. 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