mirror of
https://github.com/AynaLivePlayer/AynaLivePlayer.git
synced 2026-05-19 09:15:47 +08:00
rewrite
This commit is contained in:
65
internal/controller/controller.go
Normal file
65
internal/controller/controller.go
Normal file
@@ -0,0 +1,65 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"AynaLivePlayer/core/events"
|
||||
"AynaLivePlayer/core/model"
|
||||
"AynaLivePlayer/global"
|
||||
"AynaLivePlayer/pkg/event"
|
||||
)
|
||||
|
||||
func Initialize() {
|
||||
handleSearch()
|
||||
createLyricLoader()
|
||||
handlePlayNext()
|
||||
}
|
||||
|
||||
func Stop() {
|
||||
|
||||
}
|
||||
|
||||
func handlePlayNext() {
|
||||
log := global.Logger.WithPrefix("Controller")
|
||||
isIdle := false
|
||||
global.EventManager.RegisterA(
|
||||
events.PlayerPropertyIdleActiveUpdate,
|
||||
"internal.controller.playcontrol.idleplaynext",
|
||||
func(event *event.Event) {
|
||||
data := event.Data.(events.PlayerPropertyIdleActiveUpdateEvent)
|
||||
isIdle = data.IsIdle
|
||||
if data.IsIdle {
|
||||
log.Info("mpv went idle, try play next")
|
||||
global.EventManager.CallA(events.PlayerPlayNextCmd,
|
||||
events.PlayerPlayNextCmdEvent{})
|
||||
}
|
||||
})
|
||||
|
||||
global.EventManager.RegisterA(
|
||||
events.PlaylistInsertUpdate(model.PlaylistIDPlayer),
|
||||
"internal.controller.playcontrol.playnext_when_insert",
|
||||
func(event *event.Event) {
|
||||
if isIdle {
|
||||
global.EventManager.CallA(events.PlayerPlayNextCmd,
|
||||
events.PlayerPlayNextCmdEvent{})
|
||||
}
|
||||
})
|
||||
|
||||
global.EventManager.RegisterA(
|
||||
events.PlayerPlayNextCmd,
|
||||
"internal.controller.playcontrol.playnext",
|
||||
func(event *event.Event) {
|
||||
global.EventManager.CallA(events.PlaylistNextCmd(model.PlaylistIDPlayer),
|
||||
events.PlaylistNextCmdEvent{
|
||||
Remove: true,
|
||||
})
|
||||
})
|
||||
|
||||
global.EventManager.RegisterA(events.PlaylistNextUpdate(model.PlaylistIDPlayer),
|
||||
"internal.controller.playcontrol.play_when_next", func(event *event.Event) {
|
||||
data := event.Data.(events.PlaylistNextUpdateEvent)
|
||||
global.EventManager.CallA(
|
||||
events.PlayerPlayCmd,
|
||||
events.PlayerPlayCmdEvent{
|
||||
Media: data.Media,
|
||||
})
|
||||
})
|
||||
}
|
||||
60
internal/controller/lyric.go
Normal file
60
internal/controller/lyric.go
Normal file
@@ -0,0 +1,60 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"AynaLivePlayer/core/events"
|
||||
"AynaLivePlayer/global"
|
||||
"AynaLivePlayer/pkg/event"
|
||||
"github.com/AynaLivePlayer/miaosic"
|
||||
)
|
||||
|
||||
type lyricLoader struct {
|
||||
Lyric miaosic.Lyrics
|
||||
prev float64
|
||||
prevIndex int
|
||||
}
|
||||
|
||||
var lyricManager = &lyricLoader{}
|
||||
|
||||
func createLyricLoader() {
|
||||
log := global.Logger.WithPrefix("LyricLoader")
|
||||
global.EventManager.RegisterA(events.PlayerPlayingUpdate, "internal.lyric.update", func(event *event.Event) {
|
||||
data := event.Data.(events.PlayerPlayingUpdateEvent)
|
||||
if data.Removed {
|
||||
log.Debugf("current media removed, clear lyric")
|
||||
lyricManager.Lyric = miaosic.ParseLyrics("", "")
|
||||
return
|
||||
}
|
||||
log.Infof("update lyric for %s", data.Media.Info.Title)
|
||||
lyric, err := miaosic.GetMediaLyric(data.Media.Info.Meta)
|
||||
if err == nil && len(lyric) > 0 {
|
||||
lyricManager.Lyric = lyric[0]
|
||||
} else {
|
||||
log.Errorf("failed to get lyric for %s (%s): %s", data.Media.Info.Title, data.Media.Info.Meta.ID(), err)
|
||||
}
|
||||
global.EventManager.CallA(events.PlayerLyricReload, events.PlayerLyricReloadEvent{
|
||||
Lyrics: lyricManager.Lyric,
|
||||
})
|
||||
})
|
||||
global.EventManager.RegisterA(events.PlayerPropertyTimePosUpdate, "internal.lyric.update_current", func(event *event.Event) {
|
||||
time := event.Data.(events.PlayerPropertyTimePosUpdateEvent).TimePos
|
||||
idx := lyricManager.Lyric.FindIndex(time)
|
||||
if idx == lyricManager.prevIndex {
|
||||
return
|
||||
}
|
||||
lyricManager.prevIndex = idx
|
||||
global.EventManager.CallA(
|
||||
events.PlayerLyricPosUpdate,
|
||||
events.PlayerLyricPosUpdateEvent{
|
||||
CurrentIndex: idx,
|
||||
Time: time,
|
||||
CurrentLine: lyricManager.Lyric.Find(time),
|
||||
Total: len(lyricManager.Lyric.Content),
|
||||
})
|
||||
return
|
||||
})
|
||||
global.EventManager.RegisterA(events.PlayerLyricRequestCmd, "internal.lyric.request", func(event *event.Event) {
|
||||
global.EventManager.CallA(events.PlayerLyricReload, events.PlayerLyricReloadEvent{
|
||||
Lyrics: lyricManager.Lyric,
|
||||
})
|
||||
})
|
||||
}
|
||||
38
internal/controller/search.go
Normal file
38
internal/controller/search.go
Normal file
@@ -0,0 +1,38 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"AynaLivePlayer/core/events"
|
||||
"AynaLivePlayer/core/model"
|
||||
"AynaLivePlayer/global"
|
||||
"AynaLivePlayer/pkg/event"
|
||||
"github.com/AynaLivePlayer/miaosic"
|
||||
)
|
||||
|
||||
func handleSearch() {
|
||||
log := global.Logger.WithPrefix("Search")
|
||||
global.EventManager.RegisterA(
|
||||
events.SearchCmd, "internal.controller.search.handleSearchCmd", func(event *event.Event) {
|
||||
data := event.Data.(events.SearchCmdEvent)
|
||||
log.Infof("Search %s using %s", data.Keyword, data.Provider)
|
||||
searchResult, err := miaosic.SearchByProvider(data.Provider, data.Keyword, 1, 10)
|
||||
if err != nil {
|
||||
log.Warnf("Search %s using %s failed: %s", data.Keyword, data.Provider, err)
|
||||
return
|
||||
}
|
||||
medias := make([]model.Media, len(searchResult))
|
||||
for i, v := range searchResult {
|
||||
medias[i] = model.Media{
|
||||
Info: v,
|
||||
User: model.SystemUser,
|
||||
}
|
||||
}
|
||||
global.EventManager.CallA(
|
||||
events.SearchResultUpdate, events.SearchResultUpdateEvent{
|
||||
Medias: medias,
|
||||
})
|
||||
})
|
||||
global.EventManager.CallA(
|
||||
events.SearchProviderUpdate, events.SearchProviderUpdateEvent{
|
||||
Providers: miaosic.ListAvailableProviders(),
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user