Skip to content

Commit 76ae0d2

Browse files
KirCutexrgzs
authored andcommitted
feat(style): add driver icons and disk usage (OpenListTeam#1274)
* feat(style): add driver icons and disk usage * feat(driver): add disk usage for 115_open, 123_open, aliyundrive_open and baidu_netdisk * feat(driver): add disk usage for crypt, sftp and smb * chore: clean unused variable * feat(driver): add disk usage for cloudreve_v4 Signed-off-by: MadDogOwner <xiaoran@xrgzs.top> * fix(local): disk label check when getting disk usage * feat(style): return details when accessing the manage page --------- Signed-off-by: MadDogOwner <xiaoran@xrgzs.top> Co-authored-by: MadDogOwner <xiaoran@xrgzs.top>
1 parent 6932b9f commit 76ae0d2

File tree

23 files changed

+407
-87
lines changed

23 files changed

+407
-87
lines changed

drivers/115_open/driver.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,27 @@ func (d *Open115) OfflineList(ctx context.Context) (*sdk.OfflineTaskListResp, er
337337
return resp, nil
338338
}
339339

340+
func (d *Open115) GetDetails(ctx context.Context) (*model.StorageDetails, error) {
341+
userInfo, err := d.client.UserInfo(ctx)
342+
if err != nil {
343+
return nil, err
344+
}
345+
total, err := userInfo.RtSpaceInfo.AllTotal.Size.Int64()
346+
if err != nil {
347+
return nil, err
348+
}
349+
free, err := userInfo.RtSpaceInfo.AllRemain.Size.Int64()
350+
if err != nil {
351+
return nil, err
352+
}
353+
return &model.StorageDetails{
354+
DiskUsage: model.DiskUsage{
355+
TotalSpace: uint64(total),
356+
FreeSpace: uint64(free),
357+
},
358+
}, nil
359+
}
360+
340361
// func (d *Open115) GetArchiveMeta(ctx context.Context, obj model.Obj, args model.ArchiveArgs) (model.ArchiveMeta, error) {
341362
// // TODO get archive file meta-info, return errs.NotImplement to use an internal archive tool, optional
342363
// return nil, errs.NotImplement

drivers/123_open/driver.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,4 +294,19 @@ func (d *Open123) UploadSliceComplete(c context.Context, su *tables.SliceUpload)
294294
return d.sliceUpComplete(su.PreupID)
295295
}
296296

297+
func (d *Open123) GetDetails(ctx context.Context) (*model.StorageDetails, error) {
298+
userInfo, err := d.getUserInfo()
299+
if err != nil {
300+
return nil, err
301+
}
302+
total := userInfo.Data.SpacePermanent + userInfo.Data.SpaceTemp
303+
free := total - userInfo.Data.SpaceUsed
304+
return &model.StorageDetails{
305+
DiskUsage: model.DiskUsage{
306+
TotalSpace: total,
307+
FreeSpace: free,
308+
},
309+
}, nil
310+
}
311+
297312
var _ driver.Driver = (*Open123)(nil)

drivers/aliyundrive_open/driver.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,21 @@ func (d *AliyundriveOpen) Other(ctx context.Context, args model.OtherArgs) (inte
291291
return resp, nil
292292
}
293293

294+
func (d *AliyundriveOpen) GetDetails(ctx context.Context) (*model.StorageDetails, error) {
295+
res, err := d.request(ctx, limiterOther, "/adrive/v1.0/user/getSpaceInfo", http.MethodPost, nil)
296+
if err != nil {
297+
return nil, err
298+
}
299+
total := utils.Json.Get(res, "personal_space_info", "total_size").ToUint64()
300+
used := utils.Json.Get(res, "personal_space_info", "used_size").ToUint64()
301+
return &model.StorageDetails{
302+
DiskUsage: model.DiskUsage{
303+
TotalSpace: total,
304+
FreeSpace: total - used,
305+
},
306+
}, nil
307+
}
308+
294309
var _ driver.Driver = (*AliyundriveOpen)(nil)
295310
var _ driver.MkdirResult = (*AliyundriveOpen)(nil)
296311
var _ driver.MoveResult = (*AliyundriveOpen)(nil)

drivers/baidu_netdisk/util.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,18 @@ func (d *BaiduNetdisk) getSliceSize(filesize int64) int64 {
428428
return maxSliceSize
429429
}
430430

431+
func (d *BaiduNetdisk) quota() (*model.DiskUsage, error) {
432+
var resp QuotaResp
433+
_, err := d.request("https://pan.baidu.com/api/quota", http.MethodGet, nil, &resp)
434+
if err != nil {
435+
return nil, err
436+
}
437+
return &model.DiskUsage{
438+
TotalSpace: resp.Total,
439+
FreeSpace: resp.Total - resp.Used,
440+
}, nil
441+
}
442+
431443
// func encodeURIComponent(str string) string {
432444
// r := url.QueryEscape(str)
433445
// r = strings.ReplaceAll(r, "+", "%20")

drivers/cloudreve_v4/driver.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,21 @@ func (d *CloudreveV4) ArchiveDecompress(ctx context.Context, srcObj, dstDir mode
339339
return nil, errs.NotImplement
340340
}
341341

342+
func (d *CloudreveV4) GetDetails(ctx context.Context) (*model.StorageDetails, error) {
343+
// TODO return storage details (total space, free space, etc.)
344+
var r CapacityResp
345+
err := d.request(http.MethodGet, "/user/capacity", nil, &r)
346+
if err != nil {
347+
return nil, err
348+
}
349+
return &model.StorageDetails{
350+
DiskUsage: model.DiskUsage{
351+
TotalSpace: r.Total,
352+
FreeSpace: r.Total - r.Used,
353+
},
354+
}, nil
355+
}
356+
342357
//func (d *CloudreveV4) Other(ctx context.Context, args model.OtherArgs) (interface{}, error) {
343358
// return nil, errs.NotSupport
344359
//}

