This commit is contained in:
aynakeya
2024-04-10 00:42:33 -07:00
parent 8d73a3c284
commit f926f15606
145 changed files with 2852 additions and 4296 deletions

View 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,
})
})
}

View 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,
})
})
}

View 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(),
})
}