From 332f46bdbdf84a96f57b0be7b10c9a16a27f00ff Mon Sep 17 00:00:00 2001 From: Aynakeya Date: Fri, 1 Jul 2022 14:11:20 -0700 Subject: [PATCH] update history --- assets/translation.json | 20 +++++++++++ config/config.go | 2 +- controller/global.go | 5 +++ controller/history.go | 16 +++++++++ controller/player.go | 1 + go.mod | 1 + go.sum | 2 ++ gui/gui.go | 3 ++ gui/history_list.go | 76 +++++++++++++++++++++++++++++++++++++++++ player/media.go | 11 +++++- player/media_test.go | 8 +++++ todo.txt | 4 +-- 12 files changed, 145 insertions(+), 4 deletions(-) create mode 100644 controller/history.go create mode 100644 gui/history_list.go diff --git a/assets/translation.json b/assets/translation.json index 1e0436d..127281a 100644 --- a/assets/translation.json +++ b/assets/translation.json @@ -36,6 +36,22 @@ "en": "Basic", "zh-CN": "基础设置" }, + "gui.history.artist": { + "en": "Artist", + "zh-CN": "歌手" + }, + "gui.history.operation": { + "en": "Operation", + "zh-CN": "操作" + }, + "gui.history.title": { + "en": "Title", + "zh-CN": "歌名" + }, + "gui.history.user": { + "en": "User", + "zh-CN": "用户" + }, "gui.player.button.lrc": { "en": "lrc", "zh-CN": "歌词" @@ -168,6 +184,10 @@ "en": "Config", "zh-CN": "设置" }, + "gui.tab.history": { + "en": "History", + "zh-CN": "播放历史" + }, "gui.tab.player": { "en": "Player", "zh-CN": "播放器" diff --git a/config/config.go b/config/config.go index 8f5b748..c939349 100644 --- a/config/config.go +++ b/config/config.go @@ -6,7 +6,7 @@ import ( "path" ) -const VERSION = "alpha 0.6.7" +const VERSION = "alpha 0.6.8" const CONFIG_PATH = "./config.ini" const Assests_PATH = "./assets" diff --git a/controller/global.go b/controller/global.go index aa3d581..b8a5f92 100644 --- a/controller/global.go +++ b/controller/global.go @@ -10,6 +10,8 @@ import ( var MainPlayer *player.Player var UserPlaylist *player.Playlist +var History *player.Playlist +var HistoryUser *player.User var SystemPlaylist *player.Playlist var LiveClient liveclient.LiveClient var PlaylistManager []*player.Playlist @@ -27,6 +29,9 @@ func Initialize() { CurrentLyric = player.NewLyric("") loadPlaylists() + History = player.NewPlaylist("history", player.PlaylistConfig{RandomNext: false}) + HistoryUser = &player.User{Name: "History"} + MainPlayer.ObserveProperty("idle-active", handleMpvIdlePlayNext) UserPlaylist.Handler.RegisterA(player.EventPlaylistInsert, "controller.playnextwhenadd", handlePlaylistAdd) MainPlayer.ObserveProperty("time-pos", handleLyricUpdate) diff --git a/controller/history.go b/controller/history.go new file mode 100644 index 0000000..d0c304c --- /dev/null +++ b/controller/history.go @@ -0,0 +1,16 @@ +package controller + +import "AynaLivePlayer/player" + +func AddToHistory(media *player.Media) { + l().Tracef("add media %s (%s) to history", media.Title, media.Artist) + media = media.Copy() + History.Push(media) + return +} + +func ToHistoryMedia(media *player.Media) *player.Media { + media = media.Copy() + media.User = HistoryUser + return media +} diff --git a/controller/player.go b/controller/player.go index 82b6941..d92f3e2 100644 --- a/controller/player.go +++ b/controller/player.go @@ -29,6 +29,7 @@ func Play(media *player.Media) { return } CurrentMedia = media + AddToHistory(media) if err := MainPlayer.Play(media); err != nil { l().Warn("play failed", err) } diff --git a/go.mod b/go.mod index e3f7dac..b3ab0b5 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,7 @@ require ( github.com/go-ole/go-ole v1.2.6 github.com/go-resty/resty/v2 v2.7.0 github.com/jackmordaunt/icns v0.0.0-20181231085925-4f16af745526 + github.com/jinzhu/copier v0.3.5 github.com/josephspurrier/goversioninfo v0.0.0-20200309025242-14b0ab84c6ca github.com/lucor/goinfo v0.0.0-20210802170112-c078a2b0f08b github.com/mitchellh/panicwrap v1.0.0 diff --git a/go.sum b/go.sum index e3e8c9c..ab1dc96 100644 --- a/go.sum +++ b/go.sum @@ -39,6 +39,8 @@ github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0U github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/jackmordaunt/icns v0.0.0-20181231085925-4f16af745526 h1:NfuKjkj/Xc2z1xZIj+EmNCm5p1nKJPyw3F4E20usXvg= github.com/jackmordaunt/icns v0.0.0-20181231085925-4f16af745526/go.mod h1:UQkeMHVoNcyXYq9otUupF7/h/2tmHlhrS2zw7ZVvUqc= +github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg= +github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/josephspurrier/goversioninfo v0.0.0-20200309025242-14b0ab84c6ca h1:ozPUX9TKQZVek4lZWYRsQo7uS8vJ+q4OOHvRhHiCLfU= github.com/josephspurrier/goversioninfo v0.0.0-20200309025242-14b0ab84c6ca/go.mod h1:eJTEwMjXb7kZ633hO3Ln9mBUCOjX2+FlTljvpl9SYdE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= diff --git a/gui/gui.go b/gui/gui.go index 3855390..75c2708 100644 --- a/gui/gui.go +++ b/gui/gui.go @@ -46,6 +46,9 @@ func Initialize() { container.NewTabItem(i18n.T("gui.tab.playlist"), newPaddedBoarder(nil, nil, createPlaylists(), nil, createPlaylistMedias()), ), + container.NewTabItem(i18n.T("gui.tab.history"), + newPaddedBoarder(nil, nil, nil, nil, createHistoryList()), + ), container.NewTabItem(i18n.T("gui.tab.config"), newPaddedBoarder(nil, nil, nil, nil, createConfigLayout()), ), diff --git a/gui/history_list.go b/gui/history_list.go new file mode 100644 index 0000000..d4c18cf --- /dev/null +++ b/gui/history_list.go @@ -0,0 +1,76 @@ +package gui + +import ( + "AynaLivePlayer/controller" + "AynaLivePlayer/event" + "AynaLivePlayer/i18n" + "AynaLivePlayer/player" + "fmt" + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +type HistoryContainer struct { + Playlist *player.Playlist + List *widget.List +} + +var History = &PlaylistContainer{} + +func createHistoryList() fyne.CanvasObject { + History.Playlist = controller.History + History.List = widget.NewList( + func() int { + return History.Playlist.Size() + }, + func() fyne.CanvasObject { + return container.NewBorder(nil, nil, + widget.NewLabel("index"), + container.NewHBox( + widget.NewButtonWithIcon("", theme.MediaPlayIcon(), nil), + widget.NewButtonWithIcon("", theme.ContentAddIcon(), nil), + ), + container.NewGridWithColumns(3, + newLabelWithWrapping("title", fyne.TextTruncate), + newLabelWithWrapping("artist", fyne.TextTruncate), + newLabelWithWrapping("user", fyne.TextTruncate))) + }, + func(id widget.ListItemID, object fyne.CanvasObject) { + m := History.Playlist.Playlist[History.Playlist.Size()-id-1] + object.(*fyne.Container).Objects[0].(*fyne.Container).Objects[0].(*widget.Label).SetText( + m.Title) + object.(*fyne.Container).Objects[0].(*fyne.Container).Objects[1].(*widget.Label).SetText( + m.Artist) + object.(*fyne.Container).Objects[0].(*fyne.Container).Objects[2].(*widget.Label).SetText( + m.ToUser().Name) + 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() { + controller.Play(controller.ToHistoryMedia(m)) + } + btns[1].(*widget.Button).OnTapped = func() { + controller.UserPlaylist.Push(controller.ToHistoryMedia(m)) + } + }) + registerHistoryHandler() + return container.NewBorder( + container.NewBorder(nil, nil, + widget.NewLabel("#"), widget.NewLabel(i18n.T("gui.history.operation")), + container.NewGridWithColumns(3, + widget.NewLabel(i18n.T("gui.history.title")), + widget.NewLabel(i18n.T("gui.history.artist")), + widget.NewLabel(i18n.T("gui.history.user")))), + nil, nil, nil, + History.List, + ) +} + +func registerHistoryHandler() { + History.Playlist.Handler.RegisterA(player.EventPlaylistUpdate, "gui.history.update", func(event *event.Event) { + History.Playlist.Lock.RLock() + History.List.Refresh() + History.Playlist.Lock.RUnlock() + }) +} diff --git a/player/media.go b/player/media.go index 5b641ed..b3c4e9b 100644 --- a/player/media.go +++ b/player/media.go @@ -1,6 +1,9 @@ package player -import "AynaLivePlayer/liveclient" +import ( + "AynaLivePlayer/liveclient" + "github.com/jinzhu/copier" +) type Media struct { Title string @@ -34,3 +37,9 @@ func (m *Media) DanmuUser() *liveclient.DanmuUser { } return nil } + +func (m *Media) Copy() *Media { + newMedia := &Media{} + copier.Copy(newMedia, m) + return newMedia +} diff --git a/player/media_test.go b/player/media_test.go index 052ddc4..404c018 100644 --- a/player/media_test.go +++ b/player/media_test.go @@ -20,3 +20,11 @@ func TestStruct(t *testing.T) { z, ok := x.(*B) fmt.Println(z, ok) } + +func TestMedia_Copy(t *testing.T) { + m := &Media{Title: "asdf", User: &User{Name: "123"}} + m2 := m.Copy() + fmt.Println(m, m2) + m2.User.(*User).Name = "456" + fmt.Println(m.User.(*User).Name, m2) +} diff --git a/todo.txt b/todo.txt index 197f57b..7f22184 100644 --- a/todo.txt +++ b/todo.txt @@ -7,7 +7,6 @@ - 文本输出 - web输出 -- 历史记录 - 黑名单 - 进入beta版本 @@ -16,7 +15,8 @@ ---- Finished -- 2022/6/29: 跳过闲置歌单 +- 2022.7.01: 历史记录 +- 2022.6.29: 跳过闲置歌单 - 2022.6.26: i18n - 2022.6.25: kuwo歌单 - 2022.6.25: 设置界面