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
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
f095e6a2d1
Fix QBittorrentClient export in legacy qbittorrent.js
...
Build and Push Docker Image / build (push) Successful in 44s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 57s
CI / Security audit (push) Successful in 1m15s
CI / Tests & coverage (push) Failing after 1m22s
Remove undefined QBittorrentClient export that was causing
container startup failures. The actual implementation is now
in server/clients/QBittorrentClient.js
2026-05-19 11:21:31 +01:00
bf3e1c353d
Implement Pluggable Download Client Architecture (PDCA)
...
Build and Push Docker Image / build (push) Successful in 31s
Docs Check / Markdown lint (push) Successful in 31s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m12s
CI / Tests & coverage (push) Failing after 1m39s
CI / Security audit (push) Successful in 1m49s
Docs Check / Mermaid diagram parse check (push) Successful in 1m56s
- Add abstract DownloadClient base class with standardized interface
- Refactor QBittorrentClient to extend DownloadClient with Sync API support
- Create SABnzbdClient implementing DownloadClient interface
- Add TransmissionClient as proof-of-concept implementation
- Implement DownloadClientRegistry for factory pattern and client management
- Refactor poller.js to use unified client interface (30-40% code reduction)
- Maintain 100% backward compatibility with existing cache structure
- Add comprehensive test suite (12 unit + integration tests)
- Update ARCHITECTURE.md with detailed PDCA documentation
- Create ADDING-A-DOWNLOAD-CLIENT.md guide for future client additions
Features:
- Client-agnostic polling with error isolation
- Consistent data normalization across all clients
- Easy extensibility for new download client types
- Zero breaking changes to existing functionality
- Parallel execution with unified timing and logging
2026-05-19 11:18:19 +01:00
c85ff602d0
ci: use develop* glob in build-image branch trigger
Build and Push Docker Image / build (push) Successful in 28s
CI / Security audit (push) Successful in 1m11s
CI / Tests & coverage (push) Successful in 1m24s
Docs Check / Markdown lint (push) Successful in 37s
Docs Check / Mermaid diagram parse check (push) Successful in 1m9s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 44s
2026-05-19 09:47:26 +01:00
d73e1dcf0b
ci: build Docker images on develop* branches
CI / Security audit (push) Successful in 1m2s
CI / Tests & coverage (push) Successful in 1m15s
2026-05-19 09:37:43 +01:00
0a54d0d302
refactor: use qBittorrent Sync API (/api/v2/sync/maindata) with fallback
...
Docs Check / Markdown lint (push) Successful in 51s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m16s
CI / Tests & coverage (push) Successful in 1m37s
CI / Security audit (push) Successful in 1m44s
Docs Check / Mermaid diagram parse check (push) Successful in 1m52s
- QBittorrentClient now uses the incremental Sync API instead of repeatedly
fetching the full torrent list via /api/v2/torrents/info.
- Per-client state: lastRid, torrentMap, fallbackThisCycle.
- Handles full_update, delta updates, and torrents_removed.
- Falls back to legacy torrents/info at most once per poll cycle.
- getAllTorrents() resets fallback flags before each cycle.
- Added 9 new unit tests covering: first sync, delta merge, full_update,
torrents_removed, fallback path, direct-legacy-after-fallback, 403 re-auth,
completed-field computation, and fallback reset.
2026-05-19 09:33:20 +01:00
8c4cc20551
Add MIT copyright headers to all source files
Build and Push Docker Image / build (push) Successful in 48s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m21s
CI / Security audit (push) Successful in 1m47s
CI / Tests & coverage (push) Successful in 2m1s
2026-05-19 09:07:42 +01:00
da77f083fe
Merge pull request 'Update .gitea/workflows/licence-check.yml' ( #17 ) from develop-workflow into develop
...
Build and Push Docker Image / build (push) Successful in 40s
Licence Check / Licence compatibility and copyright header verification (push) Failing after 54s
CI / Security audit (push) Successful in 1m25s
CI / Tests & coverage (push) Successful in 1m39s
Reviewed-on: #17
2026-05-18 13:45:03 +01:00
71feaf0175
Update .gitea/workflows/licence-check.yml
Licence Check / Licence compatibility and copyright header verification (push) Failing after 56s
CI / Security audit (push) Successful in 1m7s
CI / Tests & coverage (push) Successful in 1m18s
Licence Check / Licence compatibility and copyright header verification (pull_request) Failing after 39s
CI / Security audit (pull_request) Successful in 1m13s
CI / Tests & coverage (pull_request) Successful in 1m23s
2026-05-18 13:39:59 +01:00
b41f943407
fix: Remove reference to PlantUML diagrams
Build and Push Docker Image / build (push) Successful in 1m3s
CI / Security audit (pull_request) Successful in 1m31s
CI / Tests & coverage (pull_request) Successful in 1m39s
Docs Check / Markdown lint (push) Failing after 18s
CI / Tests & coverage (push) Has been cancelled
CI / Security audit (push) Has been cancelled
Docs Check / Mermaid diagram parse check (push) Successful in 1m48s
2026-05-18 07:47:56 +01:00
9debd77392
docs: update ARCHITECTURE.md - fix CI/CD table, remove stale diagram refs, update data models
...
Build and Push Docker Image / build (push) Successful in 45s
Docs Check / Markdown lint (push) Successful in 1m2s
CI / Security audit (push) Successful in 1m25s
CI / Tests & coverage (push) Successful in 1m41s
Docs Check / Mermaid diagram parse check (push) Successful in 1m48s
- CI/CD table: add docs-check.yml and licence-check.yml, correct build-image.yml trigger (release/** + develop, not main)
- Section 13 intro: clarify no PNG exports or external tooling required
- Download class diagram: add canBlocklist, addedOn, arrQueueId, arrType, arrInstanceUrl, arrContentId, arrContentType fields
- qBittorrentTorrent class diagram: add added_on field
- Remove docs/diagrams/ directory (PNG exports superseded by embedded Mermaid)
2026-05-18 07:44:41 +01:00
a0f630fb81
chore: bump version to 1.3.1 (point release)
Build and Push Docker Image / build (push) Successful in 40s
Licence Check / Dependency licence compatibility (push) Successful in 48s
CI / Security audit (push) Successful in 58s
CI / Tests & coverage (push) Successful in 1m10s
2026-05-18 06:35:16 +01:00
e640215502
chore: bump version to 1.4.0
Licence Check / Dependency licence compatibility (push) Successful in 1m5s
Build and Push Docker Image / build (push) Successful in 1m17s
CI / Security audit (push) Successful in 1m24s
CI / Tests & coverage (push) Successful in 1m31s
2026-05-18 06:31:31 +01:00
972b407956
chore: sync package-lock.json version to 1.3.0
2026-05-18 06:30:57 +01:00
cf7008fd54
docs: update documentation for blocklist & search non-admin eligibility
...
Build and Push Docker Image / build (push) Successful in 29s
Docs Check / Markdown lint (push) Successful in 50s
CI / Security audit (push) Successful in 1m30s
CI / Tests & coverage (push) Successful in 1m50s
Docs Check / Mermaid diagram parse check (push) Successful in 2m18s
- CHANGELOG: document button availability changes (all admin downloads, non-admin eligibility)
- README: update blocklist-search endpoint description with non-admin conditions
- ARCHITECTURE.md: update Authorisation Matrix, Download object table (add canBlocklist, addedOn fields), and blocklist-search API reference
2026-05-18 00:05:31 +01:00
2747ca7754
feat: allow non-admin users to blocklist & search under specific conditions
...
Build and Push Docker Image / build (push) Successful in 37s
CI / Security audit (push) Successful in 1m30s
CI / Tests & coverage (push) Successful in 1m47s
- Added addedOn timestamp to qBittorrent torrent mapping
- Added canBlocklist helper function: true for admins, true for non-admins when (importIssues OR (torrent >1h old AND availability<100%))
- Added canBlocklist field to all download objects in /user-downloads and SSE /stream routes (8 blocks total)
- Frontend button now shows when (isAdmin OR download.canBlocklist) && download.arrQueueId
2026-05-17 23:57:06 +01:00
0341540751
feat: show blocklist & search button on all admin downloads (not just import-pending)
...
Build and Push Docker Image / build (push) Successful in 35s
CI / Security audit (push) Successful in 1m23s
CI / Tests & coverage (push) Successful in 1m43s
- Remove importIssues condition from arr action fields threading in /user-downloads route (all 4 blocks: SAB+Sonarr, SAB+Radarr, qBit+Sonarr, qBit+Radarr)
- Remove importIssues condition from arr action fields threading in SSE /stream route (all 4 blocks)
- Move blocklist button rendering outside importIssues condition in frontend — now shows for all admin downloads with arrQueueId
2026-05-17 23:43:37 +01:00
aef21d1b50
chore: bump to v1.3.0; update CHANGELOG, README, ARCHITECTURE docs
Docs Check / Mermaid diagram parse check (push) Failing after 44s
Docs Check / Markdown lint (push) Successful in 1m7s
Build and Push Docker Image / build (push) Successful in 1m15s
Licence Check / Dependency licence compatibility (push) Successful in 1m37s
CI / Security audit (push) Successful in 2m2s
CI / Tests & coverage (push) Successful in 2m27s
2026-05-17 23:29:02 +01:00
a6fcde58cf
fix: thread arr action fields through SSE handler; align import-issue tooltip with themed CSS pattern
Build and Push Docker Image / build (push) Successful in 31s
CI / Security audit (push) Successful in 1m19s
CI / Tests & coverage (push) Successful in 1m36s
2026-05-17 23:20:04 +01:00
d839fa98a0
feat: blocklist & search button for import-pending downloads with caution
...
Build and Push Docker Image / build (push) Successful in 29s
CI / Security audit (push) Successful in 1m24s
CI / Tests & coverage (push) Successful in 1m42s
- Poller now stores _instanceKey alongside _instanceUrl on Sonarr/Radarr queue records
- dashboard route threads arrQueueId/arrType/arrInstanceUrl/arrInstanceKey/arrContentId/arrContentType as admin-only fields on downloads with importIssues
- POST /api/dashboard/blocklist-search: admin-only, removes queue item with blocklist=true then triggers EpisodeSearch/MoviesSearch
- Button renders in download card header (admin + importIssues + arrQueueId only)
- Confirm dialog, loading/success/error states on the button
- Kicks a background poll on success so SSE reflects removed item promptly
2026-05-17 23:15:33 +01:00
a92ab85bc0
fix: title link wired via JS goHome() — switches to downloads, closes status, resets showAll
Build and Push Docker Image / build (push) Successful in 40s
CI / Security audit (push) Successful in 1m33s
CI / Tests & coverage (push) Successful in 1m56s
2026-05-17 23:08:27 +01:00
57b127ea95
fix: title click switches to downloads tab and closes status panel (no page reload)
Build and Push Docker Image / build (push) Successful in 33s
CI / Security audit (push) Successful in 1m20s
CI / Tests & coverage (push) Successful in 1m37s
2026-05-17 23:01:15 +01:00
56f42755cc
fix: title logo links to /, version footer links to repo
Build and Push Docker Image / build (push) Successful in 26s
CI / Security audit (push) Successful in 1m15s
CI / Tests & coverage (push) Successful in 1m36s
2026-05-17 22:58:53 +01:00
15152714fd
fix: use data-tooltip CSS popup for hide-upgrade-failures checkbox, matching episode tooltip style
Build and Push Docker Image / build (push) Successful in 26s
CI / Security audit (push) Successful in 1m35s
CI / Tests & coverage (push) Successful in 1m44s
2026-05-17 22:55:52 +01:00
19b9c97e64
feat: add 'Hide upgrade failures' checkbox to history controls
Build and Push Docker Image / build (push) Successful in 36s
CI / Security audit (push) Successful in 1m27s
CI / Tests & coverage (push) Successful in 1m43s
2026-05-17 22:52:55 +01:00
55a5577f2a
feat: render availableForUpgrade badge on failed history items where episode/movie is already on disk
Build and Push Docker Image / build (push) Successful in 38s
CI / Security audit (push) Successful in 1m41s
CI / Tests & coverage (push) Successful in 1m49s
2026-05-17 21:53:58 +01:00
6139095444
feat: deduplicate history — suppress failed records superseded by successful import, flag failed+hasFile as availableForUpgrade
Build and Push Docker Image / build (push) Successful in 58s
CI / Security audit (push) Has been cancelled
CI / Tests & coverage (push) Has been cancelled
Docs Check / Markdown lint (push) Successful in 1m14s
Licence Check / Dependency licence compatibility (push) Successful in 1m36s
Docs Check / Mermaid diagram parse check (push) Successful in 2m16s
2026-05-17 21:52:55 +01:00
4c9985e01a
chore: bump version to 1.2.2, update CHANGELOG
Create Release / release (push) Successful in 15s
Build and Push Docker Image / build (push) Successful in 1m12s
CI / Security audit (push) Successful in 2m19s
CI / Tests & coverage (push) Successful in 2m40s
v1.2.2
2026-05-17 21:22:02 +01:00
fecb96b04e
fix: correct width typo 56x -> 56px
Build and Push Docker Image / build (push) Successful in 29s
CI / Security audit (push) Successful in 1m34s
CI / Tests & coverage (push) Successful in 2m0s
2026-05-17 21:21:30 +01:00
c98b81c8bd
fix: Reduced size of logo to 56px for better balance
2026-05-17 21:21:30 +01:00
90bf411e0c
Increased size of logo to 64px for better balance
2026-05-17 21:21:30 +01:00
867e86615e
fix: increase header logo to 40px, use 192px source for crispness
2026-05-17 21:21:30 +01:00
2cbe3c6b76
feat: use favicon-192 for header logo, scale to 28px for visual parity with title text
2026-05-17 21:21:30 +01:00
59adcbc36e
feat: add logo to header title link
2026-05-17 21:21:30 +01:00
6865b860bc
merge: develop -> main (title repo link)
CI / Security audit (push) Successful in 4m30s
CI / Tests & coverage (push) Successful in 5m24s
2026-05-17 20:55:10 +01:00
9aaff5c368
feat: link sofarr title to repo
Build and Push Docker Image / build (push) Successful in 30s
CI / Security audit (push) Failing after 2m56s
CI / Tests & coverage (push) Successful in 5m35s
2026-05-17 20:55:06 +01:00
ce6f9b0459
merge: develop -> main for v1.2.1 (version footer)
Build and Push Docker Image / build (push) Successful in 41s
Create Release / release (push) Successful in 21s
CI / Security audit (push) Successful in 1m19s
CI / Tests & coverage (push) Has been cancelled
2026-05-17 20:35:36 +01:00
976d6527b6
Merge branch 'develop' of https://git.i3omb.com/Gandalf/sofarr into develop
Build and Push Docker Image / build (push) Successful in 54s
Docs Check / Markdown lint (push) Successful in 47s
Docs Check / Mermaid diagram parse check (push) Successful in 1m18s
Licence Check / Dependency licence compatibility (push) Successful in 40s
CI / Tests & coverage (push) Has been cancelled
CI / Security audit (push) Has been cancelled
2026-05-17 20:35:08 +01:00
6a8ca90fd3
feat: add version footer to dashboard UI (v1.2.1)
...
- /health endpoint now includes version field
- Footer displays 'sofarr vX.Y.Z' fetched on page load
- Subtle .app-version styling (smaller, dimmed)
- Bump version to 1.2.1, update CHANGELOG
2026-05-17 20:34:59 +01:00
2d5958006c
Merge pull request 'release/v1.2.0' ( #14 ) from release/v1.2.0 into develop
...
Build and Push Docker Image / build (push) Has been cancelled
CI / Security audit (push) Has been cancelled
CI / Tests & coverage (push) Has been cancelled
Reviewed-on: #14
2026-05-17 20:28:15 +01:00
9faf8c0ea3
Merge pull request 'release/v1.2.0' ( #13 ) from release/v1.2.0 into main
...
CI / Security audit (push) Has been cancelled
CI / Tests & coverage (push) Has been cancelled
Reviewed-on: #13
2026-05-17 20:26:35 +01:00
cb0e61ea36
Merge branch 'release/v1.2.0' of https://git.i3omb.com/Gandalf/sofarr into release/v1.2.0
Build and Push Docker Image / build (push) Successful in 31s
CI / Security audit (push) Successful in 1m10s
CI / Tests & coverage (push) Successful in 1m4s
Create Release / release (push) Successful in 24s
CI / Security audit (pull_request) Successful in 53s
CI / Tests & coverage (pull_request) Successful in 1m12s
v1.2.0
2026-05-17 20:24:40 +01:00
bd3b28921d
release: sync release/v1.2.0 with main
2026-05-17 20:24:31 +01:00
1d9e86760b
merge: sync main with remote
CI / Security audit (push) Has been cancelled
CI / Tests & coverage (push) Has been cancelled
2026-05-17 20:24:28 +01:00
ae3bf70008
merge: sync main with develop (licence-check workflow, branch exclusions)
2026-05-17 20:24:09 +01:00
fb719141fa
ci: exclude main and release/* branches from docs-check and licence-check workflows
Build and Push Docker Image / build (push) Has been cancelled
CI / Security audit (push) Has been cancelled
CI / Tests & coverage (push) Has been cancelled
2026-05-17 20:23:47 +01:00
e45c566fd7
ci: add licence-check workflow — validates production dep licences against MIT-compatible allowlist
2026-05-17 20:23:47 +01:00
81d3e0045f
ci: exclude main and release/* branches from docs-check and licence-check workflows
CI / Security audit (push) Has been cancelled
CI / Tests & coverage (push) Has been cancelled
CI / Security audit (pull_request) Successful in 1m6s
CI / Tests & coverage (pull_request) Successful in 1m19s
2026-05-17 20:22:59 +01:00
1f3b2adbfe
ci: add licence-check workflow — validates production dep licences against MIT-compatible allowlist
2026-05-17 20:22:59 +01:00