summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--README.org25
-rw-r--r--main.go100
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)
+	}
+}