Фикс отображения путей

This commit is contained in:
2026-06-14 19:09:50 +03:00
parent 5fb2f4df43
commit d4bf8a8cad
13 changed files with 178 additions and 18 deletions
+38
View File
@@ -0,0 +1,38 @@
package worker
import (
"path/filepath"
"strings"
)
// translatePath переводит путь, как его сообщает qBittorrent API (save_path),
// в путь, видимый jellybit на хосте. Применяет самое длинное совпадение
// префикса из path_map (ключ — префикс в адресации qBit, значение — префикс на
// хосте). Совпадение — только по границам сегментов: ключ `/data` подходит для
// `/data` и `/data/x`, но не для `/data2`.
//
// Обычно path_map пуст — все медиа-приложения монтируют /srv/media:/srv/media
// идентично, поэтому путь из API уже равен хост-пути и возвращается как есть.
// Фолбэк нужен, если адресация qBit и jellybit разойдётся (см.
// docs/specs/architecture.md).
func translatePath(p string, pathMap map[string]string) string {
if len(pathMap) == 0 || p == "" {
return p
}
clean := filepath.Clean(p)
bestKey, bestVal := "", ""
for key, val := range pathMap {
k := filepath.Clean(key)
if clean != k && !strings.HasPrefix(clean, k+string(filepath.Separator)) {
continue
}
if len(k) > len(bestKey) {
bestKey, bestVal = k, val
}
}
if bestKey == "" {
return p
}
return filepath.Join(filepath.Clean(bestVal), strings.TrimPrefix(clean, bestKey))
}