version 2 build
Build and Push Docker Image / build (push) Failing after 1s

This commit is contained in:
Jason Stedwell
2026-06-28 21:47:04 -05:00
parent 8498f7abc4
commit 14ce08c3c2
22 changed files with 462 additions and 116 deletions
+22 -3
View File
@@ -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.