Skip to content

fix(orphanscan): use content_path to prevent false positives when Auto TMM changes save_path - #1712

Merged
s0up4200 merged 4 commits into
developfrom
fix/orphanscan-content-path-false-positives
Apr 3, 2026
Merged

fix(orphanscan): use content_path to prevent false positives when Auto TMM changes save_path#1712
s0up4200 merged 4 commits into
developfrom
fix/orphanscan-content-path-false-positives

Conversation

@nitrobass24

@nitrobass24 nitrobass24 commented Apr 3, 2026

Copy link
Copy Markdown
Contributor

Summary

  • When Auto TMM updates save_path to the category default without moving files, content_path still reflects the real location on disk
  • Orphan scan now derives the actual save path by stripping the file name suffix from content_path, registering file entries for both paths
  • Handles both single-file and folder torrents correctly (folder torrents include the folder prefix in the file name from qBittorrent's API)
  • Aligns with the approach already used in managedDeleteCleanupDir for delete cleanup

Test plan

  • Added TestBuildFileMapFromTorrents_ContentPathDivergesFromSavePath
  • Verified with 60TB cross-seed setup — Auto TMM torrents with diverging save_path/content_path no longer flagged as orphans
  • Both single-file (hash-suffixed folders) and folder torrents (tracker-name subdirs) confirmed working

Closes #1699

Summary by CodeRabbit

  • Bug Fixes
    • Improved file scanning accuracy for torrents with alternate content paths. The system now correctly identifies files when torrent content is organized in tracker-specific directories separate from the category root.

@coderabbitai

coderabbitai Bot commented Apr 3, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • ✅ Review completed - (🔄 Check again to review again)

Walkthrough

Modified buildFileMapFromTorrents to derive an actual file location from content_path when it diverges from the reported save_path. The function now adds entries for both paths when Auto TMM updates save_path without moving files. Added a test validating this scenario.

Changes

Cohort / File(s) Summary
Production Logic
internal/services/orphanscan/service.go
Enhanced buildFileMapFromTorrents to derive actualSavePath from content_path by trimming the first file's name suffix. When this path differs from both content_path and normalized save_path, adds it to scan roots and populates file entries, ensuring files are recognized despite Auto TMM path changes.
Test Coverage
internal/services/orphanscan/settling_test.go
Added TestBuildFileMapFromTorrents_ContentPathDivergesFromSavePath to verify buildFileMapFromTorrents correctly handles torrents where SavePath diverges from ContentPath, validating file map entries and scan roots from both locations.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

  • PR #1193: Refactors buildFileMapFromTorrents and surrounding flow in the same file, directly overlapping with this function enhancement
  • PR #1197: Introduces scan-root derivation logic that depends on accurate torrent path computation, complementing this fix's scan-root accuracy improvements

Suggested labels

bugfix, orphan, backend, tests

Poem

🐰 Ah, files that dance 'tween two paths did hide,
Content whispers true while SavePath lied,
Now both shall guide us to where they reside,
No orphans false — just the truth clarified!

🚥 Pre-merge checks | ✅ 4 | ❌ 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 (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: using content_path to fix false positives in orphan scanning when Auto TMM modifies save_path without moving files.
Linked Issues check ✅ Passed The changes fully address issue #1699 by modifying buildFileMapFromTorrents to register file entries from both save_path and the actual on-disk location derived from content_path, preventing false orphan detections.
Out of Scope Changes check ✅ Passed All changes are directly scoped to fixing the orphan scan false positive issue: one production change in service.go and one targeted test in settling_test.go covering the divergence scenario.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/orphanscan-content-path-false-positives

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
internal/services/orphanscan/service.go (1)

1170-1175: Remove title-specific debug branches from orphan scan logic.

Two hardcoded title checks ("True.Lies.1994") add non-functional, data-specific debug logging that should be removed per coding guidelines. These branches do not enforce behavior mechanically and serve only as documentation.

  • service.go (lines 1170–1175): Remove the strings.Contains(entry, "True.Lies.1994") branch and its debug log.
  • walker.go (lines 206–212): Remove the strings.Contains(path, "True.Lies.1994") branch and its debug log.
Removal examples

For service.go:

 				for _, f := range files {
 					entry := normalizePath(filepath.Join(actualSavePath, f.Name))
 					tfm.Add(entry)
-					if strings.Contains(entry, "True.Lies.1994") {
-						log.Debug().
-							Str("entry", entry).
-							Bool("verifyInMap", tfm.Has(normalizePath(entry))).
-							Msg("orphanscan: added content_path entry to file map")
-					}
 				}

For walker.go:

 	if strings.Contains(path, "True.Lies.1994") {
-		log.Debug().
-			Str("rawPath", path).
-			Str("normPath", normPath).
-			Bool("inMap", w.tfm.Has(normPath)).
-			Msg("orphanscan: walker debug for True.Lies")
-	}
 	if w.tfm.Has(normPath) {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@internal/services/orphanscan/service.go` around lines 1170 - 1175, Remove the
title-specific debug branches that check for strings.Contains(...,
"True.Lies.1994") in the orphan scan logic: delete the conditional block in
service.go that wraps the log.Debug() call around strings.Contains(entry,
"True.Lies.1994") (the block that logs Str("entry", entry).Bool("verifyInMap",
tfm.Has(normalizePath(entry))).Msg(...)), and likewise remove the similar
conditional and debug log in walker.go that checks strings.Contains(path,
"True.Lies.1994"); leave the surrounding logic intact (e.g., keep any file-map
additions or normalization such as normalizePath(entry) and tfm.Has calls) but
eliminate these hardcoded, data-specific logging branches.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@internal/services/orphanscan/service.go`:
- Around line 1170-1175: Remove the title-specific debug branches that check for
strings.Contains(..., "True.Lies.1994") in the orphan scan logic: delete the
conditional block in service.go that wraps the log.Debug() call around
strings.Contains(entry, "True.Lies.1994") (the block that logs Str("entry",
entry).Bool("verifyInMap", tfm.Has(normalizePath(entry))).Msg(...)), and
likewise remove the similar conditional and debug log in walker.go that checks
strings.Contains(path, "True.Lies.1994"); leave the surrounding logic intact
(e.g., keep any file-map additions or normalization such as normalizePath(entry)
and tfm.Has calls) but eliminate these hardcoded, data-specific logging
branches.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: fc95d4be-6b46-4947-bb61-a1a3fe970915

📥 Commits

Reviewing files that changed from the base of the PR and between 2e590e1 and a38474a.

📒 Files selected for processing (1)
  • internal/services/orphanscan/service.go

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
internal/services/orphanscan/service.go (1)

159-168: Add defensive check for empty or non-absolute actualSavePath.

The TrimSuffix operation could produce an empty string in edge cases (e.g., if contentPath is at the filesystem root like /file.mkv). While extremely unlikely in practice, this would result in relative paths being added to the file map, which wouldn't match during the absolute-path walk.

🛡️ Suggested defensive fix
 		contentPath := filepath.Clean(torrent.ContentPath)
 		if contentPath != "" && filepath.IsAbs(contentPath) && len(files) > 0 {
 			firstFileName := filepath.Clean(files[0].Name)
 			actualSavePath := strings.TrimSuffix(contentPath, string(filepath.Separator)+firstFileName)
-			if actualSavePath != contentPath && actualSavePath != savePath {
+			if actualSavePath != "" && filepath.IsAbs(actualSavePath) && actualSavePath != contentPath && actualSavePath != savePath {
 				scanRoots[actualSavePath] = struct{}{}
 				for _, f := range files {
 					tfm.Add(normalizePath(filepath.Join(actualSavePath, f.Name)))
 				}
 			}
 		}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@internal/services/orphanscan/service.go` around lines 159 - 168, The loop
currently relies on normalizePath but doesn't guard against TrimSuffix producing
an empty or non-absolute actualSavePath; add a defensive check so empty or
non-absolute normalized paths are skipped. Update normalizePath (or immediately
after calling it in the loop that iterates over a and b) to return/skip when the
result is "" or when filepath.IsAbs(normalized) is false (i.e., treat those as
invalid by continuing the loop), and ensure this check covers values produced by
the TrimSuffix path transformation (actualSavePath) so no relative/empty paths
are added to the file map.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@internal/services/orphanscan/service.go`:
- Around line 159-168: The loop currently relies on normalizePath but doesn't
guard against TrimSuffix producing an empty or non-absolute actualSavePath; add
a defensive check so empty or non-absolute normalized paths are skipped. Update
normalizePath (or immediately after calling it in the loop that iterates over a
and b) to return/skip when the result is "" or when filepath.IsAbs(normalized)
is false (i.e., treat those as invalid by continuing the loop), and ensure this
check covers values produced by the TrimSuffix path transformation
(actualSavePath) so no relative/empty paths are added to the file map.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 6f05b550-d693-4f05-982d-ed7e3c141e27

📥 Commits

Reviewing files that changed from the base of the PR and between a38474a and c460aa3.

📒 Files selected for processing (2)
  • internal/services/orphanscan/service.go
  • internal/services/orphanscan/settling_test.go
✅ Files skipped from review due to trivial changes (1)
  • internal/services/orphanscan/settling_test.go

@nitrobass24
nitrobass24 force-pushed the fix/orphanscan-content-path-false-positives branch from c460aa3 to 3126ac2 Compare April 3, 2026 03:43
@nitrobass24
nitrobass24 changed the base branch from nitrobass24-testing to develop April 3, 2026 03:43
…o TMM changes save_path

When Auto TMM updates save_path to the category default without moving
files, content_path still reflects the real location on disk. Orphan
scan previously built its file map exclusively from save_path, causing
files at the original location to be falsely flagged as orphans.

Derive the actual save path by stripping the file name suffix from
content_path and register file entries for both paths. This handles
both single-file and folder torrents correctly.

Closes #1699
@nitrobass24
nitrobass24 force-pushed the fix/orphanscan-content-path-false-positives branch from 3126ac2 to a0a368d Compare April 3, 2026 03:45

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@internal/services/orphanscan/service.go`:
- Around line 1152-1168: The code derives an actualSavePath from
torrent.ContentPath but only applies it to the current instance’s file map; to
ensure cross-instance overlap checks see the same root, include that
content-derived root in the set returned/used by scanRootsFromTorrents() (and
therefore by buildInstanceScanRoots()); update scanRootsFromTorrents() (or the
scanRoots collection it returns) to add actualSavePath when computed (same
conditions used now) so buildFileMap()/MergeFrom() will consider the
content-derived root for overlap detection across instances.
- Around line 1159-1164: The current logic trims the first file name from
torrent.ContentPath using strings.TrimSuffix which yields empty string for
root-level paths (e.g., "/file.mkv") and drops the volume separator for Windows
(e.g., "D:\file.mkv" -> "D:"), causing root/volume roots to be skipped; replace
the TrimSuffix approach with filepath.Dir(torrent.ContentPath) to compute
actualSavePath, and if that returns "" or a volume-only path, normalize it to
the proper filesystem root (use string(filepath.Separator) for Unix roots or
filepath.VolumeName(contentPath)+string(filepath.Separator) for Windows) before
checking IsAbs and comparing to contentPath/savePath, then add the normalized
actualSavePath into scanRoots as before (referencing contentPath, files[0].Name,
actualSavePath, scanRoots, savePath).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: f2be6044-f05d-4371-8bcf-33c9eab79be9

📥 Commits

Reviewing files that changed from the base of the PR and between a38474a and a0a368d.

📒 Files selected for processing (2)
  • internal/services/orphanscan/service.go
  • internal/services/orphanscan/settling_test.go
✅ Files skipped from review due to trivial changes (1)
  • internal/services/orphanscan/settling_test.go

Comment thread internal/services/orphanscan/service.go Outdated
Comment thread internal/services/orphanscan/service.go Outdated
For multi-file torrents, content_path is the folder itself (not a file
path), so TrimSuffix with the file name doesn't match. Fall back to
filepath.Dir to derive the actual save path in this case.
@nitrobass24
nitrobass24 changed the base branch from develop to nitrobass24-testing April 3, 2026 03:58
@nitrobass24
nitrobass24 changed the base branch from nitrobass24-testing to develop April 3, 2026 04:12
@nitrobass24

Copy link
Copy Markdown
Contributor Author

@s0up4200 I have a few open PRs, but this one is the most urgent fix. Orphan Scan deleted about 10TB of torrents before I figured out what was happening.

@s0up4200

s0up4200 commented Apr 3, 2026

Copy link
Copy Markdown
Collaborator

@s0up4200 I have a few open PRs, but this one is the most urgent fix. Orphan Scan deleted about 10TB of torrents before I figured out what was happening.

Man, thats one nasty bug. Hope you can recover :/

Your fix seem correct, but there was one more place still relying on save_path only. I updated the cross-instance overlap check to use content_path as well so the same false positive cant happen in shared disk multi-instance setups. Let me know what you think.

@nitrobass24

Copy link
Copy Markdown
Contributor Author

Code changes look good and I just did a test in my live environment and it works as intended. Ready to go!

@s0up4200
s0up4200 merged commit d16fee2 into develop Apr 3, 2026
16 checks passed
@s0up4200
s0up4200 deleted the fix/orphanscan-content-path-false-positives branch April 3, 2026 18:28
eleboucher pushed a commit to eleboucher/homelab that referenced this pull request Apr 7, 2026
…#90)

This PR contains the following updates:

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

---

### Release Notes

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

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

[Compare Source](autobrr/qui@v1.15.0...v1.16.0)

##### Changelog

##### Highlights

- Automations got a major upgrade: rules can now match across instances, use system time, control AutoTMM, and opt out of notifications per workflow.
- Cross-seed is more reliable during state changes. Completion searches now wait for torrents to finish checking or moving, disabled instances are skipped cleanly, and hardlink/reflink save-path handling is more accurate.
- Dir Scan works better with real media libraries, with improved partial season-pack handling in link-tree mode, support for downloading missing files when needed, and better progress retention across restarts.
- Managing torrents in the unified view is smoother, with more accurate tracker health, quicker instance-level actions, and more stable category and tag editing dialogs.
- OIDC and backups both got practical quality-of-life improvements: OIDC now supports PKCE, backup settings can be applied across instances, and backup export handling is safer for tricky torrent layouts.

##### New Features

- [`2b92c7b`](autobrr/qui@2b92c7b): feat(auth): add PKCE support to OIDC implementation ([#&#8203;1737](autobrr/qui#1737)) ([@&#8203;oynqr](https://github.com/oynqr))
- [`ba3d5d9`](autobrr/qui@ba3d5d9): feat(automations): add AutoTMM condition and action ([#&#8203;1698](autobrr/qui#1698)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`702e808`](autobrr/qui@702e808): feat(automations): add system time to query builder ([#&#8203;1677](autobrr/qui#1677)) ([@&#8203;wastaken7](https://github.com/wastaken7))
- [`e6493b3`](autobrr/qui@e6493b3): feat(automations): allow disable of notifications ([#&#8203;1652](autobrr/qui#1652)) ([@&#8203;heathlarsen](https://github.com/heathlarsen))
- [`565ac2d`](autobrr/qui@565ac2d): feat(automations): cross instance condition ([#&#8203;1648](autobrr/qui#1648)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`7e12a02`](autobrr/qui@7e12a02): feat(update): verify self-updates with signed release checksums ([#&#8203;1665](autobrr/qui#1665)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`3778c7b`](autobrr/qui@3778c7b): feat(web): Add action buttons to unified instance. ([#&#8203;1637](autobrr/qui#1637)) ([@&#8203;drtaru](https://github.com/drtaru))
- [`bf9eaba`](autobrr/qui@bf9eaba): feat(web): Clarify dashboard quick links ([#&#8203;1636](autobrr/qui#1636)) ([@&#8203;drtaru](https://github.com/drtaru))
- [`b930530`](autobrr/qui@b930530): feat(web): add "Save changes to all instances" button to backup settings ([#&#8203;1651](autobrr/qui#1651)) ([@&#8203;drtaru](https://github.com/drtaru))
- [`5975c34`](autobrr/qui@5975c34): feat(web): add Discord perk section to license manager ([#&#8203;1656](autobrr/qui#1656)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`d8ad0d6`](autobrr/qui@d8ad0d6): feat(web): unify tab styling and animations ([#&#8203;1632](autobrr/qui#1632)) ([@&#8203;nuxencs](https://github.com/nuxencs))

##### Bug Fixes

- [`44596b9`](autobrr/qui@44596b9): fix(automations): add AutoTMM to condition validation ([#&#8203;1726](autobrr/qui#1726)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`8f757b2`](autobrr/qui@8f757b2): fix(automations): hardlink signature grouping ([#&#8203;1670](autobrr/qui#1670)) ([@&#8203;aulterego](https://github.com/aulterego))
- [`d242f0c`](autobrr/qui@d242f0c): fix(automations): include AutoManagement in delete standalone check ([#&#8203;1731](autobrr/qui#1731)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`744bdb8`](autobrr/qui@744bdb8): fix(backups): adaptive export throttle ([#&#8203;1630](autobrr/qui#1630)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`d1dbb81`](autobrr/qui@d1dbb81): fix(backups): gate bulk save on resolved instance capabilities ([#&#8203;1682](autobrr/qui#1682)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`2eea961`](autobrr/qui@2eea961): fix(backups): skip live export for hybrid torrents ([#&#8203;1669](autobrr/qui#1669)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`2cac32d`](autobrr/qui@2cac32d): fix(crossseed): skip disabled instances ([#&#8203;1635](autobrr/qui#1635)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`ebbba8e`](autobrr/qui@ebbba8e): fix(crossseed): tone down async cache reuse log ([#&#8203;1686](autobrr/qui#1686)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`fd382b7`](autobrr/qui@fd382b7): fix(dirscan): link plan size tolerance + partial season pack injection in link tree mode ([#&#8203;1695](autobrr/qui#1695)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`5131092`](autobrr/qui@5131092): fix(dirscan): retain recent runs and clarify restart behavior ([#&#8203;1564](autobrr/qui#1564)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`3fbcc7a`](autobrr/qui@3fbcc7a): fix(openapi): document dirscan downloadMissingFiles ([#&#8203;1727](autobrr/qui#1727)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`d16fee2`](autobrr/qui@d16fee2): fix(orphanscan): use content\_path to prevent false positives when Auto TMM changes save\_path ([#&#8203;1712](autobrr/qui#1712)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`e74bf02`](autobrr/qui@e74bf02): fix(qbittorrent): avoid tracker health URL false positives ([#&#8203;1738](autobrr/qui#1738)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`632fc54`](autobrr/qui@632fc54): fix(torrents): honor tracker health in unified view ([#&#8203;1668](autobrr/qui#1668)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`76fddc4`](autobrr/qui@76fddc4): fix(torrents): stabilize tag and category dialogs ([#&#8203;1638](autobrr/qui#1638)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`c758b6d`](autobrr/qui@c758b6d): fix(torrents): validate creator output path ([#&#8203;1739](autobrr/qui#1739)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`6c23f0e`](autobrr/qui@6c23f0e): fix(web): cross-seed warning in unified view ([#&#8203;1692](autobrr/qui#1692)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`57822c0`](autobrr/qui@57822c0): fix(web): improve duplicate torrent state and check another field.state.value type in AddTorrentDialog ([#&#8203;1679](autobrr/qui#1679)) ([@&#8203;keatonhasse](https://github.com/keatonhasse))
- [`246c8f6`](autobrr/qui@246c8f6): fix(web): migrate vite chunk splitting config ([@&#8203;s0up4200](https://github.com/s0up4200))

##### Other Changes

- [`263b0bd`](autobrr/qui@263b0bd): build(deps): add cooldown to dependabot config ([#&#8203;1691](autobrr/qui#1691)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`a394157`](autobrr/qui@a394157): chore(deps): bump github.com/go-jose/go-jose/v4 from 4.1.3 to 4.1.4 ([#&#8203;1713](autobrr/qui#1713)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`10612a7`](autobrr/qui@10612a7): chore(deps): bump golang.org/x/image from 0.36.0 to 0.38.0 ([#&#8203;1685](autobrr/qui#1685)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`16019dd`](autobrr/qui@16019dd): chore(deps): bump pnpm/action-setup from 4 to 5 in the github group ([#&#8203;1634](autobrr/qui#1634)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`fbb25fc`](autobrr/qui@fbb25fc): chore(deps): bump the golang group with 11 updates ([#&#8203;1693](autobrr/qui#1693)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`cbb9594`](autobrr/qui@cbb9594): chore(deps): bump the golang group with 3 updates ([#&#8203;1701](autobrr/qui#1701)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`805ab74`](autobrr/qui@805ab74): chore(deps): bump the npm group in /web with 25 updates ([#&#8203;1694](autobrr/qui#1694)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`e3f839c`](autobrr/qui@e3f839c): chore(deps): bump the npm group in /web with 5 updates ([#&#8203;1702](autobrr/qui#1702)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`b076ad4`](autobrr/qui@b076ad4): docs(dirscan): clarify re-identification after torrent removal ([#&#8203;1720](autobrr/qui#1720)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`340f343`](autobrr/qui@340f343): docs: add license management page with deactivation guide ([#&#8203;1706](autobrr/qui#1706)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`5d148be`](autobrr/qui@5d148be): docs: fix link in issue triage template ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`0b64237`](autobrr/qui@0b64237): docs: update release follow-up docs ([#&#8203;1741](autobrr/qui#1741)) ([@&#8203;s0up4200](https://github.com/s0up4200))

**Full Changelog**: <autobrr/qui@v1.15.0...v1.16.0>

##### Docker images

- `docker pull ghcr.io/autobrr/qui:v1.16.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 becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates 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:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL21pbm9yIl19-->

Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/90
Co-authored-by: bot-owl <bot@erwanleboucher.dev>
Co-committed-by: bot-owl <bot@erwanleboucher.dev>
hbjydev pushed a commit to hbjydev/phoebe that referenced this pull request May 29, 2026
… ) (#12)

This PR contains the following updates:

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

---

### Release Notes

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

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

[Compare Source](autobrr/qui@v1.18.0...v1.19.0)

##### Changelog

##### New Features

- [`e26bd6b`](autobrr/qui@e26bd6b): feat(actions): include web-dist in release artifacts ([#&#8203;1801](autobrr/qui#1801)) ([@&#8203;turtletowerz](https://github.com/turtletowerz))
- [`2fabce1`](autobrr/qui@2fabce1): feat(automations): add export to instance action ([#&#8203;1736](autobrr/qui#1736)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`3fca808`](autobrr/qui@3fca808): feat(instances): api key authentication ([#&#8203;1854](autobrr/qui#1854)) ([@&#8203;martylukyy](https://github.com/martylukyy))
- [`4ab1a75`](autobrr/qui@4ab1a75): feat(qbittorrent): show process uptime ([#&#8203;1849](autobrr/qui#1849)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`292ef70`](autobrr/qui@292ef70): feat(torrents): hide filter icon when not active or hovering over ([#&#8203;1869](autobrr/qui#1869)) ([@&#8203;martylukyy](https://github.com/martylukyy))
- [`3c5cf3b`](autobrr/qui@3c5cf3b): feat(torrents): implement auto-fit width for columns on double-click ([#&#8203;1867](autobrr/qui#1867)) ([@&#8203;martylukyy](https://github.com/martylukyy))
- [`5a9c538`](autobrr/qui@5a9c538): feat(torrents): set comment ([#&#8203;1928](autobrr/qui#1928)) ([@&#8203;martylukyy](https://github.com/martylukyy))
- [`754f642`](autobrr/qui@754f642): feat(torrents): support new share limit parameters ([#&#8203;1872](autobrr/qui#1872)) ([@&#8203;martylukyy](https://github.com/martylukyy))
- [`06a5fb6`](autobrr/qui@06a5fb6): feat(torrents): update AddTorrent methods for qbit 5.2.x support ([#&#8203;1902](autobrr/qui#1902)) ([@&#8203;zze0s](https://github.com/zze0s))
- [`45e3adc`](autobrr/qui@45e3adc): feat: add support for monitored folders ([#&#8203;1847](autobrr/qui#1847)) ([@&#8203;martylukyy](https://github.com/martylukyy))

##### Bug Fixes

- [`77c7ae8`](autobrr/qui@77c7ae8): fix(automations): discard add torrent response ([#&#8203;1904](autobrr/qui#1904)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`7a368f1`](autobrr/qui@7a368f1): fix(ci): repair docs and release builds ([#&#8203;1932](autobrr/qui#1932)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`8bd114e`](autobrr/qui@8bd114e): fix(crossseed): normalize empty qbit metadata ([#&#8203;1887](autobrr/qui#1887)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`92d66f9`](autobrr/qui@92d66f9): fix(crossseed): reuse shared string normalizer to stop goroutine leak ([#&#8203;1909](autobrr/qui#1909)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`3c5d32a`](autobrr/qui@3c5d32a): fix(crossseed): run external programs after link-mode injection ([#&#8203;1874](autobrr/qui#1874)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`b02d2a9`](autobrr/qui@b02d2a9): fix(qbittorrent): handle forced subcategories ([#&#8203;1863](autobrr/qui#1863)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`83cdb01`](autobrr/qui@83cdb01): fix(qbittorrent): handle new tracker statuses ([#&#8203;1879](autobrr/qui#1879)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`b358ab4`](autobrr/qui@b358ab4): fix(rss): mirror torrentParams to legacy flat fields for qBit < 5.0 compat ([#&#8203;1846](autobrr/qui#1846)) ([@&#8203;frrad](https://github.com/frrad))
- [`5bcf648`](autobrr/qui@5bcf648): fix(seasonpacker): windows path handling ([#&#8203;1910](autobrr/qui#1910)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`7de10c4`](autobrr/qui@7de10c4): fix(torrents): clear filters in unified-view empty state ([#&#8203;1898](autobrr/qui#1898)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`38f7bd3`](autobrr/qui@38f7bd3): fix(web): Show collapsed folders when searching torrent contents ([#&#8203;1850](autobrr/qui#1850)) ([@&#8203;ewenjo](https://github.com/ewenjo))
- [`d70d0bb`](autobrr/qui@d70d0bb): fix(web): keep showing torrent column filter icons on touch devices ([#&#8203;1881](autobrr/qui#1881)) ([@&#8203;martylukyy](https://github.com/martylukyy))
- [`cecbad7`](autobrr/qui@cecbad7): fix(web): select-all bulk actions delete more torrents than visible when filters are stacked ([#&#8203;1926](autobrr/qui#1926)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`780c4aa`](autobrr/qui@780c4aa): fix(web): sidebar element collisions ([#&#8203;1876](autobrr/qui#1876)) ([@&#8203;martylukyy](https://github.com/martylukyy))
- [`b621973`](autobrr/qui@b621973): fix(web): use unique keys for duplicate search results ([#&#8203;1886](autobrr/qui#1886)) ([@&#8203;GtwoK](https://github.com/GtwoK))

##### Other Changes

- [`ffda071`](autobrr/qui@ffda071): chore(deps): bump [@&#8203;babel/plugin-transform-modules-systemjs](https://github.com/babel/plugin-transform-modules-systemjs) from 7.28.5 to 7.29.4 in /documentation ([#&#8203;1889](autobrr/qui#1889)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`89ab1c8`](autobrr/qui@89ab1c8): chore(deps): bump [@&#8203;babel/plugin-transform-modules-systemjs](https://github.com/babel/plugin-transform-modules-systemjs) from 7.29.0 to 7.29.4 in /web ([#&#8203;1888](autobrr/qui#1888)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`c420bb2`](autobrr/qui@c420bb2): chore(deps): bump follow-redirects from 1.15.11 to 1.16.0 in /documentation ([#&#8203;1903](autobrr/qui#1903)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`28e4bf9`](autobrr/qui@28e4bf9): chore(deps): bump the github group with 2 updates ([#&#8203;1894](autobrr/qui#1894)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`9b241de`](autobrr/qui@9b241de): chore(deps): bump the github group with 3 updates ([#&#8203;1861](autobrr/qui#1861)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`4872577`](autobrr/qui@4872577): chore(deps): bump webpack-dev-server from 5.2.2 to 5.2.4 in /documentation ([#&#8203;1908](autobrr/qui#1908)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`3e3ec8b`](autobrr/qui@3e3ec8b): chore(deps): bump ws from 8.18.3 to 8.20.1 in /documentation ([#&#8203;1907](autobrr/qui#1907)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`25cf511`](autobrr/qui@25cf511): chore(web): migrate to pnpm 11 ([#&#8203;1883](autobrr/qui#1883)) ([@&#8203;martylukyy](https://github.com/martylukyy))
- [`4b6dce1`](autobrr/qui@4b6dce1): docs: add shared agent instructions symlink ([#&#8203;1911](autobrr/qui#1911)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`97df42c`](autobrr/qui@97df42c): other(docs): resolve 5 Dependabot security alerts on Docs Site ([#&#8203;1906](autobrr/qui#1906)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`5068a4d`](autobrr/qui@5068a4d): refactor(crossseed): gather all results for matching and refine TV based searching ([#&#8203;1871](autobrr/qui#1871)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`9d3e245`](autobrr/qui@9d3e245): refactor(crossseed): improve anime/AKA handling ([#&#8203;1882](autobrr/qui#1882)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`6f2b94c`](autobrr/qui@6f2b94c): refactor(torrents): drop unused rename props from TorrentContextMenu ([#&#8203;1900](autobrr/qui#1900)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`3ec0605`](autobrr/qui@3ec0605): refactor(web): clean up 180 multiline-ternary warnings repo-wide ([#&#8203;1905](autobrr/qui#1905)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))

**Full Changelog**: <autobrr/qui@v1.18.0...v1.19.0>

##### Docker images

- `docker pull ghcr.io/autobrr/qui:v1.19.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!

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

[Compare Source](autobrr/qui@v1.17.0...v1.18.0)

##### Changelog

##### New Features

- [`b708bc8`](autobrr/qui@b708bc8): feat(automations): add UPLOADED\_OVER\_SIZE condition field ([#&#8203;1830](autobrr/qui#1830)) ([@&#8203;com6056](https://github.com/com6056))
- [`565731e`](autobrr/qui@565731e): feat(automations): cross-instance HARDLINK\_SCOPE\_CROSS ([#&#8203;1810](autobrr/qui#1810)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`a284860`](autobrr/qui@a284860): feat(dirscan): add webhook download client filters ([#&#8203;1751](autobrr/qui#1751)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`fd54124`](autobrr/qui@fd54124): feat(web): Add option to copy magnet link from the context menu ([#&#8203;1835](autobrr/qui#1835)) ([@&#8203;pietrocaselani](https://github.com/pietrocaselani))

##### Bug Fixes

- [`ea33304`](autobrr/qui@ea33304): fix(crossseed): broaden TV/movie torznab categories and skip year on TV ([#&#8203;1822](autobrr/qui#1822)) ([@&#8203;imSp4rky](https://github.com/imSp4rky))
- [`3c3f944`](autobrr/qui@3c3f944): fix(license): unblock stale polar license migration ([#&#8203;1799](autobrr/qui#1799)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`941cf42`](autobrr/qui@941cf42): fix(qbit): stop serving stale maindata to the status bar ([#&#8203;1785](autobrr/qui#1785)) ([@&#8203;Zariel](https://github.com/Zariel))
- [`ca7590a`](autobrr/qui@ca7590a): fix(rss): populate legacy assignedCategory for qBittorrent < 5.0 comp… ([#&#8203;1836](autobrr/qui#1836)) ([@&#8203;frrad](https://github.com/frrad))
- [`278441a`](autobrr/qui@278441a): fix(settings): explain disabled API keys ([#&#8203;1826](autobrr/qui#1826)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`0f4eb52`](autobrr/qui@0f4eb52): fix(web): remove deprecated tsconfig baseUrl ([#&#8203;1840](autobrr/qui#1840)) ([@&#8203;s0up4200](https://github.com/s0up4200))

##### Other Changes

- [`c6dbf9a`](autobrr/qui@c6dbf9a): chore(deps): bump postcss from 8.5.6 to 8.5.10 in /documentation ([#&#8203;1837](autobrr/qui#1837)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`053c171`](autobrr/qui@053c171): chore(deps): bump the github group across 1 directory with 3 updates ([#&#8203;1834](autobrr/qui#1834)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`4cbedac`](autobrr/qui@4cbedac): chore(deps): bump the golang group with 15 updates ([#&#8203;1832](autobrr/qui#1832)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`dd661e8`](autobrr/qui@dd661e8): chore(deps): bump the npm group in /web with 20 updates ([#&#8203;1833](autobrr/qui#1833)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`82029d6`](autobrr/qui@82029d6): chore(deps): update go-qbittorrent for new qbt 5.2.x webAPI version ([#&#8203;1841](autobrr/qui#1841)) ([@&#8203;martylukyy](https://github.com/martylukyy))
- [`6b5b82e`](autobrr/qui@6b5b82e): refactor(time): use seconds and cleanup ([#&#8203;1823](autobrr/qui#1823)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`f5cb0c1`](autobrr/qui@f5cb0c1): refactor: O(n²) cross-seed lookups in automations preview and execution paths ([#&#8203;1829](autobrr/qui#1829)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))

**Full Changelog**: <autobrr/qui@v1.17.0...v1.18.0>

##### Docker images

- `docker pull ghcr.io/autobrr/qui:v1.18.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!

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

[Compare Source](autobrr/qui@v1.16.1...v1.17.0)

##### Changelog

##### Bug Fixes

- [`52c5e73`](autobrr/qui@52c5e73): fix(automations): clarify cross-seed condition labels ([#&#8203;1763](autobrr/qui#1763)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`70e0032`](autobrr/qui@70e0032): fix(crossseed): skip link-mode category path warnings ([#&#8203;1753](autobrr/qui#1753)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`85df3e7`](autobrr/qui@85df3e7): fix(orphanscan): align content path root detection ([#&#8203;1771](autobrr/qui#1771)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`117d617`](autobrr/qui@117d617): fix(orphanscan): ignore qBittorrent incomplete files ([#&#8203;1761](autobrr/qui#1761)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`388415e`](autobrr/qui@388415e): fix(web): fix add torrent/magnet urls ([#&#8203;1762](autobrr/qui#1762)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))

##### Other Changes

- [`845599a`](autobrr/qui@845599a): chore(ci): speed up CI pipeline (9.3 min → 4.3 min for PRs) ([#&#8203;1750](autobrr/qui#1750)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`2b09cf3`](autobrr/qui@2b09cf3): chore: trim embedded web assets and Docker build context ([#&#8203;1723](autobrr/qui#1723)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`5262f7c`](autobrr/qui@5262f7c): docs: add migration PR guidance ([#&#8203;1748](autobrr/qui#1748)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`65c7046`](autobrr/qui@65c7046): refactor(search): table & cards cleanup ([#&#8203;1768](autobrr/qui#1768)) ([@&#8203;nuxencs](https://github.com/nuxencs))

**Full Changelog**: <autobrr/qui@v1.16.1...v1.17.0>

##### Docker images

- `docker pull ghcr.io/autobrr/qui:v1.17.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!

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

[Compare Source](autobrr/qui@v1.16.0...v1.16.1)

##### Changelog

##### Bug Fixes

- [`e177ad9`](autobrr/qui@e177ad9): fix(auth): harden OIDC PKCE flow ([#&#8203;1746](autobrr/qui#1746)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`393e2b7`](autobrr/qui@393e2b7): fix(dirscan): tighten flexible matching and improve diagnostics ([#&#8203;1742](autobrr/qui#1742)) ([@&#8203;s0up4200](https://github.com/s0up4200))

**Full Changelog**: <autobrr/qui@v1.16.0...v1.16.1>

##### Docker images

- `docker pull ghcr.io/autobrr/qui:v1.16.1`
- `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!

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

[Compare Source](autobrr/qui@v1.15.0...v1.16.0)

##### Changelog

##### Highlights

- Automations got a major upgrade: rules can now match across instances, use system time, control AutoTMM, and opt out of notifications per workflow.
- Cross-seed is more reliable during state changes. Completion searches now wait for torrents to finish checking or moving, disabled instances are skipped cleanly, and hardlink/reflink save-path handling is more accurate.
- Dir Scan works better with real media libraries, with improved partial season-pack handling in link-tree mode, support for downloading missing files when needed, and better progress retention across restarts.
- Managing torrents in the unified view is smoother, with more accurate tracker health, quicker instance-level actions, and more stable category and tag editing dialogs.
- OIDC and backups both got practical quality-of-life improvements: OIDC now supports PKCE, backup settings can be applied across instances, and backup export handling is safer for tricky torrent layouts.

##### New Features

- [`2b92c7b`](autobrr/qui@2b92c7b): feat(auth): add PKCE support to OIDC implementation ([#&#8203;1737](autobrr/qui#1737)) ([@&#8203;oynqr](https://github.com/oynqr))
- [`ba3d5d9`](autobrr/qui@ba3d5d9): feat(automations): add AutoTMM condition and action ([#&#8203;1698](autobrr/qui#1698)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`702e808`](autobrr/qui@702e808): feat(automations): add system time to query builder ([#&#8203;1677](autobrr/qui#1677)) ([@&#8203;wastaken7](https://github.com/wastaken7))
- [`e6493b3`](autobrr/qui@e6493b3): feat(automations): allow disable of notifications ([#&#8203;1652](autobrr/qui#1652)) ([@&#8203;heathlarsen](https://github.com/heathlarsen))
- [`565ac2d`](autobrr/qui@565ac2d): feat(automations): cross instance condition ([#&#8203;1648](autobrr/qui#1648)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`7e12a02`](autobrr/qui@7e12a02): feat(update): verify self-updates with signed release checksums ([#&#8203;1665](autobrr/qui#1665)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`3778c7b`](autobrr/qui@3778c7b): feat(web): Add action buttons to unified instance. ([#&#8203;1637](autobrr/qui#1637)) ([@&#8203;drtaru](https://github.com/drtaru))
- [`bf9eaba`](autobrr/qui@bf9eaba): feat(web): Clarify dashboard quick links ([#&#8203;1636](autobrr/qui#1636)) ([@&#8203;drtaru](https://github.com/drtaru))
- [`b930530`](autobrr/qui@b930530): feat(web): add "Save changes to all instances" button to backup settings ([#&#8203;1651](autobrr/qui#1651)) ([@&#8203;drtaru](https://github.com/drtaru))
- [`5975c34`](autobrr/qui@5975c34): feat(web): add Discord perk section to license manager ([#&#8203;1656](autobrr/qui#1656)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`d8ad0d6`](autobrr/qui@d8ad0d6): feat(web): unify tab styling and animations ([#&#8203;1632](autobrr/qui#1632)) ([@&#8203;nuxencs](https://github.com/nuxencs))

##### Bug Fixes

- [`44596b9`](autobrr/qui@44596b9): fix(automations): add AutoTMM to condition validation ([#&#8203;1726](autobrr/qui#1726)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`8f757b2`](autobrr/qui@8f757b2): fix(automations): hardlink signature grouping ([#&#8203;1670](autobrr/qui#1670)) ([@&#8203;aulterego](https://github.com/aulterego))
- [`d242f0c`](autobrr/qui@d242f0c): fix(automations): include AutoManagement in delete standalone check ([#&#8203;1731](autobrr/qui#1731)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`744bdb8`](autobrr/qui@744bdb8): fix(backups): adaptive export throttle ([#&#8203;1630](autobrr/qui#1630)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`d1dbb81`](autobrr/qui@d1dbb81): fix(backups): gate bulk save on resolved instance capabilities ([#&#8203;1682](autobrr/qui#1682)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`2eea961`](autobrr/qui@2eea961): fix(backups): skip live export for hybrid torrents ([#&#8203;1669](autobrr/qui#1669)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`2cac32d`](autobrr/qui@2cac32d): fix(crossseed): skip disabled instances ([#&#8203;1635](autobrr/qui#1635)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`ebbba8e`](autobrr/qui@ebbba8e): fix(crossseed): tone down async cache reuse log ([#&#8203;1686](autobrr/qui#1686)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`fd382b7`](autobrr/qui@fd382b7): fix(dirscan): link plan size tolerance + partial season pack injection in link tree mode ([#&#8203;1695](autobrr/qui#1695)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`5131092`](autobrr/qui@5131092): fix(dirscan): retain recent runs and clarify restart behavior ([#&#8203;1564](autobrr/qui#1564)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`3fbcc7a`](autobrr/qui@3fbcc7a): fix(openapi): document dirscan downloadMissingFiles ([#&#8203;1727](autobrr/qui#1727)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`d16fee2`](autobrr/qui@d16fee2): fix(orphanscan): use content\_path to prevent false positives when Auto TMM changes save\_path ([#&#8203;1712](autobrr/qui#1712)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`e74bf02`](autobrr/qui@e74bf02): fix(qbittorrent): avoid tracker health URL false positives ([#&#8203;1738](autobrr/qui#1738)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`632fc54`](autobrr/qui@632fc54): fix(torrents): honor tracker health in unified view ([#&#8203;1668](autobrr/qui#1668)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`76fddc4`](autobrr/qui@76fddc4): fix(torrents): stabilize tag and category dialogs ([#&#8203;1638](autobrr/qui#1638)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`c758b6d`](autobrr/qui@c758b6d): fix(torrents): validate creator output path ([#&#8203;1739](autobrr/qui#1739)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`6c23f0e`](autobrr/qui@6c23f0e): fix(web): cross-seed warning in unified view ([#&#8203;1692](autobrr/qui#1692)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`57822c0`](autobrr/qui@57822c0): fix(web): improve duplicate torrent state and check another field.state.value type in AddTorrentDialog ([#&#8203;1679](autobrr/qui#1679)) ([@&#8203;keatonhasse](https://github.com/keatonhasse))
- [`246c8f6`](autobrr/qui@246c8f6): fix(web): migrate vite chunk splitting config ([@&#8203;s0up4200](https://github.com/s0up4200))

##### Other Changes

- [`263b0bd`](autobrr/qui@263b0bd): build(deps): add cooldown to dependabot config ([#&#8203;1691](autobrr/qui#1691)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`a394157`](autobrr/qui@a394157): chore(deps): bump github.com/go-jose/go-jose/v4 from 4.1.3 to 4.1.4 ([#&#8203;1713](autobrr/qui#1713)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`10612a7`](autobrr/qui@10612a7): chore(deps): bump golang.org/x/image from 0.36.0 to 0.38.0 ([#&#8203;1685](autobrr/qui#1685)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`16019dd`](autobrr/qui@16019dd): chore(deps): bump pnpm/action-setup from 4 to 5 in the github group ([#&#8203;1634](autobrr/qui#1634)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`fbb25fc`](autobrr/qui@fbb25fc): chore(deps): bump the golang group with 11 updates ([#&#8203;1693](autobrr/qui#1693)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`cbb9594`](autobrr/qui@cbb9594): chore(deps): bump the golang group with 3 updates ([#&#8203;1701](autobrr/qui#1701)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`805ab74`](autobrr/qui@805ab74): chore(deps): bump the npm group in /web with 25 updates ([#&#8203;1694](autobrr/qui#1694)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`e3f839c`](autobrr/qui@e3f839c): chore(deps): bump the npm group in /web with 5 updates ([#&#8203;1702](autobrr/qui#1702)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`b076ad4`](autobrr/qui@b076ad4): docs(dirscan): clarify re-identification after torrent removal ([#&#8203;1720](autobrr/qui#1720)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`340f343`](autobrr/qui@340f343): docs: add license management page with deactivation guide ([#&#8203;1706](autobrr/qui#1706)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`5d148be`](autobrr/qui@5d148be): docs: fix link in issue triage template ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`0b64237`](autobrr/qui@0b64237): docs: update release follow-up docs ([#&#8203;1741](autobrr/qui#1741)) ([@&#8203;s0up4200](https://github.com/s0up4200))

**Full Changelog**: <autobrr/qui@v1.15.0...v1.16.0>

##### Docker images

- `docker pull ghcr.io/autobrr/qui:v1.16.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!

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

[Compare Source](autobrr/qui@v1.14.1...v1.15.0)

##### Changelog

##### Breaking change

CORS is disabled by default; enable by setting QUI\_\_CORS\_ALLOWED\_ORIGINS with explicit origins (http(s)://host\[:port]). See <https://getqui.com/docs/advanced/sso-proxy-cors>

##### New Features

- [`93786a2`](autobrr/qui@93786a2): feat(automations): add configurable processing priority/sorting ([#&#8203;1235](autobrr/qui#1235)) ([@&#8203;Oscariremma](https://github.com/Oscariremma))
- [`45eaf1f`](autobrr/qui@45eaf1f): feat(database): add postgres and sqlite migration CLI ([#&#8203;1530](autobrr/qui#1530)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`430f5d1`](autobrr/qui@430f5d1): feat(torrents): mediaInfo dialog ([#&#8203;1537](autobrr/qui#1537)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`8eb8903`](autobrr/qui@8eb8903): feat(web): Add persistence to unified instance filter in sidebar ([#&#8203;1560](autobrr/qui#1560)) ([@&#8203;drtaru](https://github.com/drtaru))
- [`7aadde7`](autobrr/qui@7aadde7): feat(web): add path autocomplete to set location dialog ([#&#8203;1432](autobrr/qui#1432)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`077f32c`](autobrr/qui@077f32c): feat: add mediainfo api endpoint ([#&#8203;1545](autobrr/qui#1545)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`99cf695`](autobrr/qui@99cf695): feat: endpoint to trigger directory scans from external tools ([#&#8203;1559](autobrr/qui#1559)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`8956f9b`](autobrr/qui@8956f9b): feat: unify bulk tag editor ([#&#8203;1571](autobrr/qui#1571)) ([@&#8203;s0up4200](https://github.com/s0up4200))

##### Bug Fixes

- [`552d617`](autobrr/qui@552d617): fix(api): align add torrent OpenAPI field ([#&#8203;1617](autobrr/qui#1617)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`424f7a0`](autobrr/qui@424f7a0): fix(api): restrict CORS to explicit allowlist ([#&#8203;1551](autobrr/qui#1551)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`38991d8`](autobrr/qui@38991d8): fix(auth): allow loopback health probes ([#&#8203;1621](autobrr/qui#1621)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`4ae88c9`](autobrr/qui@4ae88c9): fix(automations): align include-cross-seeds category apply ([#&#8203;1517](autobrr/qui#1517)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`6a127a8`](autobrr/qui@6a127a8): fix(automations): scope skipWithin to only deleted action ([#&#8203;1538](autobrr/qui#1538)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`c776189`](autobrr/qui@c776189): fix(crossseed): avoid completion timeout misses on non-Gazelle torrents ([#&#8203;1536](autobrr/qui#1536)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`b1338a7`](autobrr/qui@b1338a7): fix(crossseed): handle missing webhook collection tags ([#&#8203;1610](autobrr/qui#1610)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`eacbb68`](autobrr/qui@eacbb68): fix(crossseed): normalize hdr aliases ([#&#8203;1572](autobrr/qui#1572)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`537ad46`](autobrr/qui@537ad46): fix(crossseed): queue completion searches and retry rate-limit waits ([#&#8203;1523](autobrr/qui#1523)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`4fc550f`](autobrr/qui@4fc550f): fix(crossseed): use autobrr indexer ids for webhooks ([#&#8203;1614](autobrr/qui#1614)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`08029ad`](autobrr/qui@08029ad): fix(crossseed): valid partial matches being rejected ([#&#8203;1291](autobrr/qui#1291)) ([@&#8203;rybertm](https://github.com/rybertm))
- [`77eedd9`](autobrr/qui@77eedd9): fix(database): avoid postgres temp-table statement caching ([#&#8203;1581](autobrr/qui#1581)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`25daa17`](autobrr/qui@25daa17): fix(dirscan): honor canceled queued webhook runs ([#&#8203;1612](autobrr/qui#1612)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`56995f1`](autobrr/qui@56995f1): fix(dirscan): queue webhook scans and tighten age filtering ([#&#8203;1603](autobrr/qui#1603)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`444d07b`](autobrr/qui@444d07b): fix(dirscan): select concrete hardlink base dir ([#&#8203;1606](autobrr/qui#1606)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`c35bea0`](autobrr/qui@c35bea0): fix(instances): improve settings dialog scrolling ([#&#8203;1569](autobrr/qui#1569)) ([@&#8203;nuxencs](https://github.com/nuxencs))
- [`dc501a0`](autobrr/qui@dc501a0): fix(proxy): reauth qbit passthrough requests ([#&#8203;1582](autobrr/qui#1582)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`7950d1d`](autobrr/qui@7950d1d): fix(proxy): search endpoint handling ([#&#8203;1524](autobrr/qui#1524)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`1076eea`](autobrr/qui@1076eea): fix(qbit): prune empty managed dirs after delete\_with\_files ([#&#8203;1604](autobrr/qui#1604)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`5a3114b`](autobrr/qui@5a3114b): fix(qbittorrent): stop reboot torrent\_completed spam ([#&#8203;1515](autobrr/qui#1515)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`1d02e6c`](autobrr/qui@1d02e6c): fix(settings): contain settings tab scrolling ([#&#8203;1567](autobrr/qui#1567)) ([@&#8203;nuxencs](https://github.com/nuxencs))
- [`f5d69f3`](autobrr/qui@f5d69f3): fix(settings): smoother gradient ([#&#8203;1570](autobrr/qui#1570)) ([@&#8203;nuxencs](https://github.com/nuxencs))
- [`1c0c3bc`](autobrr/qui@1c0c3bc): fix(torrents): copy MediaInfo summary without brackets ([#&#8203;1540](autobrr/qui#1540)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`3ec913a`](autobrr/qui@3ec913a): fix(web): auto-append slash on path autocomplete selection ([#&#8203;1431](autobrr/qui#1431)) ([@&#8203;nitrobass24](https://github.com/nitrobass24))
- [`aa2f3da`](autobrr/qui@aa2f3da): fix(web): check field.state.value type in AddTorrentDialog ([#&#8203;1613](autobrr/qui#1613)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`1abfc5e`](autobrr/qui@1abfc5e): fix(web): handle SSO proxy redirect to /index.html ([#&#8203;1600](autobrr/qui#1600)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`1991f90`](autobrr/qui@1991f90): fix(web): warn before enabling reannounce ([#&#8203;1583](autobrr/qui#1583)) ([@&#8203;s0up4200](https://github.com/s0up4200))

##### Other Changes

- [`4069492`](autobrr/qui@4069492): chore(deps): bump the github group with 3 updates ([#&#8203;1535](autobrr/qui#1535)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`a02e9e8`](autobrr/qui@a02e9e8): chore(deps): bump the github group with 7 updates ([#&#8203;1558](autobrr/qui#1558)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`8713667`](autobrr/qui@8713667): chore(deps): bump the golang group with 15 updates ([#&#8203;1543](autobrr/qui#1543)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`420607e`](autobrr/qui@420607e): chore(go,ci): adopt go fix, bump to 1.26, and speed up PR checks ([#&#8203;1480](autobrr/qui#1480)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`0d0df45`](autobrr/qui@0d0df45): docs: add password reset section to CLI commands ([#&#8203;1598](autobrr/qui#1598)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`9ef56a2`](autobrr/qui@9ef56a2): refactor(makefile): windows support ([#&#8203;1546](autobrr/qui#1546)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`7899cc8`](autobrr/qui@7899cc8): refactor(reflinking): add windows ReFS filesystem support ([#&#8203;1576](autobrr/qui#1576)) ([@&#8203;Audionut](https://github.com/Audionut))
- [`51d34ab`](autobrr/qui@51d34ab): refactor(releases): share hdr normalization helpers ([#&#8203;1586](autobrr/qui#1586)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`c7f4e3d`](autobrr/qui@c7f4e3d): refactor(web): tighten unified scope navigation ([#&#8203;1618](autobrr/qui#1618)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`4b05177`](autobrr/qui@4b05177): test(handlers): cover tag baseline field requests ([@&#8203;s0up4200](https://github.com/s0up4200))

**Full Changelog**: <autobrr/qui@v1.14.1...v1.15.0>

##### Docker images

- `docker pull ghcr.io/autobrr/qui:v1.15.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**: (in timezone Europe/London)

- 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 these updates again.

---

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

---

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

Reviewed-on: https://forgejo.hayden.moe/hayden/phoebe/pulls/12
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.

Bug: Orphan Scan - false positives when Auto TMM changes save path without moving files

2 participants