From 24457e0acd5181e9e9064c4396d85446da8d8233 Mon Sep 17 00:00:00 2001 From: Aynakeya Date: Fri, 15 Jul 2022 16:30:50 -0700 Subject: [PATCH] add stderr redirection, add logo --- README.md | 6 ++++- app/cli/main.go | 2 +- app/gui/main.go | 25 ++++-------------- assets/icon.jpg | Bin 0 -> 97651 bytes assets/webinfo/index.html | 22 +++++++++------- assets/webinfo/js/main.js | 3 --- config/config.go | 15 +++++++---- config/config_log.go | 10 +++++--- config/config_test.go | 2 +- go.mod | 6 ++--- go.sum | 52 ++------------------------------------ gui/gui.go | 5 ++-- gui/player_controller.go | 5 ++-- gui/resource.go | 8 ++++++ logger/logger.go | 7 +++++ plugin/webinfo/server.go | 2 ++ plugin/wylogin/wylogin.go | 4 +-- resource/resource.go | 20 +++++++++++++++ todo.txt | 25 +++++++++--------- 19 files changed, 102 insertions(+), 117 deletions(-) create mode 100644 assets/icon.jpg delete mode 100644 assets/webinfo/js/main.js create mode 100644 gui/resource.go create mode 100644 resource/resource.go diff --git a/README.md b/README.md index 13bedb8..c15621b 100644 --- a/README.md +++ b/README.md @@ -10,5 +10,9 @@ QQ group: 621035845 ``` go build -o AynaLivePlayer.exe -ldflags -H=windowsgui app/gui/main.go - ``` + +## packaging +``` +fyne package --src path_to_gui --exe AynaLivePlayer.exe --appVersion 0.8.4 --icon path_to_icon +``` \ No newline at end of file diff --git a/app/cli/main.go b/app/cli/main.go index 4fa2f10..f25f8fd 100644 --- a/app/cli/main.go +++ b/app/cli/main.go @@ -9,7 +9,7 @@ import ( ) func main() { - fmt.Printf("BiliAudioBot Revive %s\n", config.VERSION) + fmt.Printf("BiliAudioBot Revive %s\n", config.Version) logger.Logger.SetLevel(logrus.DebugLevel) fmt.Println("Please enter room id") var roomid string diff --git a/app/gui/main.go b/app/gui/main.go index 25d8ff2..f3041fa 100644 --- a/app/gui/main.go +++ b/app/gui/main.go @@ -10,35 +10,20 @@ import ( "AynaLivePlayer/plugin/textinfo" "AynaLivePlayer/plugin/webinfo" "AynaLivePlayer/plugin/wylogin" - "fmt" - "github.com/mitchellh/panicwrap" - "os" ) -func init() { - exitStatus, _ := panicwrap.BasicWrap(func(s string) { - logger.Logger.Panic(s) - os.Exit(1) - return - }) - if exitStatus >= 0 { - os.Exit(exitStatus) - } -} - var plugins = []controller.Plugin{diange.NewDiange(), qiege.NewQiege(), textinfo.NewTextInfo(), webinfo.NewWebInfo(), wylogin.NewWYLogin()} func main() { - fmt.Printf("BiliAudioBot Revive %s\n", config.VERSION) + logger.Logger.Info("================Program Start================") + logger.Logger.Infof("================Current Version: %s================", config.Version) controller.Initialize() controller.LoadPlugins(plugins...) - defer func() { - controller.Destroy() - config.SaveToConfigFile(config.CONFIG_PATH) - //i18n.SaveTranslation() - }() gui.Initialize() gui.MainWindow.ShowAndRun() controller.ClosePlugins(plugins...) + controller.Destroy() + _ = config.SaveToConfigFile(config.ConfigPath) + logger.Logger.Info("================Program End================") } diff --git a/assets/icon.jpg b/assets/icon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e26c497b0608206a394f77d87cabd0794be8bc83 GIT binary patch literal 97651 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 - - - LOL - - -

123123

-

ABDCCC

