This update introduces the ability to mount 115 share links. Currently, only listing and downloading are supported. Note that login and share link are required for this feature to work. Close #5384
112 lines
2.2 KiB
Go
112 lines
2.2 KiB
Go
package _115_share
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"time"
|
|
|
|
driver115 "github.com/SheltonZhu/115driver/pkg/driver"
|
|
"github.com/alist-org/alist/v3/internal/model"
|
|
"github.com/alist-org/alist/v3/pkg/utils"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
var _ model.Obj = (*FileObj)(nil)
|
|
|
|
type FileObj struct {
|
|
Size int64
|
|
Sha1 string
|
|
Utm time.Time
|
|
FileName string
|
|
isDir bool
|
|
FileID string
|
|
}
|
|
|
|
func (f *FileObj) CreateTime() time.Time {
|
|
return f.Utm
|
|
}
|
|
|
|
func (f *FileObj) GetHash() utils.HashInfo {
|
|
return utils.NewHashInfo(utils.SHA1, f.Sha1)
|
|
}
|
|
|
|
func (f *FileObj) GetSize() int64 {
|
|
return f.Size
|
|
}
|
|
|
|
func (f *FileObj) GetName() string {
|
|
return f.FileName
|
|
}
|
|
|
|
func (f *FileObj) ModTime() time.Time {
|
|
return f.Utm
|
|
}
|
|
|
|
func (f *FileObj) IsDir() bool {
|
|
return f.isDir
|
|
}
|
|
|
|
func (f *FileObj) GetID() string {
|
|
return f.FileID
|
|
}
|
|
|
|
func (f *FileObj) GetPath() string {
|
|
return ""
|
|
}
|
|
|
|
func transFunc(sf driver115.ShareFile) (model.Obj, error) {
|
|
timeInt, err := strconv.ParseInt(sf.UpdateTime, 10, 64)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var (
|
|
utm = time.Unix(timeInt, 0)
|
|
isDir = (sf.IsFile == 0)
|
|
fileID = string(sf.FileID)
|
|
)
|
|
if isDir {
|
|
fileID = string(sf.CategoryID)
|
|
}
|
|
return &FileObj{
|
|
Size: int64(sf.Size),
|
|
Sha1: sf.Sha1,
|
|
Utm: utm,
|
|
FileName: string(sf.FileName),
|
|
isDir: isDir,
|
|
FileID: fileID,
|
|
}, nil
|
|
}
|
|
|
|
var UserAgent = driver115.UA115Browser
|
|
|
|
func (d *Pan115Share) login() error {
|
|
var err error
|
|
opts := []driver115.Option{
|
|
driver115.UA(UserAgent),
|
|
}
|
|
d.client = driver115.New(opts...)
|
|
if _, err := d.client.GetShareSnap(d.ShareCode, d.ReceiveCode, ""); err != nil {
|
|
return errors.Wrap(err, "failed to get share snap")
|
|
}
|
|
cr := &driver115.Credential{}
|
|
if d.QRCodeToken != "" {
|
|
s := &driver115.QRCodeSession{
|
|
UID: d.QRCodeToken,
|
|
}
|
|
if cr, err = d.client.QRCodeLogin(s); err != nil {
|
|
return errors.Wrap(err, "failed to login by qrcode")
|
|
}
|
|
d.Cookie = fmt.Sprintf("UID=%s;CID=%s;SEID=%s", cr.UID, cr.CID, cr.SEID)
|
|
d.QRCodeToken = ""
|
|
} else if d.Cookie != "" {
|
|
if err = cr.FromCookie(d.Cookie); err != nil {
|
|
return errors.Wrap(err, "failed to login by cookies")
|
|
}
|
|
d.client.ImportCredential(cr)
|
|
} else {
|
|
return errors.New("missing cookie or qrcode account")
|
|
}
|
|
|
|
return d.client.LoginCheck()
|
|
}
|