package main import ( "fmt" "io/ioutil" "os" "time" "framagit.org/andinus/cetus/pkg/background" "framagit.org/andinus/cetus/pkg/bpod" "framagit.org/andinus/indus/notification" ) func execBPOD() { // reqInfo holds all the parameters that needs to be sent with // the request. GetJson() will pack apiKey & date in params // map before sending it to another function. Adding params // here will not change the behaviour of the function, changes // have to be made in GetJson() too. reqInfo := make(map[string]string) reqInfo["api"] = string(*bpodAPI) if *bpodRand { reqInfo["random"] = "true" } cacheDir := fmt.Sprintf("%s/%s", getCacheDir(), "bpod") os.MkdirAll(cacheDir, os.ModePerm) // Check if the file is available locally, if it is then don't // download it again and get it from disk. // // We don't know the bpod date because that will be there in // response & we can't read the response without requesting // it. So this will assume the bpod date to be today's date if // *bpodRand is not set true. If *bpodRand is set true then we // can't assume the date. Also this way too it can cause error // if our assumed date doesn't matches date at the server. var body string var file string var err error if !*bpodRand { // If not *bpodRand and the file exists then read from // disk, if the file doesn't exist then get it and // save it to disk. file = fmt.Sprintf("%s/%s", cacheDir, time.Now().UTC().Format("2006-01-02")) if _, err := os.Stat(file); err == nil { data, err := ioutil.ReadFile(file) chkErr(err) body = string(data) } else if os.IsNotExist(err) { body, err = bpod.GetJson(reqInfo) chkErr(err) // Write body to the cache so that it can be // read later err = ioutil.WriteFile(file, []byte(body), 0644) chkErr(err) } else { chkErr(err) } } else { // If *bpodRand then get the file and save it to disk // after unmarshal because we don't know the file name // yet body, err = bpod.GetJson(reqInfo) chkErr(err) } // Unmarshal before dump because otherwise if we come across // the date for the first time then it would just dump and // exit without saving it to cache. This way we first save it // to cache if *bpodRand is true. res, err := bpod.UnmarshalJson(body) chkErr(err) // Correct format res.Url = fmt.Sprintf("%s%s", "https://www.bing.com", res.Url) dt, err := time.Parse("20060102", res.StartDate) chkErr(err) res.StartDate = dt.Format("2006-01-02") file = fmt.Sprintf("%s/%s", cacheDir, res.StartDate) if *bpodRand { // Write body to the cache so that it can be read // later err = ioutil.WriteFile(file, []byte(body), 0644) chkErr(err) } if *bpodDump { fmt.Printf(body) os.Exit(0) } // If path-only is passed then it will only print the path, // even if quiet is passed. If the user wants the program to // be quiet then path-only shouldn't be passed. If path-only // is not passed & quiet is also not passed then print the // response. // // Path is only printed when the media type is an image // because res.HDURL is empty on non image media type. if *bpodPathOnly { fmt.Println(res.Url) } else if !*bpodQuiet { bpod.Print(res) } // Send a desktop notification if notify flag was passed if *bpodNotify { n := notification.Notif{} n.Title = res.Title n.Message = fmt.Sprintf("%s\n\n%s", res.StartDate, res.Copyright) err = n.Notify() chkErr(err) } // Proceed only if the command was set because if it was fetch // then it's already finished & should exit now. if os.Args[1] == "fetch" { os.Exit(0) } // Try to set background only if the media type is an image. // First it downloads the image to the cache directory and // then tries to set it with feh. If the download fails then // it exits with a non-zero exit code. imgCacheDir := fmt.Sprintf("%s/%s", cacheDir, "background") os.MkdirAll(imgCacheDir, os.ModePerm) imgFile := fmt.Sprintf("%s/%s", imgCacheDir, res.StartDate) // Check if the file is available locally, if it is then don't // download it again and set it from disk if _, err := os.Stat(imgFile); os.IsNotExist(err) { err = background.Download(imgFile, res.Url) chkErr(err) } else { chkErr(err) } err = background.Set(imgFile) chkErr(err) }