README.md aktualisiert
This commit is contained in:
194
README.md
194
README.md
@@ -1,3 +1,195 @@
|
|||||||
# Subscribarr
|
# Subscribarr
|
||||||
|
|
||||||
Subscribarr ist ein Benachrichtigungstool für die Arr-Suite (Sonarr, Radarr, Jellyseerr, Jellyfin), mit dem Nutzer Serien oder Filme abonnieren können. Bei neuen Episoden oder Releases versendet Subscribarr automatische E-Mail-Benachrichtigungen.
|
# Subscribarr
|
||||||
|
|
||||||
|
Subscribarr is a notification tool for the *Arr ecosystem (Sonarr, Radarr) and Jellyfin. Users can subscribe to shows/movies; when new episodes/releases are available (and actually present), Subscribarr sends email notifications.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- **Login via Jellyfin** (use your Jellyfin account; admin status respected)
|
||||||
|
- **Subscriptions** for series and movies; duplicate-send protection per user/day
|
||||||
|
- **Email notifications** (SMTP configurable)
|
||||||
|
- **Sonarr/Radarr integration** (calendar/status; optional file-presence check)
|
||||||
|
- **Settings UI** for Jellyfin/Arr/Mail/Account
|
||||||
|
- **Periodic check via cron** calling `manage.py check_new_media`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Architecture / Tech Stack
|
||||||
|
|
||||||
|
- **Backend:** Django + Django REST Framework
|
||||||
|
- **Apps (examples):** `arr_api`, `accounts`, `settingspanel`
|
||||||
|
- **Database:** SQLite by default (path configurable via env)
|
||||||
|
- **Auth:** Jellyfin API (admin mirrored from Jellyfin policy)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quickstart (Docker)
|
||||||
|
|
||||||
|
### 1) Clone & run
|
||||||
|
```bash
|
||||||
|
git clone https://gitea.js-devop.de/jschaufuss/Subscribarr.git
|
||||||
|
cd Subscribarr
|
||||||
|
docker compose up -d --build
|
||||||
|
```
|
||||||
|
|
||||||
|
- Default app port inside the container: **8000**
|
||||||
|
- Optional: set `CRON_SCHEDULE` (e.g., `*/30 * * * *`) to enable periodic checks
|
||||||
|
|
||||||
|
### 2) Minimal `docker-compose.yml` (example)
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
subscribarr:
|
||||||
|
build: .
|
||||||
|
ports:
|
||||||
|
- "8000:8000"
|
||||||
|
environment:
|
||||||
|
- DJANGO_DEBUG=true
|
||||||
|
- DJANGO_ALLOWED_HOSTS=*
|
||||||
|
- DJANGO_SECRET_KEY=change-me
|
||||||
|
- DB_PATH=/app/data/db.sqlite3
|
||||||
|
- NOTIFICATIONS_ALLOW_DUPLICATES=false
|
||||||
|
# Jellyfin / Arr / Mail (see table below)
|
||||||
|
- CRON_SCHEDULE=*/30 * * * *
|
||||||
|
volumes:
|
||||||
|
- subscribarr-data:/app/data
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
subscribarr-data:
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Environment Variables (selection)
|
||||||
|
|
||||||
|
| Variable | Purpose |
|
||||||
|
|---|---|
|
||||||
|
| `DJANGO_DEBUG` | `true` / `false` (disable in production). |
|
||||||
|
| `DJANGO_ALLOWED_HOSTS` | Comma list of allowed hosts (e.g., `example.com,localhost`). |
|
||||||
|
| `DJANGO_SECRET_KEY` | Django secret key. |
|
||||||
|
| `DB_PATH` | SQLite path, e.g., `/app/data/db.sqlite3`. |
|
||||||
|
| `NOTIFICATIONS_ALLOW_DUPLICATES` | Allow duplicate sends (`true`/`false`). |
|
||||||
|
| `ADMIN_USERNAME` / `ADMIN_PASSWORD` / `ADMIN_EMAIL` | Optional: bootstrap an admin user on first run. |
|
||||||
|
| `JELLYFIN_URL` / `JELLYFIN_API_KEY` | Base URL + API key for Jellyfin. |
|
||||||
|
| `SONARR_URL` / `SONARR_API_KEY` | Base URL + API key for Sonarr. |
|
||||||
|
| `RADARR_URL` / `RADARR_API_KEY` | Base URL + API key for Radarr. |
|
||||||
|
| `MAIL_HOST` / `MAIL_PORT` / `MAIL_SECURE` | SMTP host/port/security (`starttls` / `ssl` / empty). |
|
||||||
|
| `MAIL_USER` / `MAIL_PASSWORD` / `MAIL_FROM` | SMTP auth + sender address. |
|
||||||
|
| `CRON_SCHEDULE` | Cron interval for periodic checks (e.g., `*/30 * * * *`). |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## First Run
|
||||||
|
|
||||||
|
1. Start the container (or dev server) and open `http://<host>:8000`.
|
||||||
|
2. Complete the **first-time setup**: Jellyfin URL/API key (required), optional Sonarr/Radarr, SMTP.
|
||||||
|
3. **Sign in** with Jellyfin credentials (admin users in Jellyfin become admins in Subscribarr).
|
||||||
|
4. Adjust settings later at `/settings/`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Notifications & Cron
|
||||||
|
|
||||||
|
- The periodic job calls `check_new_media` which determines today’s items via Sonarr/Radarr calendars.
|
||||||
|
- Email is sent only if the item is **present** (e.g., `hasFile`/downloaded) and not already recorded in the sent-log (duplicate guard).
|
||||||
|
- Cron is configured using `CRON_SCHEDULE` and runs `python manage.py check_new_media`. Output is typically logged to `/app/cron.log` in the container.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Routes / Endpoints (selected)
|
||||||
|
|
||||||
|
- `GET /` — Overview page with search/filter and subscribe actions
|
||||||
|
- `GET/POST /settings/` — Jellyfin/Arr/Mail/Account configuration (auth required; admin for some actions)
|
||||||
|
- Example subscribe endpoints (subject to change):
|
||||||
|
- `POST /api/series/subscribe/<series_id>/`, `POST /api/series/unsubscribe/<series_id>/`
|
||||||
|
- `POST /api/movies/subscribe/<movie_id>/`, `POST /api/movies/unsubscribe/<movie_id>/`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Local Development (without Docker)
|
||||||
|
|
||||||
|
> Requires Python 3.12+ (recommended).
|
||||||
|
|
||||||
|
### 1) Clone
|
||||||
|
```bash
|
||||||
|
git clone https://gitea.js-devop.de/jschaufuss/Subscribarr.git
|
||||||
|
cd Subscribarr
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2) Create & activate a virtualenv
|
||||||
|
```bash
|
||||||
|
python -m venv .venv
|
||||||
|
# Linux/macOS:
|
||||||
|
source .venv/bin/activate
|
||||||
|
# Windows (PowerShell):
|
||||||
|
# .venv\Scripts\Activate.ps1
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3) Install dependencies (including Django)
|
||||||
|
If the repository provides `requirements.txt`:
|
||||||
|
```bash
|
||||||
|
pip install --upgrade pip wheel
|
||||||
|
pip install -r requirements.txt
|
||||||
|
```
|
||||||
|
If not, install the core stack explicitly:
|
||||||
|
```bash
|
||||||
|
pip install --upgrade pip wheel
|
||||||
|
pip install "Django>=5" djangorestframework python-dotenv
|
||||||
|
# add any additional libs your project uses as needed
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4) Configure environment (dev)
|
||||||
|
Create a `.env` (or export env vars) with at least:
|
||||||
|
```env
|
||||||
|
DJANGO_DEBUG=true
|
||||||
|
DJANGO_SECRET_KEY=dev-secret
|
||||||
|
DJANGO_ALLOWED_HOSTS=*
|
||||||
|
DB_PATH=./data/db.sqlite3
|
||||||
|
```
|
||||||
|
Create the `data/` directory if it doesn’t exist.
|
||||||
|
|
||||||
|
### 5) Database setup
|
||||||
|
```bash
|
||||||
|
python manage.py makemigrations
|
||||||
|
python manage.py migrate
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6) (Optional) Create a superuser for the Django admin
|
||||||
|
```bash
|
||||||
|
python manage.py createsuperuser
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7) Run the dev server
|
||||||
|
```bash
|
||||||
|
python manage.py runserver 0.0.0.0:8000
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Data Model (high level)
|
||||||
|
|
||||||
|
- **User** (`accounts.User`): custom user with Jellyfin link and admin flag.
|
||||||
|
- **Subscriptions** (`arr_api.SeriesSubscription`, `arr_api.MovieSubscription`): unique per user/title.
|
||||||
|
- **SentNotification**: records delivered emails to avoid duplicates.
|
||||||
|
- **AppSettings**: singleton for Jellyfin/Arr/Mail/Account configuration.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Production Notes
|
||||||
|
|
||||||
|
- Set **`DEBUG=false`**, a strong **`DJANGO_SECRET_KEY`**, and proper **`DJANGO_ALLOWED_HOSTS`**.
|
||||||
|
- Run behind a reverse proxy with HTTPS.
|
||||||
|
- Collect static files if served by Django:
|
||||||
|
```bash
|
||||||
|
python manage.py collectstatic --noinput
|
||||||
|
```
|
||||||
|
- Use a persistent database volume (or switch to Postgres/MySQL) for production.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
MIT (see `LICENSE`).
|
||||||
|
Reference in New Issue
Block a user