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)
+	}
+}
or Ben Morrison <ben@gbmor.dev> 2019-06-09 04:21:03 -0400 committer Ben Morrison <ben@gbmor.dev> 2019-06-09 04:21:03 -0400 explicit init of static assets and test template init were removed: redundant' href='/gbmor/getwtxt/commit/svc/init_test.go?id=c0507308950bf7db65d1f6ee79ce9f67b61cbe0e'>c050730 ^
e10fc64 ^

7f76158 ^
e10fc64 ^
5e92b61 ^
a6c8162 ^

e10fc64 ^





bc6811a ^





a6c8162 ^






6753171 ^
6753171 ^
6753171 ^

bc6811a ^
6753171 ^
bc6811a ^



6753171 ^
6753171 ^


bc6811a ^

6753171 ^






7f76158 ^
6753171 ^

e10fc64 ^
6753171 ^
6753171 ^
6753171 ^
6753171 ^
6753171 ^
45d6723 ^
6753171 ^




6753171 ^
2fd6b1a ^
bc6811a ^

2fd6b1a ^
e539d23 ^
2fd6b1a ^



bc6811a ^














f56b111 ^












1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132