youp0m/picture.go

121 lines
2.7 KiB
Go
Raw Permalink Normal View History

2016-06-26 09:23:29 +00:00
package main
import (
"encoding/base64"
2016-06-26 09:23:29 +00:00
"errors"
"image"
_ "image/gif"
"image/jpeg"
_ "image/png"
2018-09-18 20:16:58 +00:00
"io"
2016-06-26 09:23:29 +00:00
"os"
2022-09-04 19:45:39 +00:00
"path"
2016-06-26 09:23:29 +00:00
"sort"
"time"
2016-06-26 11:01:15 +00:00
"github.com/nfnt/resize"
2016-06-26 09:23:29 +00:00
)
2022-09-04 19:45:39 +00:00
type PictureExplorer struct {
FileBackend
PublishedImgDir string
NextImgDir string
}
2016-06-26 09:23:29 +00:00
type Picture struct {
path string
basename string
Name string `json:"name"`
UploadTime time.Time `json:"upload_time"`
}
2022-09-04 19:45:39 +00:00
type ByUploadTime []*Picture
2016-06-26 09:23:29 +00:00
2018-09-18 20:16:58 +00:00
func (a ByUploadTime) Len() int { return len(a) }
2016-06-26 09:23:29 +00:00
func (a ByUploadTime) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
2018-09-18 20:16:58 +00:00
func (a ByUploadTime) Less(i, j int) bool {
return a[i].UploadTime.Sub(a[j].UploadTime).Nanoseconds() < 0
}
2016-06-26 09:23:29 +00:00
2022-09-04 19:45:39 +00:00
func (e *PictureExplorer) GetNextImages() (pictures []*Picture, err error) {
pictures, err = e.ListPictures(e.NextImgDir)
sort.Sort(ByUploadTime(pictures))
return
2016-06-26 09:23:29 +00:00
}
2022-09-04 19:45:39 +00:00
func (e *PictureExplorer) GetPublishedImages() (pictures []*Picture, err error) {
pictures, err = e.ListPictures(e.PublishedImgDir)
sort.Sort(ByUploadTime(pictures))
return
2016-06-26 09:23:29 +00:00
}
2022-09-04 19:45:39 +00:00
func (e *PictureExplorer) GetLastImage() (*Picture, error) {
picts, err := e.GetPublishedImages()
if err != nil {
return nil, err
2016-06-26 09:23:29 +00:00
}
2022-09-04 19:45:39 +00:00
return picts[len(picts)-1], nil
2016-06-26 09:23:29 +00:00
}
2022-09-04 19:45:39 +00:00
func (e *PictureExplorer) GetPublishedImage(fname string) (*Picture, error) {
return e.GetPictureInfo(e.PublishedImgDir, fname)
2016-06-26 09:23:29 +00:00
}
2022-09-04 19:45:39 +00:00
func (e *PictureExplorer) GetNextImage(fname string) (*Picture, error) {
return e.GetPictureInfo(e.NextImgDir, fname)
2016-06-26 09:23:29 +00:00
}
2022-09-04 19:45:39 +00:00
func (e *PictureExplorer) IsUniqueName(filename string) bool {
if pict, _ := e.GetPublishedImage(filename); pict != nil {
return false
}
if pict, _ := e.GetNextImage(filename); pict != nil {
2016-06-26 09:23:29 +00:00
return false
}
2022-09-04 19:45:39 +00:00
return true
2016-06-26 09:23:29 +00:00
}
2022-09-04 19:45:39 +00:00
func (e *PictureExplorer) AddImage(filename string, blob io.ReadCloser) error {
2016-06-26 09:23:29 +00:00
// Check the name is not already used
2022-09-04 19:45:39 +00:00
if ok := e.IsUniqueName(filename); !ok {
2016-06-26 09:23:29 +00:00
return errors.New("This filename is already used, please choose another one.")
2022-09-04 19:45:39 +00:00
}
2016-06-26 09:23:29 +00:00
2022-09-04 19:45:39 +00:00
// Convert to JPEG
img, _, err := image.Decode(base64.NewDecoder(base64.StdEncoding, blob))
if err != nil {
2016-06-26 09:23:29 +00:00
return err
2022-09-04 19:45:39 +00:00
}
2016-06-26 09:23:29 +00:00
2022-09-04 19:45:39 +00:00
// Save file
if err := e.PutPicture(e.NextImgDir, filename, &img); err != nil {
2016-06-26 09:23:29 +00:00
return err
}
2016-06-26 11:01:15 +00:00
2022-09-04 19:45:39 +00:00
thumb := resize.Thumbnail(300, 185, img, resize.Lanczos3)
2016-06-26 09:23:29 +00:00
2022-09-04 19:45:39 +00:00
// Save thumbnail
fw, err := os.Create(path.Join(ThumbsDir, filename+".jpg"))
if err != nil {
2016-06-26 09:23:29 +00:00
return err
}
2022-09-04 19:45:39 +00:00
defer fw.Close()
return jpeg.Encode(fw, thumb, nil)
2016-06-26 09:23:29 +00:00
}
2022-09-04 19:45:39 +00:00
func (e *PictureExplorer) Publish(p *Picture) error {
return e.MovePicture(e.NextImgDir, e.PublishedImgDir, p.Name)
2016-06-26 09:23:29 +00:00
}
2022-09-04 19:45:39 +00:00
func (e *PictureExplorer) Unpublish(p *Picture) error {
return e.MovePicture(e.PublishedImgDir, e.NextImgDir, p.Name)
}
func (e *PictureExplorer) Remove(p *Picture) error {
return e.DeletePicture(path.Dir(p.path), p.Name)
2016-06-26 09:23:29 +00:00
}