This commit is contained in:
@@ -7,8 +7,12 @@ A dockerized torrent crawler and downloader for [Nyaa.si](https://nyaa.si). Trac
|
||||
- Search Nyaa.si and add shows to a watch list
|
||||
- Automatic polling for new episodes (configurable interval, default 15 min)
|
||||
- Auto-downloads `.torrent` files to a mapped host directory
|
||||
- Track episode status: pending, auto-downloaded, or manually marked
|
||||
- Backfills existing episodes (oldest first) when a show is added
|
||||
- Tracks episode status: pending, auto-downloaded, manually marked, or failed
|
||||
- Automatically retries failed downloads on each poll (up to 5 attempts), including ones that have scrolled off the RSS feed
|
||||
- Surfaces failed downloads with their error message, plus a "Poll Now" manual trigger
|
||||
- Bulk-mark episodes as already downloaded
|
||||
- Health check that warns when the torrent output directory isn't writable
|
||||
- Minimal dark-themed web UI
|
||||
- SQLite persistence — easy to back up and migrate
|
||||
- Unraid-friendly Docker container
|
||||
@@ -17,7 +21,7 @@ A dockerized torrent crawler and downloader for [Nyaa.si](https://nyaa.si). Trac
|
||||
|
||||
- **Backend**: Node.js + TypeScript + Express
|
||||
- **Frontend**: React + Vite
|
||||
- **Database**: SQLite (`better-sqlite3`)
|
||||
- **Database**: SQLite via Node's built-in `node:sqlite` (requires Node 22+)
|
||||
- **Scheduler**: `node-cron`
|
||||
- **Nyaa integration**: RSS via `fast-xml-parser`
|
||||
|
||||
@@ -31,6 +35,8 @@ Open `http://localhost:8082` in your browser.
|
||||
|
||||
## Quick Start (Development)
|
||||
|
||||
Requires **Node.js 22+** (the app uses the built-in `node:sqlite` module).
|
||||
|
||||
```bash
|
||||
npm install
|
||||
npm run dev
|
||||
@@ -39,6 +45,16 @@ npm run dev
|
||||
- Client dev server: `http://localhost:5173` (proxies `/api` to `:3000`)
|
||||
- API server: `http://localhost:3000`
|
||||
|
||||
## Tests
|
||||
|
||||
```bash
|
||||
npm test
|
||||
```
|
||||
|
||||
Unit tests (via Node's built-in test runner) cover the pure logic most prone to
|
||||
edge cases: episode-code parsing, batch-release detection, the poll-interval →
|
||||
cron conversion, filename slugification, and release-title parsing.
|
||||
|
||||
## Environment Variables
|
||||
|
||||
| Variable | Default | Description |
|
||||
@@ -72,4 +88,7 @@ services:
|
||||
|
||||
- Only `.torrent` files are downloaded — media is handled by your existing torrent client watching the output directory.
|
||||
- Batch releases (titles containing "Batch", "Complete", "Vol.", or episode ranges) are automatically skipped.
|
||||
- Removing a show marks it inactive (no further polling) but preserves episode history.
|
||||
- **Pause** stops further polling for a show but keeps its episodes. **Delete** permanently removes the show and its episode history (already-downloaded `.torrent` files on disk are left untouched).
|
||||
- Failed downloads are retried automatically on each poll, up to 5 attempts; after that they stay `failed` (mark them downloaded manually, or delete and re-add the show). Failures are deduplicated against the live feed and retried even once they've scrolled off it.
|
||||
- If the torrent output directory isn't writable, a warning banner appears on every page showing the failing path — fix the volume mapping or permissions and the next poll will recover.
|
||||
- The SQLite schema migrates automatically on startup; existing databases are upgraded in place.
|
||||
|
||||
Reference in New Issue
Block a user