From e5bdc080b4621a2cd2318d352eae1765a293a6de Mon Sep 17 00:00:00 2001 From: ShukeBta <272197458+ShukeBta@users.noreply.github.com> Date: Sat, 27 Jun 2026 12:05:47 +0800 Subject: [PATCH] split openlist helper types --- .../service/cloud/clouddrive2_openlist.go | 119 ----------------- .../cloud/clouddrive2_openlist_helpers.go | 126 ++++++++++++++++++ 2 files changed, 126 insertions(+), 119 deletions(-) create mode 100644 internal/service/cloud/clouddrive2_openlist_helpers.go diff --git a/internal/service/cloud/clouddrive2_openlist.go b/internal/service/cloud/clouddrive2_openlist.go index 4e384cd..6c4e2f4 100644 --- a/internal/service/cloud/clouddrive2_openlist.go +++ b/internal/service/cloud/clouddrive2_openlist.go @@ -8,8 +8,6 @@ import ( "io" "net/http" "net/url" - "path" - "sort" "strings" ) @@ -161,21 +159,6 @@ func (p *cloudDrive2Provider) openListAPIStatusError(action, target string, stat return fmt.Errorf("%s: api %s %s returned http %d", p.name, action, target, status) } -func sortedHeaderNames(headers map[string]string) []string { - if len(headers) == 0 { - return nil - } - out := make([]string, 0, len(headers)) - for key := range headers { - key = strings.TrimSpace(key) - if key != "" { - out = append(out, key) - } - } - sort.Strings(out) - return out -} - func (p *cloudDrive2Provider) hasOpenListAPICredentials() bool { return strings.TrimSpace(p.token) != "" || (strings.TrimSpace(p.username) != "" && p.password != "") } @@ -255,105 +238,3 @@ func (p *cloudDrive2Provider) resolveOpenListPlaybackURL(raw string) (string, er base.Fragment = "" return base.ResolveReference(u).String(), nil } - -func sameURLHost(raw string, base *url.URL) bool { - if base == nil { - return false - } - u, err := url.Parse(strings.TrimSpace(raw)) - if err != nil { - return false - } - if !u.IsAbs() { - return true - } - return strings.EqualFold(u.Host, base.Host) -} - -func normalizeOpenListPlaybackHeaders(raw json.RawMessage) map[string]string { - if len(raw) == 0 || string(raw) == "null" { - return nil - } - var obj map[string]any - if err := json.Unmarshal(raw, &obj); err != nil { - return nil - } - out := make(map[string]string, len(obj)) - for k, v := range obj { - key := strings.TrimSpace(k) - if key == "" { - continue - } - switch value := v.(type) { - case string: - if strings.TrimSpace(value) != "" { - out[key] = strings.TrimSpace(value) - } - case []any: - parts := make([]string, 0, len(value)) - for _, item := range value { - if s, ok := item.(string); ok && strings.TrimSpace(s) != "" { - parts = append(parts, strings.TrimSpace(s)) - } - } - if len(parts) > 0 { - out[key] = strings.Join(parts, ", ") - } - } - } - if len(out) == 0 { - return nil - } - return out -} - -func isCloudVideoPlaybackCandidate(fileRef string) bool { - switch strings.ToLower(path.Ext(strings.TrimSpace(fileRef))) { - case ".mkv", ".mp4", ".m4v", ".avi", ".mov", ".webm", ".ts", ".rmvb", ".rm", ".3gp", ".mpg", ".mpeg": - return true - default: - return false - } -} - -type openListListResponse struct { - Code int `json:"code"` - Message string `json:"message"` - Data struct { - Content []openListListItem `json:"content"` - Total int `json:"total"` - } `json:"data"` -} - -type openListListItem struct { - Name string `json:"name"` - Size int64 `json:"size"` - IsDir bool `json:"is_dir"` -} - -type openListGetResponse struct { - Code int `json:"code"` - Message string `json:"message"` - Data struct { - RawURL string `json:"raw_url"` - URL string `json:"url"` - Header json.RawMessage `json:"header"` - } `json:"data"` -} - -type openListLoginResponse struct { - Code int `json:"code"` - Message string `json:"message"` - Data struct { - Token string `json:"token"` - } `json:"data"` -} - -func joinOpenListAPIPath(dir, name string) string { - dir = strings.TrimRight(normalizeCloudDAVPath(dir), "/") - name = strings.Trim(strings.ReplaceAll(name, "\\", "/"), "/") - if dir == "" || dir == "/" { - return normalizeCloudDAVPath(name) - } - return normalizeCloudDAVPath(dir + "/" + name) -} diff --git a/internal/service/cloud/clouddrive2_openlist_helpers.go b/internal/service/cloud/clouddrive2_openlist_helpers.go new file mode 100644 index 0000000..d5d1880 --- /dev/null +++ b/internal/service/cloud/clouddrive2_openlist_helpers.go @@ -0,0 +1,126 @@ +package cloud + +import ( + "encoding/json" + "net/url" + "path" + "sort" + "strings" +) + +func sortedHeaderNames(headers map[string]string) []string { + if len(headers) == 0 { + return nil + } + out := make([]string, 0, len(headers)) + for key := range headers { + key = strings.TrimSpace(key) + if key != "" { + out = append(out, key) + } + } + sort.Strings(out) + return out +} + +func sameURLHost(raw string, base *url.URL) bool { + if base == nil { + return false + } + u, err := url.Parse(strings.TrimSpace(raw)) + if err != nil { + return false + } + if !u.IsAbs() { + return true + } + return strings.EqualFold(u.Host, base.Host) +} + +func normalizeOpenListPlaybackHeaders(raw json.RawMessage) map[string]string { + if len(raw) == 0 || string(raw) == "null" { + return nil + } + var obj map[string]any + if err := json.Unmarshal(raw, &obj); err != nil { + return nil + } + out := make(map[string]string, len(obj)) + for k, v := range obj { + key := strings.TrimSpace(k) + if key == "" { + continue + } + switch value := v.(type) { + case string: + if strings.TrimSpace(value) != "" { + out[key] = strings.TrimSpace(value) + } + case []any: + parts := make([]string, 0, len(value)) + for _, item := range value { + if s, ok := item.(string); ok && strings.TrimSpace(s) != "" { + parts = append(parts, strings.TrimSpace(s)) + } + } + if len(parts) > 0 { + out[key] = strings.Join(parts, ", ") + } + } + } + if len(out) == 0 { + return nil + } + return out +} + +func isCloudVideoPlaybackCandidate(fileRef string) bool { + switch strings.ToLower(path.Ext(strings.TrimSpace(fileRef))) { + case ".mkv", ".mp4", ".m4v", ".avi", ".mov", ".webm", ".ts", ".rmvb", ".rm", ".3gp", ".mpg", ".mpeg": + return true + default: + return false + } +} + +type openListListResponse struct { + Code int `json:"code"` + Message string `json:"message"` + Data struct { + Content []openListListItem `json:"content"` + Total int `json:"total"` + } `json:"data"` +} + +type openListListItem struct { + Name string `json:"name"` + Size int64 `json:"size"` + IsDir bool `json:"is_dir"` +} + +type openListGetResponse struct { + Code int `json:"code"` + Message string `json:"message"` + Data struct { + RawURL string `json:"raw_url"` + URL string `json:"url"` + Header json.RawMessage `json:"header"` + } `json:"data"` +} + +type openListLoginResponse struct { + Code int `json:"code"` + Message string `json:"message"` + Data struct { + Token string `json:"token"` + } `json:"data"` +} + +func joinOpenListAPIPath(dir, name string) string { + dir = strings.TrimRight(normalizeCloudDAVPath(dir), "/") + name = strings.Trim(strings.ReplaceAll(name, "\\", "/"), "/") + if dir == "" || dir == "/" { + return normalizeCloudDAVPath(name) + } + return normalizeCloudDAVPath(dir + "/" + name) +}