drivers/cloudreve_v4/types.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,3 +204,9 @@ type FolderSummaryResp struct {
204204
CalculatedAt time.Time `json:"calculated_at"`
205205
} `json:"folder_summary"`
206206
}
207+
208+
type CapacityResp struct {
209+
Total uint64 `json:"total"`
210+
Used uint64 `json:"used"`
211+
// StoragePackTotal uint64 `json:"storage_pack_total"`
212+
}

drivers/crypt/driver.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,20 @@ func (d *Crypt) Put(ctx context.Context, dstDir model.Obj, streamer model.FileSt
411411
return nil
412412
}
413413

414+
func (d *Crypt) GetDetails(ctx context.Context) (*model.StorageDetails, error) {
415+
wd, ok := d.remoteStorage.(driver.WithDetails)
416+
if !ok {
417+
return nil, errs.NotImplement
418+
}
419+
remoteDetails, err := wd.GetDetails(ctx)
420+
if err != nil {
421+
return nil, err
422+
}
423+
return &model.StorageDetails{
424+
DiskUsage: remoteDetails.DiskUsage,
425+
}, nil
426+
}
427+
414428
//func (d *Safe) Other(ctx context.Context, args model.OtherArgs) (interface{}, error) {
415429
// return nil, errs.NotSupport
416430
//}

drivers/local/driver.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,5 +443,14 @@ func (d *Local) UploadSliceComplete(ctx context.Context, su *tables.SliceUpload)
443443
}
444444
return os.Rename(su.TmpFile, filepath.Join(su.DstPath, f.Name()))
445445
}
446+
func (d *Local) GetDetails(ctx context.Context) (*model.StorageDetails, error) {
447+
du, err := getDiskUsage(d.RootFolderPath)
448+
if err != nil {
449+
return nil, err
450+
}
451+
return &model.StorageDetails{
452+
DiskUsage: du,
453+
}, nil
454+
}
446455

447456
var _ driver.Driver = (*Local)(nil)

drivers/local/util_unix.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,25 @@ package local
55
import (
66
"io/fs"
77
"strings"
8+
"syscall"
9+
10+
"github.com/OpenListTeam/OpenList/v4/internal/model"
811
)
912

1013
func isHidden(f fs.FileInfo, _ string) bool {
1114
return strings.HasPrefix(f.Name(), ".")
1215
}
16+
17+
func getDiskUsage(path string) (model.DiskUsage, error) {
18+
var stat syscall.Statfs_t
19+
err := syscall.Statfs(path, &stat)
20+
if err != nil {
21+
return model.DiskUsage{}, err
22+
}
23+
total := stat.Blocks * uint64(stat.Bsize)
24+
free := stat.Bfree * uint64(stat.Bsize)
25+
return model.DiskUsage{
26+
TotalSpace: total,
27+
FreeSpace: free,
28+
}, nil
29+
}

drivers/local/util_windows.go

Lines changed: 51 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,51 @@
1-
//go:build windows
2-
3-
package local
4-
5-
import (
6-
"io/fs"
7-
"path/filepath"
8-
"syscall"
9-
)
10-
11-
func isHidden(f fs.FileInfo, fullPath string) bool {
12-
filePath := filepath.Join(fullPath, f.Name())
13-
namePtr, err := syscall.UTF16PtrFromString(filePath)
14-
if err != nil {
15-
return false
16-
}
17-
attrs, err := syscall.GetFileAttributes(namePtr)
18-
if err != nil {
19-
return false
20-
}
21-
return attrs&syscall.FILE_ATTRIBUTE_HIDDEN != 0
22-
}
1+
//go:build windows
2+
3+
package local
4+
5+
import (
6+
"errors"
7+
"io/fs"
8+
"path/filepath"
9+
"syscall"
10+
11+
"github.com/OpenListTeam/OpenList/v4/internal/model"
12+
"golang.org/x/sys/windows"
13+
)
14+
15+
func isHidden(f fs.FileInfo, fullPath string) bool {
16+
filePath := filepath.Join(fullPath, f.Name())
17+
namePtr, err := syscall.UTF16PtrFromString(filePath)
18+
if err != nil {
19+
return false
20+
}
21+
attrs, err := syscall.GetFileAttributes(namePtr)
22+
if err != nil {
23+
return false
24+
}
25+
return attrs&syscall.FILE_ATTRIBUTE_HIDDEN != 0
26+
}
27+
28+
func getDiskUsage(path string) (model.DiskUsage, error) {
29+
abs, err := filepath.Abs(path)
30+
if err != nil {
31+
return model.DiskUsage{}, err
32+
}
33+
root := filepath.VolumeName(abs)
34+
if len(root) != 2 || root[1] != ':' {
35+
return model.DiskUsage{}, errors.New("cannot get disk label")
36+
}
37+
var freeBytes, totalBytes, totalFreeBytes uint64
38+
err = windows.GetDiskFreeSpaceEx(
39+
windows.StringToUTF16Ptr(root),
40+
&freeBytes,
41+
&totalBytes,
42+
&totalFreeBytes,
43+
)
44+
if err != nil {
45+
return model.DiskUsage{}, err
46+
}
47+
return model.DiskUsage{
48+
TotalSpace: totalBytes,
49+
FreeSpace: freeBytes,
50+
}, nil
51+
}

0 commit comments

Comments
 (0)