Skip to content

fix(orphanscan): ignore .parts files from qBittorrent partial downloads - #1264

Merged
s0up4200 merged 1 commit into
developfrom
claude/ignore-parts-files-L1OgQ
Jan 17, 2026
Merged

fix(orphanscan): ignore .parts files from qBittorrent partial downloads#1264
s0up4200 merged 1 commit into
developfrom
claude/ignore-parts-files-L1OgQ

Conversation

@s0up4200

@s0up4200 s0up4200 commented Jan 17, 2026

Copy link
Copy Markdown
Collaborator

qBittorrent leaves .parts files when downloading partial torrents. These
should not be treated as orphans.

Adds a new suffix ignore pattern for *.parts files to the default ignore
list, alongside the existing prefix patterns for FUSE/NFS hidden files.

Summary by CodeRabbit

Bug Fixes

  • Orphan scan now ignores qBittorrent partial download files (*.parts)

Documentation

  • Added documentation for ignored file patterns

✏️ Tip: You can customize this high-level summary in your review settings.

qBittorrent leaves .parts files when downloading partial torrents. These
should not be treated as orphans.

Adds a new suffix ignore pattern for *.parts files to the default ignore
list, alongside the existing prefix patterns for FUSE/NFS hidden files.
@coderabbitai

coderabbitai Bot commented Jan 17, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

The pull request extends the orphan file scanner to ignore qBittorrent partial download files (*.parts suffix) through a new case-insensitive suffix filter. Changes include documentation of the new ignore pattern, implementation of a suffix-matching helper function, integration into the existing orphan detection logic, and test coverage for the new functionality.

Changes

Cohort / File(s) Summary
Documentation
documentation/docs/_partials/_orphan-scan-default-ignores.mdx
Added "Ignored files (name suffixes)" section documenting the new *.parts pattern for qBittorrent partial downloads.
Orphan Scanner Logic
internal/services/orphanscan/walker.go
Added ignoredOrphanFileNameSuffixes list containing ".parts" and new hasSuffixFold() helper for case-insensitive suffix matching; extended isIgnoredOrphanFileName() to check suffixes.
Test Coverage
internal/services/orphanscan/walker_test.go
Added TestWalkScanRoot_IgnoresPartsFiles() to verify that .parts files are ignored while regular orphans are still detected.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

Suggested labels

orphan

Poem

🐰 Hopping through partial files with care,
The .parts stay hidden, not a pair!
With suffixes matched and case ignored,
Our orphan scan brings sweet reward! 🎉

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically describes the main change: ignoring .parts files from qBittorrent in the orphanscan service.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch claude/ignore-parts-files-L1OgQ

Comment @coderabbitai help to get the list of available commands and usage tips.

