docs: clarify qB save path resolution

This commit is contained in:
2026-08-15 08:12:11 +00:00
parent a1bf3e4315
commit 618bb3d206
2 changed files with 27 additions and 2 deletions
+19 -2
View File
@@ -42,8 +42,8 @@ and exported-metainfo data, keeps the qB-local hash separately, and calculates:
- normalized selected and selected-complete file-index sets; - normalized selected and selected-complete file-index sets;
- torrent runtime state; - torrent runtime state;
- canonical path flag and content revision; - canonical path flag and content revision;
- a save-path fingerprint based on validated path mapping, never a leaked - a validated qBittorrent `save_path`, retained only in the client's local
absolute host path. normalized observation.
qBittorrent 5 may expose a pure-v2 or hybrid torrent under the first 20 bytes qBittorrent 5 may expose a pure-v2 or hybrid torrent under the first 20 bytes
of its v2 hash while separately advertising full `infohash_v1` and of its v2 hash while separately advertising full `infohash_v1` and
@@ -56,6 +56,23 @@ All entries retain qBittorrent's stable torrent file index. Renamed/noncanonical
content paths are rejected in v1 because they cannot be transported and merged content paths are rejected in v1 because they cannot be transported and merged
without ambiguity. without ambiguity.
### Per-torrent local content roots
`save_path` is not inventory, placement, or protocol data. It is qBittorrent
metadata used only by the daemon that queried qBittorrent. Before staging a
source, merging into an existing target, applying post-recheck permissions, or
evicting files, that daemon maps the torrent's API-visible `save_path` through
`qbittorrent.api_root`/`local_root`. The most-specific
`qbittorrent.local_path_overrides` mapping wins when a nested path is exposed
through a distinct client container mount.
An ordinary nested qBittorrent path such as `/media/Data/Downloading` needs no
per-resource configuration: it resolves beneath the configured root. A path
outside that root, an unmapped distinct mount, or a mapped local path that is
not a visible real directory fails the affected job before filesystem mutation.
This check is intentionally per resource; an unrelated malformed qBittorrent
entry cannot prevent normal resources from being staged or transferred.
### Verification guard ### Verification guard
The client captures transfer counters and state before recheck, issues recheck, The client captures transfer counters and state before recheck, issues recheck,
+8
View File
@@ -19,6 +19,14 @@ class ResourceError(ValueError):
@dataclass(frozen=True) @dataclass(frozen=True)
class NormalizedResource: class NormalizedResource:
"""A normalized qB observation for protocol data and local file work.
``save_path`` is qBittorrent's API-visible per-torrent content root. It
is deliberately local-only: clients resolve it through their qB path
mapping immediately before filesystem work, and it is never serialized in
inventory, placements, or control protocol messages.
"""
summary: resource_pb2.ResourceSummary summary: resource_pb2.ResourceSummary
files: tuple[resource_pb2.TorrentFile, ...] files: tuple[resource_pb2.TorrentFile, ...]
metainfo: Metainfo metainfo: Metainfo