- - \ No newline at end of file + + + + + AynaLivePlayer OBS Info + + + + +
+ + + diff --git a/assets/webinfo/js/main.js b/assets/webinfo/js/main.js deleted file mode 100644 index 54c8f38..0000000 --- a/assets/webinfo/js/main.js +++ /dev/null @@ -1,3 +0,0 @@ -function aaa() { - return 0; -} \ No newline at end of file diff --git a/config/config.go b/config/config.go index 1c3ec92..6cfc8fe 100644 --- a/config/config.go +++ b/config/config.go @@ -6,13 +6,18 @@ import ( "path" ) -const VERSION = "alpha 0.8.4" +const ( + ProgramName = "卡西米尔唱片机" + Version = "alpha 0.8.4" +) -const CONFIG_PATH = "./config.ini" -const Assests_PATH = "./assets" +const ( + ConfigPath = "./config.ini" + AssetsPath = "./assets" +) func GetAssetPath(name string) string { - return path.Join(Assests_PATH, name) + return path.Join(AssetsPath, name) } type Config interface { @@ -33,7 +38,7 @@ func LoadConfig(cfg Config) { func init() { var err error - ConfigFile, err = ini.Load(CONFIG_PATH) + ConfigFile, err = ini.Load(ConfigPath) if err != nil { fmt.Println("config not found, using default config") ConfigFile = ini.Empty() diff --git a/config/config_log.go b/config/config_log.go index 93a7c25..3923f1f 100644 --- a/config/config_log.go +++ b/config/config_log.go @@ -3,8 +3,9 @@ package config import "github.com/sirupsen/logrus" type _LogConfig struct { - Path string - Level logrus.Level + Path string + Level logrus.Level + RedirectStderr bool } func (c *_LogConfig) Name() string { @@ -12,6 +13,7 @@ func (c *_LogConfig) Name() string { } var Log = &_LogConfig{ - Path: "./log.txt", - Level: logrus.InfoLevel, + Path: "./log.txt", + Level: logrus.InfoLevel, + RedirectStderr: false, // this should be true if it is in production mode. } diff --git a/config/config_test.go b/config/config_test.go index 4e27a1a..95fb4aa 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -6,7 +6,7 @@ import ( ) func TestCreate(t *testing.T) { - fmt.Println(SaveToConfigFile(CONFIG_PATH)) + fmt.Println(SaveToConfigFile(ConfigPath)) } func TestLoad(t *testing.T) { diff --git a/go.mod b/go.mod index bc5c95b..67668c0 100644 --- a/go.mod +++ b/go.mod @@ -10,15 +10,15 @@ require ( github.com/aynakeya/go-mpv v0.0.4 github.com/dhowden/tag v0.0.0-20220618230019-adf36e896086 github.com/go-resty/resty/v2 v2.7.0 - github.com/gorilla/websocket v1.5.0 // indirect + github.com/gorilla/websocket v1.5.0 github.com/jinzhu/copier v0.3.5 github.com/mitchellh/panicwrap v1.0.0 github.com/sirupsen/logrus v1.8.1 - github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect + github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e github.com/spf13/cast v1.3.1 github.com/tidwall/gjson v1.14.1 + github.com/virtuald/go-paniclog v0.0.0-20190812204905-43a7fa316459 gopkg.in/ini.v1 v1.66.4 - nhooyr.io/websocket v1.8.7 ) replace ( diff --git a/go.sum b/go.sum index 5173ae1..3d32612 100644 --- a/go.sum +++ b/go.sum @@ -20,45 +20,20 @@ github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3 h1:FDqhDm7pcsLhhWl1QtD8 github.com/fredbi/uri v0.0.0-20181227131451-3dcfdacbaaf3/go.mod h1:CzM2G82Q9BDUvMTGHnXf/6OExw/Dz2ivDj48nVg7Lg8= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/go-gl/gl v0.0.0-20210813123233-e4099ee2221f h1:s0O46d8fPwk9kU4k1jj76wBquMVETx7uveQD9MCIQoU= github.com/go-gl/gl v0.0.0-20210813123233-e4099ee2221f/go.mod h1:wjpnOv6ONl2SuJSxqCPVaPZibGFdSci9HFocT9qtVYM= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20211024062804-40e447a793be h1:Z28GdQBfKOL8tNHjvaDn3wHDO7AzTRkmAXvHvnopp98= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20211024062804-40e447a793be/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-resty/resty/v2 v2.6.0/go.mod h1:PwvJS6hvaPkjtjNg9ph+VrSD92bi5Zq73w/BIH7cC3Q= github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff h1:W71vTCKoxtdXgnm1ECDFkfQnpdqAO00zzGXLA5yaEX8= github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff/go.mod h1:wfqRWLHRBsRgkp5dmbG56SA0DmVtwrF5N3oPdI8t+Aw= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5 h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -66,24 +41,12 @@ github.com/jackmordaunt/icns v0.0.0-20181231085925-4f16af745526/go.mod h1:UQkeMH 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/go.mod h1:eJTEwMjXb7kZ633hO3Ln9mBUCOjX2+FlTljvpl9SYdE= -github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/klauspost/compress v1.10.3 h1:OP96hzwJVBIHYU52pVTI6CczrxPvrGfgqF9N5eTO0Q8= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lucor/goinfo v0.0.0-20210802170112-c078a2b0f08b/go.mod h1:PRq09yoB+Q2OJReAmwzKivcYyremnibWGbK7WfftHzc= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mitchellh/panicwrap v1.0.0 h1:67zIyVakCIvcs69A0FGfZjBdPleaonSgGlXRSRlb6fE= github.com/mitchellh/panicwrap v1.0.0/go.mod h1:pKvZHwWrZowLUzftuFq7coarnxbBXU4aQh3N0BJOeeA= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -107,8 +70,6 @@ github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9 h1:m59mIOBO4kfcNCE github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9/go.mod h1:mvWM0+15UqyrFKqdRjY6LuAVJR0HOVhJlEgZ5JWtSWU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/tidwall/gjson v1.8.0/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk= @@ -120,11 +81,9 @@ github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JT github.com/tidwall/pretty v1.1.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +github.com/virtuald/go-paniclog v0.0.0-20190812204905-43a7fa316459 h1:x9pIfbdIjnw+Ylb2vE27Gtqb7BDmfR+nLcJwvbJh98U= +github.com/virtuald/go-paniclog v0.0.0-20190812204905-43a7fa316459/go.mod h1:nFvuG3SWu3VWqobG3cX8nt57wXU0OOFapeCs/8axIuM= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.3.8 h1:Nw158Q8QN+CPgTmVRByhVwapp8Mm1e2blinhmx4wx5E= github.com/yuin/goldmark v1.3.8/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= @@ -145,7 +104,6 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -154,18 +112,14 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= @@ -176,5 +130,3 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= -nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= diff --git a/gui/gui.go b/gui/gui.go index 9f05d51..b45bcdb 100644 --- a/gui/gui.go +++ b/gui/gui.go @@ -4,6 +4,7 @@ import ( "AynaLivePlayer/config" "AynaLivePlayer/i18n" "AynaLivePlayer/logger" + "AynaLivePlayer/resource" "fmt" "fyne.io/fyne/v2" "fyne.io/fyne/v2/app" @@ -32,7 +33,7 @@ func Initialize() { l().Info("Initializing GUI") os.Setenv("FYNE_FONT", config.GetAssetPath("msyh.ttc")) App = app.New() - MainWindow = App.NewWindow(fmt.Sprintf("AynaLivePlayer Ver.%s", config.VERSION)) + MainWindow = App.NewWindow(fmt.Sprintf("%s Ver.%s", config.ProgramName, config.Version)) tabs := container.NewAppTabs( container.NewTabItem(i18n.T("gui.tab.player"), @@ -56,7 +57,7 @@ func Initialize() { ) tabs.SetTabLocation(container.TabLocationTop) - + MainWindow.SetIcon(fyne.NewStaticResource("icon", resource.ProgramIcon)) MainWindow.SetContent(tabs) //MainWindow.Resize(fyne.NewSize(1280, 720)) MainWindow.Resize(fyne.NewSize(960, 480)) diff --git a/gui/player_controller.go b/gui/player_controller.go index ab12cbd..416e7a1 100644 --- a/gui/player_controller.go +++ b/gui/player_controller.go @@ -32,8 +32,7 @@ type PlayControllerContainer struct { } func (p *PlayControllerContainer) SetDefaultCover() { - p.Cover.Resource = nil - p.Cover.File = config.GetAssetPath("empty.png") + p.Cover.Resource = ResEmptyImage p.Cover.Refresh() } @@ -224,7 +223,7 @@ func registerPlayControllerHandler() { } func createPlayControllerV2() fyne.CanvasObject { - PlayController.Cover = canvas.NewImageFromFile(config.GetAssetPath("empty.png")) + PlayController.Cover = canvas.NewImageFromResource(ResEmptyImage) PlayController.Cover.SetMinSize(fyne.NewSize(128, 128)) PlayController.Cover.FillMode = canvas.ImageFillContain diff --git a/gui/resource.go b/gui/resource.go new file mode 100644 index 0000000..3ab6985 --- /dev/null +++ b/gui/resource.go @@ -0,0 +1,8 @@ +package gui + +import ( + "AynaLivePlayer/resource" + "fyne.io/fyne/v2" +) + +var ResEmptyImage = fyne.NewStaticResource("empty", resource.EmptyImage) diff --git a/logger/logger.go b/logger/logger.go index 652e3d7..336761e 100644 --- a/logger/logger.go +++ b/logger/logger.go @@ -4,6 +4,7 @@ import ( "AynaLivePlayer/config" nested "github.com/antonfisher/nested-logrus-formatter" "github.com/sirupsen/logrus" + "github.com/virtuald/go-paniclog" "io" "os" ) @@ -14,6 +15,12 @@ func init() { Logger = logrus.New() Logger.SetLevel(config.Log.Level) 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") + if _, err = paniclog.RedirectStderr(file); err != nil { + Logger.Infof("Failed to redirect stderr to to file: %s", err) + } + } if err == nil { Logger.Out = io.MultiWriter(file, os.Stdout) } else { diff --git a/plugin/webinfo/server.go b/plugin/webinfo/server.go index add9515..adf01e2 100644 --- a/plugin/webinfo/server.go +++ b/plugin/webinfo/server.go @@ -50,6 +50,8 @@ func NewWebInfoServer(port int) *WebInfoServer { 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 { diff --git a/plugin/wylogin/wylogin.go b/plugin/wylogin/wylogin.go index c117a3e..498e33c 100644 --- a/plugin/wylogin/wylogin.go +++ b/plugin/wylogin/wylogin.go @@ -109,7 +109,7 @@ func (w *WYLogin) CreatePanel() fyne.CanvasObject { }, ) controlBtns := container.NewHBox(refreshBtn, logoutBtn) - qrcodeImg := canvas.NewImageFromFile(config.GetAssetPath("empty.png")) + qrcodeImg := canvas.NewImageFromResource(gui.ResEmptyImage) qrcodeImg.SetMinSize(fyne.NewSize(200, 200)) qrcodeImg.FillMode = canvas.ImageFillContain var key string @@ -148,7 +148,7 @@ func (w *WYLogin) CreatePanel() fyne.CanvasObject { qrStatus.SetText(msg) if ok { key = "" - qrcodeImg.Resource = nil + qrcodeImg.Resource = gui.ResEmptyImage qrcodeImg.Refresh() } }, diff --git a/resource/resource.go b/resource/resource.go new file mode 100644 index 0000000..586d5e6 --- /dev/null +++ b/resource/resource.go @@ -0,0 +1,20 @@ +package resource + +import ( + "AynaLivePlayer/config" + "io/ioutil" +) + +var ProgramIcon = []byte{} +var EmptyImage = []byte{} + +func init() { + loadResource(config.GetAssetPath("icon.jpg"), &ProgramIcon) + loadResource(config.GetAssetPath("empty.png"), &EmptyImage) +} + +func loadResource(path string, res *[]byte) { + if file, err := ioutil.ReadFile(path); err == nil { + *res = file + } +} diff --git a/todo.txt b/todo.txt index 43b943b..59a62ea 100644 --- a/todo.txt +++ b/todo.txt @@ -5,8 +5,6 @@ - @5 delete optimization - - - web输出 (前端) - 进入beta版本 @@ -17,14 +15,15 @@ alpha ---- Finished -- 2022.7.13: 网易于登录 -- 2022.7.10: Local Provider -- 2022.7.03: 多来源点歌 -- 2022.7.01: 文本输出 -- 2022.7.01: 历史记录 -- 2022.6.29: 跳过闲置歌单 -- 2022.6.26: i18n -- 2022.6.25: kuwo歌单 -- 2022.6.25: 设置界面 -- 2022.6.25: @6 bug, race condition, playlist size changed during playlist update. -- 2022.6.23: 用户歌单操作 \ No newline at end of file +- 2022.7.15: 更新stderr重定向/添加logo/ +- 2022.7.13@0.8.4: 网易云登录 +- 2022.7.10: Local Provider +- 2022.7.03: 多来源点歌 +- 2022.7.01: 文本输出 +- 2022.7.01: 历史记录 +- 2022.6.29: 跳过闲置歌单 +- 2022.6.26: i18n +- 2022.6.25: kuwo歌单 +- 2022.6.25: 设置界面 +- 2022.6.25: @6 bug, race condition, playlist size changed during playlist update. +- 2022.6.23: 用户歌单操作 \ No newline at end of file