Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/drivers/lenovonas_share/driver.go
1987 views
1
package LenovoNasShare
2
3
import (
4
"context"
5
"net/http"
6
"time"
7
8
"github.com/go-resty/resty/v2"
9
10
"github.com/alist-org/alist/v3/internal/driver"
11
"github.com/alist-org/alist/v3/internal/errs"
12
"github.com/alist-org/alist/v3/internal/model"
13
"github.com/alist-org/alist/v3/pkg/utils"
14
)
15
16
type LenovoNasShare struct {
17
model.Storage
18
Addition
19
stoken string
20
expireAt int64
21
}
22
23
func (d *LenovoNasShare) Config() driver.Config {
24
return config
25
}
26
27
func (d *LenovoNasShare) GetAddition() driver.Additional {
28
return &d.Addition
29
}
30
31
func (d *LenovoNasShare) Init(ctx context.Context) error {
32
if err := d.getStoken(); err != nil {
33
return err
34
}
35
return nil
36
}
37
38
func (d *LenovoNasShare) Drop(ctx context.Context) error {
39
return nil
40
}
41
42
func (d *LenovoNasShare) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([]model.Obj, error) {
43
d.checkStoken() // 检查stoken是否过期
44
files := make([]File, 0)
45
46
var resp Files
47
query := map[string]string{
48
"code": d.ShareId,
49
"num": "5000",
50
"stoken": d.stoken,
51
"path": dir.GetPath(),
52
}
53
_, err := d.request(d.Host+"/oneproxy/api/share/v1/files", http.MethodGet, func(req *resty.Request) {
54
req.SetQueryParams(query)
55
}, &resp)
56
if err != nil {
57
return nil, err
58
}
59
files = append(files, resp.Data.List...)
60
61
return utils.SliceConvert(files, func(src File) (model.Obj, error) {
62
return src, nil
63
})
64
}
65
66
func (d *LenovoNasShare) checkStoken() { // 检查stoken是否过期
67
if d.expireAt < time.Now().Unix() {
68
d.getStoken()
69
}
70
}
71
72
func (d *LenovoNasShare) getStoken() error { // 获取stoken
73
if d.Host == "" {
74
d.Host = "https://siot-share.lenovo.com.cn"
75
}
76
query := map[string]string{
77
"code": d.ShareId,
78
"password": d.SharePwd,
79
}
80
resp, err := d.request(d.Host+"/oneproxy/api/share/v1/access", http.MethodGet, func(req *resty.Request) {
81
req.SetQueryParams(query)
82
}, nil)
83
if err != nil {
84
return err
85
}
86
d.stoken = utils.Json.Get(resp, "data", "stoken").ToString()
87
d.expireAt = utils.Json.Get(resp, "data", "expires_in").ToInt64() + time.Now().Unix() - 60
88
return nil
89
}
90
91
func (d *LenovoNasShare) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) {
92
d.checkStoken() // 检查stoken是否过期
93
query := map[string]string{
94
"code": d.ShareId,
95
"stoken": d.stoken,
96
"path": file.GetPath(),
97
}
98
resp, err := d.request(d.Host+"/oneproxy/api/share/v1/file/link", http.MethodGet, func(req *resty.Request) {
99
req.SetQueryParams(query)
100
}, nil)
101
if err != nil {
102
return nil, err
103
}
104
downloadUrl := d.Host + "/oneproxy/api/share/v1/file/download?code=" + d.ShareId + "&dtoken=" + utils.Json.Get(resp, "data", "param", "dtoken").ToString()
105
106
link := model.Link{
107
URL: downloadUrl,
108
Header: http.Header{
109
"Referer": []string{"https://siot-share.lenovo.com.cn"},
110
},
111
}
112
return &link, nil
113
}
114
115
func (d *LenovoNasShare) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) (model.Obj, error) {
116
return nil, errs.NotImplement
117
}
118
119
func (d *LenovoNasShare) Move(ctx context.Context, srcObj, dstDir model.Obj) (model.Obj, error) {
120
return nil, errs.NotImplement
121
}
122
123
func (d *LenovoNasShare) Rename(ctx context.Context, srcObj model.Obj, newName string) (model.Obj, error) {
124
return nil, errs.NotImplement
125
}
126
127
func (d *LenovoNasShare) Copy(ctx context.Context, srcObj, dstDir model.Obj) (model.Obj, error) {
128
return nil, errs.NotImplement
129
}
130
131
func (d *LenovoNasShare) Remove(ctx context.Context, obj model.Obj) error {
132
return errs.NotImplement
133
}
134
135
func (d *LenovoNasShare) Put(ctx context.Context, dstDir model.Obj, stream model.FileStreamer, up driver.UpdateProgress) (model.Obj, error) {
136
return nil, errs.NotImplement
137
}
138
139
var _ driver.Driver = (*LenovoNasShare)(nil)
140
141