Live video on the AT Protocol
1package media
2
3import (
4 "context"
5 "fmt"
6 "io"
7 "sort"
8 "time"
9
10 "stream.place/streamplace/pkg/aqtime"
11 "stream.place/streamplace/pkg/config"
12 "stream.place/streamplace/pkg/model"
13)
14
15func ClipUser(ctx context.Context, mod model.Model, cli *config.CLI, user string, writer io.Writer, before *time.Time, after *time.Time) error {
16 segments, err := mod.LatestSegmentsForUser(user, -1, before, after)
17 if err != nil {
18 return fmt.Errorf("unable to get segments: %w", err)
19 }
20 if len(segments) == 0 {
21 return fmt.Errorf("no segments found")
22 }
23 // Sort segments by StartTime, oldest first
24 sort.Slice(segments, func(i, j int) bool {
25 return segments[i].StartTime.Before(segments[j].StartTime)
26 })
27 segmentFiles := []string{}
28 for _, segment := range segments {
29 aqt := aqtime.FromTime(segment.StartTime)
30 fpath, err := cli.SegmentFilePath(user, fmt.Sprintf("%s.%s", aqt.FileSafeString(), "mp4"))
31 if err != nil {
32 return fmt.Errorf("unable to get segment file path: %w", err)
33 }
34 segmentFiles = append(segmentFiles, fpath)
35 }
36 err = Clip(ctx, segmentFiles, writer)
37 if err != nil {
38 return fmt.Errorf("unable to clip segments: %w", err)
39 }
40 return nil
41}