Skip to content

Commit 77412e1

Browse files
committed
Added logging
1 parent e2da5b2 commit 77412e1

24 files changed

+538
-140
lines changed

cmd/cli/context.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"os"
6+
"os/signal"
7+
)
8+
9+
///////////////////////////////////////////////////////////////////////////////
10+
// PUBLIC METHODS
11+
12+
// ContextForSignal returns a context object which is cancelled when a signal
13+
// is received. It returns nil if no signal parameter is provided
14+
func ContextForSignal(signals ...os.Signal) context.Context {
15+
if len(signals) == 0 {
16+
return nil
17+
}
18+
19+
ch := make(chan os.Signal, 1)
20+
ctx, cancel := context.WithCancel(context.Background())
21+
22+
// Send message on channel when signal received
23+
signal.Notify(ch, signals...)
24+
25+
// When any signal received, call cancel
26+
go func() {
27+
<-ch
28+
cancel()
29+
}()
30+
31+
// Return success
32+
return ctx
33+
}

cmd/cli/decode.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package main
33
import (
44
"context"
55
"fmt"
6-
"os"
76

87
// Packages
98
"github.com/djthorpe/go-tablewriter"
@@ -20,7 +19,7 @@ type DecodeCmd struct {
2019
func (cmd *DecodeCmd) Run(globals *Globals) error {
2120
var format media.Format
2221

23-
manager := media.NewManager()
22+
manager := globals.manager
2423
if cmd.Format != "" {
2524
if formats := manager.InputFormats(media.NONE, cmd.Format); len(formats) == 0 {
2625
return fmt.Errorf("unknown format %q", cmd.Format)
@@ -39,19 +38,19 @@ func (cmd *DecodeCmd) Run(globals *Globals) error {
3938
defer reader.Close()
4039

4140
// Create a decoder - copy streams
42-
decoder, err := reader.Decoder(nil, false)
41+
decoder, err := reader.Decoder(nil)
4342
if err != nil {
4443
return err
4544
}
4645

4746
// Demultiplex the stream
47+
writer := globals.writer
4848
header := []tablewriter.TableOpt{tablewriter.OptHeader()}
49-
tablewriter := tablewriter.New(os.Stdout, tablewriter.OptOutputText())
5049
return decoder.Demux(context.Background(), func(packet media.Packet) error {
5150
if packet == nil {
5251
return nil
5352
}
54-
if err := tablewriter.Write(packet, header...); err != nil {
53+
if err := writer.Write(packet, header...); err != nil {
5554
return err
5655
}
5756
// Reset the header

cmd/cli/formats.go

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
package main
22

33
import (
4-
"os"
5-
64
// Packages
75
"github.com/djthorpe/go-tablewriter"
8-
"github.com/mutablelogic/go-media"
96
)
107

118
type CodecsCmd struct{}
@@ -17,28 +14,29 @@ type ChannelLayoutsCmd struct{}
1714
type PixelFormatsCmd struct{}
1815

1916
func (cmd *CodecsCmd) Run(globals *Globals) error {
20-
manager := media.NewManager()
21-
writer := tablewriter.New(os.Stdout, tablewriter.OptHeader(), tablewriter.OptOutputText())
22-
17+
manager := globals.manager
18+
writer := globals.writer
2319
codecs := manager.Codecs()
24-
25-
return writer.Write(codecs)
20+
return writer.Write(codecs, tablewriter.OptHeader())
2621
}
2722

2823
func (cmd *SampleFormatsCmd) Run(globals *Globals) error {
29-
manager := media.NewManager()
30-
writer := tablewriter.New(os.Stdout, tablewriter.OptHeader(), tablewriter.OptOutputText())
31-
return writer.Write(manager.SampleFormats())
24+
manager := globals.manager
25+
writer := globals.writer
26+
formats := manager.SampleFormats()
27+
return writer.Write(formats, tablewriter.OptHeader())
3228
}
3329

3430
func (cmd *ChannelLayoutsCmd) Run(globals *Globals) error {
35-
manager := media.NewManager()
36-
writer := tablewriter.New(os.Stdout, tablewriter.OptHeader(), tablewriter.OptOutputText())
37-
return writer.Write(manager.ChannelLayouts())
31+
manager := globals.manager
32+
writer := globals.writer
33+
layouts := manager.ChannelLayouts()
34+
return writer.Write(layouts, tablewriter.OptHeader())
3835
}
3936

4037
func (cmd *PixelFormatsCmd) Run(globals *Globals) error {
41-
manager := media.NewManager()
42-
writer := tablewriter.New(os.Stdout, tablewriter.OptHeader(), tablewriter.OptOutputText())
43-
return writer.Write(manager.PixelFormats())
38+
manager := globals.manager
39+
writer := globals.writer
40+
formats := manager.PixelFormats()
41+
return writer.Write(formats, tablewriter.OptHeader())
4442
}

cmd/cli/main.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
11
package main
22

33
import (
4+
"context"
45
"os"
56
"path/filepath"
7+
"syscall"
68

79
// Packages
810
kong "github.com/alecthomas/kong"
11+
tablewriter "github.com/djthorpe/go-tablewriter"
12+
media "github.com/mutablelogic/go-media"
913
)
1014

1115
type Globals struct {
16+
manager media.Manager
17+
writer *tablewriter.Writer
18+
ctx context.Context
19+
1220
Debug bool `name:"debug" help:"Enable debug mode"`
21+
Force bool `name:"force" help:"Force resampling and resizing on decode, even if the input and output parameters are the same"`
1322
}
1423

1524
type CLI struct {
@@ -41,6 +50,23 @@ func main() {
4150
kong.UsageOnError(),
4251
kong.ConfigureHelp(kong.HelpOptions{Compact: true}),
4352
)
53+
54+
// Create a manager object
55+
// Only print out FATAL messages
56+
manager, err := media.NewManager(media.OptLog(cli.Debug, nil))
57+
if err != nil {
58+
ctx.FatalIfErrorf(err)
59+
}
60+
cli.Globals.manager = manager
61+
62+
// Create a tablewriter object with text output
63+
writer := tablewriter.New(os.Stdout, tablewriter.OptOutputText())
64+
cli.Globals.writer = writer
65+
66+
// Create a context
67+
cli.Globals.ctx = ContextForSignal(os.Interrupt, syscall.SIGQUIT)
68+
69+
// Run the command
4470
if err := ctx.Run(&cli.Globals); err != nil {
4571
ctx.FatalIfErrorf(err)
4672
}

cmd/cli/metadata_artwork.go

Lines changed: 43 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,85 @@
11
package main
22

33
import (
4+
"context"
45
"errors"
56
"fmt"
6-
"mime"
7-
"net/http"
7+
"io/fs"
88
"os"
99
"path/filepath"
10-
"strings"
1110

1211
// Packages
13-
"github.com/djthorpe/go-tablewriter"
12+
1413
"github.com/mutablelogic/go-media"
14+
"github.com/mutablelogic/go-media/pkg/file"
1515
)
1616

1717
type MetadataCmd struct {
18-
Path string `arg:"" required:"" help:"Media file" type:"path"`
18+
Path string `arg:"" required:"" help:"Media file or directory of files" type:"path"`
1919
}
2020

2121
type ArtworkCmd struct {
2222
Path string `arg:"" required:"" help:"Media file" type:"path"`
2323
}
2424

2525
func (cmd *MetadataCmd) Run(globals *Globals) error {
26-
manager := media.NewManager()
27-
reader, err := manager.Open(cmd.Path, nil)
28-
if err != nil {
26+
// Create the walker with the processor callback
27+
walker := file.NewWalker(func(ctx context.Context, abspath, relpath string, info fs.FileInfo) error {
28+
// Ignore directories
29+
if info.IsDir() {
30+
return nil
31+
}
32+
33+
// Open the file
34+
reader, err := globals.manager.Open(filepath.Join(abspath, relpath), nil)
35+
if err != nil {
36+
globals.manager.Errorf("Error opening %q: %v\n", relpath, err)
37+
return nil
38+
}
39+
defer reader.Close()
40+
41+
fmt.Println(info.Name())
42+
for _, entry := range reader.Metadata() {
43+
fmt.Println(entry)
44+
}
45+
46+
return nil
47+
})
48+
49+
if err := walker.Walk(globals.ctx, cmd.Path); err != nil {
2950
return err
3051
}
31-
defer reader.Close()
3252

33-
// Print metadata
34-
opts := []tablewriter.TableOpt{
35-
tablewriter.OptHeader(),
36-
tablewriter.OptOutputText(),
37-
}
38-
return tablewriter.New(os.Stdout, opts...).Write(reader.Metadata())
53+
return nil
3954
}
4055

4156
func (cmd *ArtworkCmd) Run(globals *Globals) error {
42-
manager := media.NewManager()
57+
manager := globals.manager
4358
reader, err := manager.Open(cmd.Path, nil)
4459
if err != nil {
4560
return err
4661
}
4762
defer reader.Close()
4863

49-
artwork := reader.Metadata(media.MetaArtwork)
50-
if len(artwork) == 0 {
64+
artworks := reader.Metadata(media.MetaArtwork)
65+
if len(artworks) == 0 {
5166
return errors.New("no artwork")
5267
}
5368

54-
for i, a := range artwork {
55-
data := a.Value().([]byte)
56-
mimetype := http.DetectContentType(data)
57-
if !strings.HasPrefix(mimetype, "image/") {
58-
return fmt.Errorf("invalid mimetype %q for stream %d", mimetype, i)
59-
}
60-
ext, err := mime.ExtensionsByType(mimetype)
69+
for i, artwork := range artworks {
70+
data := artwork.Value().([]byte)
71+
_, ext, err := file.MimeType(data)
6172
if err != nil {
6273
return err
63-
}
64-
if len(ext) == 0 {
65-
return fmt.Errorf("no extension for mimetype %q", mimetype)
74+
} else if ext == "" {
75+
manager.Warningf("Artwork %d cannot be identified", i+1)
76+
continue
6677
}
6778

68-
// Use last extension
69-
filename := filepath.Base(cmd.Path) + ext[len(ext)-1]
70-
if len(artwork) > 1 {
71-
filename = filepath.Base(cmd.Path) + fmt.Sprintf("%d.%s", i+1, ext[len(ext)-1])
79+
// Modify the filename if there is more than one artwork
80+
filename := filepath.Base(cmd.Path) + ext
81+
if len(artworks) > 1 {
82+
filename = filepath.Base(cmd.Path) + fmt.Sprintf("%d.%s", i+1, ext)
7283
}
7384

7485
// Write the file

cmd/cli/muxers_demuxers.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,20 @@ type DevicesCmd struct {
2222
}
2323

2424
func (cmd *MuxersCmd) Run(globals *Globals) error {
25-
manager := media.NewManager()
25+
manager := globals.manager
26+
2627
return Run(cmd.Filter, Outputs(manager, media.ANY, cmd.Filter))
2728
}
2829

2930
func (cmd *DemuxersCmd) Run(globals *Globals) error {
30-
manager := media.NewManager()
31+
manager := globals.manager
32+
3133
return Run(cmd.Filter, Inputs(manager, media.ANY, cmd.Filter))
3234
}
3335

3436
func (cmd *DevicesCmd) Run(globals *Globals) error {
35-
manager := media.NewManager()
37+
manager := globals.manager
38+
3639
var formats []media.Format
3740
formats = append(formats, Inputs(manager, media.DEVICE, cmd.Filter)...)
3841
formats = append(formats, Outputs(manager, media.DEVICE, cmd.Filter)...)

cmd/cli/probe.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ var (
2121
func (cmd *ProbeCmd) Run(globals *Globals) error {
2222
var format media.Format
2323

24-
manager := media.NewManager()
24+
manager := globals.manager
25+
2526
filter := media.NONE
2627

2728
// Try device first

cmd/cli/version.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,16 @@ import (
44
"os"
55

66
"github.com/djthorpe/go-tablewriter"
7-
"github.com/mutablelogic/go-media"
87
)
98

109
type VersionCmd struct{}
1110

1211
func (v *VersionCmd) Run(globals *Globals) error {
12+
manager := globals.manager
13+
1314
opts := []tablewriter.TableOpt{
1415
tablewriter.OptOutputText(),
1516
tablewriter.OptDelimiter(' '),
1617
}
17-
return tablewriter.New(os.Stdout, opts...).Write(media.NewManager().Version())
18+
return tablewriter.New(os.Stdout, opts...).Write(manager.Version())
1819
}

decoder.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ FOR_LOOP:
327327
func (d *decoder) decode(packet *ff.AVPacket, demuxfn DecoderFunc, framefn FrameFunc) error {
328328
if demuxfn != nil {
329329
// Send the packet (or a nil to flush) to the user defined packet function
330-
return demuxfn(newPacket(packet))
330+
return demuxfn(newPacket(packet, d.stream, d.codec.Codec().Type(), d.timeBase))
331331
}
332332

333333
// Submit the packet to the decoder (nil packet will flush the decoder)

0 commit comments

Comments
 (0)