2024-03-03 12:31:26 +01:00

70 lines
1.8 KiB
Go

package piwigotools
import (
"bytes"
"encoding/base64"
"fmt"
"io"
"net/http"
)
type ImageDetails struct {
Id int `json:"id"`
Md5 string `json:"md5sum"`
Name string `json:"name"`
DateAvailable TimeResult `json:"date_available"`
DateCreation TimeResult `json:"date_creation"`
LastModified TimeResult `json:"lastmodified"`
Width int `json:"width"`
Height int `json:"height"`
Url string `json:"page_url"`
ImageUrl string `json:"element_url"`
Filename string `json:"file"`
Filesize int64 `json:"filesize"`
Categories Categories `json:"categories"`
Tags Tags `json:"tags"`
Derivatives map[string]struct {
Height int `json:"height"`
Width int `json:"width"`
Url string `json:"url"`
} `json:"derivatives"`
}
func (img *ImageDetails) Preview(height int) (string, error) {
url := img.ImageUrl
if der, ok := img.Derivatives["medium"]; ok {
url = der.Url
}
resp, err := http.Get(url)
if err != nil {
return "", err
}
if resp.StatusCode != 200 {
return "", fmt.Errorf("[error %d] failed to get image", resp.StatusCode)
}
//goland:noinspection GoUnhandledErrorResult
defer resp.Body.Close()
buf := bytes.NewBuffer([]byte{})
buf.WriteString("\033]1337")
buf.WriteString(fmt.Sprintf(";File=%s", img.Filename))
buf.WriteString(";inline=1")
buf.WriteString(fmt.Sprintf(";size=%d;", resp.ContentLength))
if height > 0 {
buf.WriteString(fmt.Sprintf(";height=%d", height))
}
buf.WriteString(":")
encoder := base64.NewEncoder(base64.StdEncoding, buf)
//goland:noinspection GoUnhandledErrorResult
defer encoder.Close()
if _, err := io.Copy(encoder, resp.Body); err != nil {
return "", err
}
buf.WriteString("\a")
return buf.String(), nil
}