From 34aad2aefe0c11035a7811723d5c15731eb2307d Mon Sep 17 00:00:00 2001 From: wiskiiii Date: Thu, 11 Jun 2026 23:40:26 +0800 Subject: [PATCH 1/2] fix(pikpak): prefer web media link request Use the current web file-detail request shape when media links are enabled, so PikPak returns the same origin media links as the web app. Keep the existing FETCH request path when media links are disabled, and prefer origin/default media links when selecting a media URL.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) --- drivers/pikpak/driver.go | 72 ++++++++++++++++++++++++++++------------ 1 file changed, 51 insertions(+), 21 deletions(-) diff --git a/drivers/pikpak/driver.go b/drivers/pikpak/driver.go index 8b72c3638..fbd6b9282 100644 --- a/drivers/pikpak/driver.go +++ b/drivers/pikpak/driver.go @@ -130,27 +130,38 @@ func (d *PikPak) List(ctx context.Context, dir model.Obj, args model.ListArgs) ( func (d *PikPak) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) { var resp File var url string - queryParams := map[string]string{ - "_magic": "2021", - "usage": "FETCH", - "thumbnail_size": "SIZE_LARGE", - } - if !d.DisableMediaLink { - queryParams["usage"] = "CACHE" - } - _, err := d.request(fmt.Sprintf("https://api-drive.mypikpak.net/drive/v1/files/%s", file.GetID()), - http.MethodGet, func(req *resty.Request) { - req.SetContext(ctx). - SetQueryParams(queryParams) - }, &resp) - if err != nil { - return nil, err - } - url = resp.WebContentLink - - if !d.DisableMediaLink && len(resp.Medias) > 0 && resp.Medias[0].Link.Url != "" { - log.Debugln("use media link") - url = resp.Medias[0].Link.Url + if d.DisableMediaLink { + queryParams := map[string]string{ + "_magic": "2021", + "usage": "FETCH", + "thumbnail_size": "SIZE_LARGE", + } + _, err := d.request(fmt.Sprintf("https://api-drive.mypikpak.net/drive/v1/files/%s", file.GetID()), + http.MethodGet, func(req *resty.Request) { + req.SetContext(ctx). + SetQueryParams(queryParams) + }, &resp) + if err != nil { + return nil, err + } + url = resp.WebContentLink + } else { + _, err := d.request(fmt.Sprintf("https://api-drive.mypikpak.com/drive/v1/files/%s", file.GetID()), + http.MethodGet, func(req *resty.Request) { + req.SetContext(ctx). + SetHeader("Accept", "*/*"). + SetHeader("Content-Type", "application/json"). + SetHeader("Referer", "https://mypikpak.com/"). + SetHeader("Origin", "https://mypikpak.com") + }, &resp) + if err != nil { + return nil, err + } + url = resp.WebContentLink + if mediaLink := pickMediaLink(resp.Medias); mediaLink != "" { + log.Debugln("use media link") + url = mediaLink + } } return &model.Link{ @@ -158,6 +169,25 @@ func (d *PikPak) Link(ctx context.Context, file model.Obj, args model.LinkArgs) }, nil } +func pickMediaLink(medias []Media) string { + for _, media := range medias { + if media.IsOrigin && media.Link.Url != "" { + return media.Link.Url + } + } + for _, media := range medias { + if media.IsDefault && media.Link.Url != "" { + return media.Link.Url + } + } + for _, media := range medias { + if media.Link.Url != "" { + return media.Link.Url + } + } + return "" +} + func (d *PikPak) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) error { _, err := d.request("https://api-drive.mypikpak.net/drive/v1/files", http.MethodPost, func(req *resty.Request) { req.SetContext(ctx).SetBody(base.Json{ From 9e371ea780e65560ee659a2859f87a7ad9c3d17b Mon Sep 17 00:00:00 2001 From: wiskiiii Date: Fri, 12 Jun 2026 01:05:25 +0800 Subject: [PATCH 2/2] docs(pikpak): explain media link selection Co-Authored-By: Claude Opus 4.8 (1M context) --- drivers/pikpak/driver.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/pikpak/driver.go b/drivers/pikpak/driver.go index fbd6b9282..7189f5735 100644 --- a/drivers/pikpak/driver.go +++ b/drivers/pikpak/driver.go @@ -170,6 +170,8 @@ func (d *PikPak) Link(ctx context.Context, file model.Obj, args model.LinkArgs) } func pickMediaLink(medias []Media) string { + // Prefer the original media to keep full quality, then fall back to the + // server-selected default stream, and finally any available media URL. for _, media := range medias { if media.IsOrigin && media.Link.Url != "" { return media.Link.Url