Live video on the AT Protocol
at natb/urfave 61 lines 1.4 kB view raw
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}