Skip to content

fix(crossseed): reduce false negatives for anime matching - #1243

Merged
s0up4200 merged 1 commit into
developfrom
fix/crossseed-anime-site-codec
Jan 16, 2026
Merged

fix(crossseed): reduce false negatives for anime matching#1243
s0up4200 merged 1 commit into
developfrom
fix/crossseed-anime-site-codec

Conversation

@s0up4200

@s0up4200 s0up4200 commented Jan 14, 2026

Copy link
Copy Markdown
Collaborator
  • Deduplicate normalized codec list (e.g. HEVC+x265 vs H.265)
  • Relax anime Site matching (only enforce when both present)
  • Infer season/episode/pack from torrent files when name lacks Sxx/Exx
  • Update/add tests for codec, site, and inference
  • Tests: go test -race -count=3 ./internal/services/crossseed

- Deduplicate normalized codec list (e.g. HEVC+x265 vs H.265)

- Relax anime Site matching (only enforce when both present)

- Infer season/episode/pack from torrent files when name lacks Sxx/Exx

- Update/add tests for codec, site, and inference

- Tests: go test -race -count=3 ./internal/services/crossseed
@s0up4200 s0up4200 added this to the v1.13.0 milestone Jan 14, 2026
@s0up4200
s0up4200 merged commit eda0eee into develop Jan 16, 2026
11 checks passed
@s0up4200
s0up4200 deleted the fix/crossseed-anime-site-codec branch January 16, 2026 12:50
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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant