Skip to content

Commit 25f38df

Browse files
fix(strm): non-specified type generates strm (#1585)
* fix(strm): non-specified type generates strm * fix(strm): only insert to strmTrie if SaveStrmToLocal is enabled * fix(strm): update suffix handling in convert2strmObjs function * fix(strm): refactor generateStrm to use range reader --------- Co-authored-by: j2rong4cn <j2rong@qq.com>
1 parent a1f1f98 commit 25f38df

File tree

3 files changed

+72
-60
lines changed

3 files changed

+72
-60
lines changed

drivers/strm/driver.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,12 @@ func (d *Strm) Init(ctx context.Context) error {
5252
}
5353
k, v := getPair(path)
5454
d.pathMap[k] = append(d.pathMap[k], v)
55-
err := InsertStrm(utils.FixAndCleanPath(strings.TrimSpace(path)), d)
56-
if err != nil {
57-
log.Errorf("insert strmTrie error: %v", err)
58-
continue
55+
if d.SaveStrmToLocal {
56+
err := InsertStrm(utils.FixAndCleanPath(strings.TrimSpace(path)), d)
57+
if err != nil {
58+
log.Errorf("insert strmTrie error: %v", err)
59+
continue
60+
}
5961
}
6062
}
6163
if len(d.pathMap) == 1 {

drivers/strm/hook.go

Lines changed: 39 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ package strm
33
import (
44
"context"
55
"errors"
6-
"io"
76
"os"
87
stdpath "path"
98
"strings"
109

1110
"github.com/OpenListTeam/OpenList/v4/internal/model"
1211
"github.com/OpenListTeam/OpenList/v4/internal/op"
1312
"github.com/OpenListTeam/OpenList/v4/internal/stream"
13+
"github.com/OpenListTeam/OpenList/v4/pkg/http_range"
1414
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
1515
log "github.com/sirupsen/logrus"
1616
"github.com/tchap/go-patricia/v2/patricia"
@@ -38,10 +38,7 @@ func UpdateLocalStrm(ctx context.Context, path string, objs []model.Obj) {
3838
return nil
3939
}
4040
for _, strmDriver := range strmDrivers {
41-
strmObjs, _ := utils.SliceConvert(objs, func(obj model.Obj) (model.Obj, error) {
42-
ret := strmDriver.convert2strmObj(ctx, path, obj)
43-
return &ret, nil
44-
})
41+
strmObjs := strmDriver.convert2strmObjs(ctx, path, objs)
4542
updateLocal(strmDriver, stdpath.Join(stdpath.Base(needPath), restPath), strmObjs)
4643
}
4744
return nil
@@ -92,29 +89,43 @@ func RemoveStrm(dstPath string, d *Strm) {
9289
}
9390

9491
func generateStrm(ctx context.Context, driver *Strm, obj model.Obj, localPath string) {
95-
link, err := driver.Link(ctx, obj, model.LinkArgs{})
96-
if err != nil {
97-
log.Warnf("failed to generate strm of obj %s: failed to link: %v", localPath, err)
98-
return
99-
}
100-
seekableStream, err := stream.NewSeekableStream(&stream.FileStream{
101-
Obj: obj,
102-
Ctx: ctx,
103-
}, link)
104-
if err != nil {
105-
_ = link.Close()
106-
log.Warnf("failed to generate strm of obj %s: failed to get seekable stream: %v", localPath, err)
107-
return
108-
}
109-
defer seekableStream.Close()
110-
file, err := utils.CreateNestedFile(localPath)
111-
if err != nil {
112-
log.Warnf("failed to generate strm of obj %s: failed to create local file: %v", localPath, err)
113-
return
114-
}
115-
defer file.Close()
116-
if _, err := io.Copy(file, seekableStream); err != nil {
117-
log.Warnf("failed to generate strm of obj %s: copy failed: %v", localPath, err)
92+
if obj.IsDir() {
93+
err := utils.CreateNestedDirectory(localPath)
94+
if err != nil {
95+
log.Warnf("failed to generate strm dir %s: failed to create dir: %v", localPath, err)
96+
return
97+
}
98+
} else {
99+
link, err := driver.Link(ctx, obj, model.LinkArgs{})
100+
if err != nil {
101+
log.Warnf("failed to generate strm of obj %s: failed to link: %v", localPath, err)
102+
return
103+
}
104+
defer link.Close()
105+
size := link.ContentLength
106+
if size <= 0 {
107+
size = obj.GetSize()
108+
}
109+
rrf, err := stream.GetRangeReaderFromLink(size, link)
110+
if err != nil {
111+
log.Warnf("failed to generate strm of obj %s: failed to get range reader: %v", localPath, err)
112+
return
113+
}
114+
rc, err := rrf.RangeRead(ctx, http_range.Range{Length: -1})
115+
if err != nil {
116+
log.Warnf("failed to generate strm of obj %s: failed to read range: %v", localPath, err)
117+
return
118+
}
119+
defer rc.Close()
120+
file, err := utils.CreateNestedFile(localPath)
121+
if err != nil {
122+
log.Warnf("failed to generate strm of obj %s: failed to create local file: %v", localPath, err)
123+
return
124+
}
125+
defer file.Close()
126+
if _, err := utils.CopyWithBuffer(file, rc); err != nil {
127+
log.Warnf("failed to generate strm of obj %s: copy failed: %v", localPath, err)
128+
}
118129
}
119130
}
120131

drivers/strm/util.go

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,35 @@ func (d *Strm) list(ctx context.Context, dst, sub string, args *fs.ListArgs) ([]
5858
if err != nil {
5959
return nil, err
6060
}
61+
return d.convert2strmObjs(ctx, reqPath, objs), nil
62+
}
6163

64+
func (d *Strm) convert2strmObjs(ctx context.Context, reqPath string, objs []model.Obj) []model.Obj {
6265
var validObjs []model.Obj
6366
for _, obj := range objs {
64-
objRes := d.convert2strmObj(ctx, reqPath, obj)
67+
id, name, path := "", obj.GetName(), ""
68+
size := int64(0)
69+
if !obj.IsDir() {
70+
path = stdpath.Join(reqPath, obj.GetName())
71+
ext := strings.ToLower(utils.Ext(name))
72+
if _, ok := d.downloadSuffix[ext]; ok {
73+
size = obj.GetSize()
74+
} else if _, ok := d.supportSuffix[ext]; ok {
75+
id = "strm"
76+
name = strings.TrimSuffix(name, ext) + "strm"
77+
size = int64(len(d.getLink(ctx, path)))
78+
} else {
79+
continue
80+
}
81+
}
82+
objRes := model.Object{
83+
ID: id,
84+
Path: path,
85+
Name: name,
86+
Size: size,
87+
Modified: obj.ModTime(),
88+
IsFolder: obj.IsDir(),
89+
}
6590
thumb, ok := model.GetThumb(obj)
6691
if !ok {
6792
validObjs = append(validObjs, &objRes)
@@ -74,33 +99,7 @@ func (d *Strm) list(ctx context.Context, dst, sub string, args *fs.ListArgs) ([]
7499
},
75100
})
76101
}
77-
return validObjs, nil
78-
}
79-
80-
func (d *Strm) convert2strmObj(ctx context.Context, reqPath string, obj model.Obj) model.Object {
81-
id, name, path := "", obj.GetName(), ""
82-
size := int64(0)
83-
if !obj.IsDir() {
84-
path = stdpath.Join(reqPath, obj.GetName())
85-
ext := strings.ToLower(utils.Ext(name))
86-
if _, ok := d.supportSuffix[ext]; ok {
87-
id = "strm"
88-
name = strings.TrimSuffix(name, ext) + "strm"
89-
size = int64(len(d.getLink(ctx, path)))
90-
} else if _, ok := d.downloadSuffix[ext]; ok {
91-
size = obj.GetSize()
92-
} else {
93-
94-
}
95-
}
96-
return model.Object{
97-
ID: id,
98-
Path: path,
99-
Name: name,
100-
Size: size,
101-
Modified: obj.ModTime(),
102-
IsFolder: obj.IsDir(),
103-
}
102+
return validObjs
104103
}
105104

106105
func (d *Strm) getLink(ctx context.Context, path string) string {

0 commit comments

Comments
 (0)