Skip to content

Commit 12dacd2

Browse files
committed
Auto fix MU1 file duration
1 parent 8c59761 commit 12dacd2

File tree

4 files changed

+113
-0
lines changed

4 files changed

+113
-0
lines changed

activities/transcode.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,3 +468,38 @@ func (va VideoActivities) TranscodeToHAPActivity(ctx context.Context, input HAPI
468468
OutputPath: paths.MustParse(transcodeResult.OutputPath),
469469
}, nil
470470
}
471+
472+
type FixDurationInput struct {
473+
InputPath paths.Path
474+
OutputPath paths.Path
475+
}
476+
477+
type FixDurationResult struct {
478+
OutputPath paths.Path
479+
}
480+
481+
func (va VideoActivities) FixDurationActivity(ctx context.Context, input FixDurationInput) (*FixDurationResult, error) {
482+
log := activity.GetLogger(ctx)
483+
activity.RecordHeartbeat(ctx, "FixDuration")
484+
log.Info("Starting FixDurationActivity")
485+
486+
stop, progressCallback := registerProgressCallback(ctx)
487+
defer close(stop)
488+
489+
args := []string{
490+
"-i", input.InputPath.Local(),
491+
"-c:v", "copy",
492+
"-c:a", "copy",
493+
"-map", "0",
494+
input.OutputPath.Local(),
495+
}
496+
497+
_, err := ffmpeg.Do(args, ffmpeg.StreamInfo{}, progressCallback)
498+
if err != nil {
499+
return nil, err
500+
}
501+
502+
return &FixDurationResult{
503+
OutputPath: input.OutputPath,
504+
}, nil
505+
}

workflows/ingest/incremental_ingest.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,19 @@ func doIncremental(ctx workflow.Context, params IncrementalParams) error {
282282
NotificationChannel: &telegram.ChatOther,
283283
})
284284

285+
// Fix duration metadata issues
286+
fixDurationFuture := workflow.ExecuteChildWorkflow(ctx, miscworkflows.FixDurationVX, miscworkflows.FixDurationVXInput{
287+
VXID: videoVXID,
288+
})
289+
290+
// Handle errors in background
291+
workflow.Go(ctx, func(ctx workflow.Context) {
292+
err := fixDurationFuture.Get(ctx, nil)
293+
if err != nil {
294+
wfutils.SendTelegramText(ctx, telegram.ChatOther, fmt.Sprintf("🟥 Duration fix failed for %s: %v", videoVXID, err))
295+
}
296+
})
297+
285298
_ = wfutils.Execute(ctx, activities.Vidispine.CreateThumbnailsActivity, vsactivity.CreateThumbnailsParams{
286299
AssetID: videoVXID,
287300
}).Get(ctx, nil)

workflows/misc/fix_duration.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package miscworkflows
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/bcc-code/bcc-media-flows/activities"
7+
vsactivity "github.com/bcc-code/bcc-media-flows/activities/vidispine"
8+
"github.com/bcc-code/bcc-media-flows/services/rclone"
9+
"github.com/bcc-code/bcc-media-flows/services/telegram"
10+
wfutils "github.com/bcc-code/bcc-media-flows/utils/workflows"
11+
"go.temporal.io/sdk/workflow"
12+
)
13+
14+
type FixDurationVXInput struct {
15+
VXID string
16+
}
17+
18+
func FixDurationVX(
19+
ctx workflow.Context,
20+
params FixDurationVXInput,
21+
) error {
22+
logger := workflow.GetLogger(ctx)
23+
logger.Info("Starting FixDurationVX")
24+
25+
ctx = workflow.WithActivityOptions(ctx, wfutils.GetDefaultActivityOptions())
26+
27+
// Get the original file from Vidispine
28+
originalFile, err := wfutils.Execute(ctx, activities.Vidispine.GetFileFromVXActivity, vsactivity.GetFileFromVXParams{
29+
VXID: params.VXID,
30+
Tags: []string{"original"},
31+
}).Result(ctx)
32+
if err != nil {
33+
return fmt.Errorf("failed to get original file: %w", err)
34+
}
35+
36+
// Get temp folder for processing
37+
tempFolder, err := wfutils.GetWorkflowTempFolder(ctx)
38+
if err != nil {
39+
return fmt.Errorf("failed to get temp folder: %w", err)
40+
}
41+
42+
// Create output path in temp folder
43+
outputPath := tempFolder.Append(originalFile.FilePath.Base()).SetExt(originalFile.FilePath.Ext())
44+
45+
// Run FFmpeg to fix duration
46+
_, err = wfutils.Execute(ctx, activities.Video.FixDurationActivity, activities.FixDurationInput{
47+
InputPath: originalFile.FilePath,
48+
OutputPath: outputPath,
49+
}).Result(ctx)
50+
if err != nil {
51+
return fmt.Errorf("failed to fix duration: %w", err)
52+
}
53+
54+
// Replace the original file on disk with the fixed version
55+
err = wfutils.MoveFile(ctx, outputPath, originalFile.FilePath, rclone.PriorityNormal)
56+
if err != nil {
57+
return fmt.Errorf("failed to replace original file: %w", err)
58+
}
59+
60+
wfutils.SendTelegramText(ctx, telegram.ChatOther, fmt.Sprintf("✅ Duration fix completed for %s", params.VXID))
61+
62+
return nil
63+
}

workflows/workflows.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ var TriggerableWorkflows = []any{
2424
miscworkflows.MergeAndImportSubtitlesFromCSV,
2525
miscworkflows.UpdateAssetRelations,
2626
miscworkflows.NormalizeAudioLevelWorkflow,
27+
miscworkflows.FixDurationVX,
2728
miscworkflows.MoveMBFile,
2829
miscworkflows.MoveFilesWorkerFlow,
2930
scheduled.CleanupTemp,
@@ -68,6 +69,7 @@ var WorkerWorkflows = []any{
6869
ingestworkflows.Multitrack,
6970
ingestworkflows.ImportSubtitles,
7071
miscworkflows.NormalizeAudioLevelWorkflow,
72+
miscworkflows.FixDurationVX,
7173
vb_export.VBExport,
7274
vb_export.VBExportToAbekas,
7375
vb_export.VBExportToBStage,

0 commit comments

Comments
 (0)