@s0up4200
s0up4200 merged commit 77b2fd6 into develop Jan 17, 2026
11 checks passed
@s0up4200
s0up4200 deleted the claude/ignore-parts-files-L1OgQ branch January 17, 2026 18:36
alexlebens pushed a commit to alexlebens/infrastructure that referenced this pull request Jan 27, 2026
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/autobrr/qui](https://github.com/autobrr/qui) | minor | `v1.12.0` → `v1.13.0` |

---

### Release Notes

<details>
<summary>autobrr/qui (ghcr.io/autobrr/qui)</summary>

### [`v1.13.0`](https://github.com/autobrr/qui/releases/tag/v1.13.0)

[Compare Source](autobrr/qui@v1.12.0...v1.13.0)

#### Highlights

- Native RSS support for feeds
- Cross-seed upgrades: directory scanning for data-based matching and category affix (prefix/suffix) modes
- Automations improvements: Move action support, uncategorized filter option, hasMissingFiles condition, include-cross-seeds mode, configurable FREE\_SPACE source
- UI improvements: inline pieces progress bar, clickable dashboard error counts, better mobile workflow modal
- Orphan scan safeguards for shared save paths
- External programs: new {comment} placeholder

##### Notable bug fixes:

- More stable sorting for timestamp fields and last\_activity
- Tracker icon fetching reliability and timeout cooldown handling
- Cross-seed matching fixes (anime/pack matching, size mismatch handling, V2 hash recheck)
- Orphan scan ignores .parts files and OS/NAS artifacts
- qBittorrent tracker-down matching improvements and magnet redirect handling

#### Changelog

##### New Features

- [`9acd789`](autobrr/qui@9acd789): feat(automations): add Move action to Automations ([#&#8203;1079](autobrr/qui#1079)) ([@&#8203;Barcode-eng](https://github.com/Barcode-eng))
- [`80aaf22`](autobrr/qui@80aaf22): feat(automations): add hasMissingfiles condition ([#&#8203;1081](autobrr/qui#1081)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`f942a71`](autobrr/qui@f942a71): feat(automations): add import button to empty state ([#&#8203;1111](autobrr/qui#1111)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`6b2831e`](autobrr/qui@6b2831e): feat(automations): add include-cross-seeds mode with hardlink support, fix free-space projection ([#&#8203;1116](autobrr/qui#1116)) ([@&#8203;Barcode-eng](https://github.com/Barcode-eng))
- [`b152a6a`](autobrr/qui@b152a6a): feat(automations): add tooltips to disabled conditions ([#&#8203;1286](autobrr/qui#1286)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`f36eb76`](autobrr/qui@f36eb76): feat(automations): add uncategorized category filter option ([#&#8203;1268](autobrr/qui#1268)) ([@&#8203;aulterego](https://github.com/aulterego))
- [`d7dcb58`](autobrr/qui@d7dcb58): feat(automations): configurable FREE\_SPACE source (qBit or path) ([#&#8203;1181](autobrr/qui#1181)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`d685bee`](autobrr/qui@d685bee): feat(backups): add tooltips and restore from lastest button ([#&#8203;1258](autobrr/qui#1258)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`4c5a975`](autobrr/qui@4c5a975): feat(crossseed): add category affix with prefix/suffix modes ([#&#8203;1296](autobrr/qui#1296)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`28cd96d`](autobrr/qui@28cd96d): feat(crossseed): add directory scanner for data-based matching ([#&#8203;1203](autobrr/qui#1203)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`fe84eb0`](autobrr/qui@fe84eb0): feat(dirscan): resumable scans with per-run limit ([#&#8203;1274](autobrr/qui#1274)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`1af2a12`](autobrr/qui@1af2a12): feat(dockerfile): add bash to Dockerfile ([#&#8203;903](autobrr/qui#903)) ([@&#8203;ryanwalder](https://github.com/ryanwalder))
- [`5c84c3f`](autobrr/qui@5c84c3f): feat(docs): add browser extension links and URL shorteners ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`13c5461`](autobrr/qui@13c5461): feat(linking): add option to fallback on linking failure ([#&#8203;1056](autobrr/qui#1056)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`5f7031f`](autobrr/qui@5f7031f): feat(orphanscan): protect shared save paths across instances ([#&#8203;1197](autobrr/qui#1197)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`341092d`](autobrr/qui@341092d): feat(rss): add native rss support ([#&#8203;801](autobrr/qui#801)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`8d2a371`](autobrr/qui@8d2a371): feat(sort): add stable fallback sorting for timestamp fields ([#&#8203;1317](autobrr/qui#1317)) ([@&#8203;aulterego](https://github.com/aulterego))
- [`28cf4ad`](autobrr/qui@28cf4ad): feat(torrents): use custom tracker names in table ([#&#8203;1120](autobrr/qui#1120)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`e0d2bb4`](autobrr/qui@e0d2bb4): feat(ui): Use 4 column grid for dashboard instances on 2xl screens ([#&#8203;1195](autobrr/qui#1195)) ([@&#8203;ewenjo](https://github.com/ewenjo))
- [`7bc98e1`](autobrr/qui@7bc98e1): feat(ui): add inline pieces progress bar visualization ([#&#8203;1050](autobrr/qui#1050)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`0154226`](autobrr/qui@0154226): feat(web): Improve performance for torrents with large file counts ([#&#8203;1252](autobrr/qui#1252)) ([@&#8203;0rkag](https://github.com/0rkag))
- [`a91df70`](autobrr/qui@a91df70): feat(web): allow merging trackers into existing groups ([#&#8203;1175](autobrr/qui#1175)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`132c512`](autobrr/qui@132c512): feat(web): improve workflow modal mobile ([#&#8203;1302](autobrr/qui#1302)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`a7f59ab`](autobrr/qui@a7f59ab): feat(web): make dashboard error counts clickable ([#&#8203;937](autobrr/qui#937)) ([@&#8203;Gykes](https://github.com/Gykes))

##### Bug Fixes

- [`c6f86e2`](autobrr/qui@c6f86e2): fix(auth): recover cleanly behind upstream SSO ([#&#8203;1142](autobrr/qui#1142)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`0c19899`](autobrr/qui@0c19899): fix(automations): handle -1 value for incomplete torrent completion\_on ([#&#8203;1186](autobrr/qui#1186)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`59a9120`](autobrr/qui@59a9120): fix(automations): include Move action in `rulesUseCondition` ([#&#8203;1079](autobrr/qui#1079)) ([#&#8203;1287](autobrr/qui#1287)) ([@&#8203;Barcode-eng](https://github.com/Barcode-eng))
- [`618d945`](autobrr/qui@618d945): fix(automations): not being able to enter multiple tags in tag action ([#&#8203;1131](autobrr/qui#1131)) ([@&#8203;Winter](https://github.com/Winter))
- [`bffecbd`](autobrr/qui@bffecbd): fix(automations): restore preview API and add loading state ([#&#8203;1194](autobrr/qui#1194)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`9b3975b`](autobrr/qui@9b3975b): fix(automations): speed up delete hardlink-copy expansion ([#&#8203;1187](autobrr/qui#1187)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`1549bcf`](autobrr/qui@1549bcf): fix(automations): support qBittorrent global/unlimited limits ([#&#8203;1134](autobrr/qui#1134)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`e31d4aa`](autobrr/qui@e31d4aa): fix(automations): validate local access for hasMissingFiles ([#&#8203;1281](autobrr/qui#1281)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`dba3419`](autobrr/qui@dba3419): fix(crossseed): allow extra files in size mismatch check ([#&#8203;1149](autobrr/qui#1149)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`f7dced6`](autobrr/qui@f7dced6): fix(crossseed): correct match type for episode-from-pack cross-seeding ([#&#8203;1250](autobrr/qui#1250)) ([@&#8203;neelmehta247](https://github.com/neelmehta247))
- [`007d87e`](autobrr/qui@007d87e): fix(crossseed): normalize ampersand to "and" for title matching ([#&#8203;1202](autobrr/qui#1202)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`048c034`](autobrr/qui@048c034): fix(crossseed): prevent automation search stalls ([#&#8203;1272](autobrr/qui#1272)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`5c48ccb`](autobrr/qui@5c48ccb): fix(crossseed): prevent false cross-seed delete warnings ([#&#8203;1148](autobrr/qui#1148)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`eda0eee`](autobrr/qui@eda0eee): fix(crossseed): reduce false negatives for anime matching ([#&#8203;1243](autobrr/qui#1243)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`8b08b87`](autobrr/qui@8b08b87): fix(crossseed): restore reuse matched category option ([#&#8203;1150](autobrr/qui#1150)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`b69682d`](autobrr/qui@b69682d): fix(crossseed): support v2 hashes for recheck ([#&#8203;1237](autobrr/qui#1237)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`8fb16c1`](autobrr/qui@8fb16c1): fix(database): remove noisy stmt cache promotion log ([#&#8203;1307](autobrr/qui#1307)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`c8d068b`](autobrr/qui@c8d068b): fix(docs): correct autobrr integration documentation ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`c6f4a4a`](autobrr/qui@c6f4a4a): fix(docs): use absolute URLs for extension links ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`48510e9`](autobrr/qui@48510e9): fix(instances): auth bypass persistence in instance form ([#&#8203;1219](autobrr/qui#1219)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`0b71b46`](autobrr/qui@0b71b46): fix(makefile): make fmt target only format changed files ([#&#8203;1200](autobrr/qui#1200)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`1f13b0e`](autobrr/qui@1f13b0e): fix(orphanscan): avoid duplicate inode entries in scans ([#&#8203;1212](autobrr/qui#1212)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`fecfebd`](autobrr/qui@fecfebd): fix(orphanscan): gate scans until qBittorrent settled ([#&#8203;1193](autobrr/qui#1193)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`77b2fd6`](autobrr/qui@77b2fd6): fix(orphanscan): ignore .parts files from qBittorrent partial downloads ([#&#8203;1264](autobrr/qui#1264)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`0f7e646`](autobrr/qui@0f7e646): fix(orphanscan): ignore OS/NAS/k8s artifacts ([#&#8203;1259](autobrr/qui#1259)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`b55881c`](autobrr/qui@b55881c): fix(orphanscan): reduce MaxFilesPerRun and fix accordion chevrons ([#&#8203;1095](autobrr/qui#1095)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`0cb682c`](autobrr/qui@0cb682c): fix(qbittorrent): force sync+retry in BulkAction ([#&#8203;1097](autobrr/qui#1097)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`aba9b7e`](autobrr/qui@aba9b7e): fix(qbittorrent): strip URLs before tracker-down pattern matching ([#&#8203;1224](autobrr/qui#1224)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`a60076f`](autobrr/qui@a60076f): fix(reflinktree): fall back to FICLONERANGE when FICLONE unsupported ([#&#8203;1221](autobrr/qui#1221)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`d79a0db`](autobrr/qui@d79a0db): fix(search): handle magnet redirects from indexer downloads ([#&#8203;1211](autobrr/qui#1211)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`1e920c4`](autobrr/qui@1e920c4): fix(sort): truncate `last_activity` to 60s for stability ([#&#8203;1318](autobrr/qui#1318)) ([@&#8203;aulterego](https://github.com/aulterego))
- [`931d720`](autobrr/qui@931d720): fix(torznab): respect per-indexer caps limits ([#&#8203;1265](autobrr/qui#1265)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`6fe91e8`](autobrr/qui@6fe91e8): fix(trackericons): apply failure cooldown on timeouts ([#&#8203;1322](autobrr/qui#1322)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`35a50b5`](autobrr/qui@35a50b5): fix(web): add max-height to import workflow dialog ([#&#8203;1207](autobrr/qui#1207)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`5bd2706`](autobrr/qui@5bd2706): fix(web): hide redundant actions dropdown ([#&#8203;1305](autobrr/qui#1305)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`307907f`](autobrr/qui@307907f): fix(web): improve Reannounce In column display ([#&#8203;1320](autobrr/qui#1320)) ([@&#8203;soggy-cr0uton](https://github.com/soggy-cr0uton))
- [`7881bdc`](autobrr/qui@7881bdc): fix(web): make Add Instance dialog scrollable on small viewports ([#&#8203;1232](autobrr/qui#1232)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`bec5433`](autobrr/qui@bec5433): fix(web): make dialogs scrollable on small viewports ([#&#8203;1233](autobrr/qui#1233)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`0e47b9e`](autobrr/qui@0e47b9e): fix(web): prevent nested scroll containers on iOS ([#&#8203;1229](autobrr/qui#1229)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`f2f0616`](autobrr/qui@f2f0616): fix(web): redirect already authenticated users to dashboard ([#&#8203;1127](autobrr/qui#1127)) ([@&#8203;burritothief](https://github.com/burritothief))
- [`7a633cf`](autobrr/qui@7a633cf): fix(web): toast message when searching then adding cross-seeds ([#&#8203;1290](autobrr/qui#1290)) ([@&#8203;rybertm](https://github.com/rybertm))
- [`da14100`](autobrr/qui@da14100): fix(web): use fixed px for sidebar width instead of rem ([#&#8203;1313](autobrr/qui#1313)) ([@&#8203;soggy-cr0uton](https://github.com/soggy-cr0uton))

##### Other Changes

- [`c93a326`](autobrr/qui@c93a326): chore(deps): bump the golang group across 1 directory with 16 updates ([#&#8203;1261](autobrr/qui#1261)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`d3de074`](autobrr/qui@d3de074): chore(docs): clarify tracker pattern necessity in documentation ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`2351097`](autobrr/qui@2351097): chore(lint): Add Linting workflow to CI ([#&#8203;1270](autobrr/qui#1270)) ([@&#8203;Barcode-eng](https://github.com/Barcode-eng))
- [`e8436e3`](autobrr/qui@e8436e3): chore(lint): update linting base branch from main to develop ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`e36afc8`](autobrr/qui@e36afc8): chore: add Ko-fi funding and pre-commit config ([#&#8203;1315](autobrr/qui#1315)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`df4375e`](autobrr/qui@df4375e): chore: update copyright headers to 2025-2026 ([#&#8203;1303](autobrr/qui#1303)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`7a6f2d1`](autobrr/qui@7a6f2d1): docs(automations): clarify tag behavior ([#&#8203;1260](autobrr/qui#1260)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`05e2028`](autobrr/qui@05e2028): refactor(build): cross platform building ([#&#8203;1060](autobrr/qui#1060)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`6355f4f`](autobrr/qui@6355f4f): refactor(crosssed): require full recheck for disc based content ([#&#8203;1168](autobrr/qui#1168)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`7466a98`](autobrr/qui@7466a98): refactor(filesmanager): improve logging messages for orphan cleanup process ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`ad90209`](autobrr/qui@ad90209): refactor(orphan): improve disc based content handling ([#&#8203;1167](autobrr/qui#1167)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`3b85f8a`](autobrr/qui@3b85f8a): refactor(web): use TanStack Query for path autocomplete ([#&#8203;1309](autobrr/qui#1309)) ([@&#8203;soggy-cr0uton](https://github.com/soggy-cr0uton))

**Full Changelog**: <autobrr/qui@v1.12.0...v1.13.0>

#### Docker images

- `docker pull ghcr.io/autobrr/qui:v1.13.0`
- `docker pull ghcr.io/autobrr/qui:latest`

#### What to do next?

- Join our [Discord server](https://discord.autobrr.com/qui)

Thank you for using qui!

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42OS4yIiwidXBkYXRlZEluVmVyIjoiNDIuNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiaW1hZ2UiXX0=-->

Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/3540
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
Zmegolaz pushed a commit to Zmegolaz/qui that referenced this pull request Mar 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants