Commit graph

3 commits

Author SHA1 Message Date
Claude
f0a824d79a
docs: correct comments and changelog wording
- FilenameSanitizer class doc previously attributed the bug to "shell
  globbing, URI handling, and various download clients"; that was
  speculation about the mechanism. The confirmed cause is a failure
  inside the Bezzad Downloader NuGet package on Linux. Rewrite the
  class doc to describe what we actually know.

- SanitizeFilenameIfEnabled / SanitizePathIfEnabled said "returns it
  unchanged" when disabled, which isn't accurate for null input: we
  coerce to String.Empty so the return stays non-null. Spell that out.

- SanitizeFilename method summary rewritten to list exactly what it
  does rather than "problematic characters".

- Changelog entry said the setting is "on by default" but the default
  is OperatingSystem.IsLinux(). Fix the wording.
2026-04-24 04:43:19 +00:00
Claude
582bbd7a78
fix: address review feedback on filename sanitizer
- 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.
2026-04-23 06:55:34 +00:00
Claude
1098bac18f
feat: strip problematic characters from downloaded filenames
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.
2026-04-23 06:19:25 +00:00