From b2f6aac754c5d46c66758db46ecb89aa85c3c113 Mon Sep 17 00:00:00 2001 From: wiserain Date: Wed, 8 May 2024 09:09:56 +0900 Subject: [PATCH] pikpak: improve getFile() usage Previously, `getFile()` was called indiscriminately during uploads, moves, and download link generation. This could lead to users with download limit causing subsequent operations like uploads and moves to fail. This PR optimizes the use of getFile(), by only calling it when it's strictly necessary. --- backend/pikpak/api/types.go | 14 ++++++++++---- backend/pikpak/pikpak.go | 22 +++++++++++----------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/backend/pikpak/api/types.go b/backend/pikpak/api/types.go index 92c81d426..8b2270e2a 100644 --- a/backend/pikpak/api/types.go +++ b/backend/pikpak/api/types.go @@ -53,7 +53,7 @@ const ( PhaseTypePending = "PHASE_TYPE_PENDING" UploadTypeForm = "UPLOAD_TYPE_FORM" UploadTypeResumable = "UPLOAD_TYPE_RESUMABLE" - ListLimit = 100 + ListLimit = 500 ) // ------------------------------------------------------------ @@ -156,6 +156,7 @@ type FileList struct { NextPageToken string `json:"next_page_token"` Version string `json:"version,omitempty"` VersionOutdated bool `json:"version_outdated,omitempty"` + SyncTime Time `json:"sync_time"` } // File is a basic element representing a single file object @@ -165,14 +166,14 @@ type FileList struct { // 2) the other from File.Medias[].Link.URL. // Empirically, 2) is less restrictive to multiple concurrent range-requests // for a single file, i.e. supports for higher `--multi-thread-streams=N`. -// However, it is not generally applicable as it is only for meadia. +// However, it is not generally applicable as it is only for media. type File struct { Apps []*FileApp `json:"apps,omitempty"` Audit *FileAudit `json:"audit,omitempty"` Collection string `json:"collection,omitempty"` // TODO CreatedTime Time `json:"created_time,omitempty"` DeleteTime Time `json:"delete_time,omitempty"` - FileCategory string `json:"file_category,omitempty"` + FileCategory string `json:"file_category,omitempty"` // "AUDIO", "VIDEO" FileExtension string `json:"file_extension,omitempty"` FolderType string `json:"folder_type,omitempty"` Hash string `json:"hash,omitempty"` // sha1 but NOT a valid file hash. looks like a torrent hash @@ -191,11 +192,14 @@ type File struct { ParentID string `json:"parent_id,omitempty"` Phase string `json:"phase,omitempty"` Revision int `json:"revision,omitempty,string"` + ReferenceEvents []interface{} `json:"reference_events"` + ReferenceResource interface{} `json:"reference_resource"` Size int64 `json:"size,omitempty,string"` SortName string `json:"sort_name,omitempty"` Space string `json:"space,omitempty"` SpellName []interface{} `json:"spell_name,omitempty"` // TODO maybe list of something? Starred bool `json:"starred,omitempty"` + Tags []interface{} `json:"tags"` ThumbnailLink string `json:"thumbnail_link,omitempty"` Trashed bool `json:"trashed,omitempty"` UserID string `json:"user_id,omitempty"` @@ -241,7 +245,8 @@ type Media struct { IsOrigin bool `json:"is_origin,omitempty"` ResolutionName string `json:"resolution_name,omitempty"` IsVisible bool `json:"is_visible,omitempty"` - Category string `json:"category,omitempty"` + Category string `json:"category,omitempty"` // "category_origin" + Audio interface{} `json:"audio"` // TODO: undiscovered yet } // FileParams includes parameters for instant open @@ -395,6 +400,7 @@ type Quota struct { UsageInTrash int64 `json:"usage_in_trash,omitempty,string"` // bytes in trash but this seems not working PlayTimesLimit string `json:"play_times_limit,omitempty"` // maybe in seconds PlayTimesUsage string `json:"play_times_usage,omitempty"` // maybe in seconds + IsUnlimited bool `json:"is_unlimited,omitempty"` } // Share is a response to RequestShare diff --git a/backend/pikpak/pikpak.go b/backend/pikpak/pikpak.go index 07fc0b201..008180356 100644 --- a/backend/pikpak/pikpak.go +++ b/backend/pikpak/pikpak.go @@ -1016,21 +1016,24 @@ func (f *Fs) Move(ctx context.Context, src fs.Object, remote string) (fs.Object, } dstObj.id = srcObj.id - var info *api.File if srcLeaf != dstLeaf { // Rename - info, err = f.renameObject(ctx, srcObj.id, dstLeaf) + info, err := f.renameObject(ctx, srcObj.id, dstLeaf) if err != nil { return nil, fmt.Errorf("move: couldn't rename moved file: %w", err) } + err = dstObj.setMetaData(info) + if err != nil { + return nil, err + } } else { // Update info - info, err = f.getFile(ctx, dstObj.id) + err = dstObj.readMetaData(ctx) if err != nil { - return nil, fmt.Errorf("move: couldn't update moved file: %w", err) + return nil, fmt.Errorf("move: couldn't locate moved file: %w", err) } } - return dstObj, dstObj.setMetaData(info) + return dstObj, nil } // copy objects @@ -1143,7 +1146,7 @@ func (f *Fs) uploadByForm(ctx context.Context, in io.Reader, name string, size i return } -func (f *Fs) uploadByResumable(ctx context.Context, in io.Reader, resumable *api.Resumable, options ...fs.OpenOption) (err error) { +func (f *Fs) uploadByResumable(ctx context.Context, in io.Reader, resumable *api.Resumable) (err error) { p := resumable.Params endpoint := strings.Join(strings.Split(p.Endpoint, ".")[1:], ".") // "mypikpak.com" @@ -1206,7 +1209,7 @@ func (f *Fs) upload(ctx context.Context, in io.Reader, leaf, dirID, sha1Str stri if uploadType == api.UploadTypeForm && newfile.Form != nil { err = f.uploadByForm(ctx, in, req.Name, size, newfile.Form, options...) } else if uploadType == api.UploadTypeResumable && newfile.Resumable != nil { - err = f.uploadByResumable(ctx, in, newfile.Resumable, options...) + err = f.uploadByResumable(ctx, in, newfile.Resumable) } else { return nil, fmt.Errorf("unable to proceed upload: %+v", newfile) } @@ -1214,10 +1217,7 @@ func (f *Fs) upload(ctx context.Context, in io.Reader, leaf, dirID, sha1Str stri if err != nil { return nil, fmt.Errorf("failed to upload: %w", err) } - // refresh uploaded file info - // Compared to `newfile.File` this upgrades several fields... - // audit, links, modified_time, phase, revision, and web_content_link - return f.getFile(ctx, newfile.File.ID) + return newfile.File, nil } // Put the object