Browse Source

feat: add params compress video

pull/15/head
Aldino Kemal 4 years ago
parent
commit
dd601e420a
  1. 2
      src/cmd/root.go
  2. 2
      src/config/settings.go
  3. 36
      src/services/send_service_impl.go
  4. 1
      src/structs/send_struct.go
  5. 8
      src/utils/general.go
  6. 12
      src/validations/send_validation.go

2
src/cmd/root.go

@ -49,7 +49,7 @@ func runRest(cmd *cobra.Command, args []string) {
engine := html.NewFileSystem(pkger.Dir("/views"), ".html") engine := html.NewFileSystem(pkger.Dir("/views"), ".html")
app := fiber.New(fiber.Config{ app := fiber.New(fiber.Config{
Views: engine, Views: engine,
BodyLimit: 30 * 1024 * 1024,
BodyLimit: 50 * 1024 * 1024,
}) })
app.Static("/statics", "./statics") app.Static("/statics", "./statics")
app.Use(middleware.Recovery()) app.Use(middleware.Recovery())

2
src/config/settings.go

@ -13,6 +13,6 @@ var (
WhatsappLogLevel string = "ERROR" WhatsappLogLevel string = "ERROR"
WhatsappAutoReplyMessage string WhatsappAutoReplyMessage string
WhatsappSettingMaxFileSize int64 = 10240000 // 10MB
WhatsappSettingMaxFileSize int64 = 30000000 // 10MB
WhatsappSettingMaxVideoSize int64 = 30000000 // 30MB WhatsappSettingMaxVideoSize int64 = 30000000 // 30MB
) )

36
src/services/send_service_impl.go

