Commit Graph

114 Commits

Author SHA1 Message Date
gronod 4d61dd566f Refactor: Extract tag functions to TagMatcher service
Build and Push Docker Image / build (push) Successful in 21s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 49s
CI / Security audit (push) Successful in 1m5s
CI / Tests & coverage (push) Failing after 1m15s
- Extract six pure tag-related functions from dashboard.js into new server/services/TagMatcher.js
- Functions: sanitizeTagLabel, tagMatchesUser, extractAllTags, extractUserTag, getEmbyUsers, buildTagBadges
- Update dashboard.js to import TagMatcher and replace all inline function calls
- Add comprehensive unit tests in tests/unit/services/TagMatcher.test.js (26 tests passing for 5 pure functions)
- Note: getEmbyUsers tests excluded due to CommonJS mocking complexity
2026-05-20 22:21:01 +01:00
gronod d568800942 fix: limit history pagination to prevent 40s response times
Licence Check / Licence compatibility and copyright header verification (push) Successful in 51s
Build and Push Docker Image / build (push) Successful in 1m27s
CI / Security audit (push) Successful in 1m27s
CI / Tests & coverage (push) Successful in 1m43s
The full pagination fix (ddad80a, e772001) caused history retrieval to
fetch up to 50 pages sequentially, taking 10-40 seconds instead of ~200ms.

Changes:
- Add maxPages parameter to getHistory() with default of 1 page
- Update poller to fetch 50 records (up from 10) in a single API call
- historyFetcher retains 100 records per page for UI display

This provides 5x more history for matching than before while keeping
the fast single-request performance.

