63 lines
1.4 KiB
Go
63 lines
1.4 KiB
Go
package unsplash
|
|
|
|
import (
|
|
"io"
|
|
"net/http"
|
|
"os"
|
|
"path/filepath"
|
|
"time"
|
|
|
|
"git.velvettear.de/velvettear/gosplash/internal/config"
|
|
"git.velvettear.de/velvettear/loggo"
|
|
)
|
|
|
|
// struct for images
|
|
type Image struct {
|
|
Id string
|
|
Name string
|
|
Url string
|
|
}
|
|
|
|
// download an image to the specified output path
|
|
func (image *Image) Download() (string, error) {
|
|
timestamp := time.Now().UnixMilli()
|
|
if !image.IsValid() {
|
|
return "image is invalid", nil
|
|
}
|
|
if image.Exists() {
|
|
return "image already exists", nil
|
|
}
|
|
path := image.getPath()
|
|
loggo.Info("downloading image '" + image.Name + "' from unsplash...")
|
|
loggo.Debug("id: " + image.Id + " | url: " + image.Url + " | path: " + path)
|
|
response, error := http.Get(image.Url)
|
|
if error != nil {
|
|
return "", error
|
|
}
|
|
data, error := io.ReadAll(response.Body)
|
|
if error != nil {
|
|
return "", error
|
|
}
|
|
error = os.WriteFile(path, data, 0775)
|
|
if error != nil {
|
|
return "", error
|
|
}
|
|
loggo.InfoTimed("successfully saved image '"+image.Name+"' to '"+path+"'", timestamp)
|
|
return "", nil
|
|
}
|
|
|
|
// check if an image already exists
|
|
func (image *Image) Exists() bool {
|
|
_, error := os.Stat(image.getPath())
|
|
return !os.IsNotExist(error)
|
|
}
|
|
|
|
// check if an image is valid
|
|
func (image *Image) IsValid() bool {
|
|
return len(image.Id) > 0 && len(image.Name) > 0 && len(image.Url) > 0
|
|
}
|
|
|
|
// get the output path for an image
|
|
func (image *Image) getPath() string {
|
|
return filepath.Join(config.Output, image.Name) + ".jpeg"
|
|
}
|