Live video on the AT Protocol
1package cmd
2
3import (
4 "context"
5 "fmt"
6 "io"
7 "os"
8 "path/filepath"
9
10 "stream.place/streamplace/pkg/config"
11 "stream.place/streamplace/pkg/log"
12 "stream.place/streamplace/pkg/media"
13)
14
15func Split(ctx context.Context, inFile, outDir string) error {
16 inFD, err := os.Open(inFile)
17 if err != nil {
18 return err
19 }
20 defer inFD.Close()
21 err = os.MkdirAll(outDir, 0755)
22 if err != nil {
23 return err
24 }
25
26 names := []string{}
27
28 err = media.SplitSegments(ctx, &config.CLI{}, inFD, func(fname string) media.ReadWriteSeekCloser {
29 fullPath := filepath.Join(outDir, fname)
30 names = append(names, fullPath)
31 log.Log(ctx, "creating segment file", "path", fullPath)
32 fd, err := os.Create(fullPath)
33 if err != nil {
34 log.Error(ctx, "failed to open segment file", "error", err)
35 return nil
36 }
37 return fd
38 })
39 if err != nil {
40 return fmt.Errorf("failed to split segments: %w", err)
41 }
42
43 for _, name := range names {
44 fd, err := os.Open(name)
45 if err != nil {
46 return fmt.Errorf("failed to open segment file: %w", err)
47 }
48 defer fd.Close()
49 bs, err := io.ReadAll(fd)
50 if err != nil {
51 return fmt.Errorf("failed to read segment file: %w", err)
52 }
53 _, err = media.ValidateMP4Media(ctx, bs)
54 if err != nil {
55 return fmt.Errorf("failed to validate segment file: %w", err)
56 }
57 log.Log(ctx, "validated segment file", "path", name)
58 }
59
60 return nil
61}