mirror of
https://github.com/AynaLivePlayer/AynaLivePlayer.git
synced 2025-12-06 10:22:50 +08:00
fix source session
This commit is contained in:
@@ -380,38 +380,6 @@
|
||||
"en": "User",
|
||||
"zh-CN": "普通用户"
|
||||
},
|
||||
"plugin.neteaselogin.current_user": {
|
||||
"en": "Current User:",
|
||||
"zh-CN": "当前用户:"
|
||||
},
|
||||
"plugin.neteaselogin.current_user.notlogin": {
|
||||
"en": "Not Login",
|
||||
"zh-CN": "未登录"
|
||||
},
|
||||
"plugin.neteaselogin.description": {
|
||||
"en": "Netease User Login",
|
||||
"zh-CN": "网易云登录"
|
||||
},
|
||||
"plugin.neteaselogin.logout": {
|
||||
"en": "Logout",
|
||||
"zh-CN": "登出"
|
||||
},
|
||||
"plugin.neteaselogin.qr.finish": {
|
||||
"en": "Finish Scan",
|
||||
"zh-CN": "完成扫描后按我"
|
||||
},
|
||||
"plugin.neteaselogin.qr.new": {
|
||||
"en": "Get a new qr code",
|
||||
"zh-CN": "获取新二维码"
|
||||
},
|
||||
"plugin.neteaselogin.refresh": {
|
||||
"en": "Refresh",
|
||||
"zh-CN": "刷新状态"
|
||||
},
|
||||
"plugin.neteaselogin.title": {
|
||||
"en": "Netease Login",
|
||||
"zh-CN": "网易云登录"
|
||||
},
|
||||
"plugin.qiege.admin": {
|
||||
"en": "Admin",
|
||||
"zh-CN": "管理员"
|
||||
@@ -440,6 +408,42 @@
|
||||
"en": "User",
|
||||
"zh-CN": "切自己"
|
||||
},
|
||||
"plugin.sourcelogin.current_user": {
|
||||
"en": "Current Status:",
|
||||
"zh-CN": "当前状态:"
|
||||
},
|
||||
"plugin.sourcelogin.current_user.loggedin": {
|
||||
"en": "Logged In",
|
||||
"zh-CN": "已登录"
|
||||
},
|
||||
"plugin.sourcelogin.current_user.notlogin": {
|
||||
"en": "Not Login",
|
||||
"zh-CN": "未登录"
|
||||
},
|
||||
"plugin.sourcelogin.description": {
|
||||
"en": "Netease User Login",
|
||||
"zh-CN": "来源登录"
|
||||
},
|
||||
"plugin.sourcelogin.logout": {
|
||||
"en": "Logout",
|
||||
"zh-CN": "登出"
|
||||
},
|
||||
"plugin.sourcelogin.qr.finish": {
|
||||
"en": "Finish Scan",
|
||||
"zh-CN": "完成扫描后按我"
|
||||
},
|
||||
"plugin.sourcelogin.qr.new": {
|
||||
"en": "Get a new qr code",
|
||||
"zh-CN": "获取新二维码"
|
||||
},
|
||||
"plugin.sourcelogin.refresh": {
|
||||
"en": "Refresh",
|
||||
"zh-CN": "刷新状态"
|
||||
},
|
||||
"plugin.sourcelogin.title": {
|
||||
"en": "Netease Login",
|
||||
"zh-CN": "来源登录"
|
||||
},
|
||||
"plugin.textinfo.checkbox": {
|
||||
"en": "Enable",
|
||||
"zh-CN": "开启"
|
||||
|
||||
6
go.mod
6
go.mod
@@ -8,13 +8,13 @@ replace (
|
||||
)
|
||||
|
||||
require (
|
||||
fyne.io/fyne/v2 v2.4.4
|
||||
fyne.io/fyne/v2 v2.4.5
|
||||
fyne.io/x/fyne v0.0.0-20240326131024-3ba9170cc3be
|
||||
github.com/AynaLivePlayer/liveroom-sdk v0.1.0
|
||||
github.com/AynaLivePlayer/miaosic v0.1.5
|
||||
github.com/antonfisher/nested-logrus-formatter v1.3.1
|
||||
github.com/aynakeya/go-mpv v0.0.6
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20221017161538-93cebf72946b
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240306074159-ea2d69986ecb
|
||||
github.com/go-resty/resty/v2 v2.7.0
|
||||
github.com/gorilla/websocket v1.5.0
|
||||
github.com/mattn/go-colorable v0.1.12
|
||||
@@ -47,7 +47,7 @@ require (
|
||||
github.com/fyne-io/glfw-js v0.0.0-20220120001248-ee7290d23504 // indirect
|
||||
github.com/fyne-io/image v0.0.0-20220602074514-4956b0afb3d2 // indirect
|
||||
github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect
|
||||
github.com/go-text/render v0.0.0-20230619120952-35bccb6164b8 // indirect
|
||||
github.com/go-text/render v0.1.0 // indirect
|
||||
github.com/go-text/typesetting v0.1.0 // indirect
|
||||
github.com/godbus/dbus/v5 v5.1.0 // indirect
|
||||
github.com/google/uuid v1.5.0 // indirect
|
||||
|
||||
@@ -9,6 +9,7 @@ import (
|
||||
"AynaLivePlayer/internal/source"
|
||||
"AynaLivePlayer/plugin/diange"
|
||||
"AynaLivePlayer/plugin/qiege"
|
||||
"AynaLivePlayer/plugin/sourcelogin"
|
||||
)
|
||||
|
||||
func Initialize() {
|
||||
@@ -18,7 +19,7 @@ func Initialize() {
|
||||
controller.Initialize()
|
||||
liveroom.Initialize()
|
||||
plugins.Initialize()
|
||||
plugins.LoadPlugins(diange.NewDiange(), qiege.NewQiege())
|
||||
plugins.LoadPlugins(diange.NewDiange(), qiege.NewQiege(), sourcelogin.NewSourceLogin())
|
||||
}
|
||||
|
||||
func Stop() {
|
||||
|
||||
Submodule pkg/miaosic updated: 7a863afe64...a743c5f97c
196
plugin/sourcelogin/sourcelogin.go
Normal file
196
plugin/sourcelogin/sourcelogin.go
Normal file
@@ -0,0 +1,196 @@
|
||||
package sourcelogin
|
||||
|
||||
import (
|
||||
"AynaLivePlayer/core/events"
|
||||
"AynaLivePlayer/global"
|
||||
"AynaLivePlayer/gui"
|
||||
"AynaLivePlayer/gui/component"
|
||||
"AynaLivePlayer/pkg/config"
|
||||
"AynaLivePlayer/pkg/i18n"
|
||||
"AynaLivePlayer/pkg/logger"
|
||||
"AynaLivePlayer/resource"
|
||||
"bytes"
|
||||
"fyne.io/fyne/v2"
|
||||
"fyne.io/fyne/v2/canvas"
|
||||
"fyne.io/fyne/v2/container"
|
||||
"fyne.io/fyne/v2/widget"
|
||||
"github.com/AynaLivePlayer/miaosic"
|
||||
"github.com/skip2/go-qrcode"
|
||||
)
|
||||
|
||||
const MODULE_PLGUIN_NETEASELOGIN = "plugin.neteaselogin"
|
||||
|
||||
type SourceLogin struct {
|
||||
SessionPath string `json:"session_path"`
|
||||
sessions map[string]string
|
||||
log logger.ILogger
|
||||
panel fyne.CanvasObject
|
||||
}
|
||||
|
||||
func (w *SourceLogin) OnLoad() {
|
||||
_ = config.LoadJson(w.SessionPath, &w.sessions)
|
||||
}
|
||||
|
||||
func (w *SourceLogin) OnSave() {
|
||||
_ = config.SaveJson(w.SessionPath, &w.sessions)
|
||||
}
|
||||
|
||||
func NewSourceLogin() *SourceLogin {
|
||||
return &SourceLogin{
|
||||
SessionPath: "config/source_session.json",
|
||||
log: global.Logger.WithPrefix("plugin.sourcelogin"),
|
||||
sessions: make(map[string]string),
|
||||
}
|
||||
}
|
||||
|
||||
func (w *SourceLogin) Name() string {
|
||||
return "SourceLogin"
|
||||
}
|
||||
|
||||
func (w *SourceLogin) Enable() error {
|
||||
config.LoadConfig(w)
|
||||
gui.AddConfigLayout(w)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (w *SourceLogin) Disable() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (w *SourceLogin) Title() string {
|
||||
return i18n.T("plugin.sourcelogin.title")
|
||||
}
|
||||
|
||||
func (w *SourceLogin) Description() string {
|
||||
return i18n.T("plugin.sourcelogin.description")
|
||||
}
|
||||
|
||||
func (w *SourceLogin) CreatePanel() fyne.CanvasObject {
|
||||
if w.panel != nil {
|
||||
return w.panel
|
||||
}
|
||||
currentUser := widget.NewLabel(i18n.T("plugin.sourcelogin.current_user.notlogin"))
|
||||
currentStatus := container.NewHBox(
|
||||
widget.NewLabel(i18n.T("plugin.sourcelogin.current_user")),
|
||||
currentUser)
|
||||
|
||||
providers := miaosic.ListAvailableProviders()
|
||||
loginableProviders := make([]string, 0)
|
||||
loginables := make(map[string]miaosic.MediaProvider)
|
||||
for _, pname := range providers {
|
||||
if p, ok := miaosic.GetProvider(pname); ok {
|
||||
pl, ok2 := p.(miaosic.Loginable)
|
||||
if ok2 {
|
||||
loginableProviders = append(loginableProviders, pname)
|
||||
loginables[pname] = p
|
||||
if session, ok3 := w.sessions[pname]; ok3 {
|
||||
err := pl.RestoreSession(session)
|
||||
if err != nil {
|
||||
w.log.Error("failed to restore session for ", pname)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
providerChoice := widget.NewSelect(loginableProviders, func(s string) {
|
||||
w.log.Info("switching provider to ", s)
|
||||
if s != "" {
|
||||
pvdr, _ := miaosic.GetProvider(s)
|
||||
provider := pvdr.(miaosic.Loginable)
|
||||
if provider.IsLogin() {
|
||||
currentUser.SetText(i18n.T("plugin.sourcelogin.current_user.loggedin"))
|
||||
} else {
|
||||
currentUser.SetText(i18n.T("plugin.sourcelogin.current_user.notlogin"))
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
sourcePanel := container.NewGridWithColumns(2,
|
||||
providerChoice, currentStatus)
|
||||
|
||||
logoutBtn := component.NewAsyncButton(
|
||||
i18n.T("plugin.sourcelogin.logout"),
|
||||
func() {
|
||||
err := loginables[providerChoice.Selected].(miaosic.Loginable).Logout()
|
||||
if err != nil {
|
||||
global.EventManager.CallA(events.ErrorUpdate,
|
||||
events.ErrorUpdateEvent{Error: err})
|
||||
return
|
||||
}
|
||||
currentUser.SetText(i18n.T("plugin.sourcelogin.current_user.notlogin"))
|
||||
w.sessions[providerChoice.Selected] = ""
|
||||
},
|
||||
)
|
||||
qrcodeImg := canvas.NewImageFromResource(resource.ImageEmptyQrCode)
|
||||
qrcodeImg.SetMinSize(fyne.NewSize(200, 200))
|
||||
qrcodeImg.FillMode = canvas.ImageFillContain
|
||||
var currentLoginSession *miaosic.QrLoginSession
|
||||
//var key string
|
||||
qrStatus := widget.NewLabel("AAAAAAAA")
|
||||
qrStatus.SetText("")
|
||||
newQrBtn := component.NewAsyncButton(
|
||||
i18n.T("plugin.sourcelogin.qr.new"),
|
||||
func() {
|
||||
var err error
|
||||
if providerChoice.Selected == "" {
|
||||
return
|
||||
}
|
||||
qrStatus.SetText("")
|
||||
w.log.Info("getting a new qr code for login")
|
||||
pvdr, _ := miaosic.GetProvider(providerChoice.Selected)
|
||||
provider := pvdr.(miaosic.Loginable)
|
||||
currentLoginSession, err = provider.QrLogin()
|
||||
if err != nil {
|
||||
global.EventManager.CallA(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,
|
||||
events.ErrorUpdateEvent{Error: err})
|
||||
return
|
||||
}
|
||||
//w.log.Debug("create img from raw data")
|
||||
pic := canvas.NewImageFromReader(bytes.NewReader(data), "qrcode")
|
||||
qrcodeImg.Resource = pic.Resource
|
||||
qrcodeImg.Refresh()
|
||||
},
|
||||
)
|
||||
finishQrBtn := component.NewAsyncButton(
|
||||
i18n.T("plugin.sourcelogin.qr.finish"),
|
||||
func() {
|
||||
if currentLoginSession == nil {
|
||||
return
|
||||
}
|
||||
currentProvider := providerChoice.Selected
|
||||
if currentProvider == "" {
|
||||
return
|
||||
}
|
||||
pvdr, _ := miaosic.GetProvider(currentProvider)
|
||||
provider := pvdr.(miaosic.Loginable)
|
||||
w.log.Info("checking qr status")
|
||||
result, err := provider.QrLoginVerify(currentLoginSession)
|
||||
if err != nil {
|
||||
global.EventManager.CallA(events.ErrorUpdate,
|
||||
events.ErrorUpdateEvent{Error: err})
|
||||
return
|
||||
}
|
||||
qrStatus.SetText(result.Message)
|
||||
if result.Success {
|
||||
currentLoginSession = nil
|
||||
qrcodeImg.Resource = resource.ImageEmptyQrCode
|
||||
qrcodeImg.Refresh()
|
||||
providerChoice.OnChanged(currentProvider)
|
||||
w.sessions[currentProvider] = provider.SaveSession()
|
||||
}
|
||||
},
|
||||
)
|
||||
controlBox := container.NewHBox(newQrBtn, finishQrBtn, logoutBtn)
|
||||
qrImagePanel := container.NewCenter(
|
||||
container.NewVBox(qrcodeImg, qrStatus),
|
||||
)
|
||||
w.panel = container.NewVBox(sourcePanel, controlBox, qrImagePanel)
|
||||
return w.panel
|
||||
}
|
||||
@@ -1,169 +0,0 @@
|
||||
package wylogin
|
||||
|
||||
import (
|
||||
"AynaLivePlayer/adapters/provider"
|
||||
"AynaLivePlayer/core/adapter"
|
||||
"AynaLivePlayer/gui"
|
||||
"AynaLivePlayer/gui/component"
|
||||
"AynaLivePlayer/pkg/config"
|
||||
"AynaLivePlayer/pkg/i18n"
|
||||
"AynaLivePlayer/resource"
|
||||
"bytes"
|
||||
"fyne.io/fyne/v2"
|
||||
"fyne.io/fyne/v2/canvas"
|
||||
"fyne.io/fyne/v2/container"
|
||||
"fyne.io/fyne/v2/widget"
|
||||
"github.com/skip2/go-qrcode"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
const MODULE_PLGUIN_NETEASELOGIN = "plugin.neteaselogin"
|
||||
|
||||
type WYLogin struct {
|
||||
config.BaseConfig
|
||||
MusicU string
|
||||
CSRF string
|
||||
panel fyne.CanvasObject
|
||||
cb adapter.IControlBridge
|
||||
log adapter.ILogger
|
||||
}
|
||||
|
||||
func NewWYLogin(cb adapter.IControlBridge) *WYLogin {
|
||||
return &WYLogin{
|
||||
MusicU: "MUSIC_U=;",
|
||||
CSRF: "__csrf=;",
|
||||
cb: cb,
|
||||
log: cb.Logger().WithModule(MODULE_PLGUIN_NETEASELOGIN),
|
||||
}
|
||||
}
|
||||
|
||||
func (w *WYLogin) Name() string {
|
||||
return "NeteaseLogin"
|
||||
}
|
||||
|
||||
func (w *WYLogin) Enable() error {
|
||||
config.LoadConfig(w)
|
||||
w.loadCookie()
|
||||
gui.AddConfigLayout(w)
|
||||
go func() {
|
||||
w.log.Info("updating netease status")
|
||||
provider.NeteaseAPI.UpdateStatus()
|
||||
w.log.Info("finish updating netease status")
|
||||
}()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (w *WYLogin) Disable() error {
|
||||
w.saveCookie()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (w *WYLogin) loadCookie() {
|
||||
provider.NeteaseAPI.ReqData.Cookies = (&http.Response{
|
||||
Header: map[string][]string{
|
||||
"Set-Cookie": []string{w.MusicU, w.CSRF},
|
||||
},
|
||||
}).Cookies()
|
||||
}
|
||||
|
||||
func (w *WYLogin) saveCookie() {
|
||||
for _, c := range provider.NeteaseAPI.ReqData.Cookies {
|
||||
if c.Name == "MUSIC_U" {
|
||||
w.MusicU = c.String()
|
||||
}
|
||||
if c.Name == "__csrf" {
|
||||
w.CSRF = c.String()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (w *WYLogin) Title() string {
|
||||
return i18n.T("plugin.neteaselogin.title")
|
||||
}
|
||||
|
||||
func (w *WYLogin) Description() string {
|
||||
return i18n.T("plugin.neteaselogin.description")
|
||||
}
|
||||
|
||||
func (w *WYLogin) CreatePanel() fyne.CanvasObject {
|
||||
if w.panel != nil {
|
||||
return w.panel
|
||||
}
|
||||
currentUser := widget.NewLabel(i18n.T("plugin.neteaselogin.current_user.notlogin"))
|
||||
currentStatus := container.NewHBox(
|
||||
widget.NewLabel(i18n.T("plugin.neteaselogin.current_user")),
|
||||
currentUser)
|
||||
|
||||
refreshBtn := component.NewAsyncButton(
|
||||
i18n.T("plugin.neteaselogin.refresh"),
|
||||
func() {
|
||||
provider.NeteaseAPI.UpdateStatus()
|
||||
if provider.NeteaseAPI.IsLogin() {
|
||||
currentUser.SetText(provider.NeteaseAPI.Nickname())
|
||||
} else {
|
||||
currentUser.SetText(i18n.T("plugin.neteaselogin.current_user.notlogin"))
|
||||
}
|
||||
|
||||
},
|
||||
)
|
||||
logoutBtn := component.NewAsyncButton(
|
||||
i18n.T("plugin.neteaselogin.logout"),
|
||||
func() {
|
||||
provider.NeteaseAPI.Logout()
|
||||
currentUser.SetText(i18n.T("plugin.neteaselogin.current_user.notlogin"))
|
||||
},
|
||||
)
|
||||
controlBtns := container.NewHBox(refreshBtn, logoutBtn)
|
||||
qrcodeImg := canvas.NewImageFromResource(resource.ImageEmpty)
|
||||
qrcodeImg.SetMinSize(fyne.NewSize(200, 200))
|
||||
qrcodeImg.FillMode = canvas.ImageFillContain
|
||||
var key string
|
||||
qrStatus := widget.NewLabel("AAAAAAAA")
|
||||
qrStatus.SetText("")
|
||||
newQrBtn := component.NewAsyncButton(
|
||||
i18n.T("plugin.neteaselogin.qr.new"),
|
||||
func() {
|
||||
qrStatus.SetText("")
|
||||
w.log.Info("getting a new qr code for login")
|
||||
key = provider.NeteaseAPI.GetQrLoginKey()
|
||||
if key == "" {
|
||||
w.log.Warn("fail to get qr code key")
|
||||
return
|
||||
}
|
||||
w.log.Debugf("trying encode url %s to qrcode", provider.NeteaseAPI.GetQrLoginUrl(key))
|
||||
data, err := qrcode.Encode(provider.NeteaseAPI.GetQrLoginUrl(key), qrcode.Medium, 256)
|
||||
if err != nil {
|
||||
w.log.Warnf("generate qr code failed: %s", err)
|
||||
return
|
||||
}
|
||||
w.log.Debug("create img from raw data")
|
||||
pic := canvas.NewImageFromReader(bytes.NewReader(data), "qrcode")
|
||||
qrcodeImg.Resource = pic.Resource
|
||||
qrcodeImg.Refresh()
|
||||
},
|
||||
)
|
||||
finishQrBtn := component.NewAsyncButton(
|
||||
i18n.T("plugin.neteaselogin.qr.finish"),
|
||||
func() {
|
||||
if key == "" {
|
||||
return
|
||||
}
|
||||
w.log.Info("checking qr status")
|
||||
ok, msg := provider.NeteaseAPI.CheckQrLogin(key)
|
||||
qrStatus.SetText(msg)
|
||||
if ok {
|
||||
key = ""
|
||||
qrcodeImg.Resource = resource.ImageEmpty
|
||||
qrcodeImg.Refresh()
|
||||
}
|
||||
},
|
||||
)
|
||||
loginPanel := container.NewCenter(
|
||||
container.NewVBox(
|
||||
qrcodeImg,
|
||||
container.NewHBox(newQrBtn, finishQrBtn, qrStatus),
|
||||
),
|
||||
)
|
||||
w.panel = container.NewVBox(controlBtns, currentStatus, loginPanel)
|
||||
return w.panel
|
||||
}
|
||||
@@ -6,6 +6,11 @@ var ImageEmpty = &fyne.StaticResource{
|
||||
StaticName: "flat-color-icons--audio-file.svg",
|
||||
StaticContent: []byte("<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 48 48\"><path fill=\"none\" d=\"M204 0h48v48h-48z\"/><path fill=\"#90caf9\" d=\"M244 45h-32V3h22l10 10z\"/><path fill=\"#e1f5fe\" d=\"M242.5 14H233V4.5z\"/><g fill=\"#1976d2\"><circle cx=\"227\" cy=\"30\" r=\"4\"/><path d=\"m234 21l-5-2v11h2v-7.1l3 1.1z\"/></g><path fill=\"#90caf9\" d=\"M40 45H8V3h22l10 10z\"/><path fill=\"#e1f5fe\" d=\"M38.5 14H29V4.5z\"/><g fill=\"#1976d2\"><circle cx=\"23\" cy=\"30\" r=\"4\"/><path d=\"m30 21l-5-2v11h2v-7.1l3 1.1z\"/></g></svg>"),
|
||||
}
|
||||
|
||||
var ImageEmptyQrCode = &fyne.StaticResource{
|
||||
StaticName: "flat-color-icons--qr-code.svg",
|
||||
StaticContent: []byte("<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"black\" d=\"M1 1h10v10H1zm2 2v6h6V3z\"/><path fill=\"black\" fill-rule=\"evenodd\" d=\"M5 5h2v2H5z\"/><path fill=\"black\" d=\"M13 1h10v10H13zm2 2v6h6V3z\"/><path fill=\"black\" fill-rule=\"evenodd\" d=\"M17 5h2v2h-2z\"/><path fill=\"black\" d=\"M1 13h10v10H1zm2 2v6h6v-6z\"/><path fill=\"black\" fill-rule=\"evenodd\" d=\"M5 17h2v2H5z\"/><path fill=\"black\" d=\"M23 19h-4v4h-6V13h1h-1v6h2v2h2v-6h-2v-2h-1h3v2h2v2h2v-4h2zm0 2v2h-2v-2z\"/></svg>"),
|
||||
}
|
||||
var ImageIcon = resImageIcon
|
||||
var FontMSYaHei = resFontMSYaHei
|
||||
var FontMSYaHeiBold = resFontMSYaHeiBold
|
||||
|
||||
Reference in New Issue
Block a user