package main import ( "encoding/json" "flag" "fmt" "math/rand" "time" "framagit.org/andinus/cetus/pkg/background" "framagit.org/andinus/cetus/pkg/cetus" "framagit.org/andinus/cetus/pkg/wallhaven" ) type wh struct { Photos []photo `json:"data"` // MetaI []meta `json:"meta"` } // type meta struct { // CurrentPage int `json:"current_page"` // LastPage int `json:"last_page"` // PerPage int `json:"per_page"` // Total int `json:"total"` // Query string `json:"query"` // Seed string `json:"seed"` // } type photo struct { Id string `json:"id"` Url string `json:"url"` ShortUrl string `json:"short_url"` Views int `json:"views"` Favorites int `json:"favorites"` Source string `json:"source"` Purity string `json:"purity"` Category string `json:"category"` DimensionX int `json:"dimension_x"` DimensionY int `json:"dimension_y"` Resolution string `json:"resolution"` Ratio string `json:"ratio"` FileSize int `json:"file_size"` FileType string `json:"file_type"` CreatedAt string `json:"created_at"` Path string `json:"path"` Colors []string `json:"colors"` // Thumbs []thumb `json:"thumbs"` } // type thumb struct { // Small string `json:"small"` // Original string `json:"original"` // Large string `json:"large"` // } var ( t time.Duration api string apiKey string dump bool quiet bool random bool version bool pathOnly bool fetchOnly bool ) func main() { parseFlags() if version { cetus.Version() return } rand.Seed(time.Now().Unix()) // Convert timeout to seconds t = t * time.Second body, err := whBody() if dump { fmt.Println(body) return } wh := wh{} err = json.Unmarshal([]byte(body), &wh) cetus.ErrChk("body unmarshal failed", err) // if random was set then wh holds list of multiple responses, // choose a random response from the list i := rand.Intn(len(wh.Photos)) whPhoto := wh.Photos[i] printDetails(whPhoto) // if fetchOnly is true then don't set background if fetchOnly { return } err = background.Set(whPhoto.Path) 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") flag.BoolVar(&random, "random", true, "Choose a random image") flag.BoolVar(&pathOnly, "path-only", false, "Print only path of the image") flag.StringVar(&api, "api", "https://wallhaven.cc/api/v1/search", "Wallhaven Search API URL") flag.StringVar(&apiKey, "api-key", "", "Wallhaven API Key") flag.DurationVar(&t, "timeout", 32*time.Second, "Timeout for http client in seconds") flag.Parse() } func printDetails(whPhoto photo) { if quiet { return } if pathOnly { cetus.PrintPath(whPhoto.Path) return } fmt.Printf("Id: %s\n", whPhoto.Id) fmt.Printf("URL: %s\n", whPhoto.Url) fmt.Printf("Short URL: %s\n", whPhoto.ShortUrl) fmt.Printf("Source: %s\n", whPhoto.Source) fmt.Printf("Date: %s\n\n", whPhoto.CreatedAt) fmt.Printf("Resolution: %s\n", whPhoto.Resolution) fmt.Printf("Ratio: %s\n", whPhoto.Ratio) fmt.Printf("Views: %d\n", whPhoto.Views) fmt.Printf("Favorites: %d\n", whPhoto.Favorites) fmt.Printf("File Size: %d KiB\n", whPhoto.FileSize/1024) fmt.Printf("Category: %s\n", whPhoto.Category) } func whBody() (string, error) { reqInfo := make(map[string]string) reqInfo["api"] = api if random { reqInfo["random"] = "true" } body, err := wallhaven.GetWhJson(reqInfo, t) return body, err }