folder.go 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package metadata
  2. import (
  3. "errors"
  4. "image"
  5. "image/draw"
  6. "image/jpeg"
  7. "image/png"
  8. "log"
  9. "os"
  10. "path/filepath"
  11. "github.com/nfnt/resize"
  12. )
  13. /*
  14. Generate folder thumbnail from the containing files
  15. The preview is generated by overlapping 2 - 3 layers of images
  16. */
  17. func generateThumbnailForFolder(cacheFolder string, file string, generateOnly bool) (string, error) {
  18. //Check if this folder has cache image folder
  19. cacheFolderInsideThisFolder := filepath.Join(file, "/.cache")
  20. if !fileExists(cacheFolderInsideThisFolder) {
  21. //This folder do not have a cache folder
  22. return "", errors.New("No previewable files")
  23. }
  24. //Load the base template
  25. if !fileExists("web/img/system/folder-preview.png") {
  26. //Missing system files. Skip rendering
  27. return "", errors.New("Missing system template image file")
  28. }
  29. image1, err := os.Open("web/img/system/folder-preview.png")
  30. if err != nil {
  31. return "", err
  32. }
  33. baseTemplate, err := png.Decode(image1)
  34. if err != nil {
  35. return "", err
  36. }
  37. image1.Close()
  38. //Generate the base image
  39. b := baseTemplate.Bounds()
  40. resultThumbnail := image.NewRGBA(b)
  41. draw.Draw(resultThumbnail, b, baseTemplate, image.ZP, draw.Over)
  42. //Get cached file inside this folder
  43. contentCache, _ := filepath.Glob(filepath.Join(cacheFolderInsideThisFolder, "/*.jpg"))
  44. //Check if there are more than 1 file inside this folder that is cached
  45. if len(contentCache) > 1 {
  46. //More than 1 files. Render the image at the back
  47. image2, err := os.Open(contentCache[1])
  48. if err != nil {
  49. return "", err
  50. }
  51. backImage, err := jpeg.Decode(image2)
  52. if err != nil {
  53. return "", err
  54. }
  55. backImgOffset := image.Pt(155, 110)
  56. defer image2.Close()
  57. resizedBackImg := resize.Resize(250, 250, backImage, resize.Lanczos3)
  58. draw.Draw(resultThumbnail, resizedBackImg.Bounds().Add(backImgOffset), resizedBackImg, image.ZP, draw.Over)
  59. } else if len(contentCache) == 0 {
  60. //Nothing to preview inside this folder
  61. return "", errors.New("No previewable files")
  62. }
  63. //Render the top image
  64. image3, err := os.Open(contentCache[0])
  65. if err != nil {
  66. log.Fatalf("failed to open: %s", err)
  67. }
  68. topImage, err := jpeg.Decode(image3)
  69. if err != nil {
  70. log.Fatalf("failed to decode: %s", err)
  71. }
  72. defer image3.Close()
  73. topImageOffset := image.Pt(210, 210)
  74. resizedTopImage := resize.Resize(260, 260, topImage, resize.Lanczos3)
  75. draw.Draw(resultThumbnail, resizedTopImage.Bounds().Add(topImageOffset), resizedTopImage, image.ZP, draw.Over)
  76. outfile, err := os.Create(filepath.Join(cacheFolder, filepath.Base(file)+".png"))
  77. if err != nil {
  78. log.Fatalf("failed to create: %s", err)
  79. }
  80. png.Encode(outfile, resultThumbnail)
  81. outfile.Close()
  82. ctx, err := getImageAsBase64(cacheFolder + filepath.Base(file) + ".png")
  83. return ctx, err
  84. }