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 }