Refs: develop-merge pagination performance issue
2026-05-20 21:44:53 +01:00
Gandalf ee2f275501 Merge pull request 'fix: use stable *arr IDs for matching before fragile title fallback' (#21) from fix-arr-matching into develop-merge
Build and Push Docker Image / build (push) Successful in 40s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m2s
CI / Security audit (push) Successful in 1m19s
CI / Tests & coverage (push) Successful in 1m31s
Reviewed-on: #21
2026-05-20 21:02:10 +01:00
Gandalf ca6ff66115 Merge pull request 'fix: webhook replay cache atomicity and instanceName precision' (#22) from fix-webhook-receiver into develop-merge
Build and Push Docker Image / build (push) Has been cancelled
CI / Tests & coverage (push) Has been cancelled
CI / Security audit (push) Has been cancelled
Licence Check / Licence compatibility and copyright header verification (push) Has been cancelled
Reviewed-on: #22
2026-05-20 21:01:52 +01:00
Gandalf 080431c4b7 Merge pull request 'fix: QBittorrent fallback state corruption after full sync' (#23) from fix-qbittorrent-client into develop-merge
Build and Push Docker Image / build (push) Has been cancelled
CI / Security audit (push) Has been cancelled
CI / Tests & coverage (push) Has been cancelled
Licence Check / Licence compatibility and copyright header verification (push) Has been cancelled
Reviewed-on: #23
2026-05-20 21:01:36 +01:00
Gandalf f457a708d2 Merge pull request 'fix: SABnzbd speed assignment and size/progress parsing' (#24) from fix-sabnzbd-client into develop-merge
Build and Push Docker Image / build (push) Has been cancelled
CI / Security audit (push) Has been cancelled
CI / Tests & coverage (push) Has been cancelled
Licence Check / Licence compatibility and copyright header verification (push) Has been cancelled
Reviewed-on: #24
2026-05-20 21:01:21 +01:00
Gandalf 914ab73d4e Merge pull request 'fix: full pagination + non-silent errors in PollingRadarrRetriever' (#25) from fix-radarr-retriever into develop-merge
Build and Push Docker Image / build (push) Has been cancelled
CI / Security audit (push) Has been cancelled
CI / Tests & coverage (push) Has been cancelled
Licence Check / Licence compatibility and copyright header verification (push) Has been cancelled
Reviewed-on: #25
2026-05-20 21:01:07 +01:00
gronod bb7b66e06d fix: use stable *arr IDs for matching before fragile title fallback
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m11s
CI / Tests & coverage (push) Failing after 1m8s
CI / Security audit (push) Successful in 1m11s
Licence Check / Licence compatibility and copyright header verification (pull_request) Successful in 52s
CI / Security audit (pull_request) Successful in 1m18s
CI / Tests & coverage (pull_request) Failing after 1m26s
2026-05-20 20:51:50 +01:00
gronod 5ad525a760 fix: webhook replay cache atomicity and instanceName precision
Licence Check / Licence compatibility and copyright header verification (push) Successful in 58s
CI / Security audit (push) Successful in 1m25s
CI / Tests & coverage (push) Failing after 1m30s
Licence Check / Licence compatibility and copyright header verification (pull_request) Successful in 57s
CI / Security audit (pull_request) Successful in 1m21s
CI / Tests & coverage (pull_request) Failing after 1m36s
2026-05-20 20:46:35 +01:00
gronod 1e162381f4 fix: QBittorrent fallback state corruption after full sync
Licence Check / Licence compatibility and copyright header verification (push) Successful in 54s
CI / Security audit (push) Successful in 1m37s
CI / Tests & coverage (push) Failing after 1m46s
Licence Check / Licence compatibility and copyright header verification (pull_request) Successful in 1m1s
CI / Security audit (pull_request) Successful in 1m29s
CI / Tests & coverage (pull_request) Failing after 1m32s
2026-05-20 20:45:26 +01:00
gronod 42f0481a9a fix: SABnzbd speed assignment and size/progress parsing
Licence Check / Licence compatibility and copyright header verification (push) Successful in 59s
CI / Security audit (push) Successful in 1m15s
CI / Tests & coverage (push) Successful in 1m45s
CI / Security audit (pull_request) Successful in 1m20s
Licence Check / Licence compatibility and copyright header verification (pull_request) Successful in 1m7s
CI / Tests & coverage (pull_request) Successful in 1m42s
2026-05-20 20:44:08 +01:00
gronod ddad80a666 fix: full pagination + non-silent errors in PollingRadarrRetriever
Licence Check / Licence compatibility and copyright header verification (push) Successful in 51s
CI / Tests & coverage (push) Failing after 1m8s
CI / Security audit (push) Successful in 1m15s
CI / Tests & coverage (pull_request) Failing after 4s
Licence Check / Licence compatibility and copyright header verification (pull_request) Successful in 1m6s
CI / Security audit (pull_request) Successful in 1m35s
2026-05-20 20:42:18 +01:00
gronod e772001c3f fix: full pagination + non-silent errors in PollingSonarrRetriever
Licence Check / Licence compatibility and copyright header verification (push) Successful in 43s
CI / Security audit (push) Successful in 59s
CI / Tests & coverage (push) Failing after 1m11s
Licence Check / Licence compatibility and copyright header verification (pull_request) Failing after 4s
CI / Tests & coverage (pull_request) Failing after 1m33s
CI / Security audit (pull_request) Successful in 1m39s
2026-05-20 20:40:48 +01:00
gronod a562cfe9aa Add logging to debug active download identification and speed
Build and Push Docker Image / build (push) Successful in 29s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 58s
CI / Security audit (push) Successful in 1m11s
CI / Tests & coverage (push) Failing after 1m18s
2026-05-20 01:00:25 +01:00
gronod 8549746721 Apply overall SABnzbd speed to active download only
Build and Push Docker Image / build (push) Successful in 34s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 39s
CI / Security audit (push) Successful in 1m12s
CI / Tests & coverage (push) Failing after 1m13s
2026-05-20 00:58:38 +01:00
gronod 63fc370262 Remove speed from SABnzbd downloads - API doesn't provide per-download speed
Build and Push Docker Image / build (push) Successful in 41s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 45s
CI / Security audit (push) Successful in 58s
CI / Tests & coverage (push) Failing after 1m8s
2026-05-20 00:56:54 +01:00
gronod 6362441dd5 Add logging to debug SABnzbd speed field in slot data
Build and Push Docker Image / build (push) Successful in 42s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 52s
CI / Security audit (push) Successful in 1m9s
CI / Tests & coverage (push) Successful in 1m22s
2026-05-20 00:54:26 +01:00
gronod 76f9e87b44 Add logging to investigate SABnzbd slot structure for speed field
Build and Push Docker Image / build (push) Successful in 35s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 45s
CI / Security audit (push) Successful in 1m15s
CI / Tests & coverage (push) Successful in 1m27s
2026-05-20 00:51:12 +01:00
gronod 7195a09562 Fix SABnzbd size and speed fields in SSE response
Build and Push Docker Image / build (push) Successful in 37s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 52s
CI / Security audit (push) Successful in 1m30s
CI / Tests & coverage (push) Successful in 1m49s
2026-05-19 23:34:24 +01:00
gronod 720de6688b Add download client ordering and filtering to active downloads list
Build and Push Docker Image / build (push) Successful in 22s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m5s
CI / Security audit (push) Successful in 1m26s
CI / Tests & coverage (push) Successful in 1m44s
2026-05-19 23:29:38 +01:00
gronod 2469c3e3f4 fix(pagination): Increase Sonarr/Radarr page sizes to fetch all items
Build and Push Docker Image / build (push) Successful in 20s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 53s
CI / Security audit (push) Successful in 1m12s
CI / Tests & coverage (push) Successful in 1m27s
Sonarr Activity tab has 12 pages but we only fetched ~2 items.
Added pageSize=1000 to queue API and changed history default from 10 to 100.
This ensures all downloads are available for matching to SAB/qBittorrent.
2026-05-19 22:20:09 +01:00
gronod 6c8c333c6a debug: Add Sonarr queue titles to no-match output
Build and Push Docker Image / build (push) Successful in 49s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m0s
CI / Security audit (push) Successful in 1m13s
CI / Tests & coverage (push) Successful in 1m29s
2026-05-19 22:16:26 +01:00
gronod 5dfe0b1216 fix(matching): Match SAB to Sonarr by downloadId first
Build and Push Docker Image / build (push) Successful in 41s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 56s
CI / Security audit (push) Successful in 1m6s
CI / Tests & coverage (push) Successful in 1m27s
Sonarr tracks the exact SAB download ID (nzo_id). Now tries to match
by downloadId first, then falls back to title matching. Also adds
debug to show if matches are via downloadId vs title, and logs
downloadIds in history to verify the link exists.
2026-05-19 22:13:43 +01:00
gronod 77beef787f debug(matching): Show queue vs history source and history titles
Build and Push Docker Image / build (push) Successful in 39s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 53s
CI / Security audit (push) Successful in 1m10s
CI / Tests & coverage (push) Successful in 1m30s
When a match is found, logs whether it came from queue or history.
When no match, shows history counts and sample titles to verify
history is being checked properly.
2026-05-19 22:10:34 +01:00
gronod 235a866ec8 fix(matching): Check Sonarr/Radarr history for SAB matches
Build and Push Docker Image / build (push) Successful in 44s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m6s
CI / Security audit (push) Successful in 1m21s
CI / Tests & coverage (push) Successful in 1m34s
SAB items often persist after Sonarr has processed them.
Previously only checked the active queue, now also checks
history records so completed downloads still appear.
2026-05-19 22:06:38 +01:00
gronod f1d9de2a92 debug(sonarr): Log all available Sonarr queue fields
Build and Push Docker Image / build (push) Successful in 28s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m9s
CI / Security audit (push) Successful in 1m25s
CI / Tests & coverage (push) Successful in 1m39s
Shows title, sourceTitle, series.title, episode.title for
each Sonarr queue item to understand the data structure.
2026-05-19 22:04:11 +01:00
gronod 9d0e31ec9a fix(matching): Normalize dots to spaces for SAB/Sonarr matching
Build and Push Docker Image / build (push) Successful in 13s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 46s
CI / Security audit (push) Has been cancelled
CI / Tests & coverage (push) Has been cancelled
SAB filenames use dots (dora.the.explorer.s02e08) but Sonarr titles
use spaces (Dora the Explorer - S02E08). Now tries matching with
both formats to improve match rate.

Also logs actual Sonarr titles when no match found for debugging.
2026-05-19 22:02:55 +01:00
gronod 42c3eebf18 debug(sse): Add detailed name matching logging
Build and Push Docker Image / build (push) Successful in 29s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m4s
CI / Security audit (push) Successful in 1m29s
CI / Tests & coverage (push) Successful in 1m49s
Shows exactly which SAB items match/don't match to Sonarr/Radarr:
- ✓ Sonarr match: SAB name → Sonarr name
- ✓ Radarr match: SAB name → Radarr name
- ✗ No match: SAB name (with Sonarr queue count)

This will help diagnose why Sonarr Activity Queue shows matches but Sofarr doesn't.
2026-05-19 21:50:05 +01:00
gronod f295e1c90d debug(sse): Add SAB matching stats to trace filtering
Build and Push Docker Image / build (push) Successful in 36s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 49s
CI / Security audit (push) Successful in 1m18s
CI / Tests & coverage (push) Successful in 1m27s
Shows how many SAB items were checked vs how many matched to Sonarr/Radarr.
This will help diagnose why only ~10 of 60 SAB items are appearing.
2026-05-19 21:47:12 +01:00
gronod c5e8281440 fix(sabnzbd): Handle labels as array or string
Build and Push Docker Image / build (push) Successful in 43s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m7s
CI / Security audit (push) Successful in 1m28s
CI / Tests & coverage (push) Successful in 1m47s
SABnzbd API returns labels as an array in newer versions,
but the code assumed it was a comma-separated string.
Now handles both cases to prevent 'slot.labels.split is not a function' error.
2026-05-19 21:43:58 +01:00
gronod f22dd0d1f6 fix(downloads): Fix SABnzbd/qBittorrent collision and webhook metrics
Build and Push Docker Image / build (push) Successful in 46s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m8s
CI / Security audit (push) Successful in 1m33s
CI / Tests & coverage (push) Successful in 1m41s
1. Fixed download client collision:
   - SABnzbd client with id 'i3omb' was being overwritten by qBittorrent
   - Now uses unique key ':' like the arr retrievers

2. Fixed webhook metrics showing 0:
   - instanceName from webhooks is generic ('Sonarr', 'Radarr')
   - Not the configured instance name ('i3omb')
   - Now updates metrics for ALL instances of that type
2026-05-19 21:40:53 +01:00
gronod 5159a83475 fix(retrievers): Use unique key to prevent Sonarr/Radarr collision
Build and Push Docker Image / build (push) Successful in 33s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m10s
CI / Security audit (push) Successful in 1m33s
CI / Tests & coverage (push) Successful in 1m52s
When Sonarr and Radarr had the same instance ID (e.g., 'i3omb'),
the Radarr retriever would overwrite the Sonarr retriever in the Map.
This caused webhook refreshes to show '0 instance(s)' for Sonarr.

Now uses ':' as the unique key so both can coexist.
2026-05-19 21:36:20 +01:00
gronod ccc3b6ffec fix(status): Check actual webhook config, show enabled even with 0 events
Build and Push Docker Image / build (push) Successful in 46s
Licence Check / Licence compatibility and copyright header verification (push) Has been cancelled
CI / Security audit (push) Has been cancelled
CI / Tests & coverage (push) Has been cancelled
The status panel was showing webhooks as disabled (null) when no events
had been received yet. Now it checks Sonarr/Radarr API to see if the
Sofarr webhook notification is actually configured.

- Added checkWebhookConfigured() to verify webhook exists in Sonarr/Radarr
- Shows 'enabled: true' with 0 events when webhook is configured
- Only shows null when webhook is not configured at all
2026-05-19 21:35:26 +01:00
gronod 4ec7d734b8 debug(sse): Add detailed logging for download matching
Build and Push Docker Image / build (push) Successful in 34s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m3s
CI / Security audit (push) Successful in 1m20s
CI / Tests & coverage (push) Successful in 1m38s
Add debug logging to trace:
- When downloads payload is built
- Data sizes from cache (SAB, qBit, Sonarr, Radarr)
- Number of downloads found and their titles

This will help diagnose why Dora downloads aren't appearing.
2026-05-19 21:32:15 +01:00
gronod 2e85fae57a fix(webhooks): Load collapsed by default, add webhook metrics to status panel
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m8s
CI / Security audit (push) Successful in 1m28s
CI / Tests & coverage (push) Successful in 1m53s
Build and Push Docker Image / build (push) Successful in 35s
- Fixed webhooks section to load collapsed (content hidden, toggle arrow reset)
- Added webhook metrics card to status panel for admin users:
  - Shows Sonarr/Radarr enabled/disabled status
  - Shows events received and polls skipped counts
- Updated /api/dashboard/status endpoint to include webhook metrics
- Metrics are aggregated from all Sonarr/Radarr instances
2026-05-19 21:24:28 +01:00
gronod 0f3c02e52d fix(webhooks): Use numeric method value (1=POST) in notification payload
Build and Push Docker Image / build (push) Successful in 44s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m6s
CI / Security audit (push) Successful in 1m17s
CI / Tests & coverage (push) Successful in 1m33s
The webhook notification payload was using string 'POST' for the method
field, but Sonarr/Radarr API expects numeric values:
- 1 = POST
- 2 = PUT

Also added onManualInteractionRequired: false to match the schema.

Fixes: Radarr/Sonarr rejecting webhook configuration with validation errors
2026-05-19 20:47:19 +01:00
gronod 9fd60bcfed fix(webhooks): Use SONARR_INSTANCES/RADARR_INSTANCES config for notification routes
Build and Push Docker Image / build (push) Successful in 31s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m8s
CI / Security audit (push) Successful in 1m21s
CI / Tests & coverage (push) Successful in 1m36s
The notification routes were using process.env.SONARR_URL directly,
which is undefined when using the newer SONARR_INSTANCES JSON format.

Changes:
- Added getFirstSonarrInstance() and getFirstRadarrInstance() helpers
- Updated /notifications, /notifications/test, and /notifications/sofarr-webhook
  routes to use instance config from getSonarrInstances()/getRadarrInstances()
- Returns 503 error if no instances are configured

Fixes: 'Invalid URL' errors when calling Sonarr/Radarr notification APIs
2026-05-19 20:42:59 +01:00
gronod af58e1bf2a debug(webhooks): Add console.error logging to Sonarr/Radarr notification routes
Build and Push Docker Image / build (push) Successful in 27s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m3s
CI / Security audit (push) Successful in 1m19s
CI / Tests & coverage (push) Successful in 1m34s
Added detailed error logging to help diagnose 500 errors when calling
Sonarr/Radarr notification APIs. Logs include:
- Error message
- Response status (if available)
- Response data (if available)

This will help identify if the issue is:
- Missing SONARR_URL/RADARR_URL or API keys
- Network connectivity issues
- Sonarr/Radarr API version incompatibility
2026-05-19 20:39:37 +01:00
gronod d06e24dbb6 feat(webhooks): display webhook statistics (events received, polls skipped, last event) in status panel
Build and Push Docker Image / build (push) Successful in 50s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 58s
CI / Security audit (push) Successful in 1m11s
CI / Tests & coverage (push) Successful in 1m24s
2026-05-19 19:18:29 +01:00
gronod 603f444c33 fix(webhooks): mount webhook routes in index.js before verifyCsrf
Webhook routes were only registered in app.js (the test factory) but
not in index.js (the production entry point). POST /api/webhook/*
was therefore falling through to the verifyCsrf middleware and being
rejected with 403 in production.
2026-05-19 19:06:36 +01:00
gronod 1bef14d590 feat(webhooks): security hardening, tests, full documentation audit & polish (Phase 6)
Build and Push Docker Image / build (push) Successful in 41s
Docs Check / Markdown lint (push) Successful in 48s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 57s
CI / Security audit (push) Successful in 1m23s
CI / Tests & coverage (push) Successful in 1m36s
Docs Check / Mermaid diagram parse check (push) Successful in 1m43s
2026-05-19 17:11:45 +01:00
gronod 8609f03c5a fix(webhooks): connect receiver to cache metrics for polling optimization (Phase 5.1)
Build and Push Docker Image / build (push) Successful in 40s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m16s
CI / Security audit (push) Successful in 1m25s
CI / Tests & coverage (push) Successful in 1m34s
2026-05-19 16:41:39 +01:00
gronod fcb0cd8e4a feat(webhooks): add polling optimization and fallback when webhooks are active (Phase 5)
Build and Push Docker Image / build (push) Successful in 38s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 56s
CI / Security audit (push) Successful in 1m18s
CI / Tests & coverage (push) Successful in 1m32s
2026-05-19 16:10:45 +01:00
gronod e022db8ef5 feat(webhooks): add notification management API + one-click Sofarr webhook setup (Phase 3)
Build and Push Docker Image / build (push) Successful in 45s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m1s
CI / Security audit (push) Successful in 1m20s
CI / Tests & coverage (push) Successful in 1m35s
2026-05-19 15:31:50 +01:00
gronod 1d61ea8d83 feat(webhooks): integrate receiver with cache + SSE (Phase 2)
CI / Security audit (push) Failing after 16s
Build and Push Docker Image / build (push) Successful in 32s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 49s
CI / Tests & coverage (push) Successful in 1m19s
2026-05-19 15:24:43 +01:00
gronod 99ddb05dbe feat(webhook): implement Phase 1 webhook receiver for Sonarr and Radarr
Build and Push Docker Image / build (push) Successful in 1m7s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m15s
CI / Security audit (push) Successful in 1m44s
CI / Tests & coverage (push) Successful in 1m53s
- Added POST /api/webhook/sonarr and POST /api/webhook/radarr endpoints
- Implemented webhook secret validation via SOFARR_WEBHOOK_SECRET environment variable
- Added logging for all incoming webhook events using existing logToFile utility
- Returns HTTP 200 immediately to prevent webhook retries
- Mounted webhook routes before CSRF middleware (called by external services)
- Non-breaking: no changes to polling, caching, SSE, or any existing behavior
- Lays groundwork for Phase 2 (cache + SSE integration) without implementing it yet
2026-05-19 15:15:53 +01:00
gronod 6e199925aa refactor: make PALDRA match PDCA style exactly - remove redundant instanceConfig parameter and convert to pure singleton
Build and Push Docker Image / build (push) Successful in 20s
CI / Security audit (push) Successful in 1m18s
CI / Tests & coverage (push) Successful in 1m14s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 54s
- Remove instanceConfig parameter from all retriever methods (getTags, getQueue, getHistory)
- Retriever instances now use this.url, this.apiKey, this.id instead of passed parameter
- Convert ArrRetrieverRegistry from class with convenience functions to pure singleton object
- Export singleton instance directly instead of class + convenience functions
- Update poller.js and historyFetcher.js to call methods on singleton directly
- All 261 tests pass with zero behavior changes
2026-05-19 14:51:22 +01:00
gronod 627329df2f feat: implement Pluggable Abstraction Layer for Data Retrieval (PALDRA) - #19
Build and Push Docker Image / build (push) Successful in 42s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 46s
CI / Security audit (push) Successful in 1m21s
CI / Tests & coverage (push) Successful in 1m35s
- Create ArrRetriever abstract base class defining pluggable interface
- Implement PollingSonarrRetriever and PollingRadarrRetriever with HTTP polling
- Add ArrRetrieverRegistry for managing retriever instances
- Refactor poller.js to use retriever registry instead of direct Axios calls
- Update historyFetcher.js to use retriever registry
- Preserve all cache keys, TTLs, timing logs, SSE broadcasts, error handling
- Enable future webhook listeners without touching poller logic
2026-05-19 14:43:28 +01:00
gronod 620f264861 fix: remove auto-appending of /RPC2 from RTorrentClient and finalize PDCA documentation
Build and Push Docker Image / build (push) Failing after 40s
CI / Security audit (push) Failing after 45s
CI / Tests & coverage (push) Failing after 55s
Docs Check / Markdown lint (push) Successful in 1m1s
Docs Check / Mermaid diagram parse check (push) Successful in 1m23s
Licence Check / Licence compatibility and copyright header verification (push) Failing after 28s
- Remove auto-appending of /RPC2 from RTorrentClient constructor
- Use exact URL from config (supports custom paths like whatbox.ca/xmlrpc)
- Update .env.sample with clear URL path documentation and examples
- Update README.md with comprehensive PDCA section and all download clients
- Add URL path verification tests (whatbox.ca, custom paths, no auth)
- Update architecture diagram to include Transmission and rTorrent
- Update Docker Compose example to include all download clients
- Update prerequisites to mention all supported download clients
- Update "What It Does" and "The Matching Process" sections
2026-05-19 11:53:51 +01:00
gronod a50e5a7d69 feat: add rtorrent client via PDCA
Build and Push Docker Image / build (push) Failing after 40s
CI / Security audit (push) Failing after 27s
CI / Tests & coverage (push) Failing after 35s
Docs Check / Markdown lint (push) Successful in 32s
Docs Check / Mermaid diagram parse check (push) Successful in 1m12s
Licence Check / Licence compatibility and copyright header verification (push) Failing after 24s
- Implement RTorrentClient extending DownloadClient abstract class
- Use xmlrpc package (v1.3.2) for XML-RPC communication
- Support HTTP Basic Auth when credentials are configured
- Map rTorrent states (d.state, d.is_active, d.is_hash_checking) to normalized statuses
- Calculate ETA from download speed and remaining bytes
- Add getRtorrentInstances() to config.js
- Register RTorrentClient in downloadClients.js registry
- Add 8 comprehensive unit tests covering all functionality
- Update .env.sample with rtorrent configuration examples
- Update ARCHITECTURE.md with rtorrent client details
- Update ADDING-A-DOWNLOAD-CLIENT.md with rtorrent-specific notes
2026-05-19 11:40:31 +01:00