mirror of
https://github.com/truewhile/MeBox.git
synced 2026-10-07 22:06:38 +08:00
2
This commit is contained in:
@@ -371,7 +371,62 @@ func TestThrottleCodeHandling(t *testing.T) {
|
|||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatal("expected throttle error")
|
t.Fatal("expected throttle error")
|
||||||
}
|
}
|
||||||
if !tm.IsThrottled() {
|
if !tm.IsThrottled() {
|
||||||
t.Fatal("code 770004 should trigger throttle status")
|
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, "")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -145,12 +145,15 @@ type RemoteFileDetail struct {
|
|||||||
|
|
||||||
// RelativePath 计算该目录相对于根同步目录(rootCID)的相对路径。
|
// RelativePath 计算该目录相对于根同步目录(rootCID)的相对路径。
|
||||||
func (d *RemoteFileDetail) RelativePath(rootCID string) string {
|
func (d *RemoteFileDetail) RelativePath(rootCID string) string {
|
||||||
if d == nil || len(d.Paths) == 0 {
|
if d == nil {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
if rootCID == "" {
|
if rootCID == "" {
|
||||||
rootCID = "0"
|
rootCID = "0"
|
||||||
}
|
}
|
||||||
|
if d.FileId == rootCID {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
rootIdx := -1
|
rootIdx := -1
|
||||||
for i, p := range d.Paths {
|
for i, p := range d.Paths {
|
||||||
if p.FileId == rootCID {
|
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 == "") {
|
} else if len(d.Paths) > 0 && (d.Paths[0].FileId == "0" || d.Paths[0].FileId == "") {
|
||||||
start = 1
|
start = 1
|
||||||
}
|
}
|
||||||
|
hasSelf := false
|
||||||
for i := start; i < len(d.Paths); i++ {
|
for i := start; i < len(d.Paths); i++ {
|
||||||
|
if d.Paths[i].FileId == d.FileId {
|
||||||
|
hasSelf = true
|
||||||
|
}
|
||||||
name := strings.TrimSpace(d.Paths[i].Name)
|
name := strings.TrimSpace(d.Paths[i].Name)
|
||||||
if name != "" {
|
if name != "" {
|
||||||
segments = append(segments, 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, "/")
|
return strings.Join(segments, "/")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -582,10 +582,11 @@ func (st *strmSyncState) walk115Flat(open115 *cloud115.OpenClient) error {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if _, loaded := st.dirCache.Load(ancestor.FileId); !loaded {
|
if _, loaded := st.dirCache.Load(ancestor.FileId); !loaded {
|
||||||
subDetail := &cloud115.RemoteFileDetail{
|
subDetail := &cloud115.RemoteFileDetail{
|
||||||
FileId: ancestor.FileId,
|
FileId: ancestor.FileId,
|
||||||
Paths: nil,
|
FileName: ancestor.Name,
|
||||||
}
|
Paths: nil,
|
||||||
|
}
|
||||||
for _, p := range detail.Paths {
|
for _, p := range detail.Paths {
|
||||||
subDetail.Paths = append(subDetail.Paths, p)
|
subDetail.Paths = append(subDetail.Paths, p)
|
||||||
if p.FileId == ancestor.FileId {
|
if p.FileId == ancestor.FileId {
|
||||||
|
|||||||
+25
@@ -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"))
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user