fix source session

This commit is contained in:
aynakeya
2024-04-20 17:31:09 -07:00
parent e01d067cbc
commit e2fa2bdb8e
7 changed files with 243 additions and 206 deletions

View 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
}

View File

@@ -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
}