Skip to content

Commit 19c6b6f

Browse files
feat(115_open): add offline download (#683)
1 parent eed3c05 commit 19c6b6f

File tree

10 files changed

+219
-2
lines changed

10 files changed

+219
-2
lines changed

drivers/115_open/driver.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,22 @@ func (d *Open115) Put(ctx context.Context, dstDir model.Obj, file model.FileStre
306306
return nil
307307
}
308308

309+
func (d *Open115) OfflineDownload(ctx context.Context, uris []string, dstDir model.Obj) ([]string, error) {
310+
return d.client.AddOfflineTaskURIs(ctx, uris, dstDir.GetID())
311+
}
312+
313+
func (d *Open115) DeleteOfflineTask(ctx context.Context, infoHash string, deleteFiles bool) error {
314+
return d.client.DeleteOfflineTask(ctx, infoHash, deleteFiles)
315+
}
316+
317+
func (d *Open115) OfflineList(ctx context.Context) (*sdk.OfflineTaskListResp, error) {
318+
resp, err := d.client.OfflineTaskList(ctx, 1)
319+
if err != nil {
320+
return nil, err
321+
}
322+
return resp, nil
323+
}
324+
309325
// func (d *Open115) GetArchiveMeta(ctx context.Context, obj model.Obj, args model.ArchiveArgs) (model.ArchiveMeta, error) {
310326
// // TODO get archive file meta-info, return errs.NotImplement to use an internal archive tool, optional
311327
// return nil, errs.NotImplement

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ require (
8989
)
9090

9191
require (
92-
github.com/OpenListTeam/115-sdk-go v0.2.0
92+
github.com/OpenListTeam/115-sdk-go v0.2.1
9393
github.com/STARRY-S/zip v0.2.1 // indirect
9494
github.com/aymerick/douceur v0.2.0 // indirect
9595
github.com/blevesearch/go-faiss v1.0.25 // indirect

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ github.com/Max-Sum/base32768 v0.0.0-20230304063302-18e6ce5945fd h1:nzE1YQBdx1bq9
3636
github.com/Max-Sum/base32768 v0.0.0-20230304063302-18e6ce5945fd/go.mod h1:C8yoIfvESpM3GD07OCHU7fqI7lhwyZ2Td1rbNbTAhnc=
3737
github.com/OpenListTeam/115-sdk-go v0.2.0 h1:qNEYpGQg++INLFXYzVW94uGFzCKAIoJJx19DBrsDvlU=
3838
github.com/OpenListTeam/115-sdk-go v0.2.0/go.mod h1:cfvitk2lwe6036iNi2h+iNxwxWDifKZsSvNtrur5BqU=
39+
github.com/OpenListTeam/115-sdk-go v0.2.1 h1:tzRUqdktS3h4o69+CXRDVwL0jYN7ccuX8TZWmLxkBGo=
40+
github.com/OpenListTeam/115-sdk-go v0.2.1/go.mod h1:cfvitk2lwe6036iNi2h+iNxwxWDifKZsSvNtrur5BqU=
3941
github.com/OpenListTeam/go-cache v0.1.0 h1:eV2+FCP+rt+E4OCJqLUW7wGccWZNJMV0NNkh+uChbAI=
4042
github.com/OpenListTeam/go-cache v0.1.0/go.mod h1:AHWjKhNK3LE4rorVdKyEALDHoeMnP8SjiNyfVlB+Pz4=
4143
github.com/OpenListTeam/gsync v0.1.0 h1:ywzGybOvA3lW8K1BUjKZ2IUlT2FSlzPO4DOazfYXjcs=

internal/conf/const.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ const (
6363
// 115
6464
Pan115TempDir = "115_temp_dir"
6565

66+
// 115_open
67+
Pan115OpenTempDir = "115_open_temp_dir"
68+
6669
// pikpak
6770
PikPakTempDir = "pikpak_temp_dir"
6871

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
package _115_open
2+
3+
import (
4+
"context"
5+
"fmt"
6+
_115_open "github.com/OpenListTeam/OpenList/v4/drivers/115_open"
7+
"github.com/OpenListTeam/OpenList/v4/internal/conf"
8+
"github.com/OpenListTeam/OpenList/v4/internal/setting"
9+
10+
"github.com/OpenListTeam/OpenList/v4/internal/errs"
11+
"github.com/OpenListTeam/OpenList/v4/internal/model"
12+
"github.com/OpenListTeam/OpenList/v4/internal/offline_download/tool"
13+
"github.com/OpenListTeam/OpenList/v4/internal/op"
14+
)
15+
16+
type Open115 struct {
17+
}
18+
19+
func (o *Open115) Name() string {
20+
return "115 Open"
21+
}
22+
23+
func (o *Open115) Items() []model.SettingItem {
24+
return nil
25+
}
26+
27+
func (o *Open115) Run(task *tool.DownloadTask) error {
28+
return errs.NotSupport
29+
}
30+
31+
func (o *Open115) Init() (string, error) {
32+
return "ok", nil
33+
}
34+
35+
func (o *Open115) IsReady() bool {
36+
tempDir := setting.GetStr(conf.Pan115OpenTempDir)
37+
if tempDir == "" {
38+
return false
39+
}
40+
storage, _, err := op.GetStorageAndActualPath(tempDir)
41+
if err != nil {
42+
return false
43+
}
44+
if _, ok := storage.(*_115_open.Open115); !ok {
45+
return false
46+
}
47+
return true
48+
}
49+
50+
func (o *Open115) AddURL(args *tool.AddUrlArgs) (string, error) {
51+
storage, actualPath, err := op.GetStorageAndActualPath(args.TempDir)
52+
if err != nil {
53+
return "", err
54+
}
55+
driver115Open, ok := storage.(*_115_open.Open115)
56+
if !ok {
57+
return "", fmt.Errorf("unsupported storage driver for offline download, only 115 Cloud is supported")
58+
}
59+
60+
ctx := context.Background()
61+
62+
if err := op.MakeDir(ctx, storage, actualPath); err != nil {
63+
return "", err
64+
}
65+
66+
parentDir, err := op.GetUnwrap(ctx, storage, actualPath)
67+
if err != nil {
68+
return "", err
69+
}
70+
71+
hashs, err := driver115Open.OfflineDownload(ctx, []string{args.Url}, parentDir)
72+
if err != nil || len(hashs) < 1 {
73+
return "", fmt.Errorf("failed to add offline download task: %w", err)
74+
}
75+
76+
return hashs[0], nil
77+
}
78+
79+
func (o *Open115) Remove(task *tool.DownloadTask) error {
80+
storage, _, err := op.GetStorageAndActualPath(task.TempDir)
81+
if err != nil {
82+
return err
83+
}
84+
driver115Open, ok := storage.(*_115_open.Open115)
85+
if !ok {
86+
return fmt.Errorf("unsupported storage driver for offline download, only 115 Open is supported")
87+
}
88+
89+
ctx := context.Background()
90+
if err := driver115Open.DeleteOfflineTask(ctx, task.GID, false); err != nil {
91+
return err
92+
}
93+
return nil
94+
}
95+
96+
func (o *Open115) Status(task *tool.DownloadTask) (*tool.Status, error) {
97+
storage, _, err := op.GetStorageAndActualPath(task.TempDir)
98+
if err != nil {
99+
return nil, err
100+
}
101+
driver115Open, ok := storage.(*_115_open.Open115)
102+
if !ok {
103+
return nil, fmt.Errorf("unsupported storage driver for offline download, only 115 Open is supported")
104+
}
105+
106+
tasks, err := driver115Open.OfflineList(context.Background())
107+
if err != nil {
108+
return nil, err
109+
}
110+
111+
s := &tool.Status{
112+
Progress: 0,
113+
NewGID: "",
114+
Completed: false,
115+
Status: "the task has been deleted",
116+
Err: nil,
117+
}
118+
119+
for _, t := range tasks.Tasks {
120+
if t.InfoHash == task.GID {
121+
s.Progress = float64(t.PercentDone)
122+
s.Status = t.GetStatus()
123+
s.Completed = t.IsDone()
124+
s.TotalBytes = t.Size
125+
if t.IsFailed() {
126+
s.Err = fmt.Errorf(t.GetStatus())
127+
}
128+
return s, nil
129+
}
130+
}
131+
s.Err = fmt.Errorf("the task has been deleted")
132+
return nil, nil
133+
}
134+
135+
var _ tool.Tool = (*Open115)(nil)
136+
137+
func init() {
138+
tool.Tools.Add(&Open115{})
139+
}

internal/offline_download/all.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package offline_download
22

33
import (
44
_ "github.com/OpenListTeam/OpenList/v4/internal/offline_download/115"
5+
_ "github.com/OpenListTeam/OpenList/v4/internal/offline_download/115_open"
56
_ "github.com/OpenListTeam/OpenList/v4/internal/offline_download/aria2"
67
_ "github.com/OpenListTeam/OpenList/v4/internal/offline_download/http"
78
_ "github.com/OpenListTeam/OpenList/v4/internal/offline_download/pikpak"

internal/offline_download/tool/add.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package tool
22

33
import (
44
"context"
5+
_115_open "github.com/OpenListTeam/OpenList/v4/drivers/115_open"
56

67
"net/url"
78
stdpath "path"
@@ -94,6 +95,12 @@ func AddURL(ctx context.Context, args *AddURLArgs) (task.TaskExtensionInfo, erro
9495
} else {
9596
tempDir = filepath.Join(setting.GetStr(conf.Pan115TempDir), uid)
9697
}
98+
case "115 Open":
99+
if _, ok := storage.(*_115_open.Open115); ok {
100+
tempDir = args.DstDirPath
101+
} else {
102+
tempDir = filepath.Join(setting.GetStr(conf.Pan115OpenTempDir), uid)
103+
}
97104
case "PikPak":
98105
if _, ok := storage.(*pikpak.PikPak); ok {
99106
tempDir = args.DstDirPath

internal/offline_download/tool/download.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@ outer:
103103
}
104104
return nil
105105
}
106+
if t.tool.Name() == "115 Open" {
107+
return nil
108+
}
106109
t.Status = "offline download completed, maybe transferring"
107110
// hack for qBittorrent
108111
if t.tool.Name() == "qBittorrent" {
@@ -166,7 +169,7 @@ func (t *DownloadTask) Update() (bool, error) {
166169

167170
func (t *DownloadTask) Transfer() error {
168171
toolName := t.tool.Name()
169-
if toolName == "115 Cloud" || toolName == "PikPak" || toolName == "Thunder" || toolName == "ThunderBrowser" {
172+
if toolName == "115 Cloud" || toolName == "115 Open" || toolName == "PikPak" || toolName == "Thunder" || toolName == "ThunderBrowser" {
170173
// 如果不是直接下载到目标路径,则进行转存
171174
if t.TempDir != t.DstDirPath {
172175
return transferObj(t.Ctx(), t.TempDir, t.DstDirPath, t.DeletePolicy)

server/handles/offline_download.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package handles
22

33
import (
44
_115 "github.com/OpenListTeam/OpenList/v4/drivers/115"
5+
_115_open "github.com/OpenListTeam/OpenList/v4/drivers/115_open"
56
"github.com/OpenListTeam/OpenList/v4/drivers/pikpak"
67
"github.com/OpenListTeam/OpenList/v4/drivers/thunder"
78
"github.com/OpenListTeam/OpenList/v4/drivers/thunder_browser"
@@ -152,6 +153,50 @@ func Set115(c *gin.Context) {
152153
common.SuccessResp(c, "ok")
153154
}
154155

156+
type Set115OpenReq struct {
157+
TempDir string `json:"temp_dir" form:"temp_dir"`
158+
}
159+
160+
func Set115Open(c *gin.Context) {
161+
var req Set115OpenReq
162+
if err := c.ShouldBind(&req); err != nil {
163+
common.ErrorResp(c, err, 400)
164+
return
165+
}
166+
if req.TempDir != "" {
167+
storage, _, err := op.GetStorageAndActualPath(req.TempDir)
168+
if err != nil {
169+
common.ErrorStrResp(c, "storage does not exists", 400)
170+
return
171+
}
172+
if storage.Config().CheckStatus && storage.GetStorage().Status != op.WORK {
173+
common.ErrorStrResp(c, "storage not init: "+storage.GetStorage().Status, 400)
174+
return
175+
}
176+
if _, ok := storage.(*_115_open.Open115); !ok {
177+
common.ErrorStrResp(c, "unsupported storage driver for offline download, only 115 Open is supported", 400)
178+
return
179+
}
180+
}
181+
items := []model.SettingItem{
182+
{Key: conf.Pan115OpenTempDir, Value: req.TempDir, Type: conf.TypeString, Group: model.OFFLINE_DOWNLOAD, Flag: model.PRIVATE},
183+
}
184+
if err := op.SaveSettingItems(items); err != nil {
185+
common.ErrorResp(c, err, 500)
186+
return
187+
}
188+
_tool, err := tool.Tools.Get("115 Open")
189+
if err != nil {
190+
common.ErrorResp(c, err, 500)
191+
return
192+
}
193+
if _, err := _tool.Init(); err != nil {
194+
common.ErrorResp(c, err, 500)
195+
return
196+
}
197+
common.SuccessResp(c, "ok")
198+
}
199+
155200
type SetPikPakReq struct {
156201
TempDir string `json:"temp_dir" form:"temp_dir"`
157202
}

server/router.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ func admin(g *gin.RouterGroup) {
145145
setting.POST("/set_qbit", handles.SetQbittorrent)
146146
setting.POST("/set_transmission", handles.SetTransmission)
147147
setting.POST("/set_115", handles.Set115)
148+
setting.POST("/set_115_open", handles.Set115Open)
148149
setting.POST("/set_pikpak", handles.SetPikPak)
149150
setting.POST("/set_thunder", handles.SetThunder)
150151
setting.POST("/set_thunder_browser", handles.SetThunderBrowser)

0 commit comments

Comments
 (0)