From 05c44079e2ef5fa9bf46b3d9c5140ead5877149f Mon Sep 17 00:00:00 2001 From: Aynakeya Date: Tue, 19 Jul 2022 18:09:44 -0700 Subject: [PATCH] fix bug/webinfo-add custom template --- config/config.go | 2 +- gui/helper.go | 7 +++- gui/player_controller.go | 15 ------- logger/logger.go | 10 ++--- plugin/webinfo/server.go | 69 +++++++++++++++++++++++++++++++++ plugin/webinfo/template.go | 5 ++- plugin/webinfo/template_test.go | 3 +- todo.txt | 2 +- webtemplates.json | 14 +++++++ 9 files changed, 100 insertions(+), 27 deletions(-) create mode 100644 webtemplates.json diff --git a/config/config.go b/config/config.go index 461770f..fbd6f63 100644 --- a/config/config.go +++ b/config/config.go @@ -8,7 +8,7 @@ import ( const ( ProgramName = "卡西米尔唱片机" - Version = "alpha 0.8.6" + Version = "beta 0.9.0" ) const ( diff --git a/gui/helper.go b/gui/helper.go index c1d8d55..70d05a6 100644 --- a/gui/helper.go +++ b/gui/helper.go @@ -90,14 +90,17 @@ func newImageFromPlayerPicture(picture player.Picture) (*canvas.Image, error) { return img, nil } else { uri, err := storage.ParseURI(picture.Url) - if err != nil || uri == nil { + if err != nil { return nil, err } + if uri == nil { + return nil, errors.New("fail to fail url") + } img := canvas.NewImageFromURI(uri) if img == nil { // bug fix, return a new error to indicate fail to read an image return nil, errors.New("fail to read image") } - return img, err + return img, nil } } diff --git a/gui/player_controller.go b/gui/player_controller.go index 416e7a1..72e4dbd 100644 --- a/gui/player_controller.go +++ b/gui/player_controller.go @@ -202,21 +202,6 @@ func registerPlayControllerHandler() { PlayController.Cover.Resource = picture.Resource PlayController.Cover.Refresh() }() - //uri, err := storage.ParseURI(media.Cover) - //if err != nil || uri == nil { - // l().Warn("fail to load parse cover url", media.Cover) - //} - //// async update - //go func() { - // img := canvas.NewImageFromURI(uri) - // if img == nil { - // l().Warn("fail to load parse cover url", media.Cover) - // PlayController.SetDefaultCover() - // return - // } - // PlayController.Cover.Resource = img.Resource - // PlayController.Cover.Refresh() - //}() } }) return diff --git a/logger/logger.go b/logger/logger.go index 336761e..3f3560b 100644 --- a/logger/logger.go +++ b/logger/logger.go @@ -14,6 +14,11 @@ var Logger *logrus.Logger func init() { Logger = logrus.New() Logger.SetLevel(config.Log.Level) + Logger.SetFormatter(&nested.Formatter{ + FieldsOrder: []string{"Module"}, + HideKeys: true, + NoColors: true, + }) file, err := os.OpenFile(config.Log.Path, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) if config.Log.RedirectStderr { Logger.Info("panic/stderr redirect to log file") @@ -26,9 +31,4 @@ func init() { } else { Logger.Info("Failed to log to file, using default stdout") } - Logger.SetFormatter(&nested.Formatter{ - FieldsOrder: []string{"Module"}, - HideKeys: true, - NoColors: true, - }) } diff --git a/plugin/webinfo/server.go b/plugin/webinfo/server.go index adf01e2..1275944 100644 --- a/plugin/webinfo/server.go +++ b/plugin/webinfo/server.go @@ -25,6 +25,7 @@ type WebInfoServer struct { Server *http.Server Clients map[*Client]int Running bool + Store *TemplateStore lock sync.Mutex } @@ -36,18 +37,86 @@ type Client struct { func NewWebInfoServer(port int) *WebInfoServer { server := &WebInfoServer{ + Store: newTemplateStore(WebTemplateStorePath), Port: port, + Info: OutInfo{Playlist: make([]MediaInfo, 0)}, Clients: map[*Client]int{}, } 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 { + lg.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 { + lg.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", "*") + lg.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 { + lg.Warnf("ParseForm() err: %v", err) + return + } + name := r.FormValue("name") + tmpl := r.FormValue("template") + if name == "" { + name = "default" + } + lg.Infof("change template %s", name) + s.Store.Modify(name, tmpl) + d, _ := json.Marshal(s.Store.Get(name)) + _, err := w.Write(d) + if err != nil { + lg.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", "*") diff --git a/plugin/webinfo/template.go b/plugin/webinfo/template.go index 6649f10..12bfc6f 100644 --- a/plugin/webinfo/template.go +++ b/plugin/webinfo/template.go @@ -19,13 +19,14 @@ type TemplateStore struct { func newTemplateStore(filename string) *TemplateStore { s := &TemplateStore{Templates: map[string]*WebTemplate{}} - var templates []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 + s.Templates[tmpl.Name] = tmpl } return s } diff --git a/plugin/webinfo/template_test.go b/plugin/webinfo/template_test.go index 77655b8..2265ecc 100644 --- a/plugin/webinfo/template_test.go +++ b/plugin/webinfo/template_test.go @@ -9,12 +9,13 @@ func TestTemplateStore_Create(t *testing.T) { s := newTemplateStore(WebTemplateStorePath) s.Get("A") s.Get("B") - s.Modify("A", "123123") + 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/todo.txt b/todo.txt index 2bcee6d..614a01c 100644 --- a/todo.txt +++ b/todo.txt @@ -7,7 +7,6 @@ - web输出 (前端) -- 进入beta版本 beta - web 重连 @@ -17,6 +16,7 @@ beta ---- Finished +- 2022.7.18@0.9.0: Fix bug/网页第二版跟新,加入自定义模板/修复图片加载不出来导致的闪退bug - 2022.7.18 : Fix bug - 2022.7.16@0.8.6: 网页输出第一版更新/修复历史列表部分歌曲放不出来的bug/修复部分歌词不更新 - 2022.7.15: 更新stderr重定向/添加logo/ diff --git a/webtemplates.json b/webtemplates.json new file mode 100644 index 0000000..5b3d941 --- /dev/null +++ b/webtemplates.json @@ -0,0 +1,14 @@ +[ + { + "Name": "时间例子", + "Template": "

\r\n\r\n

秒显示:/

\r\n\r\n

\r\n分秒显示: \r\n\r\n/\r\n\r\n

\r\n" + }, + { + "Name": "播放列表例子", + "Template": "

默认

\r\n\r\n

自定义格式

\r\n\r\n \r\n " + }, + { + "Name": "default", + "Template": "
\r\n
\r\n \r\n ---\r\n \r\n ---\r\n \r\n
" + } +]