Files
AynaLivePlayer/internal/controller/controller.go
2025-10-02 21:57:45 +08:00

123 lines
3.6 KiB
Go

package controller
import (
"AynaLivePlayer/core/events"
"AynaLivePlayer/core/model"
"AynaLivePlayer/global"
"AynaLivePlayer/internal/playlist"
"AynaLivePlayer/pkg/config"
"AynaLivePlayer/pkg/eventbus"
)
func Initialize() {
handlePlayNext()
}
func Stop() {
}
func handlePlayNext() {
log := global.Logger.WithPrefix("Controller")
playerState := model.PlayerStatePlaying
global.EventBus.Subscribe("",
events.PlayerPropertyStateUpdate,
"internal.controller.playcontrol.idleplaynext",
func(event *eventbus.Event) {
data := event.Data.(events.PlayerPropertyStateUpdateEvent)
log.Debug("[MPV PlayControl] update player to state", playerState, "->", data.State)
playerState = data.State
if playerState == model.PlayerStateIdle {
log.Info("mpv went idle, try play next")
_ = global.EventBus.Publish(events.PlayerPlayNextCmd,
events.PlayerPlayNextCmdEvent{})
}
})
global.EventBus.Subscribe("",
events.PlayerPropertyStateUpdate,
"internal.controller.playcontrol.clear_when_idle", func(event *eventbus.Event) {
data := event.Data.(events.PlayerPropertyStateUpdateEvent)
// if is idle, remove playing media
if data.State == model.PlayerStateIdle {
_ = global.EventBus.Publish(events.PlayerPlayingUpdate, events.PlayerPlayingUpdateEvent{
Media: model.Media{},
Removed: true,
})
}
})
global.EventBus.Subscribe("",
events.PlaylistInsertUpdate(model.PlaylistIDPlayer),
"internal.controller.playcontrol.playnext_when_insert.player",
func(event *eventbus.Event) {
if playerState == model.PlayerStateIdle {
_ = global.EventBus.Publish(events.PlayerPlayNextCmd,
events.PlayerPlayNextCmdEvent{})
}
})
global.EventBus.Subscribe("",
events.PlaylistInsertUpdate(model.PlaylistIDSystem),
"internal.controller.playcontrol.playnext_when_insert.system",
func(event *eventbus.Event) {
if playerState == model.PlayerStateIdle {
_ = global.EventBus.Publish(events.PlayerPlayNextCmd,
events.PlayerPlayNextCmdEvent{})
}
})
global.EventBus.Subscribe("",
events.PlayerPlayNextCmd,
"internal.controller.playcontrol.playnext",
func(event *eventbus.Event) {
if playlist.PlayerPlaylist.Size() > 0 {
log.Infof("Try to play next media in player playlist")
_ = global.EventBus.Publish(events.PlaylistNextCmd(model.PlaylistIDPlayer),
events.PlaylistNextCmdEvent{
Remove: true,
})
return
}
if !config.General.UseSystemPlaylist {
// do not play system playlist
return
}
log.Infof("Try to play next media in system playlist")
_ = global.EventBus.Publish(events.PlaylistNextCmd(model.PlaylistIDSystem),
events.PlaylistNextCmdEvent{
Remove: false,
})
})
global.EventBus.Subscribe("",
events.PlayerPlayErrorUpdate,
"internal.controller.playcontrol.playnext_on_error",
func(event *eventbus.Event) {
if config.General.PlayNextOnFail {
_ = global.EventBus.Publish(events.PlayerPlayNextCmd, events.PlayerPlayNextCmdEvent{})
return
}
})
global.EventBus.Subscribe("", events.PlaylistNextUpdate(model.PlaylistIDPlayer),
"internal.controller.playcontrol.play_when_next", func(event *eventbus.Event) {
data := event.Data.(events.PlaylistNextUpdateEvent)
_ = global.EventBus.Publish(
events.PlayerPlayCmd,
events.PlayerPlayCmdEvent{
Media: data.Media,
})
})
global.EventBus.Subscribe("", events.PlaylistNextUpdate(model.PlaylistIDSystem),
"internal.controller.playcontrol.play_when_next.system_playlist", func(event *eventbus.Event) {
data := event.Data.(events.PlaylistNextUpdateEvent)
_ = global.EventBus.Publish(
events.PlayerPlayCmd,
events.PlayerPlayCmdEvent{
Media: data.Media,
})
})
}