| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 | package metadataimport (	"errors"	"image"	"image/draw"	"image/jpeg"	"image/png"	"log"	"path/filepath"	"github.com/nfnt/resize"	"imuslab.com/arozos/mod/filesystem")/*	Generate folder thumbnail from the containing files	The preview is generated by overlapping 2 - 3 layers of images*/func generateThumbnailForFolder(fsh *filesystem.FileSystemHandler, cacheFolder string, file string, generateOnly bool) (string, error) {	if fsh.RequireBuffer {		return "", nil	}	fshAbs := fsh.FileSystemAbstraction	//Check if this folder has cache image folder	cacheFolderInsideThisFolder := filepath.Join(file, "/.metadata/.cache")	if !fshAbs.FileExists(cacheFolderInsideThisFolder) {		//This folder do not have a cache folder		return "", errors.New("No previewable files")	}	//Load the base template	if !fshAbs.FileExists("web/img/system/folder-preview.png") {		//Missing system files. Skip rendering		return "", errors.New("Missing system template image file")	}	image1, err := fshAbs.Open("web/img/system/folder-preview.png")	if err != nil {		return "", err	}	baseTemplate, err := png.Decode(image1)	if err != nil {		return "", err	}	image1.Close()	//Generate the base image	b := baseTemplate.Bounds()	resultThumbnail := image.NewRGBA(b)	draw.Draw(resultThumbnail, b, baseTemplate, image.ZP, draw.Over)	//Get cached file inside this folder, only include jpg (non folder)	contentCache, _ := fshAbs.Glob(filepath.Join(cacheFolderInsideThisFolder, "/*.jpg"))	//Check if there are more than 1 file inside this folder that is cached	if len(contentCache) > 1 {		//More than 1 files. Render the image at the back		image2, err := fshAbs.Open(contentCache[1])		if err != nil {			return "", err		}		backImage, err := jpeg.Decode(image2)		if err != nil {			return "", err		}		backImgOffset := image.Pt(155, 110)		defer image2.Close()		resizedBackImg := resize.Resize(250, 250, backImage, resize.Lanczos3)		draw.Draw(resultThumbnail, resizedBackImg.Bounds().Add(backImgOffset), resizedBackImg, image.ZP, draw.Over)	} else {		//Nothing to preview inside this folder		return "", errors.New("No previewable files")	}	//Render the top image	image3, err := fshAbs.Open(contentCache[0])	if err != nil {		return "", errors.New("failed to open: " + err.Error())	}	topImage, err := jpeg.Decode(image3)	if err != nil {		//Fail to decode the image. Try to remove the damaged iamge file		image3.Close()		fshAbs.Remove(contentCache[0])		log.Println("Failed to decode cahce image for: " + contentCache[0] + ". Removing thumbnail cache")		return "", errors.New("failed to decode: " + err.Error())	}	defer image3.Close()	topImageOffset := image.Pt(210, 210)	resizedTopImage := resize.Resize(260, 260, topImage, resize.Lanczos3)	draw.Draw(resultThumbnail, resizedTopImage.Bounds().Add(topImageOffset), resizedTopImage, image.ZP, draw.Over)	outfile, err := fshAbs.Create(filepath.Join(cacheFolder, filepath.Base(file)+".png"))	if err != nil {		log.Fatalf("failed to create: %s", err)	}	png.Encode(outfile, resultThumbnail)	outfile.Close()	ctx, err := getImageAsBase64(fsh, cacheFolder+filepath.Base(file)+".png")	return ctx, err}
 |