Files
ytdlp-site/handlers/clip.go
2024-11-06 09:32:37 -07:00

59 lines
1.2 KiB
Go

package handlers
import (
"path/filepath"
"strconv"
"ytdlp-site/config"
"ytdlp-site/database"
"ytdlp-site/ffmpeg"
"ytdlp-site/media"
"github.com/google/uuid"
"github.com/labstack/echo/v4"
)
func ClipPost(c echo.Context) error {
videoID := c.FormValue("video_id")
fromSecs, err := strconv.ParseFloat(c.FormValue("from_secs"), 64)
if err != nil {
return err
}
if fromSecs < 0 {
fromSecs = 0
}
toSecs, err := strconv.ParseFloat(c.FormValue("to_secs"), 64)
if err != nil {
return err
}
var video media.Video
err = database.Get().Where("id = ?", videoID).First(&video).Error
if err != nil {
return err
}
dstBase := uuid.Must(uuid.NewV7()).String()
dstName := dstBase + filepath.Ext(video.Filename)
dstPath := filepath.Join(config.GetDataDir(), dstName)
srcPath := filepath.Join(config.GetDataDir(), video.Filename)
log.Debugf("Clip from %s [%f-%f]", srcPath, fromSecs, toSecs)
err = ffmpeg.Clip(srcPath, dstPath, fromSecs, toSecs)
if err != nil {
return err
}
clip := media.VideoClip{
VideoFile: video.VideoFile,
OriginalID: video.OriginalID,
VideoID: video.ID,
StartMS: uint(fromSecs*1000 + 0.5),
StopMS: uint(toSecs*1000 + 0.5),
}
clip.Filename = dstName
return database.Get().Create(&clip).Error
}