59 lines
1.2 KiB
Go
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
|
|
}
|