From 4b22e35c3bb41628f7030a82ac3ddbf410dbbbf0 Mon Sep 17 00:00:00 2001 From: Kevin Ruffin Date: Thu, 17 Feb 2022 22:33:45 -0500 Subject: [PATCH] Can pull products, all installer links and the download + checksum links. --- main.go | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/main.go b/main.go index a2768cc..d37f818 100644 --- a/main.go +++ b/main.go @@ -15,6 +15,8 @@ import ( "github.com/webview/webview" "golang.org/x/oauth2" "io/ioutil" + "strconv" + "fmt" ) var ( @@ -125,6 +127,81 @@ func getGameList() *GameList { return gl } +type Product struct { + Id int `json:"id"` + Title string `json:"title"` + Downloads struct { + Installers [] struct { + Name string `json:"name"` + Os string `json:"os"` + Files [] struct { + Id string `json:"id"` + Size int64 `json:"size"` + Downlink string `json:"downlink"` + } `json:"files"` + } `json:"installers"` + } `json:"downloads` +} + +func getProduct(id int) *Product { + url := "https://api.gog.com/products/" + strconv.Itoa(id) + "?expand=downloads" + res, err := client.Get(url) + if err != nil { + log.Fatalf("Failed to get product info: %v", err) + } + defer res.Body.Close() + body, err := ioutil.ReadAll(res.Body) + if err != nil { + log.Fatalf("Failed to parse product body: %v", err) + } + + //log.Println(string(body)) + var p = new(Product) + err = json.Unmarshal(body, p) + if err != nil { + log.Fatalf("Failed to parse product response: %v", err) + } + + return p +} + +type DownloadLinks struct { + Downlink string `json:"downlink"` + Checksum string `json:"checksum"` +} + +func (dl *DownloadLinks) String() string { + return fmt.Sprintf("{downlink: %s, checksum: %s}", dl.Downlink, dl.Checksum) +} + +func getDownloadLinks(p *Product) []*DownloadLinks { + var links []*DownloadLinks + + for _, i := range p.Downloads.Installers { + for _, f := range i.Files { + res, err := client.Get(f.Downlink) + if err != nil { + log.Fatalf("Failed to get file download info: %v", err) + } + defer res.Body.Close() + body, err := ioutil.ReadAll(res.Body) + if err != nil { + log.Fatalf("Failed to parse file download body: %v", err) + } + + //log.Println(string(body)) + var dl = new(DownloadLinks) + err = json.Unmarshal(body, dl) + if err != nil { + log.Fatalf("Failed to parse file download response: %v", err) + } + links = append(links, dl) + } + } + + return links +} + func login(url string) { log.Println(color.CyanString("You will now be taken to your browser for authentication")) time.Sleep(1 * time.Second) @@ -173,5 +250,9 @@ func main() { gl := getGameList() log.Println(gl.Owned) + p := getProduct(gl.Owned[0]) + log.Println(p) + dl := getDownloadLinks(p) + log.Printf("%+v", dl) }