watermark_data.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package main
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/base64"
  6. "fmt"
  7. "io/ioutil"
  8. "os"
  9. )
  10. type watermarkData struct {
  11. data []byte
  12. imgtype imageType
  13. }
  14. func getWatermarkData() (*watermarkData, error) {
  15. if len(conf.WatermarkData) > 0 {
  16. data, imgtype, err := base64WatermarkData()
  17. if err != nil {
  18. return nil, err
  19. }
  20. return &watermarkData{data, imgtype}, err
  21. }
  22. if len(conf.WatermarkPath) > 0 {
  23. data, imgtype, err := fileWatermarkData()
  24. if err != nil {
  25. return nil, err
  26. }
  27. return &watermarkData{data, imgtype}, err
  28. }
  29. if len(conf.WatermarkURL) > 0 {
  30. b, imgtype, cancel, err := remoteWatermarkData()
  31. defer cancel()
  32. if err != nil {
  33. return nil, err
  34. }
  35. data := make([]byte, len(b))
  36. copy(data, b)
  37. return &watermarkData{data, imgtype}, err
  38. }
  39. return nil, nil
  40. }
  41. func base64WatermarkData() ([]byte, imageType, error) {
  42. data, err := base64.StdEncoding.DecodeString(conf.WatermarkData)
  43. if err != nil {
  44. return nil, imageTypeUnknown, fmt.Errorf("Can't decode watermark data: %s", err)
  45. }
  46. imgtype, err := checkTypeAndDimensions(bytes.NewReader(data))
  47. if err != nil {
  48. return nil, imageTypeUnknown, fmt.Errorf("Can't decode watermark: %s", err)
  49. }
  50. return data, imgtype, nil
  51. }
  52. func fileWatermarkData() ([]byte, imageType, error) {
  53. f, err := os.Open(conf.WatermarkPath)
  54. if err != nil {
  55. return nil, imageTypeUnknown, fmt.Errorf("Can't read watermark: %s", err)
  56. }
  57. imgtype, err := checkTypeAndDimensions(f)
  58. if err != nil {
  59. return nil, imageTypeUnknown, fmt.Errorf("Can't decode watermark: %s", err)
  60. }
  61. // Return to the beginning of the file
  62. f.Seek(0, 0)
  63. data, err := ioutil.ReadAll(f)
  64. if err != nil {
  65. return nil, imageTypeUnknown, fmt.Errorf("Can't read watermark: %s", err)
  66. }
  67. return data, imgtype, nil
  68. }
  69. func remoteWatermarkData() ([]byte, imageType, context.CancelFunc, error) {
  70. ctx := context.WithValue(context.Background(), imageURLCtxKey, conf.WatermarkURL)
  71. ctx, cancel, err := downloadImage(ctx)
  72. if err != nil {
  73. return nil, imageTypeUnknown, cancel, fmt.Errorf("Can't download watermark: %s", err)
  74. }
  75. return getImageData(ctx).Bytes(), getImageType(ctx), cancel, err
  76. }