updated player once more
This commit is contained in:
parent
adcd52c55b
commit
c9e937fe10
2 changed files with 50 additions and 76 deletions
122
cmd/mpv.go
122
cmd/mpv.go
|
@ -68,15 +68,35 @@ func (mpv *MPVPLayer) Stop() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mpv *MPVPLayer) VideoDuration() time.Duration {
|
func (mpv *MPVPLayer) VideoDuration() time.Duration {
|
||||||
mpv.RLock()
|
mpv.Lock()
|
||||||
defer mpv.RUnlock()
|
defer mpv.Unlock()
|
||||||
|
|
||||||
|
if mpv.c != nil {
|
||||||
|
data, _ := mpv.c.Get("duration")
|
||||||
|
if data != nil {
|
||||||
|
data_s := data.(float64)
|
||||||
|
if data_s != 0 {
|
||||||
|
mpv.videoDuration = time.Duration(data_s) * time.Second
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return mpv.videoDuration
|
return mpv.videoDuration
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mpv *MPVPLayer) VideoPosition() time.Duration {
|
func (mpv *MPVPLayer) VideoPosition() time.Duration {
|
||||||
mpv.RLock()
|
mpv.Lock()
|
||||||
defer mpv.RUnlock()
|
defer mpv.Unlock()
|
||||||
|
|
||||||
|
if mpv.c != nil {
|
||||||
|
data, _ := mpv.c.Get("time-pos")
|
||||||
|
if data != nil {
|
||||||
|
data_s := data.(float64)
|
||||||
|
if data_s != 0 {
|
||||||
|
mpv.videoPosition = time.Duration(data_s) * time.Second
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return mpv.videoPosition
|
return mpv.videoPosition
|
||||||
}
|
}
|
||||||
|
@ -85,7 +105,18 @@ func (mpv *MPVPLayer) IsPlaying() bool {
|
||||||
mpv.Lock()
|
mpv.Lock()
|
||||||
defer mpv.Unlock()
|
defer mpv.Unlock()
|
||||||
|
|
||||||
if mpv.c != nil && mpv.c.IsClosed() {
|
if mpv.c == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// closed
|
||||||
|
if mpv.c.IsClosed() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// eof
|
||||||
|
data, _ := mpv.c.Get("eof-reached")
|
||||||
|
if data != nil && data.(bool) == true {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,25 +133,12 @@ func (mpv *MPVPLayer) ensurePlayer() error {
|
||||||
|
|
||||||
// TODO: cleanup this file
|
// TODO: cleanup this file
|
||||||
var err error
|
var err error
|
||||||
|
// mpv.f, err = os.Create(fmt.Sprintf("%s/%s", os.TempDir(), "mpvminiflux")) # no such device or address, etc. errors
|
||||||
mpv.f, err = os.CreateTemp("", "mpvminiflux")
|
mpv.f, err = os.CreateTemp("", "mpvminiflux")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// close and delete file
|
|
||||||
// defer func() {
|
|
||||||
// if mpv.f == nil {
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
|
|
||||||
// filename := mpv.f.Name()
|
|
||||||
// mpv.f.Close()
|
|
||||||
// os.Remove(filename)
|
|
||||||
// }()
|
|
||||||
|
|
||||||
// defer mpv.finishedVideo()
|
|
||||||
|
|
||||||
// ctx := context.TODO()
|
|
||||||
cmd := exec.Command(
|
cmd := exec.Command(
|
||||||
"mpv",
|
"mpv",
|
||||||
"--keep-open=yes",
|
"--keep-open=yes",
|
||||||
|
@ -134,64 +152,20 @@ func (mpv *MPVPLayer) ensurePlayer() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
time.Sleep(100 * time.Millisecond)
|
// try 10 times to open connection
|
||||||
|
// return error otherwise
|
||||||
|
for i := 0; i < 10; i++ {
|
||||||
|
time.Sleep(10 * time.Millisecond)
|
||||||
|
|
||||||
mpv.c = mpvipc.NewConnection(mpv.f.Name())
|
mpv.c = mpvipc.NewConnection(mpv.f.Name())
|
||||||
if err := mpv.c.Open(); err != nil {
|
err = mpv.c.Open()
|
||||||
|
if err == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// setup observe properties
|
|
||||||
events, _ := mpv.c.NewEventListener()
|
|
||||||
if _, err = mpv.c.Call("observe_property", 1, "duration"); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if _, err = mpv.c.Call("observe_property", 2, "time-pos"); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if _, err = mpv.c.Call("observe_property", 3, "eof-reached"); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: this will never close any old ones, so it will keep spawning new ones
|
|
||||||
go func() {
|
|
||||||
for event := range events {
|
|
||||||
if event.ID == 1 {
|
|
||||||
if event.Data != nil {
|
|
||||||
data := event.Data.(float64)
|
|
||||||
|
|
||||||
if data != 0 {
|
|
||||||
mpv.Lock()
|
|
||||||
mpv.videoDuration = time.Duration(data) * time.Second
|
|
||||||
mpv.Unlock()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if event.ID == 2 {
|
|
||||||
if event.Data != nil {
|
|
||||||
data := event.Data.(float64)
|
|
||||||
|
|
||||||
if data != 0 {
|
|
||||||
mpv.Lock()
|
|
||||||
mpv.videoPosition = time.Duration(data) * time.Second
|
|
||||||
mpv.Unlock()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if event.ID == 3 {
|
|
||||||
if event.Data != nil && event.Data.(bool) == true {
|
|
||||||
mpv.Lock()
|
|
||||||
mpv.isPlaying = false
|
|
||||||
mpv.Unlock()
|
|
||||||
}
|
|
||||||
// TODO: this might not fire once the media ends
|
|
||||||
// if event.Data != nil {
|
|
||||||
// if event.Data.(bool) == true {
|
|
||||||
// mpv.Lock()
|
|
||||||
// mpv.finishedVideo()
|
|
||||||
// mpv.Unlock()
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,7 +71,7 @@ func (m *playerModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
||||||
|
|
||||||
func (m *playerModel) View() string {
|
func (m *playerModel) View() string {
|
||||||
// return "NO DONT ASK"
|
// return "NO DONT ASK"
|
||||||
return fmt.Sprintf("IsPlaying: %v, Pos: %v, Dur: %v, Per: %v", m.mpv.IsPlaying(), m.mpv.VideoPosition(), m.mpv.VideoDuration(), videoPercentageWatched(m.mpv.VideoPosition(), m.mpv.VideoDuration()))
|
// return fmt.Sprintf("IsPlaying: %v, Pos: %v, Dur: %v, Per: %v", m.mpv.IsPlaying(), m.mpv.VideoPosition(), m.mpv.VideoDuration(), videoPercentageWatched(m.mpv.VideoPosition(), m.mpv.VideoDuration()))
|
||||||
|
|
||||||
if m.mpv.IsPlaying() {
|
if m.mpv.IsPlaying() {
|
||||||
timePos := time.Time{}.Add(m.mpv.VideoPosition())
|
timePos := time.Time{}.Add(m.mpv.VideoPosition())
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue