Skip to content

Commit 898f6bc

Browse files
committed
CLI: Improve "photoprism video" subcommands
Signed-off-by: Michael Mayer <[email protected]>
1 parent 4b8c41b commit 898f6bc

File tree

9 files changed

+61
-19
lines changed

9 files changed

+61
-19
lines changed

internal/commands/commands.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ var PhotoPrism = []*cli.Command{
5656
StatusCommand,
5757
IndexCommand,
5858
FindCommand,
59-
VideoCommands,
6059
ImportCommand,
6160
CopyCommand,
6261
DownloadCommand,
@@ -69,6 +68,7 @@ var PhotoPrism = []*cli.Command{
6968
MomentsCommand,
7069
ConvertCommand,
7170
ThumbsCommand,
71+
VideosCommands,
7272
MigrateCommand,
7373
MigrationsCommands,
7474
BackupCommand,

internal/commands/video_info.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ var VideoInfoCommand = &cli.Command{
3434
func videoInfoAction(ctx *cli.Context) error {
3535
return CallWithDependencies(ctx, func(conf *config.Config) error {
3636
filter := videoNormalizeFilter(ctx.Args().Slice())
37-
results, err := videoSearchResults(filter, ctx.Uint(videoCountFlag.Name), ctx.Int(OffsetFlag.Name), false)
37+
results, err := videoSearchResults(filter, ctx.Int(videoCountFlag.Name), ctx.Int(OffsetFlag.Name), false)
3838
if err != nil {
3939
return err
4040
}

internal/commands/video_ls.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ func videoListAction(ctx *cli.Context) error {
3838
filter := videoNormalizeFilter(ctx.Args().Slice())
3939
includeSidecar := ctx.Bool(videoIncludeSidecarFlag.Name)
4040

41-
results, err := videoSearchResults(filter, ctx.Uint(videoCountFlag.Name), ctx.Int(OffsetFlag.Name), includeSidecar)
41+
results, err := videoSearchResults(filter, ctx.Int(videoCountFlag.Name), ctx.Int(OffsetFlag.Name), includeSidecar)
4242
if err != nil {
4343
return err
4444
}

internal/commands/video_remux.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func videoRemuxAction(ctx *cli.Context) error {
4545
}
4646

4747
filter := videoNormalizeFilter(ctx.Args().Slice())
48-
results, err := videoSearchResults(filter, ctx.Uint(videoCountFlag.Name), ctx.Int(OffsetFlag.Name), false)
48+
results, err := videoSearchResults(filter, ctx.Int(videoCountFlag.Name), ctx.Int(OffsetFlag.Name), false)
4949
if err != nil {
5050
return err
5151
}

internal/commands/video_search.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ import (
77
)
88

99
// videoSearchResults runs a video-only search and applies offset/count after sidecar filtering.
10-
func videoSearchResults(query string, count uint, offset int, includeSidecar bool) ([]search.Photo, error) {
10+
func videoSearchResults(query string, count int, offset int, includeSidecar bool) ([]search.Photo, error) {
1111
if offset < 0 {
1212
offset = 0
1313
}
1414

15-
if count == 0 {
15+
if count <= 0 {
1616
return []search.Photo{}, nil
1717
}
1818

@@ -25,20 +25,20 @@ func videoSearchResults(query string, count uint, offset int, includeSidecar boo
2525
}
2626

2727
if includeSidecar {
28-
frm.Count = int(count)
28+
frm.Count = count
2929
frm.Offset = offset
3030
results, _, err := search.Photos(frm)
3131
return results, err
3232
}
3333

34-
target := int(count) + offset
34+
target := count + offset
3535
if target < 0 {
3636
target = 0
3737
}
3838

3939
collected := make([]search.Photo, 0, target)
4040
searchOffset := 0
41-
batchSize := int(count)
41+
batchSize := count
4242
if batchSize < 200 {
4343
batchSize = 200
4444
}
@@ -73,7 +73,7 @@ func videoSearchResults(query string, count uint, offset int, includeSidecar boo
7373
return []search.Photo{}, nil
7474
}
7575

76-
end := offset + int(count)
76+
end := offset + count
7777
if end > len(collected) {
7878
end = len(collected)
7979
}

internal/commands/video_transcode.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func videoTranscodeAction(ctx *cli.Context) error {
3939
}
4040

4141
filter := videoNormalizeFilter(ctx.Args().Slice())
42-
results, err := videoSearchResults(filter, ctx.Uint(videoCountFlag.Name), ctx.Int(OffsetFlag.Name), false)
42+
results, err := videoSearchResults(filter, ctx.Int(videoCountFlag.Name), ctx.Int(OffsetFlag.Name), false)
4343
if err != nil {
4444
return err
4545
}

internal/commands/video_trim.go

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ func videoTrimAction(ctx *cli.Context) error {
5454
}
5555

5656
filter := videoNormalizeFilter(filterArgs)
57-
results, err := videoSearchResults(filter, ctx.Uint(videoCountFlag.Name), ctx.Int(OffsetFlag.Name), false)
57+
results, err := videoSearchResults(filter, ctx.Int(videoCountFlag.Name), ctx.Int(OffsetFlag.Name), false)
5858
if err != nil {
5959
return err
6060
}
@@ -216,14 +216,24 @@ func videoTrimFile(conf *config.Config, convert *photoprism.Convert, plan videoT
216216
}
217217

218218
destDir := filepath.Dir(plan.DestPath)
219-
tempPath, err := videoTempPath(destDir, ".trim-*.tmp")
219+
ext := filepath.Ext(plan.DestPath)
220+
if ext == "" {
221+
ext = filepath.Ext(plan.SrcPath)
222+
}
223+
if ext == "" {
224+
ext = ".tmp"
225+
}
226+
227+
tempPath, err := videoTempPath(destDir, ".trim-*"+ext)
220228
if err != nil {
221229
return err
222230
}
223231

224232
cmd := videoTrimCmd(conf.FFmpegBin(), plan.SrcPath, tempPath, start, remaining)
225233
cmd.Env = append(cmd.Env, fmt.Sprintf("HOME=%s", conf.CmdCachePath()))
226234

235+
log.Debugf("ffmpeg: %s", clean.Log(cmd.String()))
236+
227237
var stderr bytes.Buffer
228238
cmd.Stderr = &stderr
229239

@@ -308,9 +318,24 @@ func videoTrimCmd(ffmpegBin, srcName, destName string, start, duration time.Dura
308318
"-ignore_unknown",
309319
"-codec", "copy",
310320
"-avoid_negative_ts", "make_zero",
311-
destName,
312321
)
313322

323+
if videoTrimFastStart(destName) {
324+
args = append(args, "-movflags", "+faststart")
325+
}
326+
327+
args = append(args, destName)
328+
314329
// #nosec G204 -- arguments are built from validated inputs and config.
315330
return exec.Command(ffmpegBin, args...)
316331
}
332+
333+
// videoTrimFastStart reports whether the trim output should enable faststart for MP4/MOV containers.
334+
func videoTrimFastStart(destName string) bool {
335+
switch strings.ToLower(filepath.Ext(destName)) {
336+
case fs.ExtMp4, fs.ExtMov, fs.ExtQT, ".m4v":
337+
return true
338+
default:
339+
return false
340+
}
341+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package commands
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
// TestVideoTrimFastStart verifies which extensions get the faststart flag.
10+
func TestVideoTrimFastStart(t *testing.T) {
11+
assert.True(t, videoTrimFastStart("clip.mp4"))
12+
assert.True(t, videoTrimFastStart("clip.MOV"))
13+
assert.True(t, videoTrimFastStart("clip.m4v"))
14+
assert.True(t, videoTrimFastStart("clip.qt"))
15+
assert.False(t, videoTrimFastStart("clip.mkv"))
16+
assert.False(t, videoTrimFastStart(""))
17+
}
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ package commands
22

33
import "github.com/urfave/cli/v2"
44

5-
// VideoCommands configures the CLI subcommands for working with indexed videos.
6-
var VideoCommands = &cli.Command{
7-
Name: "video",
8-
Usage: "Video subcommands",
5+
// VideosCommands configures the CLI subcommands for working with indexed videos.
6+
var VideosCommands = &cli.Command{
7+
Name: "videos",
8+
Usage: "Video troubleshooting and editing subcommands",
99
Subcommands: []*cli.Command{
1010
VideoListCommand,
1111
VideoTrimCommand,
@@ -16,7 +16,7 @@ var VideoCommands = &cli.Command{
1616
}
1717

1818
// videoCountFlag limits the number of results returned by video commands.
19-
var videoCountFlag = &cli.UintFlag{
19+
var videoCountFlag = &cli.IntFlag{
2020
Name: "count",
2121
Aliases: []string{"n"},
2222
Usage: "maximum `NUMBER` of results",

0 commit comments

Comments
 (0)