diff --git a/CHANGELOG.md b/CHANGELOG.md index ec09ee8a..3a7884f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ bugs in actually-released versions. - Add MQTT support. Flamenco Manager can now send internal events to an MQTT broker. - Simplify the preview video filename when a complex set of frames rendered ([#104285](https://projects.blender.org/studio/flamenco/issues/104285)). Instead of `video-1, 4, 10.mp4` it is now simply `video-1-10.mp4`. +- Make the `blendfile` parameter of a `blender-render` command optional. This makes it possible to pass, for example, a Python file that loads/constructs the blend file, instead of loading one straight from disk. ## 3.4 - released 2024-01-12 diff --git a/internal/worker/command_blender.go b/internal/worker/command_blender.go index 9895e8b5..2f7af9b3 100644 --- a/internal/worker/command_blender.go +++ b/internal/worker/command_blender.go @@ -101,7 +101,12 @@ func (ce *CommandExecutor) cmdBlenderRenderCommand( cliArgs := make([]string, 0) cliArgs = append(cliArgs, parameters.argsBefore...) - cliArgs = append(cliArgs, parameters.blendfile) + if parameters.blendfile != "" { + // Only include the blendfile if the parameter is not empty. This makes it + // possible to pass a Python script that loads/constructs the blend file, + // instead of loading one explicitly here. + cliArgs = append(cliArgs, parameters.blendfile) + } cliArgs = append(cliArgs, parameters.args...) execCmd := ce.cli.CommandContext(ctx, parameters.exe, cliArgs...) if execCmd == nil { @@ -132,9 +137,9 @@ func cmdBlenderRenderParams(logger zerolog.Logger, cmd api.Command) (BlenderPara logger.Warn().Interface("command", cmd).Msg("invalid 'argsBefore' parameter") return parameters, NewParameterInvalidError("argsBefore", cmd, "cannot convert to list of strings") } - if parameters.blendfile, ok = cmdParameter[string](cmd, "blendfile"); !ok || parameters.blendfile == "" { - logger.Warn().Interface("command", cmd).Msg("missing 'blendfile' parameter") - return parameters, NewParameterMissingError("blendfile", cmd) + if parameters.blendfile, ok = cmdParameter[string](cmd, "blendfile"); !ok { + logger.Warn().Interface("command", cmd).Msg("invalid 'blendfile' parameter") + return parameters, NewParameterInvalidError("blendfile", cmd, "cannot convert to string") } if parameters.args, ok = cmdParameterAsStrings(cmd, "args"); !ok { logger.Warn().Interface("command", cmd).Msg("invalid 'args' parameter") diff --git a/internal/worker/command_blender_test.go b/internal/worker/command_blender_test.go index 0c7cac22..6b65b03b 100644 --- a/internal/worker/command_blender_test.go +++ b/internal/worker/command_blender_test.go @@ -79,6 +79,30 @@ func TestCmdBlenderCliArgsInExeParameter(t *testing.T) { assert.Equal(t, ErrNoExecCmd, err, "nil *exec.Cmd should result in ErrNoExecCmd") } +func TestCmdBlenderNoBlendfile(t *testing.T) { + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + ce, mocks := testCommandExecutor(t, mockCtrl) + + taskID := "1d54c6fe-1242-4c8f-bd63-5a09e358d7b6" + cmd := api.Command{ + Name: "blender", + Parameters: map[string]interface{}{ + "exe": "/path/to/blender", + "argsBefore": []string{"--background"}, + "blendfile": "", // Empty blendfile should be skipped. + "args": []string{"--render-output", "/frames"}, + }, + } + + cliArgs := []string{"--background", "--render-output", "/frames"} + mocks.cli.EXPECT().CommandContext(gomock.Any(), "/path/to/blender", cliArgs).Return(nil) + + err := ce.cmdBlenderRender(context.Background(), zerolog.Nop(), taskID, cmd) + assert.Equal(t, ErrNoExecCmd, err, "nil *exec.Cmd should result in ErrNoExecCmd") +} + func TestProcessLineBlender(t *testing.T) { ctx := context.Background() mockCtrl := gomock.NewController(t)