- Build Capabilities from indexer's actual search support instead of
hardcoding ["search"]
- Include Backend in Equals/GetHashCode so drift is detected during sync
- Fix default qui port from 7474 to 7476
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Prevent NullReferenceException in UpdateIndexer when indexerMapping is null
- Normalize Categories comparison in QuiIndexer.Equals for null/empty symmetry
and add GetHashCode override to maintain equality/hash contract
- Check response status in RemoveIndexer so failed DELETEs raise HttpException
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
qui is a cross-seeding tool from autobrr that supports Torznab indexers.
This adds full sync support via qui's REST API at /api/torznab/indexers,
allowing Prowlarr to automatically manage torrent indexers in qui.
Closes#2587
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Docker registry references must be lowercase. github.repository
returns 'nitrobass24/Prowlarr' with a capital P.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Each arch build pushes its image by digest to GHCR (no tags). The
publish job downloads the digests and creates a multi-arch manifest
with all tags using docker buildx imagetools create.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Build each architecture on its own native runner (ubuntu-24.04 for
amd64, ubuntu-24.04-arm for arm64) in parallel, export as OCI tarballs,
then merge into a multi-arch manifest at publish time. Eliminates
~25 minutes of QEMU emulation overhead.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Prowlarr.Core.csproj references Logo/64.png as an embedded resource
via a path relative to the repo root.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
StyleCop PackageReference is conditionally included based on
EnableAnalyzers at restore time. Without it during restore, the
analyzer DLLs get restored and run during publish regardless.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Upstream has TreatWarningsAsErrors=true and StyleCop violations in
existing code. The CI backend build already uses EnableAnalyzers=false.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
NzbDrone/Prowlarr.csproj is the Windows GUI entry point (WinForms,
net8.0-windows). NzbDrone.Console/Prowlarr.Console.csproj is the
headless Linux entry point (net8.0) which outputs as 'Prowlarr'.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The project multi-targets net8.0 and net8.0-windows, so dotnet publish
requires an explicit --framework to disambiguate.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
docker-build runs in parallel with all other jobs — no dependencies.
docker-publish gates on backend, unit-tests, frontend, and docker-build.
The publish step is a cache hit since docker-build already populated GHA cache.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Prowlarr.csproj multi-targets net8.0-windows which fails to restore on
Alpine Linux without EnableWindowsTargeting=true.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The solution includes test projects whose csproj files aren't copied
into the Docker build context, causing restore to fail.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Multi-stage Dockerfile using hotio/base:alpinevpn with s6-overlay.
Docker job runs after backend, unit-tests, and frontend pass.
Builds linux/amd64 and linux/arm64 images, pushes to GHCR on
non-PR events. Supports manual dispatch with optional version tag.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The event_handlers_should_be_unique test requires the Prowlarr app data
directory to exist. Upstream test.sh creates this directory before
running tests (mkdir -p for each platform). Added the same setup step.
The separate restore + build steps caused StyleCop analyzers to be
restored unconditionally, then EnableAnalyzers=false had no effect
since packages were already resolved. Using dotnet msbuild -restore
(matching upstream build.sh) passes the property during both restore
and build phases.
Replicates the upstream Azure Pipelines build patterns as GitHub Actions:
- Backend build across Linux, Windows, macOS with .NET 8.0
- Unit tests on all three platforms with NUnit test filtering
- Frontend build with yarn, ESLint, and Stylelint
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fixed: Don't send limit=0 to Newznab indexers
When searching via the internal API, SearchResource.Limit defaults
to 0 because it's a non-nullable int. This gets passed through to
the Newznab request generator, which emits &limit=0 in the query URL.
Indexers that follow the Newznab spec honor limit=0 literally and
return zero results. Confirmed affected: DrunkenSlug and NZBGeek.
Changed Limit and Offset on SearchResource to int? so they default
to null when omitted, matching the existing behavior in NewznabRequest.
Also guard against emitting limit=0 in the request
generators.
Co-authored-by: Daniel Jacobs <danielj@certida.com>
Co-authored-by: Bogdan <mynameisbogdan@users.noreply.github.com>