39 lines
1.5 KiB
Go
39 lines
1.5 KiB
Go
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))
|
|
}
|