diff --git a/internal/radio/icecast.go b/internal/radio/icecast.go index 54d1f3e..fee6418 100644 --- a/internal/radio/icecast.go +++ b/internal/radio/icecast.go @@ -8,6 +8,7 @@ import ( "os/exec" "strings" "sync" + "syscall" "time" "github.com/pkg/errors" @@ -143,31 +144,39 @@ func IcecastWatchPlaylist(playlistPath string, lastNSongs int) error { return errors.Wrap(err, "cannot instantiate inotify watcher") } - err = playlistWatcher.AddWatch(playlistPath, watcher.ModMask) + err = playlistWatcher.AddWatch(playlistPath, watcher.ModIgnMask) if err != nil { return errors.Wrap(err, "cannot set a playlist to watch") } - playlistWatcher.WatchForMask(playlistFired, watcher.ModMask) + playlistWatcher.WatchForMask(playlistFired, watcher.ModIgnMask) go func() { for { select { - case <-playlistFired: - lastPlayedCacheMutex.Lock() - songs, err := lastPlayedSongs(lastNSongs, playlistPath) - if err == nil && len(songs) > 0 { - lastPlayedCache = songs + case mask := <-playlistFired: + if mask&syscall.IN_MODIFY > 0 { + lastPlayedCacheMutex.Lock() + songs, err := lastPlayedSongs(lastNSongs, playlistPath) + if err == nil && len(songs) > 0 { + lastPlayedCache = songs + } + lastPlayedCacheMutex.Unlock() + } else if mask&syscall.IN_IGNORED > 0 { + playlistWatcher.Close() + IcecastWatchPlaylist(playlistPath, lastNSongs) + return } - lastPlayedCacheMutex.Unlock() } } }() + lastPlayedCacheMutex.Lock() songs, err := lastPlayedSongs(lastNSongs, playlistPath) if err == nil && len(songs) > 0 { lastPlayedCache = songs } + lastPlayedCacheMutex.Unlock() return nil }