summary refs log tree commit diff stats
path: root/cmd/cetus-nasa/cetus-nasa.go
blob: d71c41d7ba61856f0d4a5310bcabaed36d3c3292 (plain) (blame)
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
133
package main

import (
	"encoding/json"
	"flag"
	"fmt"
	"log"
	"time"

	"framagit.org/andinus/cetus/pkg/background"
	"framagit.org/andinus/cetus/pkg/cetus"
	"framagit.org/andinus/cetus/pkg/nasa"
)

type apod struct {
	Copyright      string `json:"copyright"`
	Date           string `json:"date"`
	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"`

	Code int    `json:"code"`
	Msg  string `json:"msg"`
}

var (
	t         time.Duration
	api       string
	date      string
	dump      bool
	quiet     bool
	random    bool
	apiKey    string
	version   bool
	fetchOnly bool
	pathOnly  bool
)

func main() {
	parseFlags()

	if version {
		cetus.Version()
		return
	}

	// Convert timeout to seconds
	t = t * time.Second

	if random {
		date = nasa.RandDate()
	}

	body, err := apodBody()
	if dump {
		fmt.Println(body)
		return
	}

	apod := apod{}
	err = json.Unmarshal([]byte(body), &apod)
	cetus.ErrChk("body unmarshal failed", err)
	if len(apod.Msg) != 0 {
		log.Println("Message: ", apod.Msg)
	}

	printDetails(apod)

	// if fetchOnly is true then don't set background
	if fetchOnly {
		return
	}

	// if media type is an image then set background
	if apod.MediaType == "image" {
		err = background.Set(apod.HdURL)
		cetus.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")
	dateHelp := fmt.Sprintf("Choose a random date between 1995-06-16 & %s",
		time.Now().UTC().Format("2006-01-02"))
	flag.BoolVar(&random, "random", false, dateHelp)
	flag.BoolVar(&pathOnly, "path-only", false, "Print only path of the image")

	flag.StringVar(&api, "api", "https://api.nasa.gov/planetary/apod", "APOD API URL")
	flag.StringVar(&apiKey, "api-key", "DEMO_KEY", "api.nasa.gov key for expanded usage")

	dateDefault := time.Now().UTC().Format("2006-01-02")
	flag.StringVar(&date, "date", dateDefault, "Date of the APOD image to retrieve")

	flag.DurationVar(&t, "timeout", 32*time.Second, "Timeout for http client in seconds")
	flag.Parse()

}

func printDetails(apod apod) {
	if quiet {
		return
	}
	if pathOnly {
		cetus.PrintPath(apod.HdURL)
		return
	}
	fmt.Printf("Title: %s\n\n", apod.Title)
	fmt.Printf("Copyright: %s\n", apod.Copyright)
	fmt.Printf("Date: %s\n\n", apod.Date)
	fmt.Printf("Media Type: %s\n", apod.MediaType)
	if apod.MediaType == "image" {
		fmt.Printf("URL: %s\n\n", apod.HdURL)
	} else {
		fmt.Printf("URL: %s\n\n", apod.Url)
	}
	fmt.Printf("Explanation: %s\n", apod.Explanation)
}

func apodBody() (string, error) {
	reqInfo := make(map[string]string)
	reqInfo["api"] = api
	reqInfo["apiKey"] = apiKey
	reqInfo["date"] = date

	body, err := nasa.GetApodJson(reqInfo, t)
	return body, err
}