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)) }