From 82662c308ad97376630d9d1ab351372597c5af65 Mon Sep 17 00:00:00 2001 From: aynakeya Date: Sun, 28 Sep 2025 22:59:08 +0800 Subject: [PATCH 1/3] update fyne version --- go.mod | 6 +++-- go.sum | 12 ++++++--- gui/gutil/fyne.go | 18 ++++++------- pkg/eventbus/bus.go | 3 ++- pkg/eventbus/go.mod | 11 -------- playground/bugt/main.go | 57 ----------------------------------------- 6 files changed, 23 insertions(+), 84 deletions(-) delete mode 100644 pkg/eventbus/go.mod delete mode 100644 playground/bugt/main.go diff --git a/go.mod b/go.mod index 49569e8..8f63347 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ replace ( ) require ( - fyne.io/fyne/v2 v2.5.5 + fyne.io/fyne/v2 v2.6.3 github.com/AynaLivePlayer/liveroom-sdk v0.1.0 github.com/AynaLivePlayer/miaosic v0.2.3 github.com/adrg/libvlc-go/v3 v3.1.6 @@ -55,11 +55,14 @@ require ( github.com/fyne-io/gl-js v0.2.0 // indirect github.com/fyne-io/glfw-js v0.3.0 // indirect github.com/fyne-io/image v0.1.1 // indirect + github.com/fyne-io/oksvg v0.1.0 // indirect github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 // indirect github.com/go-text/render v0.2.0 // indirect github.com/go-text/typesetting v0.2.1 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/hack-pad/go-indexeddb v0.3.2 // indirect + github.com/hack-pad/safejs v0.1.0 // indirect github.com/jeandeaual/go-locale v0.0.0-20250612000132-0ef82f21eade // indirect github.com/jinzhu/copier v0.4.0 // indirect github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 // indirect @@ -78,7 +81,6 @@ require ( github.com/yuin/goldmark v1.7.8 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/image v0.24.0 // indirect - golang.org/x/mobile v0.0.0-20231127183840-76ac6878050a // indirect golang.org/x/net v0.42.0 // indirect golang.org/x/text v0.27.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect diff --git a/go.sum b/go.sum index c469730..4e9c24d 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -fyne.io/fyne/v2 v2.5.5 h1:IhS8Vf1EtSHS94/i41D9Rh4s1rG1habkGN/oISA0kTU= -fyne.io/fyne/v2 v2.5.5/go.mod h1:0GOXKqyvNwk3DLmsFu9v0oYM0ZcD1ysGnlHCerKoAmo= +fyne.io/fyne/v2 v2.6.3 h1:cvtM2KHeRuH+WhtHiA63z5wJVBkQ9+Ay0UMl9PxFHyA= +fyne.io/fyne/v2 v2.6.3/go.mod h1:NGSurpRElVoI1G3h+ab2df3O5KLGh1CGbsMMcX0bPIs= fyne.io/systray v1.11.1-0.20250603113521-ca66a66d8b58 h1:eA5/u2XRd8OUkoMqEv3IBlFYSruNlXD8bRHDiqm0VNI= fyne.io/systray v1.11.1-0.20250603113521-ca66a66d8b58/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs= github.com/AynaLivePlayer/blivedm-go v0.0.0-20250629154348-690af765bfbc h1:t1fMdqUjB2lR9uuGQ9yWJ7LJ3h1hXhI+LhbTpElPueI= @@ -50,6 +50,8 @@ github.com/fyne-io/glfw-js v0.3.0 h1:d8k2+Y7l+zy2pc7wlGRyPfTgZoqDf3AI4G+2zOWhWUk github.com/fyne-io/glfw-js v0.3.0/go.mod h1:Ri6te7rdZtBgBpxLW19uBpp3Dl6K9K/bRaYdJ22G8Jk= github.com/fyne-io/image v0.1.1 h1:WH0z4H7qfvNUw5l4p3bC1q70sa5+YWVt6HCj7y4VNyA= github.com/fyne-io/image v0.1.1/go.mod h1:xrfYBh6yspc+KjkgdZU/ifUC9sPA5Iv7WYUBzQKK7JM= +github.com/fyne-io/oksvg v0.1.0 h1:7EUKk3HV3Y2E+qypp3nWqMXD7mum0hCw2KEGhI1fnBw= +github.com/fyne-io/oksvg v0.1.0/go.mod h1:dJ9oEkPiWhnTFNCmRgEze+YNprJF7YRbpjgpWS4kzoI= github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 h1:5BVwOaUSBTlVZowGO6VZGw2H/zl9nrd3eCZfYV+NfQA= github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20250301202403-da16c1255728 h1:RkGhqHxEVAvPM0/R+8g7XRwQnHatO0KAuVcwHo8q9W8= @@ -76,6 +78,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hack-pad/go-indexeddb v0.3.2 h1:DTqeJJYc1usa45Q5r52t01KhvlSN02+Oq+tQbSBI91A= +github.com/hack-pad/go-indexeddb v0.3.2/go.mod h1:QvfTevpDVlkfomY498LhstjwbPW6QC4VC/lxYb0Kom0= +github.com/hack-pad/safejs v0.1.0 h1:qPS6vjreAqh2amUqj4WNG1zIw7qlRQJ9K10eDKMCnE8= +github.com/hack-pad/safejs v0.1.0/go.mod h1:HdS+bKF1NrE72VoXZeWzxFOVQVUSqZJAG0xNCnb+Tio= github.com/jeandeaual/go-locale v0.0.0-20250612000132-0ef82f21eade h1:FmusiCI1wHw+XQbvL9M+1r/C3SPqKrmBaIOYwVfQoDE= github.com/jeandeaual/go-locale v0.0.0-20250612000132-0ef82f21eade/go.mod h1:ZDXo8KHryOWSIqnsb/CiDq7hQUYryCgdVnxbj8tDG7o= github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= @@ -160,8 +166,6 @@ golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/y golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= golang.org/x/image v0.24.0 h1:AN7zRgVsbvmTfNyqIbbOraYL8mSwcKncEj8ofjgzcMQ= golang.org/x/image v0.24.0/go.mod h1:4b/ITuLfqYq1hqZcjofwctIhi7sZh2WaCjvsBNjjya8= -golang.org/x/mobile v0.0.0-20231127183840-76ac6878050a h1:sYbmY3FwUWCBTodZL1S3JUuOvaW6kM2o+clDzzDNBWg= -golang.org/x/mobile v0.0.0-20231127183840-76ac6878050a/go.mod h1:Ede7gF0KGoHlj822RtphAHK1jLdrcuRBZg0sF1Q+SPc= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= diff --git a/gui/gutil/fyne.go b/gui/gutil/fyne.go index 3f3c119..131e8be 100644 --- a/gui/gutil/fyne.go +++ b/gui/gutil/fyne.go @@ -2,20 +2,20 @@ package gutil import ( "AynaLivePlayer/pkg/event" + "fyne.io/fyne/v2" ) // since 2.6.1, calls to fyne API from other go routine must be wrapped in fyne.Do func ThreadSafeHandler(fn func(e *event.Event)) func(e *event.Event) { - return fn - // todo: uncomment this after 2.6.x become stable - //return func(e *event.Event) { - // fyne.Do(func() { - // fn(e) - // }) - //} + //return fn + return func(e *event.Event) { + fyne.Do(func() { + fn(e) + }) + } } func RunInFyneThread(fn func()) { - fn() - //fyne.Do(fn) + //fn() + fyne.Do(fn) } diff --git a/pkg/eventbus/bus.go b/pkg/eventbus/bus.go index 787cfec..3e4c478 100644 --- a/pkg/eventbus/bus.go +++ b/pkg/eventbus/bus.go @@ -1,6 +1,7 @@ package eventbus type Event struct { + // Id is the event id Id string // Channel if channel is empty, then event is broadcast Channel string @@ -33,7 +34,7 @@ type Subscriber interface { type Publisher interface { // Publish basically a wrapper to PublishEvent Publish(eventId string, data interface{}) error - // PublishEvent publish a event + // PublishEvent publish an event PublishEvent(event *Event) error } diff --git a/pkg/eventbus/go.mod b/pkg/eventbus/go.mod deleted file mode 100644 index 1476162..0000000 --- a/pkg/eventbus/go.mod +++ /dev/null @@ -1,11 +0,0 @@ -module eventbus - -go 1.24.4 - -require github.com/stretchr/testify v1.11.1 - -require ( - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect -) diff --git a/playground/bugt/main.go b/playground/bugt/main.go deleted file mode 100644 index e584705..0000000 --- a/playground/bugt/main.go +++ /dev/null @@ -1,57 +0,0 @@ -package main - -import ( - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/app" - "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/data/binding" - "fyne.io/fyne/v2/theme" - "fyne.io/fyne/v2/widget" - "strconv" -) - -var w fyne.Window - -func main() { - a := app.NewWithID("io.fyne.demo") - a.SetIcon(theme.FyneLogo()) - w = a.NewWindow("Fyne Demo") - Regen(w) - w.Resize(fyne.NewSize(1080, 720)) - w.ShowAndRun() -} - -func Regen(w fyne.Window) { - tabs := container.NewDocTabs() - for _, datum := range generateData(600) { - tabs.Append(newItemTab(&datum)) - } - w.SetContent(tabs) -} - -func generateData(n int) (result []int) { - for i := 0; i < n; i++ { - result = append(result, i) - } - return -} - -func newItemTab(i *int) *container.TabItem { - c := container.NewVBox( - BindIntWithLabel(i), - widget.NewButton("Regen", func() { - Regen(w) - }), - ) - return container.NewTabItemWithIcon(strconv.Itoa(*i), theme.MenuIcon(), c) -} - -func BindIntWithLabel(k *int) *widget.Label { - b := binding.BindInt(k) - return widget.NewLabelWithData(binding.IntToString(b)) -} - -func BindIntWithEntry(k *int) *widget.Entry { - b := binding.BindInt(k) - return widget.NewEntryWithData(binding.IntToString(b)) -} From f13577f890d436e8234faf8a3c9c0eb78cf085ff Mon Sep 17 00:00:00 2001 From: aynakeya Date: Mon, 29 Sep 2025 00:02:49 +0800 Subject: [PATCH 2/3] upgrade event to eventbus; remove old event package --- app/main.go | 11 +- core/events/event.go | 18 +- core/events/liveroom.go | 4 +- core/events/mapping.go | 5 +- core/events/playlist.go | 41 ++-- global/global.go | 4 +- gui/config_basic.go | 22 +- gui/gui.go | 6 +- gui/gutil/fyne.go | 6 +- gui/handler.go | 4 +- gui/history_list.go | 10 +- gui/liverooms.go | 28 +-- gui/player_controller.go | 26 +-- gui/player_lyric.go | 14 +- gui/player_playlist.go | 8 +- gui/player_videoplayer.go | 2 +- gui/playlists.go | 32 +-- gui/search_bar.go | 8 +- gui/search_list.go | 8 +- gui/updater.go | 6 +- internal/controller/controller.go | 52 ++--- internal/controller/lyric.go | 14 +- internal/controller/search.go | 8 +- internal/liveroom/liveroom.go | 38 ++-- internal/player/mpv/config.go | 8 +- internal/player/mpv/mpv.go | 46 ++--- internal/player/vlc/config.go | 8 +- internal/player/vlc/vlc.go | 48 ++--- internal/playlist/model.go | 28 +-- internal/playlist/playlist.go | 12 +- internal/playlist/playlists.go | 50 ++--- internal/source/nosource.go | 2 +- internal/source/source.go | 2 +- internal/sysmediacontrol/smtc_windows.go | 18 +- internal/updater/application.go | 10 +- pkg/event/event.go | 165 --------------- plugin/diange/diange.go | 18 +- plugin/durationmgmt/durationmgmt.go | 18 +- plugin/qiege/qiege.go | 16 +- plugin/sourcelogin/sourcelogin.go | 8 +- plugin/textinfo/textinfo.go | 22 +- plugin/webinfo/info.go | 35 ---- plugin/webinfo/server.go | 234 --------------------- plugin/webinfo/template.go | 76 ------- plugin/webinfo/template_test.go | 22 -- plugin/webinfo/webinfo.go | 249 ----------------------- plugin/wshub/events.go | 5 +- plugin/wshub/server.go | 2 +- plugin/wshub/wshub.go | 6 +- plugin/yinliang/yinliang.go | 12 +- 50 files changed, 356 insertions(+), 1139 deletions(-) delete mode 100644 pkg/event/event.go delete mode 100644 plugin/webinfo/info.go delete mode 100644 plugin/webinfo/server.go delete mode 100644 plugin/webinfo/template.go delete mode 100644 plugin/webinfo/template_test.go delete mode 100644 plugin/webinfo/webinfo.go diff --git a/app/main.go b/app/main.go index 0ffdbd8..0dd5706 100644 --- a/app/main.go +++ b/app/main.go @@ -6,7 +6,7 @@ import ( "AynaLivePlayer/gui" "AynaLivePlayer/internal" "AynaLivePlayer/pkg/config" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "AynaLivePlayer/pkg/i18n" "AynaLivePlayer/pkg/logger" loggerRepo "AynaLivePlayer/pkg/logger/repository" @@ -39,7 +39,8 @@ var Log = &_LogConfig{ } func setupGlobal() { - global.EventManager = event.NewManger(128, 16) + //global.EventManager = event.NewManger(128, 16) + global.EventBus = eventbus.New() global.Logger = loggerRepo.NewZapColoredLogger(Log.Path, !*dev) global.Logger.SetLogLevel(Log.Level) } @@ -57,7 +58,8 @@ func main() { // temporary fix for gui not render correctly. // wait until gui rendered then start event dispatching time.Sleep(1 * time.Second) - global.EventManager.Start() + //global.EventManager.Start() + _ = global.EventBus.Start() }() if *headless || config.Experimental.Headless { quit := make(chan os.Signal) @@ -70,7 +72,8 @@ func main() { global.Logger.Info("closing internal server") internal.Stop() global.Logger.Infof("closing event manager") - global.EventManager.Stop() + //global.EventManager.Stop() + _ = global.EventBus.Stop() if *dev { global.Logger.Infof("saving translation") i18n.SaveTranslation() diff --git a/core/events/event.go b/core/events/event.go index 69827ae..5cdd8ed 100644 --- a/core/events/event.go +++ b/core/events/event.go @@ -1,13 +1,13 @@ package events //const ( -// EventPlay event.EventId = "player.play" -// EventPlayed event.EventId = "player.played" -// EventPlaylistPreInsert event.EventId = "playlist.insert.pre" -// EventPlaylistInsert event.EventId = "playlist.insert.after" -// EventPlaylistUpdate event.EventId = "playlist.update" -// EventLyricUpdate event.EventId = "lyric.update" -// EventLyricReload event.EventId = "lyric.reload" +// EventPlay string = "player.play" +// EventPlayed string = "player.played" +// EventPlaylistPreInsert string = "playlist.insert.pre" +// EventPlaylistInsert string = "playlist.insert.after" +// EventPlaylistUpdate string = "playlist.update" +// EventLyricUpdate string = "lyric.update" +// EventLyricReload string = "lyric.reload" //) const ErrorUpdate = "update.error" @@ -17,8 +17,8 @@ type ErrorUpdateEvent struct { } // -//func EventPlayerPropertyUpdate(property model.PlayerProperty) event.EventId { -// return event.EventId("player.property.update." + string(property)) +//func EventPlayerPropertyUpdate(property model.PlayerProperty) string { +// return string("player.property.update." + string(property)) //} // //type PlaylistInsertEvent struct { diff --git a/core/events/liveroom.go b/core/events/liveroom.go index be43abc..a70cf6d 100644 --- a/core/events/liveroom.go +++ b/core/events/liveroom.go @@ -6,8 +6,8 @@ import ( ) //const ( -// LiveRoomStatusChange event.EventId = "liveclient.status.change" -// LiveRoomMessageReceive event.EventId = "liveclient.message.receive" +// LiveRoomStatusChange string = "liveclient.status.change" +// LiveRoomMessageReceive string = "liveclient.message.receive" //) // //type StatusChangeEvent struct { diff --git a/core/events/mapping.go b/core/events/mapping.go index b2eb0ac..d79103a 100644 --- a/core/events/mapping.go +++ b/core/events/mapping.go @@ -2,13 +2,12 @@ package events import ( "AynaLivePlayer/core/model" - "AynaLivePlayer/pkg/event" "encoding/json" "errors" "reflect" ) -var EventsMapping = map[event.EventId]any{ +var EventsMapping = map[string]any{ LiveRoomAddCmd: LiveRoomAddCmdEvent{}, LiveRoomProviderUpdate: LiveRoomProviderUpdateEvent{}, LiveRoomRemoveCmd: LiveRoomRemoveCmdEvent{}, @@ -65,7 +64,7 @@ func init() { } } -func UnmarshalEventData(eventId event.EventId, data []byte) (any, error) { +func UnmarshalEventData(eventId string, data []byte) (any, error) { val, ok := EventsMapping[eventId] if !ok { return nil, errors.New("event id not found") diff --git a/core/events/playlist.go b/core/events/playlist.go index c6d9b3b..8b3cc9e 100644 --- a/core/events/playlist.go +++ b/core/events/playlist.go @@ -2,19 +2,18 @@ package events import ( "AynaLivePlayer/core/model" - "AynaLivePlayer/pkg/event" ) -func PlaylistDetailUpdate(id model.PlaylistID) event.EventId { - return event.EventId("update.playlist.detail." + id) +func PlaylistDetailUpdate(id model.PlaylistID) string { + return string("update.playlist.detail." + id) } type PlaylistDetailUpdateEvent struct { Medias []model.Media } -func PlaylistMoveCmd(id model.PlaylistID) event.EventId { - return event.EventId("cmd.playlist.move." + id) +func PlaylistMoveCmd(id model.PlaylistID) string { + return string("cmd.playlist.move." + id) } type PlaylistMoveCmdEvent struct { @@ -22,24 +21,24 @@ type PlaylistMoveCmdEvent struct { To int } -func PlaylistSetIndexCmd(id model.PlaylistID) event.EventId { - return event.EventId("cmd.playlist.setindex." + id) +func PlaylistSetIndexCmd(id model.PlaylistID) string { + return string("cmd.playlist.setindex." + id) } type PlaylistSetIndexCmdEvent struct { Index int } -func PlaylistDeleteCmd(id model.PlaylistID) event.EventId { - return event.EventId("cmd.playlist.delete." + id) +func PlaylistDeleteCmd(id model.PlaylistID) string { + return string("cmd.playlist.delete." + id) } type PlaylistDeleteCmdEvent struct { Index int } -func PlaylistInsertCmd(id model.PlaylistID) event.EventId { - return event.EventId("cmd.playlist.insert." + id) +func PlaylistInsertCmd(id model.PlaylistID) string { + return string("cmd.playlist.insert." + id) } type PlaylistInsertCmdEvent struct { @@ -47,8 +46,8 @@ type PlaylistInsertCmdEvent struct { Media model.Media } -func PlaylistInsertUpdate(id model.PlaylistID) event.EventId { - return event.EventId("update.playlist.insert." + id) +func PlaylistInsertUpdate(id model.PlaylistID) string { + return string("update.playlist.insert." + id) } type PlaylistInsertUpdateEvent struct { @@ -56,32 +55,32 @@ type PlaylistInsertUpdateEvent struct { Media model.Media } -func PlaylistNextCmd(id model.PlaylistID) event.EventId { - return event.EventId("cmd.playlist.next." + id) +func PlaylistNextCmd(id model.PlaylistID) string { + return string("cmd.playlist.next." + id) } type PlaylistNextCmdEvent struct { Remove bool // remove the media after next } -func PlaylistNextUpdate(id model.PlaylistID) event.EventId { - return event.EventId("update.playlist.next." + id) +func PlaylistNextUpdate(id model.PlaylistID) string { + return string("update.playlist.next." + id) } type PlaylistNextUpdateEvent struct { Media model.Media } -func PlaylistModeChangeCmd(id model.PlaylistID) event.EventId { - return event.EventId("cmd.playlist.mode." + id) +func PlaylistModeChangeCmd(id model.PlaylistID) string { + return string("cmd.playlist.mode." + id) } type PlaylistModeChangeCmdEvent struct { Mode model.PlaylistMode } -func PlaylistModeChangeUpdate(id model.PlaylistID) event.EventId { - return event.EventId("update.playlist.mode." + id) +func PlaylistModeChangeUpdate(id model.PlaylistID) string { + return string("update.playlist.mode." + id) } type PlaylistModeChangeUpdateEvent struct { diff --git a/global/global.go b/global/global.go index 7aefa74..0ac757e 100644 --- a/global/global.go +++ b/global/global.go @@ -1,10 +1,10 @@ package global import ( - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "AynaLivePlayer/pkg/logger" ) var Logger logger.ILogger = nil -var EventManager *event.Manager = nil +var EventBus eventbus.Bus = nil diff --git a/gui/config_basic.go b/gui/config_basic.go index ee66ae1..67f4dee 100644 --- a/gui/config_basic.go +++ b/gui/config_basic.go @@ -7,7 +7,7 @@ import ( "AynaLivePlayer/gui/component" "AynaLivePlayer/gui/gutil" "AynaLivePlayer/pkg/config" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "AynaLivePlayer/pkg/i18n" "fyne.io/fyne/v2" "fyne.io/fyne/v2/container" @@ -38,14 +38,14 @@ func (b *bascicConfig) CreatePanel() fyne.CanvasObject { mode = model.PlaylistModeRandom } logger.Infof("Set player playlist mode to %d", mode) - global.EventManager.CallA(events.PlaylistModeChangeCmd(model.PlaylistIDPlayer), + _ = global.EventBus.Publish(events.PlaylistModeChangeCmd(model.PlaylistIDPlayer), events.PlaylistModeChangeCmdEvent{ Mode: mode, }) }) - global.EventManager.RegisterA(events.PlaylistModeChangeUpdate(model.PlaylistIDPlayer), + global.EventBus.Subscribe("", events.PlaylistModeChangeUpdate(model.PlaylistIDPlayer), "gui.config.basic.random_playlist.player", - gutil.ThreadSafeHandler(func(event *event.Event) { + gutil.ThreadSafeHandler(func(event *eventbus.Event) { data := event.Data.(events.PlaylistModeChangeUpdateEvent) playerRandomCheck.SetChecked(data.Mode == model.PlaylistModeRandom) })) @@ -56,15 +56,15 @@ func (b *bascicConfig) CreatePanel() fyne.CanvasObject { if b { mode = model.PlaylistModeRandom } - global.EventManager.CallA(events.PlaylistModeChangeCmd(model.PlaylistIDSystem), + _ = global.EventBus.Publish(events.PlaylistModeChangeCmd(model.PlaylistIDSystem), events.PlaylistModeChangeCmdEvent{ Mode: mode, }) }) - global.EventManager.RegisterA(events.PlaylistModeChangeUpdate(model.PlaylistIDSystem), + global.EventBus.Subscribe("", events.PlaylistModeChangeUpdate(model.PlaylistIDSystem), "gui.config.basic.random_playlist.system", - gutil.ThreadSafeHandler(func(event *event.Event) { + gutil.ThreadSafeHandler(func(event *eventbus.Event) { data := event.Data.(events.PlaylistModeChangeUpdateEvent) systemRandomCheck.SetChecked(data.Mode == model.PlaylistModeRandom) })) @@ -80,14 +80,14 @@ func (b *bascicConfig) CreatePanel() fyne.CanvasObject { if !ok { return } - global.EventManager.CallA(events.PlayerSetAudioDeviceCmd, events.PlayerSetAudioDeviceCmdEvent{ + _ = global.EventBus.Publish(events.PlayerSetAudioDeviceCmd, events.PlayerSetAudioDeviceCmdEvent{ Device: name, }) }) - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.PlayerAudioDeviceUpdate, "gui.config.basic.audio_device.update", - gutil.ThreadSafeHandler(func(event *event.Event) { + gutil.ThreadSafeHandler(func(event *eventbus.Event) { data := event.Data.(events.PlayerAudioDeviceUpdateEvent) devices := make([]string, len(data.Devices)) deviceDesc2Name = make(map[string]string) @@ -123,7 +123,7 @@ func (b *bascicConfig) CreatePanel() fyne.CanvasObject { config.General.AutoCheckUpdate), ) checkUpdateBtn := widget.NewButton(i18n.T("gui.config.basic.check_update"), func() { - global.EventManager.CallA(events.CheckUpdateCmd, events.CheckUpdateCmdEvent{}) + _ = global.EventBus.Publish(events.CheckUpdateCmd, events.CheckUpdateCmdEvent{}) }) useSysPlaylistBtn := container.NewHBox( widget.NewLabel(i18n.T("gui.config.basic.use_system_playlist")), diff --git a/gui/gui.go b/gui/gui.go index bd46f3b..d23d931 100644 --- a/gui/gui.go +++ b/gui/gui.go @@ -5,7 +5,7 @@ import ( "AynaLivePlayer/global" "AynaLivePlayer/gui/gutil" "AynaLivePlayer/pkg/config" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "AynaLivePlayer/pkg/i18n" "AynaLivePlayer/resource" "fyne.io/fyne/v2" @@ -72,8 +72,8 @@ func Initialize() { // setupPlayerWindow() // register error - global.EventManager.RegisterA( - events.ErrorUpdate, "gui.show_error", gutil.ThreadSafeHandler(func(e *event.Event) { + global.EventBus.Subscribe("", + events.ErrorUpdate, "gui.show_error", gutil.ThreadSafeHandler(func(e *eventbus.Event) { err := e.Data.(events.ErrorUpdateEvent).Error logger.Warnf("gui received error event: %v, %v", err, err == nil) if err == nil { diff --git a/gui/gutil/fyne.go b/gui/gutil/fyne.go index 131e8be..d901c75 100644 --- a/gui/gutil/fyne.go +++ b/gui/gutil/fyne.go @@ -1,14 +1,14 @@ package gutil import ( - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "fyne.io/fyne/v2" ) // since 2.6.1, calls to fyne API from other go routine must be wrapped in fyne.Do -func ThreadSafeHandler(fn func(e *event.Event)) func(e *event.Event) { +func ThreadSafeHandler(fn func(e *eventbus.Event)) func(e *eventbus.Event) { //return fn - return func(e *event.Event) { + return func(e *eventbus.Event) { fyne.Do(func() { fn(e) }) diff --git a/gui/handler.go b/gui/handler.go index 5b847c0..6c522f7 100644 --- a/gui/handler.go +++ b/gui/handler.go @@ -3,11 +3,11 @@ package gui import ( "AynaLivePlayer/core/events" "AynaLivePlayer/global" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" ) func registerHandlers() { - global.EventManager.RegisterA(events.GUISetPlayerWindowOpenCmd, "gui.player.videoplayer.handleopen", func(event *event.Event) { + global.EventBus.Subscribe("", events.GUISetPlayerWindowOpenCmd, "gui.player.videoplayer.handleopen", func(event *eventbus.Event) { data := event.Data.(events.GUISetPlayerWindowOpenCmdEvent) if data.SetOpen { playerWindow.Close() diff --git a/gui/history_list.go b/gui/history_list.go index 5b69829..b4949ad 100644 --- a/gui/history_list.go +++ b/gui/history_list.go @@ -5,7 +5,7 @@ import ( "AynaLivePlayer/core/model" "AynaLivePlayer/global" "AynaLivePlayer/gui/gutil" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "AynaLivePlayer/pkg/i18n" "fmt" "fyne.io/fyne/v2" @@ -50,12 +50,12 @@ func createHistoryList() fyne.CanvasObject { btns := object.(*fyne.Container).Objects[2].(*fyne.Container).Objects m.User = model.SystemUser btns[0].(*widget.Button).OnTapped = func() { - global.EventManager.CallA(events.PlayerPlayCmd, events.PlayerPlayCmdEvent{ + _ = global.EventBus.Publish(events.PlayerPlayCmd, events.PlayerPlayCmdEvent{ Media: m, }) } btns[1].(*widget.Button).OnTapped = func() { - global.EventManager.CallA(events.PlaylistInsertCmd(model.PlaylistIDPlayer), events.PlaylistInsertCmdEvent{ + _ = global.EventBus.Publish(events.PlaylistInsertCmd(model.PlaylistIDPlayer), events.PlaylistInsertCmdEvent{ Media: m, Position: -1, }) @@ -75,9 +75,9 @@ func createHistoryList() fyne.CanvasObject { } func registerHistoryHandler() { - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.PlaylistDetailUpdate(model.PlaylistIDHistory), - "gui.history.update", gutil.ThreadSafeHandler(func(event *event.Event) { + "gui.history.update", gutil.ThreadSafeHandler(func(event *eventbus.Event) { History.mux.Lock() History.Medias = event.Data.(events.PlaylistDetailUpdateEvent).Medias History.List.Refresh() diff --git a/gui/liverooms.go b/gui/liverooms.go index e92a6e3..2b679de 100644 --- a/gui/liverooms.go +++ b/gui/liverooms.go @@ -6,7 +6,7 @@ import ( "AynaLivePlayer/global" "AynaLivePlayer/gui/gutil" "AynaLivePlayer/gui/xfyne" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "AynaLivePlayer/pkg/i18n" "fyne.io/fyne/v2" "fyne.io/fyne/v2/container" @@ -80,7 +80,7 @@ func createRoomSelector() fyne.CanvasObject { func(b bool) { if b && len(clientNameEntry.Selected) > 0 && len(idEntry.Text) > 0 { logger.Infof("Add room %s %s", clientNameEntry.Selected, idEntry.Text) - global.EventManager.CallA( + _ = global.EventBus.Publish( events.LiveRoomAddCmd, events.LiveRoomAddCmdEvent{ Title: nameEntry.Text, @@ -98,7 +98,7 @@ func createRoomSelector() fyne.CanvasObject { if len(RoomTab.rooms) == 0 { return } - global.EventManager.CallA( + _ = global.EventBus.Publish( events.LiveRoomRemoveCmd, events.LiveRoomRemoveCmdEvent{ Identifier: RoomTab.rooms[RoomTab.Index].LiveRoom.Identifier(), @@ -133,17 +133,17 @@ func createRoomSelector() fyne.CanvasObject { } func registerRoomHandlers() { - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.LiveRoomProviderUpdate, "gui.liveroom.provider_update", - gutil.ThreadSafeHandler(func(event *event.Event) { + gutil.ThreadSafeHandler(func(event *eventbus.Event) { RoomTab.providers = event.Data.(events.LiveRoomProviderUpdateEvent).Providers RoomTab.Rooms.Refresh() })) - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.LiveRoomRoomsUpdate, "gui.liveroom.rooms_update", - gutil.ThreadSafeHandler(func(event *event.Event) { + gutil.ThreadSafeHandler(func(event *eventbus.Event) { logger.Infof("Update rooms") data := event.Data.(events.LiveRoomRoomsUpdateEvent) RoomTab.lock.Lock() @@ -152,10 +152,10 @@ func registerRoomHandlers() { RoomTab.Rooms.Refresh() RoomTab.lock.Unlock() })) - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.LiveRoomStatusUpdate, "gui.liveroom.room_status_update", - gutil.ThreadSafeHandler(func(event *event.Event) { + gutil.ThreadSafeHandler(func(event *eventbus.Event) { room := event.Data.(events.LiveRoomStatusUpdateEvent).Room index := -1 for i := 0; i < len(RoomTab.rooms); i++ { @@ -194,7 +194,7 @@ func createRoomController() fyne.CanvasObject { } RoomTab.ConnectBtn.Disable() logger.Infof("Connect to room %s", RoomTab.rooms[RoomTab.Index].LiveRoom.Identifier()) - global.EventManager.CallA( + _ = global.EventBus.Publish( events.LiveRoomOperationCmd, events.LiveRoomOperationCmdEvent{ Identifier: RoomTab.rooms[RoomTab.Index].LiveRoom.Identifier(), @@ -207,17 +207,17 @@ func createRoomController() fyne.CanvasObject { } RoomTab.DisConnectBtn.Disable() logger.Infof("Disconnect from room %s", RoomTab.rooms[RoomTab.Index].LiveRoom.Identifier()) - global.EventManager.CallA( + _ = global.EventBus.Publish( events.LiveRoomOperationCmd, events.LiveRoomOperationCmdEvent{ Identifier: RoomTab.rooms[RoomTab.Index].LiveRoom.Identifier(), SetConnect: false, }) }) - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.LiveRoomOperationFinish, "gui.liveroom.operation_finish", - gutil.ThreadSafeHandler(func(event *event.Event) { + gutil.ThreadSafeHandler(func(event *eventbus.Event) { RoomTab.ConnectBtn.Enable() RoomTab.DisConnectBtn.Enable() })) @@ -229,7 +229,7 @@ func createRoomController() fyne.CanvasObject { return } logger.Infof("Change room %s autoconnect to %v", RoomTab.rooms[RoomTab.Index].LiveRoom.Identifier(), b) - global.EventManager.CallA( + _ = global.EventBus.Publish( events.LiveRoomConfigChangeCmd, events.LiveRoomConfigChangeCmdEvent{ Identifier: RoomTab.rooms[RoomTab.Index].LiveRoom.Identifier(), diff --git a/gui/player_controller.go b/gui/player_controller.go index d102d61..a43285d 100644 --- a/gui/player_controller.go +++ b/gui/player_controller.go @@ -6,7 +6,7 @@ import ( "AynaLivePlayer/global" "AynaLivePlayer/gui/component" "AynaLivePlayer/gui/gutil" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "AynaLivePlayer/pkg/i18n" "AynaLivePlayer/pkg/util" "AynaLivePlayer/resource" @@ -45,16 +45,16 @@ var PlayController = &PlayControllerContainer{} func registerPlayControllerHandler() { PlayController.ButtonPrev.OnTapped = func() { - global.EventManager.CallA(events.PlayerSeekCmd, events.PlayerSeekCmdEvent{ + _ = global.EventBus.Publish(events.PlayerSeekCmd, events.PlayerSeekCmdEvent{ Position: 0, Absolute: true, }) } PlayController.ButtonSwitch.OnTapped = func() { - global.EventManager.CallA(events.PlayerToggleCmd, events.PlayerToggleCmdEvent{}) + _ = global.EventBus.Publish(events.PlayerToggleCmd, events.PlayerToggleCmdEvent{}) } PlayController.ButtonNext.OnTapped = func() { - global.EventManager.CallA(events.PlayerPlayNextCmd, events.PlayerPlayNextCmdEvent{}) + _ = global.EventBus.Publish(events.PlayerPlayNextCmd, events.PlayerPlayNextCmdEvent{}) } PlayController.ButtonLrc.OnTapped = func() { @@ -68,7 +68,7 @@ func registerPlayControllerHandler() { showPlayerWindow() } - global.EventManager.RegisterA(events.PlayerPropertyPauseUpdate, "gui.player.controller.paused", gutil.ThreadSafeHandler(func(event *event.Event) { + global.EventBus.Subscribe("", events.PlayerPropertyPauseUpdate, "gui.player.controller.paused", gutil.ThreadSafeHandler(func(event *eventbus.Event) { if event.Data.(events.PlayerPropertyPauseUpdateEvent).Paused { PlayController.ButtonSwitch.Icon = theme.MediaPlayIcon() } else { @@ -77,7 +77,7 @@ func registerPlayControllerHandler() { PlayController.ButtonSwitch.Refresh() })) - global.EventManager.RegisterA(events.PlayerPropertyPercentPosUpdate, "gui.player.controller.percent_pos", gutil.ThreadSafeHandler(func(event *event.Event) { + global.EventBus.Subscribe("", events.PlayerPropertyPercentPosUpdate, "gui.player.controller.percent_pos", gutil.ThreadSafeHandler(func(event *eventbus.Event) { if PlayController.Progress.Dragging { return } @@ -85,7 +85,7 @@ func registerPlayControllerHandler() { PlayController.Progress.Refresh() })) - global.EventManager.RegisterA(events.PlayerPropertyStateUpdate, "gui.player.controller.idle_active", gutil.ThreadSafeHandler(func(event *event.Event) { + global.EventBus.Subscribe("", events.PlayerPropertyStateUpdate, "gui.player.controller.idle_active", gutil.ThreadSafeHandler(func(event *eventbus.Event) { state := event.Data.(events.PlayerPropertyStateUpdateEvent).State if state == model.PlayerStateIdle || state == model.PlayerStateLoading { PlayController.Progress.Value = 0 @@ -101,33 +101,33 @@ func registerPlayControllerHandler() { PlayController.Progress.Max = 0 PlayController.Progress.OnDragEnd = func(f float64) { - global.EventManager.CallA(events.PlayerSeekCmd, events.PlayerSeekCmdEvent{ + _ = global.EventBus.Publish(events.PlayerSeekCmd, events.PlayerSeekCmdEvent{ Position: f / 10, Absolute: false, }) } - global.EventManager.RegisterA(events.PlayerPropertyTimePosUpdate, "gui.player.controller.time_pos", gutil.ThreadSafeHandler(func(event *event.Event) { + global.EventBus.Subscribe("", events.PlayerPropertyTimePosUpdate, "gui.player.controller.time_pos", gutil.ThreadSafeHandler(func(event *eventbus.Event) { PlayController.CurrentTime.SetText(util.FormatTime(int(event.Data.(events.PlayerPropertyTimePosUpdateEvent).TimePos))) })) - global.EventManager.RegisterA(events.PlayerPropertyDurationUpdate, "gui.player.controller.duration", gutil.ThreadSafeHandler(func(event *event.Event) { + global.EventBus.Subscribe("", events.PlayerPropertyDurationUpdate, "gui.player.controller.duration", gutil.ThreadSafeHandler(func(event *eventbus.Event) { PlayController.TotalTime.SetText(util.FormatTime(int(event.Data.(events.PlayerPropertyDurationUpdateEvent).Duration))) })) - global.EventManager.RegisterA(events.PlayerPropertyVolumeUpdate, "gui.player.controller.volume", gutil.ThreadSafeHandler(func(event *event.Event) { + global.EventBus.Subscribe("", events.PlayerPropertyVolumeUpdate, "gui.player.controller.volume", gutil.ThreadSafeHandler(func(event *eventbus.Event) { PlayController.Volume.Value = event.Data.(events.PlayerPropertyVolumeUpdateEvent).Volume PlayController.Volume.Refresh() })) PlayController.Volume.OnChanged = func(f float64) { - global.EventManager.CallA(events.PlayerVolumeChangeCmd, events.PlayerVolumeChangeCmdEvent{ + _ = global.EventBus.Publish(events.PlayerVolumeChangeCmd, events.PlayerVolumeChangeCmdEvent{ Volume: f, }) } // todo: double check cover loading for new thread model - global.EventManager.RegisterA(events.PlayerPlayingUpdate, "gui.player.updateinfo", gutil.ThreadSafeHandler(func(event *event.Event) { + global.EventBus.Subscribe("", events.PlayerPlayingUpdate, "gui.player.updateinfo", gutil.ThreadSafeHandler(func(event *eventbus.Event) { if event.Data.(events.PlayerPlayingUpdateEvent).Removed { PlayController.Progress.Value = 0 PlayController.Progress.Max = 0 diff --git a/gui/player_lyric.go b/gui/player_lyric.go index deec266..2432a5e 100644 --- a/gui/player_lyric.go +++ b/gui/player_lyric.go @@ -4,7 +4,7 @@ import ( "AynaLivePlayer/core/events" "AynaLivePlayer/global" "AynaLivePlayer/gui/gutil" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "AynaLivePlayer/pkg/i18n" "fyne.io/fyne/v2" "fyne.io/fyne/v2/container" @@ -42,9 +42,8 @@ func createLyricWindow() fyne.Window { w.CenterOnScreen() // register handlers - // todo: lyric not update correctly, known bug https://github.com/fyne-io/fyne/pull/5783 - global.EventManager.RegisterA( - events.PlayerLyricPosUpdate, "player.lyric.current_lyric", gutil.ThreadSafeHandler(func(event *event.Event) { + global.EventBus.Subscribe("", + events.PlayerLyricPosUpdate, "player.lyric.current_lyric", gutil.ThreadSafeHandler(func(event *eventbus.Event) { e := event.Data.(events.PlayerLyricPosUpdateEvent) logger.Debug("lyric update", e) if prevIndex >= len(fullLrc.Objects) || e.CurrentIndex >= len(fullLrc.Objects) { @@ -70,17 +69,16 @@ func createLyricWindow() fyne.Window { fullLrc.Refresh() })) - global.EventManager.RegisterA(events.PlayerLyricReload, "player.lyric.current_lyric", gutil.ThreadSafeHandler(func(event *event.Event) { + global.EventBus.Subscribe("", events.PlayerLyricReload, "player.lyric.current_lyric", gutil.ThreadSafeHandler(func(event *eventbus.Event) { e := event.Data.(events.PlayerLyricReloadEvent) fullLrc.Objects = createLyricObj(&e.Lyrics) lrcWindow.Refresh() })) - global.EventManager.CallA(events.PlayerLyricRequestCmd, events.PlayerLyricRequestCmdEvent{}) + _ = global.EventBus.Publish(events.PlayerLyricRequestCmd, events.PlayerLyricRequestCmdEvent{}) w.SetOnClosed(func() { - global.EventManager.Unregister("player.lyric.current_lyric") - global.EventManager.Unregister("player.lyric.new_media") + global.EventBus.Unsubscribe(events.PlayerLyricReload, "player.lyric.current_lyric") PlayController.LrcWindowOpen = false }) return w diff --git a/gui/player_playlist.go b/gui/player_playlist.go index 84f3293..79f084e 100644 --- a/gui/player_playlist.go +++ b/gui/player_playlist.go @@ -5,7 +5,7 @@ import ( "AynaLivePlayer/core/model" "AynaLivePlayer/global" "AynaLivePlayer/gui/gutil" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "AynaLivePlayer/pkg/i18n" "fmt" "fyne.io/fyne/v2" @@ -28,12 +28,12 @@ func (b *playlistOperationButton) Tapped(e *fyne.PointEvent) { func newPlaylistOperationButton() *playlistOperationButton { b := &playlistOperationButton{Index: 0} deleteItem := fyne.NewMenuItem(i18n.T("gui.player.playlist.op.delete"), func() { - global.EventManager.CallA(events.PlaylistDeleteCmd(model.PlaylistIDPlayer), events.PlaylistDeleteCmdEvent{ + _ = global.EventBus.Publish(events.PlaylistDeleteCmd(model.PlaylistIDPlayer), events.PlaylistDeleteCmdEvent{ Index: b.Index, }) }) topItem := fyne.NewMenuItem(i18n.T("gui.player.playlist.op.top"), func() { - global.EventManager.CallA(events.PlaylistMoveCmd(model.PlaylistIDPlayer), events.PlaylistMoveCmdEvent{ + _ = global.EventBus.Publish(events.PlaylistMoveCmd(model.PlaylistIDPlayer), events.PlaylistMoveCmdEvent{ From: b.Index, To: 0, }) @@ -75,7 +75,7 @@ func createPlaylist() fyne.CanvasObject { object.(*fyne.Container).Objects[1].(*widget.Label).SetText(fmt.Sprintf("%d", id)) object.(*fyne.Container).Objects[2].(*playlistOperationButton).Index = id }) - global.EventManager.RegisterA(events.PlaylistDetailUpdate(model.PlaylistIDPlayer), "gui.player.playlist.update", gutil.ThreadSafeHandler(func(event *event.Event) { + global.EventBus.Subscribe("", events.PlaylistDetailUpdate(model.PlaylistIDPlayer), "gui.player.playlist.update", gutil.ThreadSafeHandler(func(event *eventbus.Event) { UserPlaylist.mux.Lock() UserPlaylist.Medias = event.Data.(events.PlaylistDetailUpdateEvent).Medias UserPlaylist.List.Refresh() diff --git a/gui/player_videoplayer.go b/gui/player_videoplayer.go index 540887f..4b86619 100644 --- a/gui/player_videoplayer.go +++ b/gui/player_videoplayer.go @@ -25,7 +25,7 @@ func showPlayerWindow() { playerWindowHandle = xfyne.GetWindowHandle(playerWindow) logger.Infof("video output window handle: %d", playerWindowHandle) if playerWindowHandle != 0 { - global.EventManager.CallA(events.PlayerVideoPlayerSetWindowHandleCmd, + _ = global.EventBus.Publish(events.PlayerVideoPlayerSetWindowHandleCmd, events.PlayerVideoPlayerSetWindowHandleCmdEvent{Handle: playerWindowHandle}) } } diff --git a/gui/playlists.go b/gui/playlists.go index 4935a14..4894d04 100644 --- a/gui/playlists.go +++ b/gui/playlists.go @@ -6,7 +6,7 @@ import ( "AynaLivePlayer/global" "AynaLivePlayer/gui/gutil" "AynaLivePlayer/gui/xfyne" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "AynaLivePlayer/pkg/i18n" "fmt" "fyne.io/fyne/v2" @@ -64,7 +64,7 @@ func createPlaylists() fyne.CanvasObject { func(b bool) { if b && len(providerEntry.Selected) > 0 && len(idEntry.Text) > 0 { logger.Infof("add playlists %s %s", providerEntry.Selected, idEntry.Text) - global.EventManager.CallA( + _ = global.EventBus.Publish( events.PlaylistManagerAddPlaylistCmd, events.PlaylistManagerAddPlaylistCmdEvent{ Provider: providerEntry.Selected, @@ -82,7 +82,7 @@ func createPlaylists() fyne.CanvasObject { return } logger.Infof("remove playlists %s", PlaylistManager.currentPlaylists[PlaylistManager.Index].Meta.ID()) - global.EventManager.CallA( + _ = global.EventBus.Publish( events.PlaylistManagerRemovePlaylistCmd, events.PlaylistManagerRemovePlaylistCmdEvent{ PlaylistID: PlaylistManager.currentPlaylists[PlaylistManager.Index].Meta.ID(), @@ -93,19 +93,19 @@ func createPlaylists() fyne.CanvasObject { return } PlaylistManager.Index = id - global.EventManager.CallA(events.PlaylistManagerGetCurrentCmd, events.PlaylistManagerGetCurrentCmdEvent{ + _ = global.EventBus.Publish(events.PlaylistManagerGetCurrentCmd, events.PlaylistManagerGetCurrentCmdEvent{ PlaylistID: PlaylistManager.currentPlaylists[id].Meta.ID(), }) } - global.EventManager.RegisterA(events.MediaProviderUpdate, - "gui.playlists.provider.update", gutil.ThreadSafeHandler(func(event *event.Event) { + global.EventBus.Subscribe("", events.MediaProviderUpdate, + "gui.playlists.provider.update", gutil.ThreadSafeHandler(func(event *eventbus.Event) { providers := event.Data.(events.MediaProviderUpdateEvent) s := make([]string, len(providers.Providers)) copy(s, providers.Providers) PlaylistManager.providers = s })) - global.EventManager.RegisterA(events.PlaylistManagerInfoUpdate, - "gui.playlists.info.update", gutil.ThreadSafeHandler(func(event *event.Event) { + global.EventBus.Subscribe("", events.PlaylistManagerInfoUpdate, + "gui.playlists.info.update", gutil.ThreadSafeHandler(func(event *eventbus.Event) { data := event.Data.(events.PlaylistManagerInfoUpdateEvent) prevLen := len(PlaylistManager.currentPlaylists) PlaylistManager.currentPlaylists = data.Playlists @@ -115,8 +115,8 @@ func createPlaylists() fyne.CanvasObject { PlaylistManager.Playlists.Select(0) } })) - global.EventManager.RegisterA(events.PlaylistManagerSystemUpdate, - "gui.playlists.system.update", gutil.ThreadSafeHandler(func(event *event.Event) { + global.EventBus.Subscribe("", events.PlaylistManagerSystemUpdate, + "gui.playlists.system.update", gutil.ThreadSafeHandler(func(event *eventbus.Event) { data := event.Data.(events.PlaylistManagerSystemUpdateEvent) PlaylistManager.CurrentSystemPlaylist.SetText(i18n.T("gui.playlist.current") + data.Info.DisplayName()) })) @@ -137,7 +137,7 @@ func createPlaylistMedias() fyne.CanvasObject { if PlaylistManager.Index >= len(PlaylistManager.currentPlaylists) { return } - global.EventManager.CallA(events.PlaylistManagerRefreshCurrentCmd, events.PlaylistManagerRefreshCurrentCmdEvent{ + _ = global.EventBus.Publish(events.PlaylistManagerRefreshCurrentCmd, events.PlaylistManagerRefreshCurrentCmdEvent{ PlaylistID: PlaylistManager.currentPlaylists[PlaylistManager.Index].Meta.ID(), }) }) @@ -148,7 +148,7 @@ func createPlaylistMedias() fyne.CanvasObject { return } logger.Infof("set playlist %s as system", PlaylistManager.currentPlaylists[PlaylistManager.Index].Meta.ID()) - global.EventManager.CallA(events.PlaylistManagerSetSystemCmd, events.PlaylistManagerSetSystemCmdEvent{ + _ = global.EventBus.Publish(events.PlaylistManagerSetSystemCmd, events.PlaylistManagerSetSystemCmdEvent{ PlaylistID: PlaylistManager.currentPlaylists[PlaylistManager.Index].Meta.ID(), }) }) @@ -179,19 +179,19 @@ func createPlaylistMedias() fyne.CanvasObject { btns := object.(*fyne.Container).Objects[2].(*fyne.Container).Objects m.User = model.SystemUser btns[0].(*widget.Button).OnTapped = func() { - global.EventManager.CallA(events.PlayerPlayCmd, events.PlayerPlayCmdEvent{ + _ = global.EventBus.Publish(events.PlayerPlayCmd, events.PlayerPlayCmdEvent{ Media: m, }) } btns[1].(*widget.Button).OnTapped = func() { - global.EventManager.CallA(events.PlaylistInsertCmd(model.PlaylistIDPlayer), events.PlaylistInsertCmdEvent{ + _ = global.EventBus.Publish(events.PlaylistInsertCmd(model.PlaylistIDPlayer), events.PlaylistInsertCmdEvent{ Media: m, Position: -1, }) } }) - global.EventManager.RegisterA(events.PlaylistManagerCurrentUpdate, - "gui.playlists.current.update", gutil.ThreadSafeHandler(func(event *event.Event) { + global.EventBus.Subscribe("", events.PlaylistManagerCurrentUpdate, + "gui.playlists.current.update", gutil.ThreadSafeHandler(func(event *eventbus.Event) { logger.Infof("receive current playlist update, try to refresh playlist medias") data := event.Data.(events.PlaylistManagerCurrentUpdateEvent) PlaylistManager.currentMedias = data.Medias diff --git a/gui/search_bar.go b/gui/search_bar.go index 9abc539..95db503 100644 --- a/gui/search_bar.go +++ b/gui/search_bar.go @@ -6,7 +6,7 @@ import ( "AynaLivePlayer/global" "AynaLivePlayer/gui/component" "AynaLivePlayer/gui/gutil" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "AynaLivePlayer/pkg/i18n" "fyne.io/fyne/v2" "fyne.io/fyne/v2/container" @@ -35,14 +35,14 @@ func createSearchBar() fyne.CanvasObject { SearchResult.Items = make([]model.Media, 0) SearchResult.List.Refresh() SearchResult.mux.Unlock() - global.EventManager.CallA(events.SearchCmd, events.SearchCmdEvent{ + _ = global.EventBus.Publish(events.SearchCmd, events.SearchCmdEvent{ Keyword: keyword, Provider: pr, }) }) - global.EventManager.RegisterA(events.MediaProviderUpdate, - "gui.search.provider.update", gutil.ThreadSafeHandler(func(event *event.Event) { + global.EventBus.Subscribe("", events.MediaProviderUpdate, + "gui.search.provider.update", gutil.ThreadSafeHandler(func(event *eventbus.Event) { providers := event.Data.(events.MediaProviderUpdateEvent) s := make([]string, len(providers.Providers)) copy(s, providers.Providers) diff --git a/gui/search_list.go b/gui/search_list.go index 5aa074c..1c08f96 100644 --- a/gui/search_list.go +++ b/gui/search_list.go @@ -5,7 +5,7 @@ import ( "AynaLivePlayer/core/model" "AynaLivePlayer/global" "AynaLivePlayer/gui/gutil" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "AynaLivePlayer/pkg/i18n" "fmt" "fyne.io/fyne/v2" @@ -51,18 +51,18 @@ func createSearchList() fyne.CanvasObject { object.(*fyne.Container).Objects[1].(*widget.Label).SetText(fmt.Sprintf("%d", id)) btns := object.(*fyne.Container).Objects[2].(*fyne.Container).Objects btns[0].(*widget.Button).OnTapped = func() { - global.EventManager.CallA(events.PlayerPlayCmd, events.PlayerPlayCmdEvent{ + _ = global.EventBus.Publish(events.PlayerPlayCmd, events.PlayerPlayCmdEvent{ Media: SearchResult.Items[id], }) } btns[1].(*widget.Button).OnTapped = func() { - global.EventManager.CallA(events.PlaylistInsertCmd(model.PlaylistIDPlayer), events.PlaylistInsertCmdEvent{ + _ = global.EventBus.Publish(events.PlaylistInsertCmd(model.PlaylistIDPlayer), events.PlaylistInsertCmdEvent{ Media: SearchResult.Items[id], Position: -1, }) } }) - global.EventManager.RegisterA(events.SearchResultUpdate, "gui.search.update_result", gutil.ThreadSafeHandler(func(event *event.Event) { + global.EventBus.Subscribe("", events.SearchResultUpdate, "gui.search.update_result", gutil.ThreadSafeHandler(func(event *eventbus.Event) { items := event.Data.(events.SearchResultUpdateEvent).Medias SearchResult.Items = items SearchResult.mux.Lock() diff --git a/gui/updater.go b/gui/updater.go index ad62d4a..5b123fd 100644 --- a/gui/updater.go +++ b/gui/updater.go @@ -4,15 +4,15 @@ import ( "AynaLivePlayer/core/events" "AynaLivePlayer/global" "AynaLivePlayer/gui/gutil" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "AynaLivePlayer/pkg/i18n" "fyne.io/fyne/v2/dialog" "fyne.io/fyne/v2/widget" ) func checkUpdate() { - global.EventManager.RegisterA( - events.CheckUpdateResultUpdate, "gui.updater.check_update", gutil.ThreadSafeHandler(func(event *event.Event) { + global.EventBus.Subscribe("", + events.CheckUpdateResultUpdate, "gui.updater.check_update", gutil.ThreadSafeHandler(func(event *eventbus.Event) { data := event.Data.(events.CheckUpdateResultUpdateEvent) msg := data.Info.Version.String() + "\n\n\n" + data.Info.Info if data.HasUpdate { diff --git a/internal/controller/controller.go b/internal/controller/controller.go index 7a85447..56537e2 100644 --- a/internal/controller/controller.go +++ b/internal/controller/controller.go @@ -6,7 +6,7 @@ import ( "AynaLivePlayer/global" "AynaLivePlayer/internal/playlist" "AynaLivePlayer/pkg/config" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" ) func Initialize() { @@ -22,60 +22,60 @@ func Stop() { func handlePlayNext() { log := global.Logger.WithPrefix("Controller") playerState := model.PlayerStatePlaying - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.PlayerPropertyStateUpdate, "internal.controller.playcontrol.idleplaynext", - func(event *event.Event) { + 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.EventManager.CallA(events.PlayerPlayNextCmd, + _ = global.EventBus.Publish(events.PlayerPlayNextCmd, events.PlayerPlayNextCmdEvent{}) } }) - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.PlayerPropertyStateUpdate, - "internal.controller.playcontrol.clear_when_idle", func(event *event.Event) { + "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.EventManager.CallA(events.PlayerPlayingUpdate, events.PlayerPlayingUpdateEvent{ + _ = global.EventBus.Publish(events.PlayerPlayingUpdate, events.PlayerPlayingUpdateEvent{ Media: model.Media{}, Removed: true, }) } }) - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.PlaylistInsertUpdate(model.PlaylistIDPlayer), "internal.controller.playcontrol.playnext_when_insert.player", - func(event *event.Event) { + func(event *eventbus.Event) { if playerState == model.PlayerStateIdle { - global.EventManager.CallA(events.PlayerPlayNextCmd, + _ = global.EventBus.Publish(events.PlayerPlayNextCmd, events.PlayerPlayNextCmdEvent{}) } }) - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.PlaylistInsertUpdate(model.PlaylistIDSystem), "internal.controller.playcontrol.playnext_when_insert.system", - func(event *event.Event) { + func(event *eventbus.Event) { if playerState == model.PlayerStateIdle { - global.EventManager.CallA(events.PlayerPlayNextCmd, + _ = global.EventBus.Publish(events.PlayerPlayNextCmd, events.PlayerPlayNextCmdEvent{}) } }) - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.PlayerPlayNextCmd, "internal.controller.playcontrol.playnext", - func(event *event.Event) { + func(event *eventbus.Event) { if playlist.PlayerPlaylist.Size() > 0 { log.Infof("Try to play next media in player playlist") - global.EventManager.CallA(events.PlaylistNextCmd(model.PlaylistIDPlayer), + _ = global.EventBus.Publish(events.PlaylistNextCmd(model.PlaylistIDPlayer), events.PlaylistNextCmdEvent{ Remove: true, }) @@ -86,36 +86,36 @@ func handlePlayNext() { return } log.Infof("Try to play next media in system playlist") - global.EventManager.CallA(events.PlaylistNextCmd(model.PlaylistIDSystem), + _ = global.EventBus.Publish(events.PlaylistNextCmd(model.PlaylistIDSystem), events.PlaylistNextCmdEvent{ Remove: false, }) }) - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.PlayerPlayErrorUpdate, "internal.controller.playcontrol.playnext_on_error", - func(event *event.Event) { + func(event *eventbus.Event) { if config.General.PlayNextOnFail { - global.EventManager.CallA(events.PlayerPlayNextCmd, events.PlayerPlayNextCmdEvent{}) + _ = global.EventBus.Publish(events.PlayerPlayNextCmd, events.PlayerPlayNextCmdEvent{}) return } }) - global.EventManager.RegisterA(events.PlaylistNextUpdate(model.PlaylistIDPlayer), - "internal.controller.playcontrol.play_when_next", func(event *event.Event) { + global.EventBus.Subscribe("", events.PlaylistNextUpdate(model.PlaylistIDPlayer), + "internal.controller.playcontrol.play_when_next", func(event *eventbus.Event) { data := event.Data.(events.PlaylistNextUpdateEvent) - global.EventManager.CallA( + _ = global.EventBus.Publish( events.PlayerPlayCmd, events.PlayerPlayCmdEvent{ Media: data.Media, }) }) - global.EventManager.RegisterA(events.PlaylistNextUpdate(model.PlaylistIDSystem), - "internal.controller.playcontrol.play_when_next.system_playlist", func(event *event.Event) { + 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.EventManager.CallA( + _ = global.EventBus.Publish( events.PlayerPlayCmd, events.PlayerPlayCmdEvent{ Media: data.Media, diff --git a/internal/controller/lyric.go b/internal/controller/lyric.go index bdc203f..6c12c12 100644 --- a/internal/controller/lyric.go +++ b/internal/controller/lyric.go @@ -3,7 +3,7 @@ package controller import ( "AynaLivePlayer/core/events" "AynaLivePlayer/global" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "github.com/AynaLivePlayer/miaosic" ) @@ -17,7 +17,7 @@ var lyricManager = &lyricLoader{} func createLyricLoader() { log := global.Logger.WithPrefix("LyricLoader") - global.EventManager.RegisterA(events.PlayerPlayingUpdate, "internal.lyric.update", func(event *event.Event) { + global.EventBus.Subscribe("", events.PlayerPlayingUpdate, "internal.lyric.update", func(event *eventbus.Event) { data := event.Data.(events.PlayerPlayingUpdateEvent) if data.Removed { log.Debugf("current media removed, clear lyric") @@ -32,18 +32,18 @@ func createLyricLoader() { lyricManager.Lyric = miaosic.ParseLyrics("", "") 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{ + _ = global.EventBus.Publish(events.PlayerLyricReload, events.PlayerLyricReloadEvent{ Lyrics: lyricManager.Lyric, }) }) - global.EventManager.RegisterA(events.PlayerPropertyTimePosUpdate, "internal.lyric.update_current", func(event *event.Event) { + global.EventBus.Subscribe("", events.PlayerPropertyTimePosUpdate, "internal.lyric.update_current", func(event *eventbus.Event) { time := event.Data.(events.PlayerPropertyTimePosUpdateEvent).TimePos idx := lyricManager.Lyric.FindIndex(time) if idx == lyricManager.prevIndex { return } lyricManager.prevIndex = idx - global.EventManager.CallA( + _ = global.EventBus.Publish( events.PlayerLyricPosUpdate, events.PlayerLyricPosUpdateEvent{ CurrentIndex: idx, @@ -53,8 +53,8 @@ func createLyricLoader() { }) return }) - global.EventManager.RegisterA(events.PlayerLyricRequestCmd, "internal.lyric.request", func(event *event.Event) { - global.EventManager.CallA(events.PlayerLyricReload, events.PlayerLyricReloadEvent{ + global.EventBus.Subscribe("", events.PlayerLyricRequestCmd, "internal.lyric.request", func(event *eventbus.Event) { + _ = global.EventBus.Publish(events.PlayerLyricReload, events.PlayerLyricReloadEvent{ Lyrics: lyricManager.Lyric, }) }) diff --git a/internal/controller/search.go b/internal/controller/search.go index d0a8bc8..2c68ff7 100644 --- a/internal/controller/search.go +++ b/internal/controller/search.go @@ -4,14 +4,14 @@ import ( "AynaLivePlayer/core/events" "AynaLivePlayer/core/model" "AynaLivePlayer/global" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "github.com/AynaLivePlayer/miaosic" ) func handleSearch() { log := global.Logger.WithPrefix("Search") - global.EventManager.RegisterA( - events.SearchCmd, "internal.controller.search.handleSearchCmd", func(event *event.Event) { + global.EventBus.Subscribe("", + events.SearchCmd, "internal.controller.search.handleSearchCmd", func(event *eventbus.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) @@ -26,7 +26,7 @@ func handleSearch() { User: model.SystemUser, } } - global.EventManager.CallA( + _ = global.EventBus.Publish( events.SearchResultUpdate, events.SearchResultUpdateEvent{ Medias: medias, }) diff --git a/internal/liveroom/liveroom.go b/internal/liveroom/liveroom.go index 7c76213..af258b1 100644 --- a/internal/liveroom/liveroom.go +++ b/internal/liveroom/liveroom.go @@ -5,7 +5,7 @@ import ( "AynaLivePlayer/core/model" "AynaLivePlayer/global" "AynaLivePlayer/pkg/config" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "AynaLivePlayer/pkg/logger" "errors" liveroomsdk "github.com/AynaLivePlayer/liveroom-sdk" @@ -53,7 +53,7 @@ func addLiveRoom(roomModel model.LiveRoom) { // handle failed to create liveroom if err != nil { log.Errorf("Create live room failed: %s", err) - global.EventManager.CallA( + _ = global.EventBus.Publish( events.ErrorUpdate, events.ErrorUpdateEvent{ Error: err, }) @@ -61,7 +61,7 @@ func addLiveRoom(roomModel model.LiveRoom) { } if _, ok := liveRooms[room.Config().Identifier()]; ok { log.Errorf("fail to add, room %s already exists", room.Config().Identifier()) - global.EventManager.CallA( + _ = global.EventBus.Publish( events.ErrorUpdate, events.ErrorUpdateEvent{ Error: errors.New("room already exists"), }) @@ -69,7 +69,7 @@ func addLiveRoom(roomModel model.LiveRoom) { } if err != nil { log.Errorf("Create live room failed: %s", err) - global.EventManager.CallA( + _ = global.EventBus.Publish( events.ErrorUpdate, events.ErrorUpdateEvent{ Error: err, }) @@ -88,7 +88,7 @@ func addLiveRoom(roomModel model.LiveRoom) { }) room.OnMessage(func(message *liveroomsdk.Message) { log.Debugf("room %s receive message: %s", room.Config().Identifier(), message.Message) - global.EventManager.CallA( + _ = global.EventBus.Publish( events.LiveRoomMessageReceive, events.LiveRoomMessageReceiveEvent{ Message: message, @@ -100,8 +100,8 @@ func addLiveRoom(roomModel model.LiveRoom) { } func registerHandlers() { - global.EventManager.RegisterA( - events.LiveRoomAddCmd, "internal.liveroom.add", func(event *event.Event) { + global.EventBus.Subscribe("", + events.LiveRoomAddCmd, "internal.liveroom.add", func(event *eventbus.Event) { data := event.Data.(events.LiveRoomAddCmdEvent) addLiveRoom(model.LiveRoom{ LiveRoom: liveroomsdk.LiveRoom{ @@ -116,8 +116,8 @@ func registerHandlers() { }) }) - global.EventManager.RegisterA( - events.LiveRoomRemoveCmd, "internal.liveroom.remove", func(event *event.Event) { + global.EventBus.Subscribe("", + events.LiveRoomRemoveCmd, "internal.liveroom.remove", func(event *eventbus.Event) { data := event.Data.(events.LiveRoomRemoveCmdEvent) room, ok := liveRooms[data.Identifier] if !ok { @@ -133,8 +133,8 @@ func registerHandlers() { sendRoomsUpdateEvent() }) - global.EventManager.RegisterA( - events.LiveRoomConfigChangeCmd, "internal.liveroom.config.change", func(event *event.Event) { + global.EventBus.Subscribe("", + events.LiveRoomConfigChangeCmd, "internal.liveroom.config.change", func(event *eventbus.Event) { data := event.Data.(events.LiveRoomConfigChangeCmdEvent) if room, ok := liveRooms[data.Identifier]; ok { room.model.Config = data.Config @@ -142,8 +142,8 @@ func registerHandlers() { } }) - global.EventManager.RegisterA( - events.LiveRoomOperationCmd, "internal.liveroom.operation", func(event *event.Event) { + global.EventBus.Subscribe("", + events.LiveRoomOperationCmd, "internal.liveroom.operation", func(event *eventbus.Event) { data := event.Data.(events.LiveRoomOperationCmdEvent) log.Infof("Live room operation SetConnect %v", data.SetConnect) room, ok := liveRooms[data.Identifier] @@ -159,12 +159,12 @@ func registerHandlers() { } if err != nil { log.Errorf("Room %s operation failed: %s", data.Identifier, err) - global.EventManager.CallA( + _ = global.EventBus.Publish( events.ErrorUpdate, events.ErrorUpdateEvent{ Error: err, }) } - global.EventManager.CallA( + _ = global.EventBus.Publish( events.LiveRoomOperationFinish, events.LiveRoomOperationFinishEvent{}) sendRoomStatusUpdateEvent(data.Identifier) }) @@ -177,7 +177,7 @@ func sendRoomStatusUpdateEvent(roomId string) { return } log.Infof("send room status update event, room %s", roomId) - global.EventManager.CallA( + _ = global.EventBus.Publish( events.LiveRoomStatusUpdate, events.LiveRoomStatusUpdateEvent{ Room: room.model, @@ -189,7 +189,7 @@ func sendRoomsUpdateEvent() { for _, r := range liveRooms { rooms = append(rooms, r.model) } - global.EventManager.CallA( + _ = global.EventBus.Publish( events.LiveRoomRoomsUpdate, events.LiveRoomRoomsUpdateEvent{ Rooms: rooms, @@ -209,7 +209,7 @@ func callEvents() { for _, roomCfg := range cfg.liveRooms { addLiveRoom(roomCfg) } - global.EventManager.CallA( + _ = global.EventBus.Publish( events.LiveRoomProviderUpdate, events.LiveRoomProviderUpdateEvent{ Providers: providerInfo, @@ -217,7 +217,7 @@ func callEvents() { sendRoomsUpdateEvent() for _, r := range liveRooms { if r.model.Config.AutoConnect { - global.EventManager.CallA( + _ = global.EventBus.Publish( events.LiveRoomOperationCmd, events.LiveRoomOperationCmdEvent{ Identifier: r.room.Config().Identifier(), diff --git a/internal/player/mpv/config.go b/internal/player/mpv/config.go index a63e2d7..ab4c187 100644 --- a/internal/player/mpv/config.go +++ b/internal/player/mpv/config.go @@ -3,7 +3,7 @@ package mpv import ( "AynaLivePlayer/core/events" "AynaLivePlayer/global" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" ) type playerConfig struct { @@ -30,14 +30,14 @@ var cfg = &playerConfig{ } func restoreConfig() { - global.EventManager.CallA(events.PlayerVolumeChangeCmd, events.PlayerVolumeChangeCmdEvent{ + _ = global.EventBus.Publish(events.PlayerVolumeChangeCmd, events.PlayerVolumeChangeCmdEvent{ Volume: cfg.Volume, }) - global.EventManager.RegisterA(events.PlayerPropertyVolumeUpdate, "player.config.volume", func(evnt *event.Event) { + global.EventBus.Subscribe("", events.PlayerPropertyVolumeUpdate, "player.config.volume", func(evnt *eventbus.Event) { data := evnt.Data.(events.PlayerPropertyVolumeUpdateEvent) cfg.Volume = data.Volume }) - global.EventManager.CallA(events.PlayerSetAudioDeviceCmd, events.PlayerSetAudioDeviceCmdEvent{ + _ = global.EventBus.Publish(events.PlayerSetAudioDeviceCmd, events.PlayerSetAudioDeviceCmdEvent{ Device: cfg.AudioDevice, }) } diff --git a/internal/player/mpv/mpv.go b/internal/player/mpv/mpv.go index fb1e258..d3e7ae6 100644 --- a/internal/player/mpv/mpv.go +++ b/internal/player/mpv/mpv.go @@ -5,7 +5,7 @@ import ( "AynaLivePlayer/core/model" "AynaLivePlayer/global" "AynaLivePlayer/pkg/config" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "AynaLivePlayer/pkg/logger" "AynaLivePlayer/pkg/util" "fmt" @@ -102,7 +102,7 @@ var mpvPropertyHandler = map[string]func(value any){ var data events.PlayerPropertyPauseUpdateEvent log.Debugf("pause property update %v %T", value, value) data.Paused = value.(bool) - global.EventManager.CallA(events.PlayerPropertyPauseUpdate, data) + _ = global.EventBus.Publish(events.PlayerPropertyPauseUpdate, data) }, "percent-pos": func(value any) { var data events.PlayerPropertyPercentPosUpdateEvent @@ -120,7 +120,7 @@ var mpvPropertyHandler = map[string]func(value any){ return } prevPercentPos = data.PercentPos - global.EventManager.CallA(events.PlayerPropertyPercentPosUpdate, data) + _ = global.EventBus.Publish(events.PlayerPropertyPercentPosUpdate, data) }, "idle-active": func(value any) { @@ -137,7 +137,7 @@ var mpvPropertyHandler = map[string]func(value any){ log.Debugf("mpv state update %v + %v = %v", currentState, data.State, currentState.NextState(data.State)) currentState = currentState.NextState(data.State) data.State = currentState - global.EventManager.CallA(events.PlayerPropertyStateUpdate, data) + _ = global.EventBus.Publish(events.PlayerPropertyStateUpdate, data) }, "time-pos": func(value any) { @@ -156,7 +156,7 @@ var mpvPropertyHandler = map[string]func(value any){ return } prevTimePos = data.TimePos - global.EventManager.CallA(events.PlayerPropertyTimePosUpdate, data) + _ = global.EventBus.Publish(events.PlayerPropertyTimePosUpdate, data) }, "duration": func(value any) { var data events.PlayerPropertyDurationUpdateEvent @@ -165,7 +165,7 @@ var mpvPropertyHandler = map[string]func(value any){ } else { data.Duration = value.(float64) } - global.EventManager.CallA(events.PlayerPropertyDurationUpdate, data) + _ = global.EventBus.Publish(events.PlayerPropertyDurationUpdate, data) }, "volume": func(value any) { var data events.PlayerPropertyVolumeUpdateEvent @@ -174,7 +174,7 @@ var mpvPropertyHandler = map[string]func(value any){ } else { data.Volume = value.(float64) } - global.EventManager.CallA(events.PlayerPropertyVolumeUpdate, data) + _ = global.EventBus.Publish(events.PlayerPropertyVolumeUpdate, data) }, } @@ -190,9 +190,9 @@ func registerHandler() { } func registerCmdHandler() { - global.EventManager.RegisterA(events.PlayerPlayCmd, "player.play", func(evnt *event.Event) { + global.EventBus.Subscribe("", events.PlayerPlayCmd, "player.play", func(evnt *eventbus.Event) { currentState = currentState.NextState(model.PlayerStateLoading) - global.EventManager.CallA( + _ = global.EventBus.Publish( events.PlayerPropertyStateUpdate, events.PlayerPropertyStateUpdateEvent{ State: currentState, @@ -202,7 +202,7 @@ func registerCmdHandler() { if m, err := miaosic.GetMediaInfo(media.Info.Meta); err == nil { media.Info = m } - global.EventManager.CallA(events.PlayerPlayingUpdate, events.PlayerPlayingUpdateEvent{ + _ = global.EventBus.Publish(events.PlayerPlayingUpdate, events.PlayerPlayingUpdateEvent{ Media: media, Removed: false, }) @@ -213,7 +213,7 @@ func registerCmdHandler() { if err := libmpv.Command([]string{"stop"}); err != nil { log.Error("[MPV PlayControl] failed to stop", err) } - global.EventManager.CallA( + _ = global.EventBus.Publish( events.PlayerPlayErrorUpdate, events.PlayerPlayErrorUpdateEvent{ Error: err, @@ -253,7 +253,7 @@ func registerCmdHandler() { log.Debug("[MPV PlayControl] mpv command", cmd) if err := libmpv.Command(cmd); err != nil { log.Error("[MPV PlayControl] mpv load media failed", cmd, mediaInfo, err) - global.EventManager.CallA( + _ = global.EventBus.Publish( events.PlayerPlayErrorUpdate, events.PlayerPlayErrorUpdateEvent{ Error: err, @@ -261,19 +261,19 @@ func registerCmdHandler() { return } currentState = currentState.NextState(model.PlayerStatePlaying) - global.EventManager.CallA( + _ = global.EventBus.Publish( events.PlayerPropertyStateUpdate, events.PlayerPropertyStateUpdateEvent{ State: currentState, }) - global.EventManager.CallA(events.PlayerPropertyTimePosUpdate, events.PlayerPropertyTimePosUpdateEvent{ + _ = global.EventBus.Publish(events.PlayerPropertyTimePosUpdate, events.PlayerPropertyTimePosUpdateEvent{ TimePos: 0, }) - global.EventManager.CallA(events.PlayerPropertyPercentPosUpdate, events.PlayerPropertyPercentPosUpdateEvent{ + _ = global.EventBus.Publish(events.PlayerPropertyPercentPosUpdate, events.PlayerPropertyPercentPosUpdateEvent{ PercentPos: 0, }) }) - global.EventManager.RegisterA(events.PlayerToggleCmd, "player.toggle", func(evnt *event.Event) { + global.EventBus.Subscribe("", events.PlayerToggleCmd, "player.toggle", func(evnt *eventbus.Event) { property, err := libmpv.GetProperty("pause", mpv.FORMAT_FLAG) if err != nil { log.Warn("[MPV PlayControl] get property pause failed", err) @@ -284,14 +284,14 @@ func registerCmdHandler() { log.Warn("[MPV PlayControl] toggle pause failed", err) } }) - global.EventManager.RegisterA(events.PlayerSetPauseCmd, "player.set_paused", func(evnt *event.Event) { + global.EventBus.Subscribe("", events.PlayerSetPauseCmd, "player.set_paused", func(evnt *eventbus.Event) { data := evnt.Data.(events.PlayerSetPauseCmdEvent) err := libmpv.SetProperty("pause", mpv.FORMAT_FLAG, data.Pause) if err != nil { log.Warn("[MPV PlayControl] set pause failed", err) } }) - global.EventManager.RegisterA(events.PlayerSeekCmd, "player.seek", func(evnt *event.Event) { + global.EventBus.Subscribe("", events.PlayerSeekCmd, "player.seek", func(evnt *eventbus.Event) { data := evnt.Data.(events.PlayerSeekCmdEvent) log.Debugf("seek to %f (absolute=%t)", data.Position, data.Absolute) var err error @@ -304,7 +304,7 @@ func registerCmdHandler() { log.Warn("seek failed", err) } }) - global.EventManager.RegisterA(events.PlayerVolumeChangeCmd, "player.volume", func(evnt *event.Event) { + global.EventBus.Subscribe("", events.PlayerVolumeChangeCmd, "player.volume", func(evnt *eventbus.Event) { data := evnt.Data.(events.PlayerVolumeChangeCmdEvent) err := libmpv.SetProperty("volume", mpv.FORMAT_DOUBLE, data.Volume) if err != nil { @@ -312,7 +312,7 @@ func registerCmdHandler() { } }) - global.EventManager.RegisterA(events.PlayerVideoPlayerSetWindowHandleCmd, "player.set_window_handle", func(evnt *event.Event) { + global.EventBus.Subscribe("", events.PlayerVideoPlayerSetWindowHandleCmd, "player.set_window_handle", func(evnt *eventbus.Event) { handle := evnt.Data.(events.PlayerVideoPlayerSetWindowHandleCmdEvent).Handle err := SetWindowHandle(handle) if err != nil { @@ -320,11 +320,11 @@ func registerCmdHandler() { } }) - global.EventManager.RegisterA(events.PlayerSetAudioDeviceCmd, "player.set_audio_device", func(evnt *event.Event) { + global.EventBus.Subscribe("", events.PlayerSetAudioDeviceCmd, "player.set_audio_device", func(evnt *eventbus.Event) { device := evnt.Data.(events.PlayerSetAudioDeviceCmdEvent).Device err := libmpv.SetPropertyString("audio-device", device) if err != nil { - global.EventManager.CallA( + _ = global.EventBus.Publish( events.ErrorUpdate, events.ErrorUpdateEvent{ Error: err, @@ -359,7 +359,7 @@ func updateAudioDeviceList() { return true }) log.Infof("update audio device list %v, current %s", dl, ad) - global.EventManager.CallA(events.PlayerAudioDeviceUpdate, events.PlayerAudioDeviceUpdateEvent{ + _ = global.EventBus.Publish(events.PlayerAudioDeviceUpdate, events.PlayerAudioDeviceUpdateEvent{ Current: ad, Devices: dl, }) diff --git a/internal/player/vlc/config.go b/internal/player/vlc/config.go index 84a8713..424248f 100644 --- a/internal/player/vlc/config.go +++ b/internal/player/vlc/config.go @@ -3,7 +3,7 @@ package vlc import ( "AynaLivePlayer/core/events" "AynaLivePlayer/global" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" ) type playerConfig struct { @@ -30,17 +30,17 @@ var cfg = &playerConfig{ } func restoreConfig() { - global.EventManager.CallA(events.PlayerVolumeChangeCmd, events.PlayerVolumeChangeCmdEvent{ + _ = global.EventBus.Publish(events.PlayerVolumeChangeCmd, events.PlayerVolumeChangeCmdEvent{ Volume: cfg.Volume, }) - global.EventManager.RegisterA(events.PlayerPropertyVolumeUpdate, "player.config.volume", func(evnt *event.Event) { + global.EventBus.Subscribe("", events.PlayerPropertyVolumeUpdate, "player.config.volume", func(evnt *eventbus.Event) { data := evnt.Data.(events.PlayerPropertyVolumeUpdateEvent) if data.Volume < 0 { return } cfg.Volume = data.Volume }) - global.EventManager.CallA(events.PlayerSetAudioDeviceCmd, events.PlayerSetAudioDeviceCmdEvent{ + _ = global.EventBus.Publish(events.PlayerSetAudioDeviceCmd, events.PlayerSetAudioDeviceCmdEvent{ Device: cfg.AudioDevice, }) } diff --git a/internal/player/vlc/vlc.go b/internal/player/vlc/vlc.go index 4ae1a8b..0e3a6b5 100644 --- a/internal/player/vlc/vlc.go +++ b/internal/player/vlc/vlc.go @@ -5,7 +5,7 @@ import ( "AynaLivePlayer/core/model" "AynaLivePlayer/global" "AynaLivePlayer/pkg/config" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "AynaLivePlayer/pkg/logger" "fmt" "github.com/AynaLivePlayer/miaosic" @@ -133,10 +133,10 @@ func StopPlayer() { func registerEvents() { // 播放结束事件 _, err := eventManager.Attach(vlc.MediaPlayerEndReached, func(e vlc.Event, userData interface{}) { - global.EventManager.CallA(events.PlayerPropertyStateUpdate, events.PlayerPropertyStateUpdateEvent{ + _ = global.EventBus.Publish(events.PlayerPropertyStateUpdate, events.PlayerPropertyStateUpdateEvent{ State: model.PlayerStateIdle, }) - global.EventManager.CallA(events.PlayerPlayingUpdate, events.PlayerPlayingUpdateEvent{ + _ = global.EventBus.Publish(events.PlayerPlayingUpdate, events.PlayerPlayingUpdateEvent{ Media: model.Media{}, Removed: true, }) @@ -158,10 +158,10 @@ func registerEvents() { } prevTimePos = timePos prevPercentPos = percentPos - global.EventManager.CallA(events.PlayerPropertyTimePosUpdate, events.PlayerPropertyTimePosUpdateEvent{ + _ = global.EventBus.Publish(events.PlayerPropertyTimePosUpdate, events.PlayerPropertyTimePosUpdateEvent{ TimePos: timePos, }) - global.EventManager.CallA(events.PlayerPropertyPercentPosUpdate, events.PlayerPropertyPercentPosUpdateEvent{ + _ = global.EventBus.Publish(events.PlayerPropertyPercentPosUpdate, events.PlayerPropertyPercentPosUpdateEvent{ PercentPos: percentPos, }) } @@ -174,7 +174,7 @@ func registerEvents() { _, err = eventManager.Attach(vlc.MediaPlayerTimeChanged, func(e vlc.Event, userData interface{}) { dur, _ := player.MediaLength() duration = float64(dur) / 1000.0 // 转换为秒 - global.EventManager.CallA(events.PlayerPropertyDurationUpdate, events.PlayerPropertyDurationUpdateEvent{ + _ = global.EventBus.Publish(events.PlayerPropertyDurationUpdate, events.PlayerPropertyDurationUpdateEvent{ Duration: duration, }) }, nil) @@ -185,7 +185,7 @@ func registerEvents() { // 暂停状态改变 _, err = eventManager.Attach(vlc.MediaPlayerPaused, func(e vlc.Event, userData interface{}) { log.Debug("VLC player paused") - global.EventManager.CallA(events.PlayerPropertyPauseUpdate, events.PlayerPropertyPauseUpdateEvent{ + _ = global.EventBus.Publish(events.PlayerPropertyPauseUpdate, events.PlayerPropertyPauseUpdateEvent{ Paused: true, }) }, nil) @@ -195,7 +195,7 @@ func registerEvents() { _, err = eventManager.Attach(vlc.MediaPlayerPlaying, func(e vlc.Event, userData interface{}) { log.Debug("VLC player playing") - global.EventManager.CallA(events.PlayerPropertyPauseUpdate, events.PlayerPropertyPauseUpdateEvent{ + _ = global.EventBus.Publish(events.PlayerPropertyPauseUpdate, events.PlayerPropertyPauseUpdateEvent{ Paused: false, }) }, nil) @@ -206,14 +206,14 @@ func registerEvents() { _, err = eventManager.Attach(vlc.MediaPlayerAudioVolume, func(e vlc.Event, userData interface{}) { volume, _ := player.Volume() log.Debug("VLC player audio volume: ", volume) - global.EventManager.CallA(events.PlayerPropertyVolumeUpdate, events.PlayerPropertyVolumeUpdateEvent{ + _ = global.EventBus.Publish(events.PlayerPropertyVolumeUpdate, events.PlayerPropertyVolumeUpdateEvent{ Volume: float64(volume), }) }, nil) } func registerCmdHandler() { - global.EventManager.RegisterA(events.PlayerPlayCmd, "player.play", func(evnt *event.Event) { + global.EventBus.Subscribe("", events.PlayerPlayCmd, "player.play", func(evnt *eventbus.Event) { lock.Lock() defer lock.Unlock() @@ -223,7 +223,7 @@ func registerCmdHandler() { mediaUrls, err := miaosic.GetMediaUrl(mediaInfo.Meta, miaosic.QualityAny) if err != nil || len(mediaUrls) == 0 { log.Warn("[VLC PlayControl] get media url failed ", mediaInfo.Meta.ID(), err) - global.EventManager.CallA( + _ = global.EventBus.Publish( events.PlayerPlayErrorUpdate, events.PlayerPlayErrorUpdateEvent{ Error: err, @@ -265,7 +265,7 @@ func registerCmdHandler() { } currentMedia = mediaData - global.EventManager.CallA(events.PlayerPlayingUpdate, events.PlayerPlayingUpdateEvent{ + _ = global.EventBus.Publish(events.PlayerPlayingUpdate, events.PlayerPlayingUpdateEvent{ Media: mediaData, Removed: false, }) @@ -290,18 +290,18 @@ func registerCmdHandler() { // 重置位置信息 prevPercentPos = 0 prevTimePos = 0 - global.EventManager.CallA(events.PlayerPropertyTimePosUpdate, events.PlayerPropertyTimePosUpdateEvent{ + _ = global.EventBus.Publish(events.PlayerPropertyTimePosUpdate, events.PlayerPropertyTimePosUpdateEvent{ TimePos: 0, }) - global.EventManager.CallA(events.PlayerPropertyPercentPosUpdate, events.PlayerPropertyPercentPosUpdateEvent{ + _ = global.EventBus.Publish(events.PlayerPropertyPercentPosUpdate, events.PlayerPropertyPercentPosUpdateEvent{ PercentPos: 0, }) - global.EventManager.CallA(events.PlayerPropertyStateUpdate, events.PlayerPropertyStateUpdateEvent{ + _ = global.EventBus.Publish(events.PlayerPropertyStateUpdate, events.PlayerPropertyStateUpdateEvent{ State: model.PlayerStatePlaying, }) }) - global.EventManager.RegisterA(events.PlayerToggleCmd, "player.toggle", func(evnt *event.Event) { + global.EventBus.Subscribe("", events.PlayerToggleCmd, "player.toggle", func(evnt *eventbus.Event) { lock.Lock() defer lock.Unlock() err := player.TogglePause() @@ -311,7 +311,7 @@ func registerCmdHandler() { } }) - global.EventManager.RegisterA(events.PlayerSetPauseCmd, "player.set_paused", func(evnt *event.Event) { + global.EventBus.Subscribe("", events.PlayerSetPauseCmd, "player.set_paused", func(evnt *eventbus.Event) { lock.Lock() defer lock.Unlock() data := evnt.Data.(events.PlayerSetPauseCmdEvent) @@ -322,7 +322,7 @@ func registerCmdHandler() { } }) - global.EventManager.RegisterA(events.PlayerSeekCmd, "player.seek", func(evnt *event.Event) { + global.EventBus.Subscribe("", events.PlayerSeekCmd, "player.seek", func(evnt *eventbus.Event) { lock.Lock() defer lock.Unlock() data := evnt.Data.(events.PlayerSeekCmdEvent) @@ -333,7 +333,7 @@ func registerCmdHandler() { } }) - global.EventManager.RegisterA(events.PlayerVolumeChangeCmd, "player.volume", func(evnt *event.Event) { + global.EventBus.Subscribe("", events.PlayerVolumeChangeCmd, "player.volume", func(evnt *eventbus.Event) { lock.Lock() defer lock.Unlock() data := evnt.Data.(events.PlayerVolumeChangeCmdEvent) @@ -343,16 +343,16 @@ func registerCmdHandler() { } }) - global.EventManager.RegisterA(events.PlayerVideoPlayerSetWindowHandleCmd, "player.set_window_handle", func(evnt *event.Event) { + global.EventBus.Subscribe("", events.PlayerVideoPlayerSetWindowHandleCmd, "player.set_window_handle", func(evnt *eventbus.Event) { handle := evnt.Data.(events.PlayerVideoPlayerSetWindowHandleCmdEvent).Handle setWindowHandle(handle) }) - global.EventManager.RegisterA(events.PlayerSetAudioDeviceCmd, "player.set_audio_device", func(evnt *event.Event) { + global.EventBus.Subscribe("", events.PlayerSetAudioDeviceCmd, "player.set_audio_device", func(evnt *eventbus.Event) { device := evnt.Data.(events.PlayerSetAudioDeviceCmdEvent).Device if err := setAudioDevice(device); err != nil { log.Warn("set audio device failed", err) - global.EventManager.CallA( + _ = global.EventBus.Publish( events.ErrorUpdate, events.ErrorUpdateEvent{ Error: err, @@ -393,7 +393,7 @@ func setAudioDevice(deviceID string) error { cfg.AudioDevice = deviceID // 发送更新事件 - global.EventManager.CallA(events.PlayerAudioDeviceUpdate, events.PlayerAudioDeviceUpdateEvent{ + _ = global.EventBus.Publish(events.PlayerAudioDeviceUpdate, events.PlayerAudioDeviceUpdateEvent{ Current: currentAudioDevice, Devices: audioDevices, }) @@ -437,7 +437,7 @@ func updateAudioDeviceList() { len(audioDevices), currentAudioDevice) // 发送事件通知 - global.EventManager.CallA(events.PlayerAudioDeviceUpdate, events.PlayerAudioDeviceUpdateEvent{ + _ = global.EventBus.Publish(events.PlayerAudioDeviceUpdate, events.PlayerAudioDeviceUpdateEvent{ Current: currentAudioDevice, Devices: audioDevices, }) diff --git a/internal/playlist/model.go b/internal/playlist/model.go index 1bb18aa..891b07e 100644 --- a/internal/playlist/model.go +++ b/internal/playlist/model.go @@ -4,7 +4,7 @@ import ( "AynaLivePlayer/core/events" "AynaLivePlayer/core/model" "AynaLivePlayer/global" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "math/rand" "sync" "time" @@ -44,34 +44,34 @@ func newPlaylist(id model.PlaylistID) *playlist { Lock: sync.RWMutex{}, Index: 0, } - global.EventManager.RegisterA(events.PlaylistMoveCmd(id), "internal.playlist.move", func(event *event.Event) { + global.EventBus.Subscribe("", events.PlaylistMoveCmd(id), "internal.playlist.move", func(event *eventbus.Event) { e := event.Data.(events.PlaylistMoveCmdEvent) pl.Move(e.From, e.To) }) - global.EventManager.RegisterA(events.PlaylistInsertCmd(id), "internal.playlist.insert", func(event *event.Event) { + global.EventBus.Subscribe("", events.PlaylistInsertCmd(id), "internal.playlist.insert", func(event *eventbus.Event) { e := event.Data.(events.PlaylistInsertCmdEvent) pl.Insert(e.Position, e.Media) }) - global.EventManager.RegisterA(events.PlaylistDeleteCmd(id), "internal.playlist.delete", func(event *event.Event) { + global.EventBus.Subscribe("", events.PlaylistDeleteCmd(id), "internal.playlist.delete", func(event *eventbus.Event) { e := event.Data.(events.PlaylistDeleteCmdEvent) pl.Delete(e.Index) }) - global.EventManager.RegisterA(events.PlaylistNextCmd(id), "internal.playlist.next", func(event *event.Event) { + global.EventBus.Subscribe("", events.PlaylistNextCmd(id), "internal.playlist.next", func(event *eventbus.Event) { log.Infof("Playlist %s recieve next", id) pl.Next(event.Data.(events.PlaylistNextCmdEvent).Remove) }) - global.EventManager.RegisterA(events.PlaylistModeChangeCmd(id), "internal.playlist.mode", func(event *event.Event) { + global.EventBus.Subscribe("", events.PlaylistModeChangeCmd(id), "internal.playlist.mode", func(event *eventbus.Event) { pl.Lock.Lock() pl.mode = event.Data.(events.PlaylistModeChangeCmdEvent).Mode pl.Index = 0 pl.resetRandomIndex() pl.Lock.Unlock() log.Infof("Playlist %s mode changed to %d", id, pl.mode) - global.EventManager.CallA(events.PlaylistModeChangeUpdate(id), events.PlaylistModeChangeUpdateEvent{ + _ = global.EventBus.Publish(events.PlaylistModeChangeUpdate(id), events.PlaylistModeChangeUpdateEvent{ Mode: pl.mode, }) }) - global.EventManager.RegisterA(events.PlaylistSetIndexCmd(id), "internal.playlist.setindex", func(event *event.Event) { + global.EventBus.Subscribe("", events.PlaylistSetIndexCmd(id), "internal.playlist.setindex", func(event *eventbus.Event) { index := event.Data.(events.PlaylistSetIndexCmdEvent).Index if index >= pl.Size() || index < 0 { index = 0 @@ -98,7 +98,7 @@ func (p *playlist) Replace(medias []model.Media) { p.Index = 0 p.resetRandomIndex() p.Lock.Unlock() - global.EventManager.CallA(events.PlaylistDetailUpdate(p.playlistId), events.PlaylistDetailUpdateEvent{ + _ = global.EventBus.Publish(events.PlaylistDetailUpdate(p.playlistId), events.PlaylistDetailUpdateEvent{ Medias: p.CopyMedia(), }) } @@ -118,11 +118,11 @@ func (p *playlist) Insert(index int, media model.Media) { p.Medias[index] = media p.resetRandomIndex() p.Lock.Unlock() - global.EventManager.CallA(events.PlaylistInsertUpdate(p.playlistId), events.PlaylistInsertUpdateEvent{ + _ = global.EventBus.Publish(events.PlaylistInsertUpdate(p.playlistId), events.PlaylistInsertUpdateEvent{ Position: index, Media: media, }) - global.EventManager.CallA(events.PlaylistDetailUpdate(p.playlistId), events.PlaylistDetailUpdateEvent{ + _ = global.EventBus.Publish(events.PlaylistDetailUpdate(p.playlistId), events.PlaylistDetailUpdateEvent{ Medias: p.CopyMedia(), }) } @@ -140,7 +140,7 @@ func (p *playlist) Delete(index int) { } p.resetRandomIndex() p.Lock.Unlock() - global.EventManager.CallA(events.PlaylistDetailUpdate(p.playlistId), events.PlaylistDetailUpdateEvent{ + _ = global.EventBus.Publish(events.PlaylistDetailUpdate(p.playlistId), events.PlaylistDetailUpdateEvent{ Medias: p.CopyMedia(), }) } @@ -170,7 +170,7 @@ func (p *playlist) Move(src int, dst int) { } p.Medias[dst] = tmp p.Lock.Unlock() - global.EventManager.CallA(events.PlaylistDetailUpdate(p.playlistId), events.PlaylistDetailUpdateEvent{ + _ = global.EventBus.Publish(events.PlaylistDetailUpdate(p.playlistId), events.PlaylistDetailUpdateEvent{ Medias: p.CopyMedia(), }) } @@ -215,7 +215,7 @@ func (p *playlist) Next(delete bool) { // } //} p.Lock.Unlock() - global.EventManager.CallA(events.PlaylistNextUpdate(p.playlistId), events.PlaylistNextUpdateEvent{ + _ = global.EventBus.Publish(events.PlaylistNextUpdate(p.playlistId), events.PlaylistNextUpdateEvent{ Media: m, }) if delete { diff --git a/internal/playlist/playlist.go b/internal/playlist/playlist.go index 518fc6c..a619900 100644 --- a/internal/playlist/playlist.go +++ b/internal/playlist/playlist.go @@ -5,7 +5,7 @@ import ( "AynaLivePlayer/core/model" "AynaLivePlayer/global" "AynaLivePlayer/pkg/config" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "AynaLivePlayer/pkg/logger" "github.com/AynaLivePlayer/miaosic" ) @@ -56,22 +56,22 @@ func Initialize() { HistoryPlaylist = newPlaylist(model.PlaylistIDHistory) config.LoadConfig(cfg) - global.EventManager.CallA(events.PlaylistModeChangeCmd(model.PlaylistIDPlayer), events.PlaylistModeChangeCmdEvent{ + _ = global.EventBus.Publish(events.PlaylistModeChangeCmd(model.PlaylistIDPlayer), events.PlaylistModeChangeCmdEvent{ Mode: cfg.PlayerPlaylistMode, }) - global.EventManager.CallA(events.PlaylistModeChangeCmd(model.PlaylistIDSystem), events.PlaylistModeChangeCmdEvent{ + _ = global.EventBus.Publish(events.PlaylistModeChangeCmd(model.PlaylistIDSystem), events.PlaylistModeChangeCmdEvent{ Mode: cfg.SystemPlaylistMode, }) - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.PlayerPlayingUpdate, "internal.playlist.player_playing_update", - func(event *event.Event) { + func(event *eventbus.Event) { if event.Data.(events.PlayerPlayingUpdateEvent).Removed { return } - global.EventManager.CallA(events.PlaylistInsertCmd(model.PlaylistIDHistory), events.PlaylistInsertCmdEvent{ + _ = global.EventBus.Publish(events.PlaylistInsertCmd(model.PlaylistIDHistory), events.PlaylistInsertCmdEvent{ Media: event.Data.(events.PlayerPlayingUpdateEvent).Media, Position: -1, }) diff --git a/internal/playlist/playlists.go b/internal/playlist/playlists.go index 9fb3e86..1ef5412 100644 --- a/internal/playlist/playlists.go +++ b/internal/playlist/playlists.go @@ -4,7 +4,7 @@ import ( "AynaLivePlayer/core/events" "AynaLivePlayer/core/model" "AynaLivePlayer/global" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "errors" "github.com/AynaLivePlayer/miaosic" ) @@ -25,21 +25,21 @@ func createPlaylistManager() { currentSelected = cfg.playlists[0].Meta.ID() } - global.EventManager.CallA( + _ = global.EventBus.Publish( events.PlaylistManagerCurrentUpdate, events.PlaylistManagerCurrentUpdateEvent{ Medias: make([]model.Media, 0), }) - global.EventManager.CallA( + _ = global.EventBus.Publish( events.PlaylistManagerSetSystemCmd, events.PlaylistManagerSetSystemCmdEvent{ PlaylistID: cfg.SystemPlaylistID, }) - global.EventManager.RegisterA(events.PlaylistManagerSetSystemCmd, + global.EventBus.Subscribe("", events.PlaylistManagerSetSystemCmd, "internal.playlist.system_playlist.set", - func(event *event.Event) { + func(event *eventbus.Event) { data := event.Data.(events.PlaylistManagerSetSystemCmdEvent) // default case if data.PlaylistID == "" { @@ -48,7 +48,7 @@ func createPlaylistManager() { log.Infof("try to set system playlist %s", data.PlaylistID) pl, ok := allPlaylists[data.PlaylistID] if !ok { - global.EventManager.CallA( + _ = global.EventBus.Publish( events.ErrorUpdate, events.ErrorUpdateEvent{ Error: errors.New("playlist not found"), @@ -56,7 +56,7 @@ func createPlaylistManager() { return } cfg.SystemPlaylistID = pl.Meta.ID() - global.EventManager.CallA( + _ = global.EventBus.Publish( events.PlaylistManagerSystemUpdate, events.PlaylistManagerSystemUpdateEvent{ Info: model.PlaylistInfo{ @@ -75,10 +75,10 @@ func createPlaylistManager() { SystemPlaylist.Replace(medias) }) - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.PlaylistManagerRefreshCurrentCmd, "internal.playlist.current_playlist.refresh", - func(event *event.Event) { + func(event *eventbus.Event) { data := event.Data.(events.PlaylistManagerRefreshCurrentCmdEvent) log.Infof("try to refresh playlist %s", data.PlaylistID) currentSelected = data.PlaylistID @@ -88,7 +88,7 @@ func createPlaylistManager() { } pl, ok := allPlaylists[data.PlaylistID] if !ok { - global.EventManager.CallA( + _ = global.EventBus.Publish( events.ErrorUpdate, events.ErrorUpdateEvent{ Error: errors.New("playlist not found"), @@ -97,7 +97,7 @@ func createPlaylistManager() { } getPlaylist, err := miaosic.GetPlaylist(pl.Meta) if err != nil { - global.EventManager.CallA( + _ = global.EventBus.Publish( events.ErrorUpdate, events.ErrorUpdateEvent{ Error: err, @@ -109,10 +109,10 @@ func createPlaylistManager() { updatePlaylistManagerInfos() }) - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.PlaylistManagerGetCurrentCmd, "internal.playlist.current_playlist.get", - func(event *event.Event) { + func(event *eventbus.Event) { data := event.Data.(events.PlaylistManagerGetCurrentCmdEvent) log.Infof("try to get playlist %s", data.PlaylistID) currentSelected = data.PlaylistID @@ -122,7 +122,7 @@ func createPlaylistManager() { } pl, ok := allPlaylists[data.PlaylistID] if !ok { - global.EventManager.CallA( + _ = global.EventBus.Publish( events.ErrorUpdate, events.ErrorUpdateEvent{ Error: errors.New("playlist not found"), @@ -132,15 +132,15 @@ func createPlaylistManager() { updateCurrenMedias(pl) }) - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.PlaylistManagerAddPlaylistCmd, "internal.playlist.add_playlist", - func(event *event.Event) { + func(event *eventbus.Event) { data := event.Data.(events.PlaylistManagerAddPlaylistCmdEvent) log.Info("try to add playlist", data) meta, ok := miaosic.MatchPlaylistByProvider(data.Provider, data.URL) if !ok { - global.EventManager.CallA( + _ = global.EventBus.Publish( events.ErrorUpdate, events.ErrorUpdateEvent{ Error: errors.New("not proper url"), @@ -149,7 +149,7 @@ func createPlaylistManager() { } _, ok = allPlaylists[meta.ID()] if ok { - global.EventManager.CallA( + _ = global.EventBus.Publish( events.ErrorUpdate, events.ErrorUpdateEvent{ Error: errors.New("playlist already exists"), @@ -158,7 +158,7 @@ func createPlaylistManager() { } pl, err := miaosic.GetPlaylist(meta) if err != nil { - global.EventManager.CallA( + _ = global.EventBus.Publish( events.ErrorUpdate, events.ErrorUpdateEvent{ Error: err, @@ -169,13 +169,13 @@ func createPlaylistManager() { updatePlaylistManagerInfos() }) - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.PlaylistManagerRemovePlaylistCmd, "internal.playlist.remove_playlist", - func(event *event.Event) { + func(event *eventbus.Event) { data := event.Data.(events.PlaylistManagerRemovePlaylistCmdEvent) if data.PlaylistID == cfg.SystemPlaylistID { - global.EventManager.CallA( + _ = global.EventBus.Publish( events.ErrorUpdate, events.ErrorUpdateEvent{ Error: errors.New("cannot remove system playlist"), @@ -184,7 +184,7 @@ func createPlaylistManager() { } _, ok := allPlaylists[data.PlaylistID] if !ok { - global.EventManager.CallA( + _ = global.EventBus.Publish( events.ErrorUpdate, events.ErrorUpdateEvent{ Error: errors.New("playlist not found"), @@ -205,7 +205,7 @@ func updateCurrenMedias(pl *miaosic.Playlist) { User: model.SystemUser, } } - global.EventManager.CallA( + _ = global.EventBus.Publish( events.PlaylistManagerCurrentUpdate, events.PlaylistManagerCurrentUpdateEvent{ Medias: medias, @@ -225,7 +225,7 @@ func updatePlaylistManagerInfos() { }) } log.InfoW("update playlist manager infos") - global.EventManager.CallA( + _ = global.EventBus.Publish( events.PlaylistManagerInfoUpdate, events.PlaylistManagerInfoUpdateEvent{ Playlists: playlists, diff --git a/internal/source/nosource.go b/internal/source/nosource.go index c17f2ce..60a9411 100644 --- a/internal/source/nosource.go +++ b/internal/source/nosource.go @@ -30,7 +30,7 @@ var sourceCfg = &_sourceConfig{ func Initialize() { config.LoadConfig(sourceCfg) miaosic.RegisterProvider(&dummySource{}) - global.EventManager.CallA( + _ = global.EventBus.Publish( events.MediaProviderUpdate, events.MediaProviderUpdateEvent{ Providers: miaosic.ListAvailableProviders(), }) diff --git a/internal/source/source.go b/internal/source/source.go index ade462a..d4bd4c6 100644 --- a/internal/source/source.go +++ b/internal/source/source.go @@ -38,7 +38,7 @@ func Initialize() { kugou.UseInstrumental() miaosic.RegisterProvider(local.NewLocal(sourceCfg.LocalSourcePath)) - global.EventManager.CallA( + _ = global.EventBus.Publish( events.MediaProviderUpdate, events.MediaProviderUpdateEvent{ Providers: miaosic.ListAvailableProviders(), }) diff --git a/internal/sysmediacontrol/smtc_windows.go b/internal/sysmediacontrol/smtc_windows.go index 6db6ed5..4b5611b 100644 --- a/internal/sysmediacontrol/smtc_windows.go +++ b/internal/sysmediacontrol/smtc_windows.go @@ -6,7 +6,7 @@ import ( "AynaLivePlayer/core/events" "AynaLivePlayer/global" "AynaLivePlayer/pkg/config" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "AynaLivePlayer/pkg/logger" "github.com/go-ole/go-ole" "github.com/saltosystems/winrt-go" @@ -84,7 +84,7 @@ func InitSystemMediaControl() { _ = updater.SetType(media.MediaPlaybackTypeMusic) }) - global.EventManager.RegisterA(events.PlayerPlayingUpdate, "sysmediacontrol.update_playing", func(event *event.Event) { + global.EventBus.Subscribe("", events.PlayerPlayingUpdate, "sysmediacontrol.update_playing", func(event *eventbus.Event) { data := event.Data.(events.PlayerPlayingUpdateEvent) withMusicProperties(func(updater *media.SystemMediaTransportControlsDisplayUpdater, properties *media.MusicDisplayProperties) { properties.SetArtist(data.Media.Info.Artist) @@ -106,7 +106,7 @@ func InitSystemMediaControl() { } }) - global.EventManager.RegisterA(events.PlayerPropertyPauseUpdate, "sysmediacontrol.update_paused", func(event *event.Event) { + global.EventBus.Subscribe("", events.PlayerPropertyPauseUpdate, "sysmediacontrol.update_paused", func(event *eventbus.Event) { if event.Data.(events.PlayerPropertyPauseUpdateEvent).Paused { smtc.SetPlaybackStatus(media.MediaPlaybackStatusPaused) } else { @@ -121,16 +121,16 @@ func InitSystemMediaControl() { defer eventArgs.Release() switch val, _ := eventArgs.GetButton(); val { case media.SystemMediaTransportControlsButtonPlay: - global.EventManager.CallA( + _ = global.EventBus.Publish( events.PlayerSetPauseCmd, events.PlayerSetPauseCmdEvent{Pause: false}) case media.SystemMediaTransportControlsButtonPause: - global.EventManager.CallA( + _ = global.EventBus.Publish( events.PlayerSetPauseCmd, events.PlayerSetPauseCmdEvent{Pause: true}) case media.SystemMediaTransportControlsButtonNext: - global.EventManager.CallA( + _ = global.EventBus.Publish( events.PlayerPlayNextCmd, events.PlayerPlayNextCmdEvent{}) case media.SystemMediaTransportControlsButtonPrevious: - global.EventManager.CallA(events.PlayerSeekCmd, events.PlayerSeekCmdEvent{ + _ = global.EventBus.Publish(events.PlayerSeekCmd, events.PlayerSeekCmdEvent{ Position: 0, Absolute: true, }) @@ -146,7 +146,7 @@ func InitSystemMediaControl() { lastDuration := int64(0) lastTimePos := int64(0) timelineProps, _ = media.NewSystemMediaTransportControlsTimelineProperties() - global.EventManager.RegisterA(events.PlayerPropertyDurationUpdate, "sysmediacontrol.properties.duration", func(event *event.Event) { + global.EventBus.Subscribe("", events.PlayerPropertyDurationUpdate, "sysmediacontrol.properties.duration", func(event *eventbus.Event) { data := event.Data.(events.PlayerPropertyDurationUpdateEvent) lastDuration = int64(data.Duration * 1000) _ = timelineProps.SetStartTime(foundation.TimeSpan{Duration: 0}) @@ -156,7 +156,7 @@ func InitSystemMediaControl() { _ = timelineProps.SetPosition(foundation.TimeSpan{Duration: lastTimePos * TicksPerMillisecond}) _ = smtc.UpdateTimelineProperties(timelineProps) }) - global.EventManager.RegisterA(events.PlayerPropertyTimePosUpdate, "sysmediacontrol.properties.time_pos", func(event *event.Event) { + global.EventBus.Subscribe("", events.PlayerPropertyTimePosUpdate, "sysmediacontrol.properties.time_pos", func(event *eventbus.Event) { data := event.Data.(events.PlayerPropertyTimePosUpdateEvent) lastTimePos = int64(data.TimePos * 1000) _ = timelineProps.SetStartTime(foundation.TimeSpan{Duration: 0}) diff --git a/internal/updater/application.go b/internal/updater/application.go index d4b21da..357b992 100644 --- a/internal/updater/application.go +++ b/internal/updater/application.go @@ -5,7 +5,7 @@ import ( "AynaLivePlayer/core/model" "AynaLivePlayer/global" "AynaLivePlayer/pkg/config" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "AynaLivePlayer/pkg/logger" "github.com/go-resty/resty/v2" "github.com/tidwall/gjson" @@ -22,7 +22,7 @@ func Initialize() { if !hasUpdate { return } - global.EventManager.CallA( + _ = global.EventBus.Publish( events.CheckUpdateResultUpdate, events.CheckUpdateResultUpdateEvent{ HasUpdate: hasUpdate, @@ -30,11 +30,11 @@ func Initialize() { }) }() } - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.CheckUpdateCmd, "internal.updater.handle", - func(evt *event.Event) { + func(evt *eventbus.Event) { info, hasUpdate := CheckUpdate() - global.EventManager.CallA( + _ = global.EventBus.Publish( events.CheckUpdateResultUpdate, events.CheckUpdateResultUpdateEvent{ HasUpdate: hasUpdate, diff --git a/pkg/event/event.go b/pkg/event/event.go deleted file mode 100644 index b33c7b9..0000000 --- a/pkg/event/event.go +++ /dev/null @@ -1,165 +0,0 @@ -package event - -import ( - "fmt" - "sync" -) - -type EventId string - -type Event struct { - Id EventId - Data interface{} - lock sync.Mutex // just placed for now, i don't know why i place it here, seems useless -} - -type HandlerFunc func(event *Event) - -type Handler struct { - EventId EventId - Name string - Handler HandlerFunc -} - -type Manager struct { - handlers map[EventId]map[string]*Handler - eventWorkerIdMap map[EventId]int - pendingEvents []*Event - workerQueue []chan func() - currentWorkerId int - stopSig chan int - queueSize int - workerSize int - dispatching bool - lock sync.RWMutex -} - -func NewManger(queueSize int, workerSize int) *Manager { - manager := &Manager{ - handlers: make(map[EventId]map[string]*Handler), - eventWorkerIdMap: make(map[EventId]int), - workerQueue: make([]chan func(), workerSize), - currentWorkerId: 0, - stopSig: make(chan int, workerSize), - queueSize: queueSize, - workerSize: workerSize, - lock: sync.RWMutex{}, - dispatching: false, - pendingEvents: make([]*Event, 0), - } - for i := 0; i < workerSize; i++ { - queue := make(chan func(), queueSize) - manager.workerQueue[i] = queue - go func() { - for { - select { - case <-manager.stopSig: - return - case f := <-queue: - f() - } - } - }() - } - return manager -} - -// Start for starting to dispatching events -func (h *Manager) Start() { - h.dispatching = true - for _, event := range h.pendingEvents { - h.Call(event) - } -} - -func (h *Manager) Stop() { - for i := 0; i < h.workerSize; i++ { - h.stopSig <- 0 - } - h.dispatching = false -} - -func (h *Manager) Register(handler *Handler) { - h.lock.Lock() - m, ok := h.handlers[handler.EventId] - // if not found, crate new handler map and assign a worker to this event id - if !ok { - m = make(map[string]*Handler) - h.handlers[handler.EventId] = m - // assign a worker to this event id - h.eventWorkerIdMap[handler.EventId] = h.currentWorkerId - h.currentWorkerId = (h.currentWorkerId + 1) % h.workerSize - } - if _, ok := m[handler.Name]; ok { - fmt.Printf("handler %s already registered, old handler is overwrittened\n", handler.Name) - } - m[handler.Name] = handler - h.lock.Unlock() -} - -func (h *Manager) RegisterA(id EventId, name string, handler HandlerFunc) { - h.Register(&Handler{ - EventId: id, - Name: name, - Handler: handler, - }) -} - -func (h *Manager) UnregisterAll() { - h.lock.Lock() - defer h.lock.Unlock() - h.handlers = make(map[EventId]map[string]*Handler) - h.currentWorkerId = 0 - h.eventWorkerIdMap = make(map[EventId]int) -} - -func (h *Manager) Unregister(name string) { - h.lock.Lock() - defer h.lock.Unlock() - for _, m := range h.handlers { - if _, ok := m[name]; ok { - delete(m, name) - } - } -} - -func (h *Manager) Call(event *Event) { - - // if not dispatching, put this event to pending events - h.lock.Lock() - if !h.dispatching { - h.pendingEvents = append(h.pendingEvents, event) - h.lock.Unlock() - return - } - - handlers, ok := h.handlers[event.Id] - if !ok { - h.lock.Unlock() - return - } - workerId, ok := h.eventWorkerIdMap[event.Id] - if !ok { - // event id don't have a worker id, ignore - // maybe because this event id has no handler - h.lock.Unlock() - return - } - - h.lock.Unlock() - for _, eh := range handlers { - eventHandler := eh - h.workerQueue[workerId] <- func() { - event.lock.Lock() - eventHandler.Handler(event) - event.lock.Unlock() - } - } -} - -func (h *Manager) CallA(id EventId, data interface{}) { - h.Call(&Event{ - Id: id, - Data: data, - }) -} diff --git a/plugin/diange/diange.go b/plugin/diange/diange.go index 9e12144..e2adb2f 100644 --- a/plugin/diange/diange.go +++ b/plugin/diange/diange.go @@ -8,7 +8,7 @@ import ( "AynaLivePlayer/gui/component" "AynaLivePlayer/gui/xfyne" "AynaLivePlayer/pkg/config" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "AynaLivePlayer/pkg/i18n" "AynaLivePlayer/pkg/logger" "fyne.io/fyne/v2" @@ -131,14 +131,14 @@ func (d *Diange) Enable() error { config.LoadConfig(d) gui.AddConfigLayout(d) gui.AddConfigLayout(&blacklist{}) - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.LiveRoomMessageReceive, "plugin.diange.message", d.handleMessage) - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.PlaylistDetailUpdate(model.PlaylistIDPlayer), "plugin.diange.queue.update", - func(event *event.Event) { + func(event *eventbus.Event) { d.currentQueueLength = len(event.Data.(events.PlaylistDetailUpdateEvent).Medias) d.log.Debugf("current queue length: %d", d.currentQueueLength) medias := event.Data.(events.PlaylistDetailUpdateEvent).Medias @@ -157,10 +157,10 @@ func (d *Diange) Enable() error { d.log.Debugf("user media count in player playlist %s: %d", user, count) } }) - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.PlayerPlayingUpdate, "plugin.diange.check_playing", - func(event *event.Event) { + func(event *eventbus.Event) { data := event.Data.(events.PlayerPlayingUpdateEvent) if data.Removed { d.isCurrentSystem = true @@ -216,7 +216,7 @@ func (d *Diange) getSource(cmd string) []string { return sources } -func (d *Diange) handleMessage(event *event.Event) { +func (d *Diange) handleMessage(event *eventbus.Event) { message := event.Data.(events.LiveRoomMessageReceiveEvent).Message msgs := strings.Split(message.Message, " ") if len(msgs) < 2 || len(msgs[0]) == 0 { @@ -333,7 +333,7 @@ func (d *Diange) handleMessage(event *event.Event) { } } if d.SkipSystemPlaylist && d.isCurrentSystem { - global.EventManager.CallA( + _ = global.EventBus.Publish( events.PlayerPlayCmd, events.PlayerPlayCmdEvent{ Media: model.Media{ @@ -343,7 +343,7 @@ func (d *Diange) handleMessage(event *event.Event) { }) return } - global.EventManager.CallA( + _ = global.EventBus.Publish( events.PlaylistInsertCmd(model.PlaylistIDPlayer), events.PlaylistInsertCmdEvent{ Position: -1, diff --git a/plugin/durationmgmt/durationmgmt.go b/plugin/durationmgmt/durationmgmt.go index 17f81ef..f3f7ef2 100644 --- a/plugin/durationmgmt/durationmgmt.go +++ b/plugin/durationmgmt/durationmgmt.go @@ -6,7 +6,7 @@ import ( "AynaLivePlayer/gui" "AynaLivePlayer/gui/xfyne" "AynaLivePlayer/pkg/config" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "AynaLivePlayer/pkg/i18n" "AynaLivePlayer/pkg/logger" "fyne.io/fyne/v2" @@ -43,33 +43,33 @@ func (d *MaxDuration) Name() string { func (d *MaxDuration) Enable() error { config.LoadConfig(d) gui.AddConfigLayout(d) - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.PlayerPropertyDurationUpdate, "plugin.maxduration.duration", - func(event *event.Event) { + func(event *eventbus.Event) { data := event.Data.(events.PlayerPropertyDurationUpdateEvent) if int(data.Duration) > d.MaxDuration && d.SkipOnPlay { d.log.Infof("Skip on reach max duration %.2f/%d (on play)", data.Duration, d.MaxDuration) - global.EventManager.CallA( + _ = global.EventBus.Publish( events.PlayerPlayNextCmd, events.PlayerPlayNextCmdEvent{}) } }) - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.PlayerPropertyTimePosUpdate, "plugin.maxduration.timepos", - func(event *event.Event) { + func(event *eventbus.Event) { data := event.Data.(events.PlayerPropertyTimePosUpdateEvent) if int(data.TimePos) > d.MaxDuration && d.SkipOnReach && !d.skipped { d.log.Infof("Skip on reach max duration %.2f/%d (on time pos reach)", data.TimePos, d.MaxDuration) d.skipped = true - global.EventManager.CallA( + _ = global.EventBus.Publish( events.PlayerPlayNextCmd, events.PlayerPlayNextCmdEvent{}) } }) - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.PlayerPlayingUpdate, "plugin.maxduration.play", - func(event *event.Event) { + func(event *eventbus.Event) { d.skipped = false }) return nil diff --git a/plugin/qiege/qiege.go b/plugin/qiege/qiege.go index 91db3f7..aa66c0c 100644 --- a/plugin/qiege/qiege.go +++ b/plugin/qiege/qiege.go @@ -7,7 +7,7 @@ import ( "AynaLivePlayer/gui/component" "AynaLivePlayer/gui/xfyne" "AynaLivePlayer/pkg/config" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "AynaLivePlayer/pkg/i18n" "AynaLivePlayer/pkg/logger" "fyne.io/fyne/v2" @@ -45,14 +45,14 @@ func (d *Qiege) Name() string { func (d *Qiege) Enable() error { config.LoadConfig(d) gui.AddConfigLayout(d) - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.LiveRoomMessageReceive, "plugin.qiege.message", d.handleMessage) - global.EventManager.RegisterA( + global.EventBus.Subscribe("", events.PlayerPlayingUpdate, "plugin.qiege.playing", - func(event *event.Event) { + func(event *eventbus.Event) { data := event.Data.(events.PlayerPlayingUpdateEvent) if data.Removed { d.currentUid = "" @@ -69,7 +69,7 @@ func (d *Qiege) Disable() error { return nil } -func (d *Qiege) handleMessage(event *event.Event) { +func (d *Qiege) handleMessage(event *eventbus.Event) { message := event.Data.(events.LiveRoomMessageReceiveEvent).Message msgs := strings.Split(message.Message, " ") if len(msgs) < 1 || msgs[0] != d.CustomCMD { @@ -78,20 +78,20 @@ func (d *Qiege) handleMessage(event *event.Event) { d.log.Infof("recieve qiege command") if d.UserPermission { if d.currentUid == message.User.Uid { - global.EventManager.CallA( + _ = global.EventBus.Publish( events.PlayerPlayNextCmd, events.PlayerPlayNextCmdEvent{}) return } } if d.PrivilegePermission && message.User.Privilege > 0 { - global.EventManager.CallA( + _ = global.EventBus.Publish( events.PlayerPlayNextCmd, events.PlayerPlayNextCmdEvent{}) return } if d.AdminPermission && message.User.Admin { - global.EventManager.CallA( + _ = global.EventBus.Publish( events.PlayerPlayNextCmd, events.PlayerPlayNextCmdEvent{}) return diff --git a/plugin/sourcelogin/sourcelogin.go b/plugin/sourcelogin/sourcelogin.go index cd4c54d..05f0bc3 100644 --- a/plugin/sourcelogin/sourcelogin.go +++ b/plugin/sourcelogin/sourcelogin.go @@ -124,7 +124,7 @@ func (w *SourceLogin) CreatePanel() fyne.CanvasObject { func() { err := loginables[providerChoice.Selected].(miaosic.Loginable).Logout() if err != nil { - global.EventManager.CallA(events.ErrorUpdate, + _ = global.EventBus.Publish(events.ErrorUpdate, events.ErrorUpdateEvent{Error: err}) return } @@ -152,14 +152,14 @@ func (w *SourceLogin) CreatePanel() fyne.CanvasObject { provider := pvdr.(miaosic.Loginable) currentLoginSession, err = provider.QrLogin() if err != nil { - global.EventManager.CallA(events.ErrorUpdate, + _ = global.EventBus.Publish(events.ErrorUpdate, events.ErrorUpdateEvent{Error: err}) return } w.log.Debugf("trying encode url %s to qrcode", currentLoginSession.Url) data, err := qrcode.Encode(currentLoginSession.Url, qrcode.Medium, 256) if err != nil { - global.EventManager.CallA(events.ErrorUpdate, + _ = global.EventBus.Publish(events.ErrorUpdate, events.ErrorUpdateEvent{Error: err}) return } @@ -184,7 +184,7 @@ func (w *SourceLogin) CreatePanel() fyne.CanvasObject { w.log.Info("checking qr status") result, err := provider.QrLoginVerify(currentLoginSession) if err != nil { - global.EventManager.CallA(events.ErrorUpdate, + _ = global.EventBus.Publish(events.ErrorUpdate, events.ErrorUpdateEvent{Error: err}) return } diff --git a/plugin/textinfo/textinfo.go b/plugin/textinfo/textinfo.go index 9922d7c..477fa1a 100644 --- a/plugin/textinfo/textinfo.go +++ b/plugin/textinfo/textinfo.go @@ -7,7 +7,7 @@ import ( "AynaLivePlayer/gui" "AynaLivePlayer/gui/component" "AynaLivePlayer/pkg/config" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "AynaLivePlayer/pkg/i18n" "AynaLivePlayer/pkg/logger" "bytes" @@ -190,8 +190,8 @@ func (t *TextInfo) OutputCover() { } func (t *TextInfo) registerHandlers() { - global.EventManager.RegisterA( - events.PlayerPlayingUpdate, "plugin.textinfo.playing", func(event *event.Event) { + global.EventBus.Subscribe("", + events.PlayerPlayingUpdate, "plugin.textinfo.playing", func(event *eventbus.Event) { data := event.Data.(events.PlayerPlayingUpdateEvent) if data.Removed { t.info.Current = MediaInfo{} @@ -201,8 +201,8 @@ func (t *TextInfo) registerHandlers() { t.RenderTemplates() t.OutputCover() }) - global.EventManager.RegisterA( - events.PlayerPropertyTimePosUpdate, "plugin.txtinfo.timepos", func(event *event.Event) { + global.EventBus.Subscribe("", + events.PlayerPropertyTimePosUpdate, "plugin.txtinfo.timepos", func(event *eventbus.Event) { data := event.Data.(events.PlayerPropertyTimePosUpdateEvent).TimePos ct := int(data) if ct == t.info.CurrentTime.TotalSeconds { @@ -211,8 +211,8 @@ func (t *TextInfo) registerHandlers() { t.info.CurrentTime = NewTimeFromSec(ct) t.RenderTemplates() }) - global.EventManager.RegisterA( - events.PlayerPropertyDurationUpdate, "plugin.txtinfo.duration", func(event *event.Event) { + global.EventBus.Subscribe("", + events.PlayerPropertyDurationUpdate, "plugin.txtinfo.duration", func(event *eventbus.Event) { data := event.Data.(events.PlayerPropertyDurationUpdateEvent).Duration ct := int(data) if ct == t.info.TotalTime.TotalSeconds { @@ -221,8 +221,8 @@ func (t *TextInfo) registerHandlers() { t.info.TotalTime = NewTimeFromSec(ct) t.RenderTemplates() }) - global.EventManager.RegisterA( - events.PlaylistDetailUpdate(model.PlaylistIDPlayer), "plugin.textinfo.playlist", func(event *event.Event) { + global.EventBus.Subscribe("", + events.PlaylistDetailUpdate(model.PlaylistIDPlayer), "plugin.textinfo.playlist", func(event *eventbus.Event) { pl := make([]MediaInfo, 0) data := event.Data.(events.PlaylistDetailUpdateEvent) for index, m := range data.Medias { @@ -232,8 +232,8 @@ func (t *TextInfo) registerHandlers() { t.info.PlaylistLength = len(pl) t.RenderTemplates() }) - global.EventManager.RegisterA( - events.PlayerLyricPosUpdate, "plugin.textinfo.lyricpos", func(event *event.Event) { + global.EventBus.Subscribe("", + events.PlayerLyricPosUpdate, "plugin.textinfo.lyricpos", func(event *eventbus.Event) { data := event.Data.(events.PlayerLyricPosUpdateEvent) t.info.Lyric = data.CurrentLine.Lyric t.RenderTemplates() diff --git a/plugin/webinfo/info.go b/plugin/webinfo/info.go deleted file mode 100644 index 12661d5..0000000 --- a/plugin/webinfo/info.go +++ /dev/null @@ -1,35 +0,0 @@ -package webinfo - -import ( - "AynaLivePlayer/core/model" -) - -type MediaInfo struct { - Index int - Title string - Artist string - Album string - Username string - Cover model.Picture -} - -type OutInfo struct { - Current MediaInfo - CurrentTime int - TotalTime int - Lyric string - Playlist []MediaInfo -} - -const ( - OutInfoC = "Current" - OutInfoCT = "CurrentTime" - OutInfoTT = "TotalTime" - OutInfoL = "Lyric" - OutInfoPL = "Playlists" -) - -type WebsocketData struct { - Update string - Data OutInfo -} diff --git a/plugin/webinfo/server.go b/plugin/webinfo/server.go deleted file mode 100644 index 02c84a9..0000000 --- a/plugin/webinfo/server.go +++ /dev/null @@ -1,234 +0,0 @@ -package webinfo - -import ( - "AynaLivePlayer/pkg/config" - "context" - "encoding/json" - "fmt" - "github.com/gorilla/websocket" - "net/http" - "sync" -) - -var upgrader = websocket.Upgrader{ - ReadBufferSize: 1024, - WriteBufferSize: 1024, - CheckOrigin: func(r *http.Request) bool { - return true - }, -} - -type WebInfoServer struct { - Info OutInfo - Port int - ServerMux *http.ServeMux - Server *http.Server - Clients map[*Client]int - Running bool - Store *TemplateStore - lock sync.Mutex - log adapter.ILogger -} - -type Client struct { - conn *websocket.Conn - Data chan []byte - Close chan byte -} - -func NewWebInfoServer(port int, log adapter.ILogger) *WebInfoServer { - server := &WebInfoServer{ - Store: newTemplateStore(WebTemplateStorePath), - Port: port, - Info: OutInfo{Playlist: make([]MediaInfo, 0)}, - Clients: map[*Client]int{}, - log: log, - } - mux := http.NewServeMux() - mux.Handle("/", http.FileServer(http.Dir(config.GetAssetPath("webinfo")))) - mux.HandleFunc("/ws/info", server.handleInfo) - mux.HandleFunc("/api/info", server.getInfo) - mux.HandleFunc("/api/template/list", server.tmplList) - mux.HandleFunc("/api/template/get", server.tmplGet) - mux.HandleFunc("/api/template/save", server.tmplSave) - server.ServerMux = mux - - return server -} - -func (s *WebInfoServer) tmplList(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - w.Header().Set("Access-Control-Allow-Origin", "*") - //w.Header().Set("Access-Control-Allow-Headers", "Content-Type") - d, _ := json.Marshal(s.Store.List()) - _, err := w.Write(d) - if err != nil { - s.log.Warnf("/api/template/list error: %s", err) - return - } -} - -func (s *WebInfoServer) tmplGet(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - w.Header().Set("Access-Control-Allow-Origin", "*") - name := r.URL.Query().Get("name") - if name == "" { - name = "default" - } - d, _ := json.Marshal(s.Store.Get(name)) - _, err := w.Write(d) - if err != nil { - s.log.Warnf("/api/template/get error: %s", err) - return - } -} - -func (s *WebInfoServer) tmplSave(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - w.Header().Set("Access-Control-Allow-Origin", "*") - w.Header().Set("Access-Control-Allow-Method", "*") - w.Header().Set("Access-Control-Allow-Credentials", "true") - w.Header().Set("Access-Control-Expose-Headers", "*") - w.Header().Set("Access-Control-Allow-Headers", "*") - s.log.Info(r.Method) - if r.Method == "OPTIONS" { - w.WriteHeader(http.StatusOK) - return - } - if r.Method != "POST" { - w.WriteHeader(http.StatusMethodNotAllowed) - return - } - if err := r.ParseMultipartForm(1 << 16); err != nil { - s.log.Warnf("ParseForm() err: %v", err) - return - } - name := r.FormValue("name") - tmpl := r.FormValue("template") - if name == "" { - name = "default" - } - s.log.Infof("change template %s", name) - s.Store.Modify(name, tmpl) - d, _ := json.Marshal(s.Store.Get(name)) - _, err := w.Write(d) - if err != nil { - s.log.Warnf("/api/template/save error: %s", err) - return - } - s.Store.Save(WebTemplateStorePath) -} - -func (s *WebInfoServer) getInfo(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - w.Header().Set("Access-Control-Allow-Origin", "*") - //w.Header().Set("Access-Control-Allow-Headers", "Content-Type") - d, _ := json.Marshal(s.Info) - _, err := w.Write(d) - if err != nil { - s.log.Warnf("api get info error: %s", err) - return - } -} - -func (s *WebInfoServer) handleInfo(w http.ResponseWriter, r *http.Request) { - s.log.Debug("connection start") - conn, err := upgrader.Upgrade(w, r, nil) - if err != nil { - s.log.Warnf("upgrade error: %s", err) - return - } - client := &Client{ - conn: conn, - Data: make(chan []byte, 16), - Close: make(chan byte, 1), - } - s.addClient(client) - defer s.removeClient(client) - go func() { - for { - _, _, err := client.conn.ReadMessage() - if err != nil { - client.Close <- 1 - } - } - }() - for { - s.log.Debug("waiting for message") - select { - case data := <-client.Data: - writer, err := client.conn.NextWriter(websocket.TextMessage) - if err != nil { - s.log.Warn("get writer error", err) - return - } - - if _, err = writer.Write(data); err != nil { - s.log.Warn("send error:", err) - return - } - if err = writer.Close(); err != nil { - s.log.Warnf("can't close writer: %s", err) - return - } - case _ = <-client.Close: - s.log.Debug("client close") - if err := client.conn.Close(); err != nil { - s.log.Warnf("close connection encouter an error: %s", err) - } - return - } - } -} - -func (s *WebInfoServer) SendInfo(update string, info OutInfo) { - for client := range s.Clients { - d, _ := json.Marshal(WebsocketData{Update: update, Data: info}) - client.Data <- d - } -} - -func (s *WebInfoServer) addClient(c *Client) { - s.lock.Lock() - s.Clients[c] = 1 - s.lock.Unlock() -} - -func (s *WebInfoServer) removeClient(c *Client) { - s.lock.Lock() - close(c.Data) - delete(s.Clients, c) - s.lock.Unlock() -} - -func (s *WebInfoServer) Start() { - s.log.Debug("WebInfoServer starting...") - s.Running = true - go func() { - s.Server = &http.Server{ - Addr: fmt.Sprintf("localhost:%d", s.Port), - Handler: s.ServerMux, - } - err := s.Server.ListenAndServe() - s.Running = false - if err == http.ErrServerClosed { - s.log.Info("WebInfoServer closed") - return - } - if err != nil { - s.log.Warnf("Failed to start webinfo server: %s", err) - return - } - }() -} - -func (s *WebInfoServer) Stop() error { - s.log.Debug("WebInfoServer stopping...") - s.lock.Lock() - s.Clients = map[*Client]int{} - s.lock.Unlock() - if s.Server != nil { - return s.Server.Shutdown(context.TODO()) - } - return nil -} diff --git a/plugin/webinfo/template.go b/plugin/webinfo/template.go deleted file mode 100644 index 6b431c7..0000000 --- a/plugin/webinfo/template.go +++ /dev/null @@ -1,76 +0,0 @@ -package webinfo - -import ( - "AynaLivePlayer/pkg/util" - "encoding/json" - "io/ioutil" -) - -const WebTemplateStorePath = "./webtemplates.json" - -type WebTemplate struct { - Name string - Template string -} - -type TemplateStore struct { - Templates map[string]*WebTemplate -} - -func newTemplateStore(filename string) *TemplateStore { - s := &TemplateStore{Templates: map[string]*WebTemplate{}} - var templates []*WebTemplate - file, err := ioutil.ReadFile(filename) - if err == nil { - _ = json.Unmarshal(file, &templates) - } - - for _, tmpl := range templates { - s.Templates[tmpl.Name] = tmpl - } - return s -} - -func (s *TemplateStore) Save(filename string) { - templates := make([]WebTemplate, 0) - for _, tmp := range s.Templates { - templates = append(templates, *tmp) - } - unescape, err := util.MarshalIndentUnescape(templates, "", " ") - if err != nil { - lg.Warnf("save web templates to %s failed: %s", filename, err) - return - } - if err := ioutil.WriteFile(filename, []byte(unescape), 0666); err != nil { - lg.Warnf("save web templates to %s failed: %s", filename, err) - return - } -} - -func (s *TemplateStore) Get(name string) *WebTemplate { - if t, ok := s.Templates[name]; ok { - return t - } - t := &WebTemplate{Name: name, Template: "

Empty

"} - s.Templates[name] = t - return t -} - -func (s *TemplateStore) Modify(name string, content string) { - if _, ok := s.Templates[name]; ok { - s.Templates[name].Template = content - return - } -} - -func (s *TemplateStore) List() []string { - names := make([]string, 0) - for name, _ := range s.Templates { - names = append(names, name) - } - return names -} - -func (s *TemplateStore) Delete(name string) { - delete(s.Templates, name) -} diff --git a/plugin/webinfo/template_test.go b/plugin/webinfo/template_test.go deleted file mode 100644 index 2265ecc..0000000 --- a/plugin/webinfo/template_test.go +++ /dev/null @@ -1,22 +0,0 @@ -package webinfo - -import ( - "fmt" - "testing" -) - -func TestTemplateStore_Create(t *testing.T) { - s := newTemplateStore(WebTemplateStorePath) - s.Get("A") - s.Get("B") - s.Modify("A", "33333") - s.Save(WebTemplateStorePath) -} - -func TestTemplateStore_Load(t *testing.T) { - s := newTemplateStore(WebTemplateStorePath) - fmt.Println(s.List()) - for name, tmpl := range s.Templates { - fmt.Println(name, tmpl.Template) - } -} diff --git a/plugin/webinfo/webinfo.go b/plugin/webinfo/webinfo.go deleted file mode 100644 index 3d4f18a..0000000 --- a/plugin/webinfo/webinfo.go +++ /dev/null @@ -1,249 +0,0 @@ -package webinfo - -import ( - "AynaLivePlayer/adapters/logger" - "AynaLivePlayer/core/adapter" - "AynaLivePlayer/core/events" - "AynaLivePlayer/core/model" - "AynaLivePlayer/gui" - "AynaLivePlayer/gui/component" - "AynaLivePlayer/gui/xfyne" - "AynaLivePlayer/pkg/config" - "AynaLivePlayer/pkg/event" - "AynaLivePlayer/pkg/i18n" - "AynaLivePlayer/pkg/util" - "fmt" - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/data/binding" - "fyne.io/fyne/v2/theme" - "fyne.io/fyne/v2/widget" -) - -const MODULE_PLGUIN_WEBINFO = "plugin.webinfo" - -var lg adapter.ILogger = &logger.EmptyLogger{} - -type WebInfo struct { - config.BaseConfig - Enabled bool - Port int - server *WebInfoServer - panel fyne.CanvasObject - ctr adapter.IControlBridge - log adapter.ILogger -} - -func NewWebInfo(ctr adapter.IControlBridge) *WebInfo { - lg = ctr.Logger().WithModule(MODULE_PLGUIN_WEBINFO) - return &WebInfo{ - Enabled: true, - Port: 4000, - ctr: ctr, - log: ctr.Logger().WithModule(MODULE_PLGUIN_WEBINFO), - } -} - -func (w *WebInfo) Name() string { - return "WebInfo" -} - -func (w *WebInfo) Title() string { - return i18n.T("plugin.webinfo.title") -} - -func (w *WebInfo) Description() string { - return i18n.T("plugin.webinfo.description") -} - -func (w *WebInfo) Enable() error { - config.LoadConfig(w) - w.server = NewWebInfoServer(w.Port, w.log) - w.registerHandlers() - gui.AddConfigLayout(w) - w.log.Info("webinfo loaded") - if w.Enabled { - w.log.Info("starting web backend server") - w.server.Start() - } - return nil -} - -func (w *WebInfo) Disable() error { - w.log.Info("closing webinfo backend server") - if err := w.server.Stop(); err != nil { - w.log.Warnf("stop webinfo server encouter an error: %s", err) - } - return nil -} - -func (w *WebInfo) registerHandlers() { - w.ctr.PlayControl().EventManager().RegisterA(events.EventPlay, "plugin.webinfo.current", func(event *event.Event) { - w.server.Info.Current = MediaInfo{ - Index: 0, - Title: event.Data.(events.PlayEvent).Media.Title, - Artist: event.Data.(events.PlayEvent).Media.Artist, - Album: event.Data.(events.PlayEvent).Media.Album, - Cover: event.Data.(events.PlayEvent).Media.Cover, - Username: event.Data.(events.PlayEvent).Media.ToUser().Name, - } - w.server.SendInfo( - OutInfoC, - OutInfo{Current: w.server.Info.Current}, - ) - }) - if w.ctr.PlayControl().GetPlayer().ObserveProperty( - model.PlayerPropTimePos, "plugin.webinfo.timepos", func(event *event.Event) { - data := event.Data.(events.PlayerPropertyUpdateEvent).Value - if data == nil { - w.server.Info.CurrentTime = 0 - return - } - ct := int(data.(float64)) - if ct == w.server.Info.CurrentTime { - return - } - w.server.Info.CurrentTime = ct - w.server.SendInfo( - OutInfoCT, - OutInfo{CurrentTime: w.server.Info.CurrentTime}, - ) - }) != nil { - w.log.Error("register time-pos handler failed") - } - if w.ctr.PlayControl().GetPlayer().ObserveProperty( - model.PlayerPropDuration, "plugin.webinfo.duration", func(event *event.Event) { - data := event.Data.(events.PlayerPropertyUpdateEvent).Value - if data == nil { - w.server.Info.TotalTime = 0 - return - } - w.server.Info.TotalTime = int(data.(float64)) - w.server.SendInfo( - OutInfoTT, - OutInfo{TotalTime: w.server.Info.TotalTime}, - ) - }) != nil { - w.log.Error("fail to register handler for total time with property duration") - } - w.ctr.Playlists().GetCurrent().EventManager().RegisterA( - events.EventPlaylistUpdate, "plugin.webinfo.playlist", func(event *event.Event) { - pl := make([]MediaInfo, 0) - e := event.Data.(events.PlaylistUpdateEvent) - for index, m := range e.Playlist.Medias { - pl = append(pl, MediaInfo{ - Index: index, - Title: m.Title, - Artist: m.Artist, - Album: m.Album, - Username: m.ToUser().Name, - }) - } - w.server.Info.Playlist = pl - w.server.SendInfo( - OutInfoPL, - OutInfo{Playlist: w.server.Info.Playlist}, - ) - }) - w.ctr.PlayControl().GetLyric().EventManager().RegisterA( - events.EventLyricUpdate, "plugin.webinfo.lyric", func(event *event.Event) { - lrcLine := event.Data.(events.LyricUpdateEvent).Lyric - w.server.Info.Lyric = lrcLine.Now.Lyric - w.server.SendInfo( - OutInfoL, - OutInfo{Lyric: w.server.Info.Lyric}, - ) - }) -} - -func (w *WebInfo) getServerStatusText() string { - if w.server.Running { - return i18n.T("plugin.webinfo.server_status.running") - } else { - return i18n.T("plugin.webinfo.server_status.stopped") - } -} - -func (w *WebInfo) getServerUrl() string { - return fmt.Sprintf("http://localhost:%d/#/previewV2", w.Port) -} - -func (w *WebInfo) CreatePanel() fyne.CanvasObject { - if w.panel != nil { - return w.panel - } - - statusText := widget.NewLabel("") - serverStatus := container.NewHBox( - widget.NewLabel(i18n.T("plugin.webinfo.server_status")), - statusText, - ) - autoStart := container.NewHBox( - widget.NewLabel(i18n.T("plugin.webinfo.autostart")), - component.NewCheckOneWayBinding("", &w.Enabled, w.Enabled)) - statusText.SetText(w.getServerStatusText()) - serverPort := container.NewBorder(nil, nil, - widget.NewLabel(i18n.T("plugin.webinfo.port")), nil, - xfyne.EntryDisableUndoRedo(widget.NewEntryWithData(binding.IntToString(binding.BindInt(&w.Port)))), - ) - serverUrl := widget.NewHyperlink(w.getServerUrl(), util.UrlMustParse(w.getServerUrl())) - serverPreview := container.NewHBox( - widget.NewLabel(i18n.T("plugin.webinfo.server_preview")), - serverUrl, - ) - stopBtn := component.NewAsyncButtonWithIcon( - i18n.T("plugin.webinfo.server_control.stop"), - theme.MediaStopIcon(), - func() { - if !w.server.Running { - return - } - w.log.Info("User try stop webinfo server") - err := w.server.Stop() - if err != nil { - w.log.Warnf("stop server have error: %s", err) - return - } - statusText.SetText(w.getServerStatusText()) - }, - ) - startBtn := component.NewAsyncButtonWithIcon( - i18n.T("plugin.webinfo.server_control.start"), - theme.MediaPlayIcon(), - func() { - if w.server.Running { - return - } - w.log.Infof("User try start webinfo server with port %d", w.Port) - w.server.Port = w.Port - w.server.Start() - statusText.SetText(w.getServerStatusText()) - serverUrl.SetText(w.getServerUrl()) - _ = serverUrl.SetURLFromString(w.getServerUrl()) - }, - ) - restartBtn := component.NewAsyncButtonWithIcon( - i18n.T("plugin.webinfo.server_control.restart"), - theme.MediaReplayIcon(), - func() { - w.log.Infof("User try restart webinfo server with port %d", w.Port) - if w.server.Running { - if err := w.server.Stop(); err != nil { - w.log.Warnf("stop server have error: %s", err) - return - } - } - w.server.Port = w.Port - w.server.Start() - statusText.SetText(w.getServerStatusText()) - serverUrl.SetText(w.getServerUrl()) - _ = serverUrl.SetURLFromString(w.getServerUrl()) - }, - ) - ctrlBtns := container.NewHBox( - widget.NewLabel(i18n.T("plugin.webinfo.server_control")), - startBtn, stopBtn, restartBtn, - ) - w.panel = container.NewVBox(serverStatus, autoStart, serverPreview, serverPort, ctrlBtns) - return w.panel -} diff --git a/plugin/wshub/events.go b/plugin/wshub/events.go index 1f3b813..617a3d3 100644 --- a/plugin/wshub/events.go +++ b/plugin/wshub/events.go @@ -1,17 +1,16 @@ package wshub import ( - "AynaLivePlayer/pkg/event" "encoding/json" ) type EventData struct { - EventID event.EventId + EventID string Data interface{} } type EventDataReceived struct { - EventID event.EventId + EventID string Data json.RawMessage } diff --git a/plugin/wshub/server.go b/plugin/wshub/server.go index 853655c..dfc7839 100644 --- a/plugin/wshub/server.go +++ b/plugin/wshub/server.go @@ -49,7 +49,7 @@ func (c *wsClient) start() { return } if globalEnableWsHubControl { - global.EventManager.CallA(data.EventID, actualEventData) + _ = global.EventBus.Publish(data.EventID, actualEventData) } } } diff --git a/plugin/wshub/wshub.go b/plugin/wshub/wshub.go index a8a0e21..cfa077e 100644 --- a/plugin/wshub/wshub.go +++ b/plugin/wshub/wshub.go @@ -7,7 +7,7 @@ import ( "AynaLivePlayer/gui/component" "AynaLivePlayer/gui/xfyne" "AynaLivePlayer/pkg/config" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "AynaLivePlayer/pkg/i18n" "AynaLivePlayer/pkg/logger" "fyne.io/fyne/v2" @@ -175,9 +175,9 @@ func (w *WsHub) registerEvents() { for eid, _ := range events.EventsMapping { eventCache = append(eventCache, &EventData{}) currentIdx := i - global.EventManager.RegisterA(eid, + global.EventBus.Subscribe("", eid, "plugin.wshub.event."+string(eid), - func(e *event.Event) { + func(e *eventbus.Event) { ed := EventData{ EventID: e.Id, Data: e.Data, diff --git a/plugin/yinliang/yinliang.go b/plugin/yinliang/yinliang.go index 637fdfc..d44a71e 100644 --- a/plugin/yinliang/yinliang.go +++ b/plugin/yinliang/yinliang.go @@ -7,7 +7,7 @@ import ( "AynaLivePlayer/gui/component" "AynaLivePlayer/gui/xfyne" "AynaLivePlayer/pkg/config" - "AynaLivePlayer/pkg/event" + "AynaLivePlayer/pkg/eventbus" "AynaLivePlayer/pkg/i18n" "AynaLivePlayer/pkg/logger" "fmt" @@ -67,15 +67,15 @@ func (y *Yinliang) Enable() error { gui.AddConfigLayout(y) - global.EventManager.RegisterA( + _ = global.EventBus.Subscribe("", events.LiveRoomMessageReceive, "plugin.yinliang.message", y.handleMessage) - global.EventManager.RegisterA( + _ = global.EventBus.Subscribe("", events.PlayerVolumeChangeCmd, "plugin.yinliang.volume_tracker", - func(e *event.Event) { + func(e *eventbus.Event) { data := e.Data.(events.PlayerVolumeChangeCmdEvent) y.currentVolume = data.Volume }) @@ -86,7 +86,7 @@ func (y *Yinliang) Disable() error { return nil } -func (y *Yinliang) handleMessage(event *event.Event) { +func (y *Yinliang) handleMessage(event *eventbus.Event) { if !y.Enabled { return } @@ -115,7 +115,7 @@ func (y *Yinliang) handleMessage(event *event.Event) { } y.log.Infof("User <%s> modify volume from %.2f to %.2f", message.User.Username, y.currentVolume, newVolume) - global.EventManager.CallA( + _ = global.EventBus.Publish( events.PlayerVolumeChangeCmd, events.PlayerVolumeChangeCmdEvent{ Volume: newVolume, From a81eb4a13198e90dba0f9af1591ab54b6976b4e1 Mon Sep 17 00:00:00 2001 From: aynakeya Date: Mon, 29 Sep 2025 23:23:23 +0800 Subject: [PATCH 3/3] update qqmusic wxlogin --- internal/source/source.go | 9 ++++++++- pkg/miaosic | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/internal/source/source.go b/internal/source/source.go index d4bd4c6..94c7c89 100644 --- a/internal/source/source.go +++ b/internal/source/source.go @@ -12,11 +12,12 @@ import ( _ "github.com/AynaLivePlayer/miaosic/providers/kuwo" "github.com/AynaLivePlayer/miaosic/providers/local" _ "github.com/AynaLivePlayer/miaosic/providers/netease" - _ "github.com/AynaLivePlayer/miaosic/providers/qq" + "github.com/AynaLivePlayer/miaosic/providers/qq" ) type _sourceConfig struct { LocalSourcePath string + QQChannel string } func (_ _sourceConfig) Name() string { @@ -31,12 +32,18 @@ func (_ _sourceConfig) OnSave() { var sourceCfg = &_sourceConfig{ LocalSourcePath: "./music", + QQChannel: "qq", } func Initialize() { config.LoadConfig(sourceCfg) kugou.UseInstrumental() miaosic.RegisterProvider(local.NewLocal(sourceCfg.LocalSourcePath)) + if sourceCfg.QQChannel == "wechat" { + qq.UseWechatLogin() + } else { + qq.UseQQLogin() + } _ = global.EventBus.Publish( events.MediaProviderUpdate, events.MediaProviderUpdateEvent{ diff --git a/pkg/miaosic b/pkg/miaosic index 15cadb4..8f67b50 160000 --- a/pkg/miaosic +++ b/pkg/miaosic @@ -1 +1 @@ -Subproject commit 15cadb4e5ff717a823f9643597a44c972b8f606d +Subproject commit 8f67b50eae7d8cf0f1f0bf2c32d58a85045c3d6a