Decided to implement an inotify watcher for a playlist file. Dunno if it works correctly, but it seems like, not tested yet.
This commit is contained in:
parent
4faf2a0309
commit
dc3658d6de
@ -1,9 +1,12 @@
|
|||||||
package radio
|
package radio
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"dwelling-radio/pkg/watcher"
|
||||||
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
"syscall"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Playlist holds a list of paths to a song files.
|
// Playlist holds a list of paths to a song files.
|
||||||
@ -13,6 +16,8 @@ type Playlist struct {
|
|||||||
playlist []string
|
playlist []string
|
||||||
cur int
|
cur int
|
||||||
repeat bool
|
repeat bool
|
||||||
|
watcher *watcher.InotifyWatcher
|
||||||
|
changed chan uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewPlaylist returns an instance of a Playlist struct with a loaded playlist.
|
// NewPlaylist returns an instance of a Playlist struct with a loaded playlist.
|
||||||
@ -58,3 +63,34 @@ func (p *Playlist) load() error {
|
|||||||
func (p *Playlist) Reload() error {
|
func (p *Playlist) Reload() error {
|
||||||
return p.load()
|
return p.load()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *Playlist) Watch() (err error) {
|
||||||
|
p.watcher, err = watcher.NewInotifyWatcher()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = p.watcher.AddWatch(p.filePath, watcher.ModIgnMask)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
p.watcher.WatchForMask(p.changed, watcher.ModIgnMask)
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
mask := <-p.changed
|
||||||
|
|
||||||
|
if mask&syscall.IN_MODIFY > 0 {
|
||||||
|
if err := p.load(); err != nil {
|
||||||
|
log.Fatalln("cannot reload a changed playlist:", err)
|
||||||
|
}
|
||||||
|
} else if mask&syscall.IN_IGNORED > 0 {
|
||||||
|
p.watcher.Close()
|
||||||
|
p.Watch()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user