Фикс отображения путей
This commit is contained in:
@@ -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))
|
||||
}
|
||||
Reference in New Issue
Block a user