diff --git a/src/cmd/root.go b/src/cmd/root.go index 9489527..f4d9717 100644 --- a/src/cmd/root.go +++ b/src/cmd/root.go @@ -49,7 +49,7 @@ func runRest(cmd *cobra.Command, args []string) { engine := html.NewFileSystem(pkger.Dir("/views"), ".html") app := fiber.New(fiber.Config{ Views: engine, - BodyLimit: 30 * 1024 * 1024, + BodyLimit: 50 * 1024 * 1024, }) app.Static("/statics", "./statics") app.Use(middleware.Recovery()) diff --git a/src/config/settings.go b/src/config/settings.go index 9b438a9..b78f726 100644 --- a/src/config/settings.go +++ b/src/config/settings.go @@ -13,6 +13,6 @@ var ( WhatsappLogLevel string = "ERROR" WhatsappAutoReplyMessage string - WhatsappSettingMaxFileSize int64 = 10240000 // 10MB + WhatsappSettingMaxFileSize int64 = 30000000 // 10MB WhatsappSettingMaxVideoSize int64 = 30000000 // 30MB ) diff --git a/src/services/send_service_impl.go b/src/services/send_service_impl.go index 145e590..8ee73b9 100644 --- a/src/services/send_service_impl.go +++ b/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) { utils.MustLogin(service.WaCli) + var ( + videoPath string + videoThumbnail string + deletedItems []string + ) + generateUUID := fiberUtils.UUIDv4() // Save video to server 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 } - 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 thumbnailVideoPath := fmt.Sprintf("%s/%s", config.PathSendItems, generateUUID+".png") cmdThumbnail := exec.Command("ffmpeg", "-i", oriVideoPath, "-ss", "00:00:01.000", "-vframes", "1", thumbnailVideoPath) err = cmdThumbnail.Run() utils.PanicIfNeeded(err, "error when getting thumbnail") + // Resize Thumbnail openImageBuffer, err := bimg.Read(thumbnailVideoPath) resize, err := bimg.NewImage(openImageBuffer).Thumbnail(100) @@ -193,12 +195,30 @@ func (service SendServiceImpl) SendVideo(c *fiber.Ctx, request structs.SendVideo 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 dataWaRecipient, ok := utils.ParseJID(request.Phone) if !ok { return response, errors.New("invalid JID " + request.Phone) } - dataWaVideo, err := os.ReadFile(oriVideoPath) + dataWaVideo, err := os.ReadFile(videoPath) if err != nil { 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) return response, err } - dataWaThumbnail, err := os.ReadFile(thumbnailResizeVideoPath) + dataWaThumbnail, err := os.ReadFile(videoThumbnail) if err != nil { return response, err } @@ -226,7 +246,7 @@ func (service SendServiceImpl) SendVideo(c *fiber.Ctx, request structs.SendVideo }} ts, err := service.WaCli.SendMessage(dataWaRecipient, "", msg) go func() { - errDelete := utils.RemoveFile(0, oriVideoPath, compresVideoPath, thumbnailVideoPath, thumbnailResizeVideoPath) + errDelete := utils.RemoveFile(0, deletedItems...) if errDelete != nil { fmt.Println(errDelete) } diff --git a/src/structs/send_struct.go b/src/structs/send_struct.go index d283d60..a54dc23 100644 --- a/src/structs/send_struct.go +++ b/src/structs/send_struct.go @@ -47,6 +47,7 @@ type SendVideoRequest struct { Video *multipart.FileHeader `json:"video" form:"video"` Type SendType `json:"type" form:"message"` ViewOnce bool `json:"view_once" form:"view_once"` + Compress bool `json:"compress"` } type SendVideoResponse struct { diff --git a/src/utils/general.go b/src/utils/general.go index 322f959..639fc2e 100644 --- a/src/utils/general.go +++ b/src/utils/general.go @@ -13,9 +13,11 @@ func RemoveFile(delaySecond int, paths ...string) error { } 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 diff --git a/src/validations/send_validation.go b/src/validations/send_validation.go index b0d09df..6e35d94 100644 --- a/src/validations/send_validation.go +++ b/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 maxSizeString := humanize.Bytes(uint64(config.WhatsappSettingMaxVideoSize)) panic(utils.ValidationError{