diff options
author | Andinus <andinus@inventati.org> | 2020-03-12 13:45:01 +0530 |
---|---|---|
committer | Andinus <andinus@inventati.org> | 2020-03-12 13:46:06 +0530 |
commit | 0e51e2944ac86cb3e60df92700bd3affda5c890a (patch) | |
tree | edb2f2c89f6c4a3d156cbf5d06e7cfa41fc1abc7 | |
parent | 6b37ee4e32f483f32f05b04c3f7be59316529ae8 (diff) | |
download | cetus-0e51e2944ac86cb3e60df92700bd3affda5c890a.tar.gz |
Support Bing Photo of the Day
-rw-r--r-- | README.org | 44 | ||||
-rw-r--r-- | main.go | 154 |
2 files changed, 136 insertions, 62 deletions
diff --git a/README.org b/README.org index dd23ebe..e88fd23 100644 --- a/README.org +++ b/README.org @@ -3,9 +3,15 @@ Cetus is a wallpaper tool written in Go. It can set wallpapers from various sources. Default behaviour is to set a random wallpaper. +* Defaults +| mode | random | +| src | random | +** Bing Photo of the Day +| bpodAPI | https://www.bing.com/HPImageArchive.aspx | +| bpodNum | 16 | + * Dependency - [[https://feh.finalrewind.org/][feh]] - * Features - Set Daily, Weekly or Random wallpaper @@ -13,27 +19,43 @@ sources. Default behaviour is to set a random wallpaper. ** Daily wallpaper *** from Astronomy Picture of the Day #+BEGIN_SRC sh -cetus -apod -daily +cetus -src=apod -mode=daily #+END_SRC *** from Bing Photo of the Day #+BEGIN_SRC sh -cetus -bpod -daily +cetus -src=bpod -mode=daily #+END_SRC -*** from Unsplash +*** from Unsplash Source #+BEGIN_SRC sh -cetus -unsplash -daily +cetus -src=unsplash -mode=daily #+END_SRC *** from any service (choosen randomly) #+BEGIN_SRC sh -cetus -daily +cetus -src=random -mode=daily + +cetus -mode=daily # This is same as above #+END_SRC ** Weekly wallpaper -*** from Unsplash -#+BEGIN_SRC sh -cetus -unsplash -weekly +*** from Unsplash Source +#+BEGIN_SRC shp +cetus -src=unsplash -mode=weekly #+END_SRC ** Random wallpaper -*** from Unsplash +*** from Bing Photo of the Day #+BEGIN_SRC sh -cetus -unsplash -random +cetus -src=bpod -bpod-num 16 -mode=random # select from last 16 images + +cetus -src=bpod # This is same as above +#+END_SRC +*** from Unsplash Source +#+BEGIN_SRC sh +cetus -src=unsplash -mode=random + +cetus -src=unsplash # This is same as above +#+END_SRC +*** from any service (choosen randomly) +#+BEGIN_SRC sh +cetus -src=random -mode=random + +cetus # This is same as above #+END_SRC diff --git a/main.go b/main.go index 3f52fb8..95e91fa 100644 --- a/main.go +++ b/main.go @@ -20,84 +20,105 @@ import ( "fmt" "io/ioutil" "log" + "math/rand" "net/http" "os/exec" + "strconv" "time" ) var ( - err error timeout time.Duration + + apodAPI string + apodAPIKey string + bpodAPI string + bpodNum int + unsplashAPI string ) func main() { - var ( - imgPath string + rand.Seed(time.Now().Unix()) - apod bool - apodAPI string - apodAPIKey string + var ( + err error - bpod bool - bpodAPI string + imgPath string + mode string + src string + srcArr []string = []string{ + "apod", + "bpod", + "unsplash", + } ) // Parse flags passed to program - flag.StringVar(&imgPath, "img-path", "", "Image to set as wallpaper") + flag.StringVar(&src, "src", "random", "Source for the image") + flag.StringVar(&mode, "mode", "random", "Daily, Weekly or Random 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.BoolVar(&bpod, "bpod", false, "Set Bing Photo of the Day as wallpaper") flag.StringVar(&bpodAPI, "bpod-api", "https://www.bing.com/HPImageArchive.aspx", "BPOD API URL") - + flag.IntVar(&bpodNum, "bpod-num", 16, "BPOD Number of images to fetch") flag.DurationVar(&timeout, "timeout", 16, "Timeout for http client") - flag.Parse() - if len(imgPath) > 0 { - err = setWall(imgPath) - errChk(err) - return + if src == "random" { + src = srcArr[rand.Intn(len(srcArr))] } - if apod { - apodI := make(map[string]string) - apodI["api"] = apodAPI - apodI["apiKey"] = apodAPIKey - - err = setWallFromAPOD(apodI) - errChk(err) - return + // Check if the source is known + if !contains(srcArr, src) { + log.Fatal("Error: Unknown Source") } - if bpod { - bpodI := make(map[string]string) - bpodI["api"] = bpodAPI + imgPath, err = parseSrcAndGetPath(src, mode) + errChk(err) + + err = setWall(imgPath) + errChk(err) +} - err = setWallFromBPOD(bpodI) - errChk(err) - return +func contains(arr []string, str string) bool { + for _, i := range arr { + if i == str { + return true + } } + return false } -// Calls feh to set the wallpaper -func setWall(imgPath string) error { - feh, err := exec.LookPath("feh") - if err != nil { - fmt.Println("Error: feh is not in $PATH") - return err +// Gets image path from src +func parseSrcAndGetPath(src string, mode string) (string, error) { + var err error + var imgPath string + + switch src { + case "apod": + fmt.Println("Astronomy Picture of the Day") + imgPath, err = getPathAPOD(mode) + case "bpod": + fmt.Println("Bing Photo of the Day") + imgPath, err = getPathBPOD(mode) + case "unsplash": + fmt.Println("Unsplash Source") + imgPath, err = getPathUnsplash(mode) } - fmt.Printf("Path to set as Wallpaper: %s\n", imgPath) + return imgPath, err +} - err = exec.Command(feh, "--bg-fill", imgPath).Run() - return err +func getPathAPOD(mode string) (string, error) { + var err error + var imgPath string + return imgPath, err } -// Get url of Bing Photo of the Day & pass it to setWall() -func setWallFromBPOD(bpodI map[string]string) error { +func getPathBPOD(mode string) (string, error) { + var err error + var imgPath string + type Images struct { StartDate string `json:"startdate"` FullStartDate string `json:"fullstartdate"` @@ -116,34 +137,65 @@ func setWallFromBPOD(bpodI map[string]string) error { bpodNow := bpodRes{} - req, err := http.NewRequest(http.MethodGet, bpodI["api"], nil) + req, err := http.NewRequest(http.MethodGet, bpodAPI, nil) if err != nil { - return err + return "", err } q := req.URL.Query() q.Add("format", "js") - q.Add("n", "1") + + switch mode { + case "daily": + q.Add("n", "1") + case "random": + // Fetches 16 images (only info) & chooses a random image + q.Add("n", strconv.Itoa(bpodNum)) + default: + return "", fmt.Errorf("Error: Unknown Mode") + } + req.URL.RawQuery = q.Encode() res, err := getRes(req) if err != nil { - fmt.Printf("Error: GET %s\n", bpodI["api"]) - return err + return "", err } defer res.Body.Close() apiBody, err := ioutil.ReadAll(res.Body) if err != nil { - return err + return "", err } err = json.Unmarshal([]byte(apiBody), &bpodNow) if err != nil { + return "", err + } + + // Choose a random image + var i int = rand.Intn(len(bpodNow.Image)) + imgPath = fmt.Sprintf("%s%s", "https://www.bing.com", bpodNow.Image[i].URL) + + return imgPath, err +} + +func getPathUnsplash(mode string) (string, error) { + var err error + var imgPath string + return imgPath, err +} + +// Calls feh to set the wallpaper +func setWall(imgPath string) error { + feh, err := exec.LookPath("feh") + if err != nil { + fmt.Println("Error: feh is not in $PATH") return err } - // Set Bing Photo of the Day as wallpaper - err = setWall(fmt.Sprintf("%s%s", "https://www.bing.com", bpodNow.Image[0].URL)) + fmt.Printf("Path to set as Wallpaper: %s\n", imgPath) + + err = exec.Command(feh, "--bg-fill", imgPath).Run() return err } |