#3288
Cross-seed: smart filtering never excludes TorrentLeech, and static domain mappings never match Jackett/Prowlarr indexers
This was generated by AI during triage.
Agent Brief
Category: bug
Summary: Cross-seed indexer filtering never matches a tracker announce domain to an indexer through the static domain mappings when the indexer comes from Jackett or Prowlarr, and TorrentLeech (tracker.tleechreload.org) has no mapping at all.
Current behavior:
Service.trackerDomainsMatchIndexerDomain decides whether an indexer serves a tracker that the torrent already seeds from. Smart filtering uses it to exclude those indexers ("You already seed this release from these trackers..."). Two faults:
initializeDomainMappingshas no entry fortracker.tleechreload.org, the TorrentLeech announce host. That host shares nothing with the indexer nameTorrentLeechor with a Jackett/Prowlarr host, so the TorrentLeech indexer is never excluded. Each search queries it again and returns the copy that the user already seeds as a match.- A mapped domain matches only when it equals the normalized indexer name or the indexer domain exactly.
normalizeIndexerNamestrips dots, but the mapped domain keeps them (broadcasthe.netvsbroadcasthenet). For a Jackett or Prowlarr indexer,EnabledIndexerInfo.Domainis the proxy host. So the existing mappings (landof.tv,flacsfor.me,home.opsfet.ch) never match a proxied indexer either. Example:landof.tvagainst an indexer namedBroadcasTheNetwith a Jackett host domain returns false.
Desired behavior:
- A torrent whose announce domain is
tracker.tleechreload.orgmatches the TorrentLeech indexer, whether it was added through Jackett, through Prowlarr, or natively (domaintorrentleech.org), and also with no domain. - Mapped indexer domains get the same name and domain comparison as the tracker domains themselves: name match after normalization, TLD strip, and partial match. Then
landof.tvmatches a JackettBroadcasTheNet,flacsfor.mematchesRedacted, andhome.opsfet.chmatchesOrpheus. - A mapped domain must not make a tracker match an unrelated indexer.
Key interfaces:
initializeDomainMappings(): addtracker.tleechreload.org->torrentleech.org.Service.trackerDomainsMatchIndexerDomain(): returns false today for a mapped tracker domain against a proxied indexer. It must return true, by running the mapped domains through the same fuzzy checks as the tracker domains.
Acceptance criteria:
-
tracker.tleechreload.orgmatches indexer nameTorrentLeechwith a Jackett/Prowlarr host domain. -
tracker.tleechreload.orgmatches indexer nameTorrentLeechwith an empty domain. -
tracker.tleechreload.orgmatches a native indexer whose domain istorrentleech.org. -
landof.tvmatches indexer nameBroadcasTheNetwith a Jackett host domain. -
tracker.tleechreload.organdlandof.tvdo not match an unrelated indexer, for exampleRedactedwith a Jackett host domain. - The existing duplicate-filtering tests in the crossseed package still pass.
Out of scope:
- A user-editable mapping table or a settings UI.
- Changes to how
EnabledIndexerInfo.Domainis derived from the indexer base URL.
Domain:
- Glossary terms: none of the terms in this brief are in
GLOSSARY.md. Gap: "smart filtering" (indexer exclusion by tracker already seeded) and "domain mapping". - ADRs: None.
- Owner:
crossseed.Servicetracker-to-indexer matching (trackerDomainsMatchIndexerDomain). Every caller (content filtering, prefilter rejection scoping,torrentMatchesIndexerDomain) gets the fix.
Logs:
- None
From discussion #3287
Addition from the reporter: Superbits has the same gap. Some of its torrents announce to
sptracker.cc, which shares nothing with the indexer nameSuperbits(itssuperbits.org/tracker.superbits.orghosts already match by name). Please add"sptracker.cc": {"superbits.org"}toinitializeDomainMappings()alongsidetracker.tleechreload.org.Suggested extra acceptance rows:
sptracker.cc(announce URLhttps://sptracker.cc:2086/<passkey>/announce) matches indexer nameSuperbitswith a Jackett/Prowlarr host domain.sptracker.ccdoes not matchTorrentLeech.