@ -163,6 +163,12 @@ func (service SendServiceImpl) SendFile(c *fiber.Ctx, request structs.SendFileRe
func (service SendServiceImpl) SendVideo(c *fiber.Ctx, request structs.SendVideoRequest) (response structs.SendVideoResponse, err error) { func (service SendServiceImpl) SendVideo(c *fiber.Ctx, request structs.SendVideoRequest) (response structs.SendVideoResponse, err error) {
utils.MustLogin(service.WaCli) utils.MustLogin(service.WaCli)
var (
videoPath string
videoThumbnail string
deletedItems []string
)
generateUUID := fiberUtils.UUIDv4() generateUUID := fiberUtils.UUIDv4()
// Save video to server // Save video to server
oriVideoPath := fmt.Sprintf("%s/%s", config.PathSendItems, generateUUID+request.Video.Filename) oriVideoPath := fmt.Sprintf("%s/%s", config.PathSendItems, generateUUID+request.Video.Filename)
@ -171,16 +177,12 @@ func (service SendServiceImpl) SendVideo(c *fiber.Ctx, request structs.SendVideo
return response, err return response, err
} }
compresVideoPath := fmt.Sprintf("%s/%s", config.PathSendItems, generateUUID+".mp4")
// Compress video with ffmpeg
cmdCompress := exec.Command("ffmpeg", "-i", oriVideoPath, "-strict", "-2", compresVideoPath)
err = cmdCompress.Run()
utils.PanicIfNeeded(err, "error when compress video")
// Get thumbnail video with ffmpeg // Get thumbnail video with ffmpeg
thumbnailVideoPath := fmt.Sprintf("%s/%s", config.PathSendItems, generateUUID+".png") thumbnailVideoPath := fmt.Sprintf("%s/%s", config.PathSendItems, generateUUID+".png")
cmdThumbnail := exec.Command("ffmpeg", "-i", oriVideoPath, "-ss", "00:00:01.000", "-vframes", "1", thumbnailVideoPath) cmdThumbnail := exec.Command("ffmpeg", "-i", oriVideoPath, "-ss", "00:00:01.000", "-vframes", "1", thumbnailVideoPath)
err = cmdThumbnail.Run() err = cmdThumbnail.Run()
utils.PanicIfNeeded(err, "error when getting thumbnail") utils.PanicIfNeeded(err, "error when getting thumbnail")
// Resize Thumbnail // Resize Thumbnail
openImageBuffer, err := bimg.Read(thumbnailVideoPath) openImageBuffer, err := bimg.Read(thumbnailVideoPath)
resize, err := bimg.NewImage(openImageBuffer).Thumbnail(100) resize, err := bimg.NewImage(openImageBuffer).Thumbnail(100)
@ -193,12 +195,30 @@ func (service SendServiceImpl) SendVideo(c *fiber.Ctx, request structs.SendVideo
return response, err return response, err
} }
deletedItems = append(deletedItems, thumbnailVideoPath)
deletedItems = append(deletedItems, thumbnailResizeVideoPath)
videoThumbnail = thumbnailResizeVideoPath
if request.Compress {
compresVideoPath := fmt.Sprintf("%s/%s", config.PathSendItems, generateUUID+".mp4")
// Compress video with ffmpeg
cmdCompress := exec.Command("ffmpeg", "-i", oriVideoPath, "-strict", "-2", compresVideoPath)
err = cmdCompress.Run()
utils.PanicIfNeeded(err, "error when compress video")
videoPath = compresVideoPath
deletedItems = append(deletedItems, compresVideoPath)
} else {
videoPath = oriVideoPath
deletedItems = append(deletedItems, oriVideoPath)
}
//Send to WA server //Send to WA server
dataWaRecipient, ok := utils.ParseJID(request.Phone) dataWaRecipient, ok := utils.ParseJID(request.Phone)
if !ok { if !ok {
return response, errors.New("invalid JID " + request.Phone) return response, errors.New("invalid JID " + request.Phone)
} }
dataWaVideo, err := os.ReadFile(oriVideoPath)
dataWaVideo, err := os.ReadFile(videoPath)
if err != nil { if err != nil {
return response, err return response, err
} }
@ -207,7 +227,7 @@ func (service SendServiceImpl) SendVideo(c *fiber.Ctx, request structs.SendVideo
fmt.Printf("Failed to upload file: %v", err) fmt.Printf("Failed to upload file: %v", err)
return response, err return response, err
} }
dataWaThumbnail, err := os.ReadFile(thumbnailResizeVideoPath)
dataWaThumbnail, err := os.ReadFile(videoThumbnail)
if err != nil { if err != nil {
return response, err return response, err
} }
@ -226,7 +246,7 @@ func (service SendServiceImpl) SendVideo(c *fiber.Ctx, request structs.SendVideo
}} }}
ts, err := service.WaCli.SendMessage(dataWaRecipient, "", msg) ts, err := service.WaCli.SendMessage(dataWaRecipient, "", msg)
go func() { go func() {
errDelete := utils.RemoveFile(0, oriVideoPath, compresVideoPath, thumbnailVideoPath, thumbnailResizeVideoPath)
errDelete := utils.RemoveFile(0, deletedItems...)
if errDelete != nil { if errDelete != nil {
fmt.Println(errDelete) fmt.Println(errDelete)
} }

1
src/structs/send_struct.go

@ -47,6 +47,7 @@ type SendVideoRequest struct {
Video *multipart.FileHeader `json:"video" form:"video"` Video *multipart.FileHeader `json:"video" form:"video"`
Type SendType `json:"type" form:"message"` Type SendType `json:"type" form:"message"`
ViewOnce bool `json:"view_once" form:"view_once"` ViewOnce bool `json:"view_once" form:"view_once"`
Compress bool `json:"compress"`
} }
type SendVideoResponse struct { type SendVideoResponse struct {

8
src/utils/general.go

@ -13,9 +13,11 @@ func RemoveFile(delaySecond int, paths ...string) error {
} }
for _, path := range paths { for _, path := range paths {
err := os.Remove(path)
if err != nil {
return err
if path != "" {
err := os.Remove(path)
if err != nil {
return err
}
} }
} }
return nil return nil

12
src/validations/send_validation.go

@ -81,6 +81,18 @@ func ValidateSendVideo(request structs.SendVideoRequest) {
}) })
} }
availableMimes := map[string]bool{
"video/mp4": true,
"video/x-matroska": true,
"video/avi": true,
}
if !availableMimes[request.Video.Header.Get("Content-Type")] {
panic(utils.ValidationError{
Message: "your video type is not allowed. please use mp4/mkv",
})
}
if request.Video.Size > config.WhatsappSettingMaxVideoSize { // 30MB if request.Video.Size > config.WhatsappSettingMaxVideoSize { // 30MB
maxSizeString := humanize.Bytes(uint64(config.WhatsappSettingMaxVideoSize)) maxSizeString := humanize.Bytes(uint64(config.WhatsappSettingMaxVideoSize))
panic(utils.ValidationError{ panic(utils.ValidationError{

Loading…
Cancel
Save