mirror of
https://github.com/nadimkobeissi/mkbsd.git
synced 2025-04-21 05:56:32 -04:00
Add go implementation
This commit is contained in:
parent
82e50c64f0
commit
0da82bb8ee
1 changed files with 135 additions and 0 deletions
135
mkbsd.go
Normal file
135
mkbsd.go
Normal file
|
@ -0,0 +1,135 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
const imagesUrl = "https://storage.googleapis.com/panels-api/data/20240916/media-1a-i-p~s"
|
||||||
|
const downloadsFolder = "downloads"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
asciiArt()
|
||||||
|
|
||||||
|
wd, err := os.Getwd()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("downloading image sets\n")
|
||||||
|
imageComponents, err := getImageSets()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for imageSetId, imageSet := range imageComponents {
|
||||||
|
if err = os.MkdirAll(fmt.Sprintf("%s/%s/%s", wd, downloadsFolder, imageSetId), os.ModePerm); err != nil {
|
||||||
|
fmt.Printf("failed to create directory for images: %s/%s/%s: %v\n",
|
||||||
|
wd, downloadsFolder, imageSetId, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for imageName, imageUrl := range imageSet {
|
||||||
|
imageExt, err := getImageExtension(imageUrl)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("failed to extract iamge extension for url: %s\n", imageUrl)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
downloadPath := fmt.Sprintf("%s/%s/%s/%s.%s",
|
||||||
|
wd, downloadsFolder, imageSetId, imageName, imageExt)
|
||||||
|
fmt.Printf("downloading %s/%s/%s.%s\n",
|
||||||
|
downloadsFolder, imageSetId, imageName, imageExt)
|
||||||
|
if err = downloadImage(imageUrl, downloadPath); err != nil {
|
||||||
|
fmt.Printf("failed to download from %s: %v\n", imageUrl, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func getImageSets() (map[string]map[string]string, error) {
|
||||||
|
imageSets := make(map[string]map[string]string)
|
||||||
|
|
||||||
|
response, err := http.Get(imagesUrl)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to fetch data: %w", err)
|
||||||
|
}
|
||||||
|
defer response.Body.Close()
|
||||||
|
|
||||||
|
if response.StatusCode != http.StatusOK {
|
||||||
|
return nil, fmt.Errorf("server returned non-200 status: %d", response.StatusCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
var result map[string]interface{}
|
||||||
|
decoder := json.NewDecoder(response.Body)
|
||||||
|
if err := decoder.Decode(&result); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to decode JSON: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
data := result["data"].(map[string]interface{})
|
||||||
|
for imageSetId, imageSet := range data {
|
||||||
|
for imageId, imageUrl := range imageSet.(map[string]interface{}) {
|
||||||
|
if _, exists := imageSets[imageSetId]; !exists {
|
||||||
|
imageSets[imageSetId] = make(map[string]string)
|
||||||
|
}
|
||||||
|
imageSets[imageSetId][imageId] = imageUrl.(string)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return imageSets, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func downloadImage(url, filePath string) error {
|
||||||
|
response, err := http.Get(url)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to download image: %w", err)
|
||||||
|
}
|
||||||
|
defer response.Body.Close()
|
||||||
|
|
||||||
|
if response.StatusCode != http.StatusOK {
|
||||||
|
return fmt.Errorf("server returned non-200 status: %d", response.StatusCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
outFile, err := os.Create(filePath)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to create file: %w", err)
|
||||||
|
}
|
||||||
|
defer outFile.Close()
|
||||||
|
|
||||||
|
_, err = io.Copy(outFile, response.Body)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to save image: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func asciiArt() {
|
||||||
|
fmt.Printf(`
|
||||||
|
/$$ /$$ /$$ /$$ /$$$$$$$ /$$$$$$ /$$$$$$$
|
||||||
|
| $$$ /$$$| $$ /$$/| $$__ $$ /$$__ $$| $$__ $$
|
||||||
|
| $$$$ /$$$$| $$ /$$/ | $$ \\ $$| $$ \\__/| $$ \\ $$
|
||||||
|
| $$ $$/$$ $$| $$$$$/ | $$$$$$$ | $$$$$$ | $$ | $$
|
||||||
|
| $$ $$$| $$| $$ $$ | $$__ $$ \\____ $$| $$ | $$
|
||||||
|
| $$\\ $ | $$| $$\\ $$ | $$ \\ $$ /$$ \\ $$| $$ | $$
|
||||||
|
| $$ \\/ | $$| $$ \\ $$| $$$$$$$/| $$$$$$/| $$$$$$$/
|
||||||
|
|__/ |__/|__/ \\__/|_______/ \\______/ |_______/`)
|
||||||
|
fmt.Printf("\n\n")
|
||||||
|
fmt.Printf("🤑 Starting downloads from your favorite sellout grifter's wallpaper app...\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
func getImageExtension(imageUrl string) (string, error) {
|
||||||
|
parsedURL, err := url.Parse(imageUrl)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
fileName := path.Base(parsedURL.Path)
|
||||||
|
ext := path.Ext(fileName)
|
||||||
|
|
||||||
|
return strings.TrimPrefix(ext, "."), nil
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue