diff --git a/internal/service/cloud115/cloud115_test.go b/internal/service/cloud115/cloud115_test.go index d1c704d..aaf5dfd 100644 --- a/internal/service/cloud115/cloud115_test.go +++ b/internal/service/cloud115/cloud115_test.go @@ -371,7 +371,62 @@ func TestThrottleCodeHandling(t *testing.T) { if err == nil { t.Fatal("expected throttle error") } - if !tm.IsThrottled() { - t.Fatal("code 770004 should trigger throttle status") + if !tm.IsThrottled() { + t.Fatal("code 770004 should trigger throttle status") + } } -} + + func TestRemoteFileDetailRelativePath(t *testing.T) { + rootCID := "3238787832374488117" // 影视库 + + // 场景 1:115 目录 paths 中只有祖先目录链,不包含自身 + d1 := &RemoteFileDetail{ + FileId: "3251154147730910635", + FileName: "出包王女", + Paths: []struct { + FileId string `json:"file_id"` + Name string `json:"file_name"` + }{ + {FileId: "0", Name: "根目录"}, + {FileId: "3238787832374488117", Name: "影视库"}, + {FileId: "3238787913223892116", Name: "动漫"}, + }, + } + if got := d1.RelativePath(rootCID); got != "动漫/出包王女" { + t.Errorf("d1.RelativePath = %q, want %q", got, "动漫/出包王女") + } + + // 场景 2:祖先中间目录,自身在 paths 末尾 + d2 := &RemoteFileDetail{ + FileId: "3238787913223892116", + FileName: "动漫", + Paths: []struct { + FileId string `json:"file_id"` + Name string `json:"file_name"` + }{ + {FileId: "0", Name: "根目录"}, + {FileId: "3238787832374488117", Name: "影视库"}, + {FileId: "3238787913223892116", Name: "动漫"}, + }, + } + if got := d2.RelativePath(rootCID); got != "动漫" { + t.Errorf("d2.RelativePath = %q, want %q", got, "动漫") + } + + // 场景 3:根同步目录自身 + d3 := &RemoteFileDetail{ + FileId: rootCID, + FileName: "影视库", + Paths: []struct { + FileId string `json:"file_id"` + Name string `json:"file_name"` + }{ + {FileId: "0", Name: "根目录"}, + {FileId: rootCID, Name: "影视库"}, + }, + } + if got := d3.RelativePath(rootCID); got != "" { + t.Errorf("d3.RelativePath = %q, want %q", got, "") + } + } + diff --git a/internal/service/cloud115/open.go b/internal/service/cloud115/open.go index bbbd0b9..44c64c6 100644 --- a/internal/service/cloud115/open.go +++ b/internal/service/cloud115/open.go @@ -145,12 +145,15 @@ type RemoteFileDetail struct { // RelativePath 计算该目录相对于根同步目录(rootCID)的相对路径。 func (d *RemoteFileDetail) RelativePath(rootCID string) string { - if d == nil || len(d.Paths) == 0 { + if d == nil { return "" } if rootCID == "" { rootCID = "0" } + if d.FileId == rootCID { + return "" + } rootIdx := -1 for i, p := range d.Paths { if p.FileId == rootCID { @@ -165,12 +168,20 @@ func (d *RemoteFileDetail) RelativePath(rootCID string) string { } else if len(d.Paths) > 0 && (d.Paths[0].FileId == "0" || d.Paths[0].FileId == "") { start = 1 } + hasSelf := false for i := start; i < len(d.Paths); i++ { + if d.Paths[i].FileId == d.FileId { + hasSelf = true + } name := strings.TrimSpace(d.Paths[i].Name) if name != "" { segments = append(segments, name) } } + // 若 115 返回的 paths 祖先链未包含当前目录自身,则将其自身目录名 FileName 补在末尾 + if !hasSelf && strings.TrimSpace(d.FileName) != "" && d.FileId != rootCID { + segments = append(segments, strings.TrimSpace(d.FileName)) + } return strings.Join(segments, "/") } diff --git a/internal/service/strm_sync.go b/internal/service/strm_sync.go index 4c34ebe..71e00bd 100644 --- a/internal/service/strm_sync.go +++ b/internal/service/strm_sync.go @@ -582,10 +582,11 @@ func (st *strmSyncState) walk115Flat(open115 *cloud115.OpenClient) error { continue } if _, loaded := st.dirCache.Load(ancestor.FileId); !loaded { - subDetail := &cloud115.RemoteFileDetail{ - FileId: ancestor.FileId, - Paths: nil, - } + subDetail := &cloud115.RemoteFileDetail{ + FileId: ancestor.FileId, + FileName: ancestor.Name, + Paths: nil, + } for _, p := range detail.Paths { subDetail.Paths = append(subDetail.Paths, p) if p.FileId == ancestor.FileId { diff --git a/test_rel.go b/test_rel.go new file mode 100644 index 0000000..e4e8682 --- /dev/null +++ b/test_rel.go @@ -0,0 +1,25 @@ +package main +import ( + "context" + "fmt" + "github.com/ShukeBta/MMTL/internal/service" + "github.com/ShukeBta/MMTL/internal/service/cloud115" + "go.uber.org/zap" +) +func main() { + crypto := service.NewCryptoService("test-secret", zap.NewNop()) + // Let's test with a mock RemoteFileDetail + d := &cloud115.RemoteFileDetail{ + FileId: "3251154147730910635", + FileName: "出包王女", + Paths: []struct { + FileId string + Name string + }{ + {FileId: "0", Name: "根目录"}, + {FileId: "3238787832374488117", Name: "影视库"}, + {FileId: "3238787913223892116", Name: "动漫"}, + }, + } + fmt.Println("RelativePath when rootCID is 3238787832374488117:", d.RelativePath("3238787832374488117")) +}