diff --git a/cmd/root.go b/cmd/root.go index 0730314..30b92e2 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -22,6 +22,7 @@ var rootCmd = &cobra.Command{ file := files.PickRandomFile() out := media.ProbeFile(file) fmt.Printf("%+v\n", out) + media.Watch(out.Format.Path) stream := media.SelectAudioStream(out) fmt.Printf("Stream %d of %s: %+v\n", stream, out.Format.Path, out.Streams[stream]) }, diff --git a/go.mod b/go.mod index 42cf843..0c333ce 100644 --- a/go.mod +++ b/go.mod @@ -6,9 +6,11 @@ require ( github.com/BurntSushi/toml v1.3.2 github.com/adrg/xdg v0.4.0 github.com/akrennmair/slice v0.0.0-20220105203817-49445747ab81 + github.com/creack/pty v1.1.18 github.com/kirsle/configdir v0.0.0-20170128060238-e45d2f54772f github.com/spf13/cobra v1.7.0 github.com/u2takey/ffmpeg-go v0.5.0 + golang.org/x/term v0.11.0 ) require ( @@ -17,5 +19,5 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/u2takey/go-utils v0.3.1 // indirect - golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359 // indirect + golang.org/x/sys v0.11.0 // indirect ) diff --git a/go.sum b/go.sum index da72b2b..6fc7924 100644 --- a/go.sum +++ b/go.sum @@ -7,6 +7,8 @@ github.com/akrennmair/slice v0.0.0-20220105203817-49445747ab81/go.mod h1:jk5mJ+K github.com/aws/aws-sdk-go v1.38.20 h1:QbzNx/tdfATbdKfubBpkt84OM6oBkxQZRw6+bW2GyeA= github.com/aws/aws-sdk-go v1.38.20/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -64,8 +66,11 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359 h1:2B5p2L5IfGiD7+b9BOoRMC6DgObAVZV+Fsp050NqXik= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= diff --git a/media/watch.go b/media/watch.go new file mode 100644 index 0000000..e598758 --- /dev/null +++ b/media/watch.go @@ -0,0 +1,45 @@ +package media + +import ( + "github.com/creack/pty" + "golang.org/x/term" + "io" + "os" + "os/exec" + "os/signal" + "syscall" +) + +func Watch(path string) { + cmd := exec.Command("mpv", "--osd-fractions", "--term-osd=force", path) + ptmx, err := pty.Start(cmd) + + if err != nil { + panic(err) + } + // Make sure to close the pty at the end. + defer func() { ptmx.Close() }() // Best effort. + + // Handle pty size. + ch := make(chan os.Signal, 1) + signal.Notify(ch, syscall.SIGWINCH) + go func() { + for range ch { + pty.InheritSize(os.Stdin, ptmx) + } + }() + ch <- syscall.SIGWINCH // Initial resize. + defer func() { signal.Stop(ch); close(ch) }() // Cleanup signals when done. + + // Set stdin in raw mode. + oldState, err := term.MakeRaw(int(os.Stdin.Fd())) + if err != nil { + panic(err) + } + defer func() { term.Restore(int(os.Stdin.Fd()), oldState) }() // Best effort. + + // Copy stdin to the pty and the pty to stdout. + // NOTE: The goroutine will keep reading until the next keystroke before returning. + go func() { io.Copy(ptmx, os.Stdin) }() + io.Copy(os.Stdout, ptmx) +}