feat(torrents): support new share limit parameters#1872
Conversation
|
Note Reviews pausedIt 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 Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
WalkthroughAdds qBittorrent 5.2+ per-torrent share-limit action and matching-mode support and threads capability and fields through client capability detection, API/OpenAPI, sync manager, automation processing/service, frontend types/hooks/UI, dependency, and documentation. ChangesShare Limit Action & Mode Feature
Sequence Diagram(s)sequenceDiagram
participant Frontend as Frontend UI
participant API as Backend API Handler
participant Service as Automation Service
participant SyncMgr as Sync Manager
participant QB as qBittorrent Client
Frontend->>API: POST /instances/{id}/torrents/bulk-action (shareLimitAction, shareLimitsMode, limits)
API->>Service: enqueue desired share-limit state
Service->>SyncMgr: SetTorrentShareLimit(hashes, ratio, times, action, mode)
SyncMgr->>QB: call SupportsShareLimits()
SyncMgr->>QB: send SetTorrentShareLimit request (with action/mode if supported, else empty)
QB->>SyncMgr: respond with result
SyncMgr->>Service: report success/failure (includes action/mode)
Service->>API: return aggregated result
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Suggested labels
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
5660d68 to
4e3284d
Compare
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (3)
internal/services/automations/service.go (1)
2561-2566:⚠️ Potential issue | 🟠 Major | ⚡ Quick winAction/mode-only share-limit changes are currently skipped.
At Line 2561-Line 2564,
needsUpdateonly checks ratio/seeding deltas. If a rule changes onlyshareLimitActionorshareLimitsMode, the torrent never entersshareBatches, so Line 2749 is never called for that change.💡 Proposed fix
- ratioNeedsUpdate := state.ratioLimit != nil && currentRatio != ratio - seedingNeedsUpdate := state.seedingMinutes != nil && torrent.SeedingTimeLimit != seedMinutes - needsUpdate := ratioNeedsUpdate || seedingNeedsUpdate + ratioNeedsUpdate := state.ratioLimit != nil && currentRatio != ratio + seedingNeedsUpdate := state.seedingMinutes != nil && torrent.SeedingTimeLimit != seedMinutes + // Ensure new share semantics are applied even when numeric limits are unchanged. + actionNeedsUpdate := strings.TrimSpace(state.shareLimitAction) != "" + modeNeedsUpdate := strings.TrimSpace(state.shareLimitsMode) != "" + needsUpdate := ratioNeedsUpdate || seedingNeedsUpdate || actionNeedsUpdate || modeNeedsUpdate if needsUpdate { key := shareKey{ratio: ratio, seed: seedMinutes, inactive: inactiveMinutes, action: state.shareLimitAction, mode: state.shareLimitsMode}🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/services/automations/service.go` around lines 2561 - 2566, The code currently computes needsUpdate as only ratio or seeding changes, so changes that only alter state.shareLimitAction or state.shareLimitsMode never enqueue torrents into shareBatches; update the logic around needsUpdate (the block building shareKey and appending to shareBatches) to also detect action/mode-only changes by adding checks (e.g., actionNeedsUpdate := state.shareLimitAction != currentAction and modeNeedsUpdate := state.shareLimitsMode != currentMode) and include them in the needsUpdate OR condition so shareBatches[key] is populated when shareLimitAction or shareLimitsMode differ even if ratio/seeding are unchanged.internal/qbittorrent/sync_manager.go (1)
5499-5518:⚠️ Potential issue | 🔴 Critical | ⚡ Quick winCritical build error: undefined type
qbt.MonitoredFoldersat line 5512The
NormalizeScanDirsPreferencefunction attempts to unmarshal scan_dirs preference intoqbt.MonitoredFolders, which does not exist in the go-qbittorrent package. The web search confirms this type is not exported by go-qbittorrent. This breaks compilation of the code.Determine the correct type for scan_dirs (likely a slice or map type that qBittorrent's API uses), or remove this function if it's not yet ready for merge.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/qbittorrent/sync_manager.go` around lines 5499 - 5518, The code fails because qbt.MonitoredFolders does not exist; update NormalizeScanDirsPreference to unmarshal into a concrete type the qBittorrent API returns (e.g. map[string]string) or a generic map[string]any if uncertain: replace the qbt.MonitoredFolders variable with var scanDirs map[string]string (or map[string]any), unmarshal into that, and set prefs["scan_dirs"] = scanDirs; alternatively remove the function if you don't want to normalize yet. Ensure references to qbt.MonitoredFolders in NormalizeScanDirsPreference are removed and tests/usage expecting the preference shape are adjusted accordingly.web/src/components/torrents/TorrentCardsMobile.tsx (1)
119-124:⚠️ Potential issue | 🟠 Major | ⚡ Quick winForwarding for new share-limit parameters is currently a dead path on mobile.
onConfirmnow supportsshareLimitActionandshareLimitsMode, but this submit path never sends them, so mobile users can’t set the new qBittorrent 5.2+ options.Please either (a) add dialog controls + pass these values here, or (b) remove the new callback params from this component until mobile UI supports them.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@web/src/components/torrents/TorrentCardsMobile.tsx` around lines 119 - 124, The mobile submit path (handleSubmit) doesn't forward the new shareLimitAction and shareLimitsMode parameters to onConfirm, so update TorrentCardsMobile.tsx by adding component state and UI controls for shareLimitAction and shareLimitsMode (or appropriate toggles/selects), bind them to those state values, and then include them in the onConfirm call (e.g., onConfirm(ratioEnabled ? ratioLimit : -1, seedingTimeEnabled ? seedingTimeLimit : -1, inactiveSeedingTimeEnabled ? inactiveSeedingTimeLimit : -1, shareLimitActionValue, shareLimitsModeValue) ), ensuring sensible defaults when controls are not set so mobile can configure the new qBittorrent 5.2+ options; alternatively if you prefer not to implement the UI yet, remove the extra parameters from the onConfirm type/signature used by TorrentCardsMobile to keep behavior consistent.
🧹 Nitpick comments (3)
internal/models/automation.go (1)
883-889: ⚡ Quick winConstrain new share-limit fields to allowed values (typed enum + validation).
Using
*stringhere permits invalid values to be stored and propagated. Prefer constrained types (or explicit validation) forShareLimitActionandShareLimitsMode.♻️ Proposed model typing change
type ShareLimitsAction struct { Enabled bool `json:"enabled"` RatioLimit *float64 `json:"ratioLimit,omitempty"` SeedingTimeMinutes *int64 `json:"seedingTimeMinutes,omitempty"` - ShareLimitAction *string `json:"shareLimitAction,omitempty"` - ShareLimitsMode *string `json:"shareLimitsMode,omitempty"` + ShareLimitAction *ShareLimitActionValue `json:"shareLimitAction,omitempty"` + ShareLimitsMode *ShareLimitsModeValue `json:"shareLimitsMode,omitempty"` Condition *RuleCondition `json:"condition,omitempty"` }// Add near other constants/types. type ShareLimitActionValue string type ShareLimitsModeValue string const ( ShareLimitActionDefault ShareLimitActionValue = "-1" ShareLimitActionStop ShareLimitActionValue = "0" ShareLimitActionRemove ShareLimitActionValue = "1" ShareLimitActionSuper ShareLimitActionValue = "2" ShareLimitActionRemoveWithContent ShareLimitActionValue = "3" ShareLimitsModeDefault ShareLimitsModeValue = "-1" ShareLimitsModeAny ShareLimitsModeValue = "0" ShareLimitsModeAll ShareLimitsModeValue = "1" )🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/models/automation.go` around lines 883 - 889, The ShareLimitsAction struct currently uses *string for ShareLimitAction and ShareLimitsMode which allows invalid values; change those fields to pointer types of constrained enums (e.g., *ShareLimitActionValue and *ShareLimitsModeValue) and add the new types and constants (ShareLimitActionValue, ShareLimitsModeValue and their allowed consts like ShareLimitActionDefault/Stop/Remove/Super/RemoveWithContent and ShareLimitsModeDefault/Any/All) near other model types; implement simple validation by adding a Validate method or UnmarshalJSON on those enum types to reject values not in the allowed set and keep the existing json tags so marshaling/unmarshaling behavior is preserved.internal/web/swagger/openapi.yaml (1)
1597-1602: ⚡ Quick winAdd enum constraints for the new share-limit fields in the API contract.
shareLimitActionandshareLimitsModecurrently accept any string. Since valid values are explicitly defined, encode them as enums to prevent invalid payloads from clients.♻️ Proposed OpenAPI diff
shareLimitAction: type: string + enum: ["-1", "0", "1", "2", "3"] description: Action when share limits are reached (qBittorrent 5.2+). Values -1=default, 0=stop, 1=remove, 2=enable super seeding, 3=remove with content. shareLimitsMode: type: string + enum: ["-1", "0", "1"] description: Whether any or all limits must be reached (qBittorrent 5.2+). Values -1=default, 0=match any, 1=match all.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/web/swagger/openapi.yaml` around lines 1597 - 1602, The OpenAPI schema currently allows any string for shareLimitAction and shareLimitsMode; update the properties in internal/web/swagger/openapi.yaml to add explicit enum constraints: for shareLimitAction (the property named shareLimitAction) set type: string and enum: ["-1","0","1","2","3"] (matching -1=default,0=stop,1=remove,2=enable super seeding,3=remove with content) and for shareLimitsMode (the property named shareLimitsMode) set type: string and enum: ["-1","0","1"] (matching -1=default,0=match any,1=match all), keeping or clarifying the existing descriptions to reflect these allowed values.web/src/components/torrents/TorrentDialogs.tsx (1)
1586-1589: ⚡ Quick winConsider stricter typing for the new optional parameters.
The
shareLimitActionandshareLimitsModeparameters are currently typed asstring, but based on the Select options (lines 1946-1950, 1966-1968), they have a finite set of valid values. Consider using union types for better type safety:shareLimitAction?: "0" | "1" | "2" | "3" shareLimitsMode?: "0" | "1"This would prevent invalid values at compile time and improve IDE autocomplete.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@web/src/components/torrents/TorrentDialogs.tsx` around lines 1586 - 1589, The onConfirm callback in TorrentDialogs.tsx currently types shareLimitAction and shareLimitsMode as generic strings; tighten these to unions matching the select options (e.g., shareLimitAction?: "0" | "1" | "2" | "3" and shareLimitsMode?: "0" | "1") so callers and consumers of onConfirm (the onConfirm signature/type) get compile-time validation and improved autocomplete; update the onConfirm parameter types where it's declared and any related usages/props to use the new union types.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@internal/services/automations/service.go`:
- Around line 2754-2756: The success/dry-run aggregation omits action/mode so
different action/mode batches with identical numeric limits collide; update the
aggregation keys and details to include key.action and key.mode wherever counts
and JSON details are created/updated (e.g., the map used for limitCounts and the
detailsJSON construction that currently uses key.ratio, key.seed, key.inactive,
"count", and "type"); ensure any code paths that increment or merge entries
(references to limitCounts, detailsJSON, and the key variable) include action
and mode fields so entries are unique per action/mode combination.
In `@web/src/components/torrents/TorrentManagementBar.tsx`:
- Line 244: The ternary spacing in the assignment to variable target is
incorrect: change the expression in the target initialization that uses
separatorIndex (the line starting with const target = separatorIndex > 0? {) so
there is a space before the question mark (i.e. separatorIndex > 0 ? ...) to
comply with ESLint `@stylistic` spacing rules; locate the target declaration in
TorrentManagementBar (using the target and separatorIndex identifiers) and
update the ternary spacing accordingly.
---
Outside diff comments:
In `@internal/qbittorrent/sync_manager.go`:
- Around line 5499-5518: The code fails because qbt.MonitoredFolders does not
exist; update NormalizeScanDirsPreference to unmarshal into a concrete type the
qBittorrent API returns (e.g. map[string]string) or a generic map[string]any if
uncertain: replace the qbt.MonitoredFolders variable with var scanDirs
map[string]string (or map[string]any), unmarshal into that, and set
prefs["scan_dirs"] = scanDirs; alternatively remove the function if you don't
want to normalize yet. Ensure references to qbt.MonitoredFolders in
NormalizeScanDirsPreference are removed and tests/usage expecting the preference
shape are adjusted accordingly.
In `@internal/services/automations/service.go`:
- Around line 2561-2566: The code currently computes needsUpdate as only ratio
or seeding changes, so changes that only alter state.shareLimitAction or
state.shareLimitsMode never enqueue torrents into shareBatches; update the logic
around needsUpdate (the block building shareKey and appending to shareBatches)
to also detect action/mode-only changes by adding checks (e.g.,
actionNeedsUpdate := state.shareLimitAction != currentAction and modeNeedsUpdate
:= state.shareLimitsMode != currentMode) and include them in the needsUpdate OR
condition so shareBatches[key] is populated when shareLimitAction or
shareLimitsMode differ even if ratio/seeding are unchanged.
In `@web/src/components/torrents/TorrentCardsMobile.tsx`:
- Around line 119-124: The mobile submit path (handleSubmit) doesn't forward the
new shareLimitAction and shareLimitsMode parameters to onConfirm, so update
TorrentCardsMobile.tsx by adding component state and UI controls for
shareLimitAction and shareLimitsMode (or appropriate toggles/selects), bind them
to those state values, and then include them in the onConfirm call (e.g.,
onConfirm(ratioEnabled ? ratioLimit : -1, seedingTimeEnabled ? seedingTimeLimit
: -1, inactiveSeedingTimeEnabled ? inactiveSeedingTimeLimit : -1,
shareLimitActionValue, shareLimitsModeValue) ), ensuring sensible defaults when
controls are not set so mobile can configure the new qBittorrent 5.2+ options;
alternatively if you prefer not to implement the UI yet, remove the extra
parameters from the onConfirm type/signature used by TorrentCardsMobile to keep
behavior consistent.
---
Nitpick comments:
In `@internal/models/automation.go`:
- Around line 883-889: The ShareLimitsAction struct currently uses *string for
ShareLimitAction and ShareLimitsMode which allows invalid values; change those
fields to pointer types of constrained enums (e.g., *ShareLimitActionValue and
*ShareLimitsModeValue) and add the new types and constants
(ShareLimitActionValue, ShareLimitsModeValue and their allowed consts like
ShareLimitActionDefault/Stop/Remove/Super/RemoveWithContent and
ShareLimitsModeDefault/Any/All) near other model types; implement simple
validation by adding a Validate method or UnmarshalJSON on those enum types to
reject values not in the allowed set and keep the existing json tags so
marshaling/unmarshaling behavior is preserved.
In `@internal/web/swagger/openapi.yaml`:
- Around line 1597-1602: The OpenAPI schema currently allows any string for
shareLimitAction and shareLimitsMode; update the properties in
internal/web/swagger/openapi.yaml to add explicit enum constraints: for
shareLimitAction (the property named shareLimitAction) set type: string and
enum: ["-1","0","1","2","3"] (matching -1=default,0=stop,1=remove,2=enable super
seeding,3=remove with content) and for shareLimitsMode (the property named
shareLimitsMode) set type: string and enum: ["-1","0","1"] (matching
-1=default,0=match any,1=match all), keeping or clarifying the existing
descriptions to reflect these allowed values.
In `@web/src/components/torrents/TorrentDialogs.tsx`:
- Around line 1586-1589: The onConfirm callback in TorrentDialogs.tsx currently
types shareLimitAction and shareLimitsMode as generic strings; tighten these to
unions matching the select options (e.g., shareLimitAction?: "0" | "1" | "2" |
"3" and shareLimitsMode?: "0" | "1") so callers and consumers of onConfirm (the
onConfirm signature/type) get compile-time validation and improved autocomplete;
update the onConfirm parameter types where it's declared and any related
usages/props to use the new union types.
🪄 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: 827d11b6-be2a-4b73-8ed1-39eaf28ea46a
⛔ Files ignored due to path filters (1)
go.sumis excluded by!**/*.sum
📒 Files selected for processing (19)
documentation/docs/advanced/compatibility.mddocumentation/docs/features/automations.mdgo.modinternal/api/handlers/capabilities.gointernal/api/handlers/torrents.gointernal/models/automation.gointernal/qbittorrent/client.gointernal/qbittorrent/sync_manager.gointernal/services/automations/processor.gointernal/services/automations/service.gointernal/web/swagger/openapi.yamlweb/src/components/instances/preferences/WorkflowDialog.tsxweb/src/components/torrents/TorrentCardsMobile.tsxweb/src/components/torrents/TorrentDialogs.tsxweb/src/components/torrents/TorrentManagementBar.tsxweb/src/components/torrents/TorrentTableOptimized.tsxweb/src/hooks/useTorrentActions.tsweb/src/lib/api.tsweb/src/types/index.ts
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@web/src/hooks/useTorrentActions.ts`:
- Around line 396-397: The succeededLabel ternary is redundant and stylistically
compressed; replace it with a simpler expression using the literal "succeeded"
(e.g. succeeded.length > 0 ? `${succeeded.join(" and ")} succeeded` : "") and
ensure consistent spacing around the ? and : operators; also normalize
failedLabel spacing similarly (e.g. failed.length > 0 ? `${failed.map(r =>
r.action).join(" and ")} failed` : "tag update failed") so both labels are
readable and lint-friendly, referencing the succeededLabel and failedLabel
variables to locate the change.
🪄 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: 0f23783f-cc2f-43a3-b4b3-511bd90e9404
⛔ Files ignored due to path filters (1)
go.sumis excluded by!**/*.sum
📒 Files selected for processing (19)
documentation/docs/advanced/compatibility.mddocumentation/docs/features/automations.mdgo.modinternal/api/handlers/capabilities.gointernal/api/handlers/torrents.gointernal/models/automation.gointernal/qbittorrent/client.gointernal/qbittorrent/sync_manager.gointernal/services/automations/processor.gointernal/services/automations/service.gointernal/web/swagger/openapi.yamlweb/src/components/instances/preferences/WorkflowDialog.tsxweb/src/components/torrents/TorrentCardsMobile.tsxweb/src/components/torrents/TorrentDialogs.tsxweb/src/components/torrents/TorrentManagementBar.tsxweb/src/components/torrents/TorrentTableOptimized.tsxweb/src/hooks/useTorrentActions.tsweb/src/lib/api.tsweb/src/types/index.ts
✅ Files skipped from review due to trivial changes (3)
- documentation/docs/features/automations.md
- documentation/docs/advanced/compatibility.md
- web/src/lib/api.ts
🚧 Files skipped from review as they are similar to previous changes (15)
- go.mod
- internal/web/swagger/openapi.yaml
- internal/models/automation.go
- internal/api/handlers/capabilities.go
- web/src/components/torrents/TorrentManagementBar.tsx
- web/src/types/index.ts
- internal/qbittorrent/sync_manager.go
- internal/services/automations/service.go
- internal/qbittorrent/client.go
- web/src/components/torrents/TorrentTableOptimized.tsx
- internal/api/handlers/torrents.go
- web/src/components/torrents/TorrentDialogs.tsx
- web/src/components/instances/preferences/WorkflowDialog.tsx
- internal/services/automations/processor.go
- web/src/components/torrents/TorrentCardsMobile.tsx
f75b4ef to
1d22eee
Compare
1d22eee to
fc8d0a9
Compare
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
web/src/components/torrents/TorrentCardsMobile.tsx (1)
109-124:⚠️ Potential issue | 🟠 Major | 🏗️ Heavy liftMobile dialog never provides the new share-limit params
Line 109 expands
onConfirm, but Line 120-Line 124 still invoke it with only ratio/time values and no dialog state forshareLimitAction/shareLimitsMode. As a result, the values forwarded later are alwaysundefined, so the new qBittorrent 5.2 options are not actually configurable from mobile.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@web/src/components/torrents/TorrentCardsMobile.tsx` around lines 109 - 124, The mobile dialog's handleSubmit calls onConfirm without passing the new share-limit parameters, so shareLimitAction/shareLimitsMode are always undefined; update the component (add state hooks for shareLimitAction and shareLimitsMode if not present) and modify handleSubmit to pass those values (e.g., pass shareLimitAction and shareLimitsMode or their defaults) into onConfirm along with the existing ratio/time arguments; ensure the onConfirm signature declared at top matches and use the local state variables (shareLimitAction, shareLimitsMode) when invoking onConfirm in handleSubmit.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@web/src/components/torrents/TorrentCardsMobile.tsx`:
- Around line 109-124: The mobile dialog's handleSubmit calls onConfirm without
passing the new share-limit parameters, so shareLimitAction/shareLimitsMode are
always undefined; update the component (add state hooks for shareLimitAction and
shareLimitsMode if not present) and modify handleSubmit to pass those values
(e.g., pass shareLimitAction and shareLimitsMode or their defaults) into
onConfirm along with the existing ratio/time arguments; ensure the onConfirm
signature declared at top matches and use the local state variables
(shareLimitAction, shareLimitsMode) when invoking onConfirm in handleSubmit.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: 18081851-1ab3-453d-8457-73ef3c80d8a1
⛔ Files ignored due to path filters (1)
go.sumis excluded by!**/*.sum
📒 Files selected for processing (19)
documentation/docs/advanced/compatibility.mddocumentation/docs/features/automations.mdgo.modinternal/api/handlers/capabilities.gointernal/api/handlers/torrents.gointernal/models/automation.gointernal/qbittorrent/client.gointernal/qbittorrent/sync_manager.gointernal/services/automations/processor.gointernal/services/automations/service.gointernal/web/swagger/openapi.yamlweb/src/components/instances/preferences/WorkflowDialog.tsxweb/src/components/torrents/TorrentCardsMobile.tsxweb/src/components/torrents/TorrentDialogs.tsxweb/src/components/torrents/TorrentManagementBar.tsxweb/src/components/torrents/TorrentTableOptimized.tsxweb/src/hooks/useTorrentActions.tsweb/src/lib/api.tsweb/src/types/index.ts
✅ Files skipped from review due to trivial changes (1)
- documentation/docs/advanced/compatibility.md
🚧 Files skipped from review as they are similar to previous changes (17)
- internal/models/automation.go
- go.mod
- internal/web/swagger/openapi.yaml
- web/src/lib/api.ts
- internal/qbittorrent/client.go
- web/src/components/torrents/TorrentTableOptimized.tsx
- web/src/hooks/useTorrentActions.ts
- web/src/types/index.ts
- internal/services/automations/service.go
- internal/qbittorrent/sync_manager.go
- web/src/components/instances/preferences/WorkflowDialog.tsx
- web/src/components/torrents/TorrentDialogs.tsx
- documentation/docs/features/automations.md
- internal/api/handlers/torrents.go
- web/src/components/torrents/TorrentManagementBar.tsx
- internal/api/handlers/capabilities.go
- internal/services/automations/processor.go
This PR adds support for the new share limit parameters in qBittorrent 5.2.0+
Summary by CodeRabbit
New Features
Documentation