mirror of
https://github.com/truewhile/MeBox.git
synced 2026-09-29 11:36:36 +08:00
38 lines
1.1 KiB
Go
38 lines
1.1 KiB
Go
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
|
|
}
|
|
// 尝试路径映射
|
|
cleanForMatch := filepath.ToSlash(clean)
|
|
for clientPrefix, localPrefix := range mappings {
|
|
prefix := strings.TrimRight(filepath.ToSlash(filepath.Clean(clientPrefix)), "/")
|
|
if prefix == "" || prefix == "." {
|
|
continue
|
|
}
|
|
if cleanForMatch == prefix || strings.HasPrefix(cleanForMatch, prefix+"/") {
|
|
rel := strings.TrimPrefix(cleanForMatch, prefix)
|
|
rel = strings.TrimPrefix(rel, "/")
|
|
translated := filepath.Join(localPrefix, filepath.FromSlash(rel))
|
|
if _, err := os.Stat(translated); err == nil {
|
|
return translated
|
|
}
|
|
}
|
|
}
|
|
return ""
|
|
}
|