mirror of
https://github.com/AynaLivePlayer/AynaLivePlayer.git
synced 2025-12-10 20:28:13 +08:00
* rewrite * update submodule * make width height configurable * update dependency * update * update file * update dep * fix basic config layout * update plugin management * more stuff * add blacklist * fix todo * fix windows gethandle * update windows update guide * update windows build guide * include go mod tidy in script * update todo * fix source session * fix text output * add plugin play duration control * fix id diange not working * update todo * update version number
234 lines
5.9 KiB
Go
234 lines
5.9 KiB
Go
package playlist
|
|
|
|
import (
|
|
"AynaLivePlayer/core/events"
|
|
"AynaLivePlayer/core/model"
|
|
"AynaLivePlayer/global"
|
|
"AynaLivePlayer/pkg/event"
|
|
"errors"
|
|
"github.com/AynaLivePlayer/miaosic"
|
|
)
|
|
|
|
// todo: implement the playlist controller
|
|
|
|
var allPlaylists = make(map[string]*miaosic.Playlist)
|
|
var currentSelected string = ""
|
|
|
|
func createPlaylistManager() {
|
|
allPlaylists = make(map[string]*miaosic.Playlist)
|
|
for _, pl := range cfg.playlists {
|
|
value := pl.Copy()
|
|
allPlaylists[pl.Meta.ID()] = &value
|
|
}
|
|
currentSelected = ""
|
|
if len(cfg.playlists) > 0 {
|
|
currentSelected = cfg.playlists[0].Meta.ID()
|
|
}
|
|
|
|
global.EventManager.CallA(
|
|
events.PlaylistManagerCurrentUpdate,
|
|
events.PlaylistManagerCurrentUpdateEvent{
|
|
Medias: make([]model.Media, 0),
|
|
})
|
|
|
|
global.EventManager.CallA(
|
|
events.PlaylistManagerSetSystemCmd,
|
|
events.PlaylistManagerSetSystemCmdEvent{
|
|
PlaylistID: cfg.SystemPlaylistID,
|
|
})
|
|
|
|
global.EventManager.RegisterA(events.PlaylistManagerSetSystemCmd,
|
|
"internal.playlist.system_playlist.set",
|
|
func(event *event.Event) {
|
|
data := event.Data.(events.PlaylistManagerSetSystemCmdEvent)
|
|
// default case
|
|
if data.PlaylistID == "" {
|
|
return
|
|
}
|
|
log.Infof("try to set system playlist %s", data.PlaylistID)
|
|
pl, ok := allPlaylists[data.PlaylistID]
|
|
if !ok {
|
|
global.EventManager.CallA(
|
|
events.ErrorUpdate,
|
|
events.ErrorUpdateEvent{
|
|
Error: errors.New("playlist not found"),
|
|
})
|
|
return
|
|
}
|
|
cfg.SystemPlaylistID = pl.Meta.ID()
|
|
global.EventManager.CallA(
|
|
events.PlaylistManagerSystemUpdate,
|
|
events.PlaylistManagerSystemUpdateEvent{
|
|
Info: model.PlaylistInfo{
|
|
Meta: pl.Meta,
|
|
Title: pl.DisplayName(),
|
|
},
|
|
})
|
|
log.Infof("replace system playlist with %d medias", len(pl.Medias))
|
|
medias := make([]model.Media, len(pl.Medias))
|
|
for i, v := range pl.Medias {
|
|
medias[i] = model.Media{
|
|
Info: v,
|
|
User: model.SystemUser,
|
|
}
|
|
}
|
|
SystemPlaylist.Replace(medias)
|
|
|
|
})
|
|
global.EventManager.RegisterA(
|
|
events.PlaylistManagerRefreshCurrentCmd,
|
|
"internal.playlist.current_playlist.refresh",
|
|
func(event *event.Event) {
|
|
data := event.Data.(events.PlaylistManagerRefreshCurrentCmdEvent)
|
|
log.Infof("try to refresh playlist %s", data.PlaylistID)
|
|
currentSelected = data.PlaylistID
|
|
// default case
|
|
if currentSelected == "" {
|
|
return
|
|
}
|
|
pl, ok := allPlaylists[data.PlaylistID]
|
|
if !ok {
|
|
global.EventManager.CallA(
|
|
events.ErrorUpdate,
|
|
events.ErrorUpdateEvent{
|
|
Error: errors.New("playlist not found"),
|
|
})
|
|
return
|
|
}
|
|
getPlaylist, err := miaosic.GetPlaylist(pl.Meta)
|
|
if err != nil {
|
|
global.EventManager.CallA(
|
|
events.ErrorUpdate,
|
|
events.ErrorUpdateEvent{
|
|
Error: err,
|
|
})
|
|
return
|
|
}
|
|
allPlaylists[pl.Meta.ID()] = getPlaylist
|
|
updateCurrenMedias(getPlaylist)
|
|
updatePlaylistManagerInfos()
|
|
})
|
|
|
|
global.EventManager.RegisterA(
|
|
events.PlaylistManagerGetCurrentCmd,
|
|
"internal.playlist.current_playlist.get",
|
|
func(event *event.Event) {
|
|
data := event.Data.(events.PlaylistManagerGetCurrentCmdEvent)
|
|
log.Infof("try to get playlist %s", data.PlaylistID)
|
|
currentSelected = data.PlaylistID
|
|
// default case
|
|
if currentSelected == "" {
|
|
return
|
|
}
|
|
pl, ok := allPlaylists[data.PlaylistID]
|
|
if !ok {
|
|
global.EventManager.CallA(
|
|
events.ErrorUpdate,
|
|
events.ErrorUpdateEvent{
|
|
Error: errors.New("playlist not found"),
|
|
})
|
|
return
|
|
}
|
|
updateCurrenMedias(pl)
|
|
})
|
|
|
|
global.EventManager.RegisterA(
|
|
events.PlaylistManagerAddPlaylistCmd,
|
|
"internal.playlist.add_playlist",
|
|
func(event *event.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(
|
|
events.ErrorUpdate,
|
|
events.ErrorUpdateEvent{
|
|
Error: errors.New("not proper url"),
|
|
})
|
|
return
|
|
}
|
|
_, ok = allPlaylists[meta.ID()]
|
|
if ok {
|
|
global.EventManager.CallA(
|
|
events.ErrorUpdate,
|
|
events.ErrorUpdateEvent{
|
|
Error: errors.New("playlist already exists"),
|
|
})
|
|
return
|
|
}
|
|
pl, err := miaosic.GetPlaylist(meta)
|
|
if err != nil {
|
|
global.EventManager.CallA(
|
|
events.ErrorUpdate,
|
|
events.ErrorUpdateEvent{
|
|
Error: err,
|
|
})
|
|
return
|
|
}
|
|
allPlaylists[meta.ID()] = pl
|
|
updatePlaylistManagerInfos()
|
|
})
|
|
|
|
global.EventManager.RegisterA(
|
|
events.PlaylistManagerRemovePlaylistCmd,
|
|
"internal.playlist.remove_playlist",
|
|
func(event *event.Event) {
|
|
data := event.Data.(events.PlaylistManagerRemovePlaylistCmdEvent)
|
|
if data.PlaylistID == cfg.SystemPlaylistID {
|
|
global.EventManager.CallA(
|
|
events.ErrorUpdate,
|
|
events.ErrorUpdateEvent{
|
|
Error: errors.New("cannot remove system playlist"),
|
|
})
|
|
return
|
|
}
|
|
_, ok := allPlaylists[data.PlaylistID]
|
|
if !ok {
|
|
global.EventManager.CallA(
|
|
events.ErrorUpdate,
|
|
events.ErrorUpdateEvent{
|
|
Error: errors.New("playlist not found"),
|
|
})
|
|
return
|
|
}
|
|
delete(allPlaylists, data.PlaylistID)
|
|
updatePlaylistManagerInfos()
|
|
})
|
|
updatePlaylistManagerInfos()
|
|
}
|
|
|
|
func updateCurrenMedias(pl *miaosic.Playlist) {
|
|
medias := make([]model.Media, len(pl.Medias))
|
|
for i, v := range pl.Medias {
|
|
medias[i] = model.Media{
|
|
Info: v,
|
|
User: model.SystemUser,
|
|
}
|
|
}
|
|
global.EventManager.CallA(
|
|
events.PlaylistManagerCurrentUpdate,
|
|
events.PlaylistManagerCurrentUpdateEvent{
|
|
Medias: medias,
|
|
})
|
|
}
|
|
|
|
func updatePlaylistManagerInfos() {
|
|
playlists := make([]model.PlaylistInfo, 0)
|
|
keys := make([]string, 0)
|
|
for k := range allPlaylists {
|
|
keys = append(keys, k)
|
|
}
|
|
for _, k := range keys {
|
|
playlists = append(playlists, model.PlaylistInfo{
|
|
Meta: allPlaylists[k].Meta,
|
|
Title: allPlaylists[k].DisplayName(),
|
|
})
|
|
}
|
|
log.InfoW("update playlist manager infos")
|
|
global.EventManager.CallA(
|
|
events.PlaylistManagerInfoUpdate,
|
|
events.PlaylistManagerInfoUpdateEvent{
|
|
Playlists: playlists,
|
|
})
|
|
}
|