- Revert GetFileName to return unsanitized name. AllDebridDebridClient.
GetSymlinkPath matches torrent.Files[].Path (original debrid data)
against GetFileName, so sanitizing it broke AllDebrid Symlink lookups
for any torrent with bracketed filenames. Sanitization now happens
inside GetDownloadPath at the point the filesystem path is assembled,
while matching still uses the unsanitized name.
- Make SanitizeFilename / SanitizePath accept String? and return
String.Empty for null/empty input so the declared non-null return
type is honoured.
- SanitizePath splits on both '/' and '\\' regardless of host OS, so
paths arriving from the debrid provider with foreign separators are
still segmented correctly on Linux containers.
- Rewrite the control-character tests to use explicit \u escape
sequences (, , , , ) so the test
inputs are visible in diffs and survive editor/CI round-trips.
Replace the single-row empty [Theory] with a [Fact] and add a null
case. Add tests asserting SanitizeFilenameIfEnabled and
SanitizePathIfEnabled return input unchanged when the toggle is
disabled, and sanitize when enabled.
Downloads fail on Linux containers when filenames contain square
brackets or multiple consecutive spaces. On Linux, .NET's
Path.GetInvalidFileNameChars() only returns NUL and '/', so characters
like [ ] { } that cause issues with shell globbing, URI handling, and
various download clients pass through the existing filter unchanged.
Add FilenameSanitizer that:
- Strips square brackets, curly braces, and control characters
- Collapses multiple consecutive spaces into one
- Trims leading and trailing whitespace
- Preserves parentheses and all other characters
Apply sanitization at filesystem boundaries: DownloadHelper (where the
Real-Debrid filename is turned into a local path), UnpackClient,
Torrent delete / RunOnTorrentComplete, and the qBittorrent / SABnzbd
status paths that *arr reads back. Aria2c and DownloadStation also
sanitize their remote output paths so they match the sanitized local
filePath. Symlink's rclone-mount lookup still uses the original name
since that has to match the real file in the mount.
Add a SanitizeFilenames toggle in DbSettings (default on) so users
can disable the behaviour if they need the exact Real-Debrid name.