mirror of
https://github.com/AynaLivePlayer/AynaLivePlayer.git
synced 2025-12-06 10:22:50 +08:00
123 lines
3.6 KiB
Go
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,
|
|
})
|
|
})
|
|
}
|