Usenet Support Implementation Status
Schema Changes (shared/schema.ts)
✅ Added protocol field to indexers table (torznab/newznab)
✅ Extended downloaders enum to include sabnzbd and nzbget
✅ Renamed gameTorrents to gameDownloads (with backward compatibility alias)
✅ Added downloadType field ('torrent' | 'usenet')
✅ Updated DownloadStatus interface with Usenet-specific fields:
downloadType: Identifies torrent vs usenet
repairStatus: Par2 repair status (good/repairing/failed)
unpackStatus: Extract status (unpacking/completed/failed)
age: Age in days for Usenet posts
Newznab Client (server/newznab.ts)
✅ Complete Newznab protocol implementation
✅ Search functionality with category filtering
✅ Multi-indexer parallel search
✅ Category discovery (caps endpoint)
✅ Connection testing
✅ Usenet-specific metadata parsing (grabs, age, poster, groups)
Usenet Downloaders (server/downloaders.ts)
✅ SABnzbd client implementation:
Queue management
History tracking
Repair/unpack status monitoring
NZB addition via URL
Pause/resume/remove operations
Free space reporting
✅ NZBGet client implementation:
JSON-RPC protocol support
Queue and history management
Post-processing status tracking
All standard operations
✅ Updated DownloaderManager.createClient() to support new clients
Routes Integration (server/routes.ts)
Storage Layer (server/storage.ts)
Middleware (server/middleware.ts)
Search Page (client/src/pages/search.tsx)
Game Download Dialog (client/src/components/GameDownloadDialog.tsx)
Downloads Page (client/src/pages/downloads.tsx)
Indexers Page (client/src/pages/indexers.tsx)
Downloaders Page (client/src/pages/downloaders.tsx)
Download Utils (client/src/lib/downloads-utils.ts)
Database Migration (Phase 5)
Element
Torrent
Usenet
Badge Color
Blue (default)
Purple (secondary)
Icon
Download
Newspaper
Primary Metrics
Seeders/Leechers
Grabs/Age
Speed Display
Up + Down
Down only
Status Values
downloading, seeding, completed, paused, error
downloading, repairing, unpacking, completed, paused, error
Additional Info
Ratio
Repair/Unpack status
// Download Type Badge
< Badge variant = { download . downloadType === 'torrent' ? 'default' : 'secondary' } >
{ download . downloadType === 'torrent' ? (
< > < Download className = "h-3 w-3" /> Torrent</ >
) : (
< > < Newspaper className = "h-3 w-3" /> Usenet</ >
) }
</ Badge >
// Conditional Metrics
{ download . downloadType === 'torrent' && (
< >
< Badge > { download . seeders } S/{ download . leechers } L</ Badge >
< Badge > Ratio: { download . ratio ?. toFixed ( 2 ) } </ Badge >
</ >
) }
{ download . downloadType === 'usenet' && (
< >
< Badge > { download . grabs } grabs</ Badge >
< Badge > { download . age } d old</ Badge >
{ download . repairStatus && (
< Badge variant = { download . repairStatus === 'failed' ? 'destructive' : 'default' } >
Repair: { download . repairStatus }
</ Badge >
) }
</ >
) }
Deploy schema changes with backward compatibility
Run database migration to add new columns
Update backend routes gradually
Deploy frontend updates with feature flag
Test with real Usenet providers
Enable for all users after validation
Usenet downloads don't support seeding (upload speed)
NZB file details less granular than torrents
Repair status requires SABnzbd/NZBGet to report it
Some Usenet indexers may have different category schemes