assets-for-lmika.org/cmd/fetch-header-image/models.go
Leon Mika c9f3944c72
All checks were successful
/ publish (push) Successful in 1m46s
Added the pending image data file
2025-11-23 22:13:43 +11:00

73 lines
1.4 KiB
Go

package main
import (
"encoding/json"
"errors"
"net/http"
"os"
"sort"
"time"
)
const CropBottom = "bottom"
var ErrNon200Error = errors.New("non 200 status code")
type PendingImage struct {
Date time.Time `json:"date"`
URL string `json:"url"`
Crop string `json:"crop"`
}
func LoadPendingImageFromURL(url string) (pi PendingImage, err error) {
resp, err := http.Get(url)
if err != nil {
return PendingImage{}, err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return PendingImage{}, ErrNon200Error
}
if err := json.NewDecoder(resp.Body).Decode(&pi); err != nil {
return PendingImage{}, err
}
return pi, nil
}
type PendingImages struct {
Images []PendingImage `json:"images"`
}
func (pi PendingImages) FindPendingImage() (bestImg PendingImage, ok bool) {
timeNow := time.Now().UTC()
if len(pi.Images) == 0 {
return PendingImage{}, false
}
for _, img := range pi.Images {
if timeNow.Before(img.Date) {
continue
}
bestImg = img
}
return bestImg, bestImg.URL != ""
}
func LoadPendingImages(jsonFile string) (pi PendingImages, _ error) {
f, err := os.Open(jsonFile)
if err != nil {
return PendingImages{}, err
}
defer f.Close()
if err := json.NewDecoder(f).Decode(&pi); err != nil {
return PendingImages{}, err
}
sort.Slice(pi.Images, func(i, j int) bool { return pi.Images[i].Date.Before(pi.Images[j].Date) })
return pi, nil
}