diff --git a/backend/modules/tasks/discover/discover_medias.go b/backend/modules/tasks/discover/discover_medias.go index 8d103a6..092508c 100644 --- a/backend/modules/tasks/discover/discover_medias.go +++ b/backend/modules/tasks/discover/discover_medias.go @@ -16,6 +16,7 @@ import ( "github.com/google/uuid" "github.com/pkg/errors" log "github.com/sirupsen/logrus" + "github.com/spf13/cast" ) // @provider @@ -268,3 +269,27 @@ func (d *DiscoverMedias) getPrice(dir string) (uint, error) { return uint(p), nil } + +// getMediaDuration get the duration of a media file +func (d *DiscoverMedias) getMediaDuration(file string) (float64, error) { + // ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input_video.mp4 + args := []string{ + "-v", "error", + "-show_entries", "format=duration", + "-of", "default=noprint_wrappers=1:nokey=1", + file, + } + + log.Infof("cmd: ffprobe %s", strings.Join(args, " ")) + out, err := exec.Command("ffprobe", args...).CombinedOutput() + if err != nil { + return 0, errors.Wrapf(err, "get media duration: %s", file) + } + + duration, err := cast.ToFloat64E(strings.TrimSpace(string(out))) + if err != nil { + return 0, errors.Wrapf(err, "get media duration: %s", file) + } + + return duration, nil +} diff --git a/backend/modules/tasks/discover/discover_medias_test.go b/backend/modules/tasks/discover/discover_medias_test.go index 23eadc2..977c289 100644 --- a/backend/modules/tasks/discover/discover_medias_test.go +++ b/backend/modules/tasks/discover/discover_medias_test.go @@ -74,3 +74,11 @@ func (t *DiscoverMediasTestSuite) Test_item() { } }) } + +func (t *DiscoverMediasTestSuite) TestDiscoverMedias_getMediaDuration() { + Convey("TestDiscoverMedias_getMediaDuration", t.T(), func() { + duration, err := t.Svc.getMediaDuration("/projects/mp-qvyun/backend/fixtures/medias/video.mp4") + So(err, ShouldBeNil) + t.T().Logf("Duration: %0.8f", duration) + }) +}