media_box.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package media_library
  2. import (
  3. "database/sql/driver"
  4. "encoding/json"
  5. "fmt"
  6. "path"
  7. "strings"
  8. "github.com/qor5/admin/media"
  9. )
  10. const (
  11. ALLOW_TYPE_FILE = "file"
  12. ALLOW_TYPE_IMAGE = "image"
  13. ALLOW_TYPE_VIDEO = "video"
  14. )
  15. type MediaBox struct {
  16. ID json.Number
  17. Url string
  18. VideoLink string
  19. FileName string
  20. Description string
  21. FileSizes map[string]int `json:",omitempty"`
  22. // for default image
  23. Width int `json:",omitempty"`
  24. Height int `json:",omitempty"`
  25. }
  26. // MediaBoxConfig configure MediaBox metas
  27. type MediaBoxConfig struct {
  28. Sizes map[string]*media.Size
  29. Max uint
  30. AllowType string
  31. }
  32. func (mediaBox *MediaBox) Scan(data interface{}) (err error) {
  33. switch values := data.(type) {
  34. case []byte:
  35. if len(values) > 0 {
  36. return json.Unmarshal(values, mediaBox)
  37. }
  38. case string:
  39. return mediaBox.Scan([]byte(values))
  40. }
  41. return nil
  42. }
  43. func (mediaBox MediaBox) Value() (driver.Value, error) {
  44. if mediaBox.ID.String() == "0" || mediaBox.ID.String() == "" {
  45. return nil, nil
  46. }
  47. results, err := json.Marshal(mediaBox)
  48. return string(results), err
  49. }
  50. // IsImage return if it is an image
  51. func (mediaBox *MediaBox) IsImage() bool {
  52. return media.IsImageFormat(mediaBox.Url)
  53. }
  54. func (mediaBox *MediaBox) IsVideo() bool {
  55. return media.IsVideoFormat(mediaBox.Url)
  56. }
  57. func (mediaBox *MediaBox) IsSVG() bool {
  58. return media.IsSVGFormat(mediaBox.Url)
  59. }
  60. func (mediaBox *MediaBox) URL(styles ...string) string {
  61. if mediaBox.Url != "" && len(styles) > 0 {
  62. ext := path.Ext(mediaBox.Url)
  63. return fmt.Sprintf("%v.%v%v", strings.TrimSuffix(mediaBox.Url, ext), styles[0], ext)
  64. }
  65. return mediaBox.Url
  66. }
  67. func (mediaBox MediaBox) WebpURL(styles ...string) string {
  68. url := mediaBox.URL(styles...)
  69. ext := path.Ext(url)
  70. extArr := strings.Split(ext, "?")
  71. i := strings.LastIndex(url, ext)
  72. return url[:i] + strings.Replace(url[i:], extArr[0], ".webp", 1)
  73. }