@@ -3,14 +3,14 @@ package strm
33import (
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
9491func 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
0 commit comments