diff --git a/internal/service/downloads.go b/internal/service/downloads.go index b7dc8b7..ecfbfd4 100644 --- a/internal/service/downloads.go +++ b/internal/service/downloads.go @@ -20,7 +20,6 @@ import ( "errors" "math" "net/url" - "os" "path" "path/filepath" "regexp" @@ -895,6 +894,12 @@ func (d *DownloadService) onTorrentComplete(ctx context.Context, torrent QBitTor } func (d *DownloadService) completedTorrentSource(torrent QBitTorrent) string { + // 常见路径映射:qBittorrent容器路径 -> MediaStationGo容器路径 + mappings := map[string]string{ + "/var/apps/qBittorrent/shares/qBittorrent/Download": "/downloads", + "/data/qBittorrent/downloads": "/downloads", + "/downloads/qBittorrent": "/downloads", + } for _, candidate := range []string{ torrent.ContentPath, filepath.Join(torrent.SavePath, torrent.Name), @@ -904,10 +909,12 @@ func (d *DownloadService) completedTorrentSource(torrent QBitTorrent) string { if clean == "" || clean == "." { continue } - clean = filepath.Clean(clean) - if _, err := os.Stat(clean); err == nil { - return clean + // 尝试直接访问或路径映射 + if translated := translateClientPath(clean, mappings); translated != "" { + return translated } } return "" } + + diff --git a/internal/service/path_translation.go b/internal/service/path_translation.go new file mode 100644 index 0000000..d2e446a --- /dev/null +++ b/internal/service/path_translation.go @@ -0,0 +1,30 @@ +package service + +import ( + "os" + "path/filepath" + "strings" +) + +// translateClientPath 将下载客户端报告的路径转换为容器内可访问的路径。 +// 常见场景:qBittorrent在另一个容器,报告的路径是其容器内路径,需要映射到当前容器。 +func translateClientPath(clientPath string, mappings map[string]string) string { + if clientPath == "" { + return "" + } + clean := filepath.Clean(clientPath) + // 尝试直接访问 + if _, err := os.Stat(clean); err == nil { + return clean + } + // 尝试路径映射 + for clientPrefix, localPrefix := range mappings { + if strings.HasPrefix(clean, clientPrefix) { + translated := filepath.Join(localPrefix, strings.TrimPrefix(clean, clientPrefix)) + if _, err := os.Stat(translated); err == nil { + return translated + } + } + } + return "" +}