708 lines
12 KiB
Markdown
708 lines
12 KiB
Markdown
# encoderPro Dashboard API Reference
|
|
|
|
## Overview
|
|
|
|
The encoderPro dashboard provides a RESTful API for monitoring and controlling the encoding system. All endpoints return JSON responses with a consistent format:
|
|
|
|
```json
|
|
{
|
|
"success": true,
|
|
"data": { ... }
|
|
}
|
|
```
|
|
|
|
Or on error:
|
|
```json
|
|
{
|
|
"success": false,
|
|
"error": "Error message"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Auto-Initialization
|
|
|
|
The dashboard automatically initializes the database on first run if it doesn't exist. No manual setup required!
|
|
|
|
**On first start:**
|
|
1. Dashboard creates empty database at `/db/state.db`
|
|
2. Database schema is created automatically
|
|
3. Dashboard is ready to use
|
|
4. Run a library scan to populate database
|
|
|
|
---
|
|
|
|
## API Endpoints
|
|
|
|
### Health & Status
|
|
|
|
#### `GET /api/health`
|
|
Health check with database status.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"data": {
|
|
"status": "healthy",
|
|
"version": "3.1.0",
|
|
"timestamp": "2025-12-19T18:45:00.000Z",
|
|
"database": {
|
|
"exists": true,
|
|
"path": "/db/state.db",
|
|
"file_count": 1250,
|
|
"needs_scan": false
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
**Use cases:**
|
|
- Check if dashboard is running
|
|
- Check if database exists
|
|
- Check if library scan is needed
|
|
- Monitor file count
|
|
|
|
---
|
|
|
|
### Statistics
|
|
|
|
#### `GET /api/stats`
|
|
Get processing statistics.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"data": {
|
|
"pending": 850,
|
|
"processing": 2,
|
|
"completed": 145,
|
|
"failed": 3,
|
|
"skipped": 250,
|
|
"original_size": 4500000000000,
|
|
"encoded_size": 2200000000000,
|
|
"space_saved": 2300000000000,
|
|
"space_saved_percent": 51.1,
|
|
"avg_fps": 8.5,
|
|
"avg_encode_time": 3600,
|
|
"encoder_usage": {
|
|
"cpu_x265": 100,
|
|
"nvidia_nvenc_h265": 45
|
|
},
|
|
"completed_24h": 12
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### Files
|
|
|
|
#### `GET /api/files`
|
|
Get list of files with filtering.
|
|
|
|
**Query Parameters:**
|
|
- `state` (optional): Filter by state (`pending`, `processing`, `completed`, `failed`, `skipped`)
|
|
- `limit` (optional): Number of results (default: 100)
|
|
- `offset` (optional): Pagination offset (default: 0)
|
|
- `search` (optional): Search in file paths
|
|
|
|
**Examples:**
|
|
```
|
|
GET /api/files?state=pending&limit=50
|
|
GET /api/files?search=action&limit=20
|
|
GET /api/files?offset=100&limit=100
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"data": [
|
|
{
|
|
"id": 1,
|
|
"filepath": "/movies/example.mkv",
|
|
"relative_path": "example.mkv",
|
|
"state": "completed",
|
|
"has_subtitles": true,
|
|
"original_size": 5000000000,
|
|
"encoded_size": 2500000000,
|
|
"subtitle_count": 2,
|
|
"profile_name": "sweetspot_cpu",
|
|
"encoder_used": "cpu_x265",
|
|
"encode_time_seconds": 3600,
|
|
"fps": 8.5,
|
|
"created_at": "2025-12-19T10:00:00",
|
|
"completed_at": "2025-12-19T11:00:00"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### `GET /api/file/<id>`
|
|
Get single file details.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"data": {
|
|
"id": 1,
|
|
"filepath": "/movies/example.mkv",
|
|
"state": "completed",
|
|
...
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### Activity
|
|
|
|
#### `GET /api/activity`
|
|
Get recent file activity (completed/failed).
|
|
|
|
**Query Parameters:**
|
|
- `limit` (optional): Number of results (default: 20)
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"data": [
|
|
{
|
|
"id": 1,
|
|
"relative_path": "example.mkv",
|
|
"state": "completed",
|
|
"updated_at": "2025-12-19T11:00:00",
|
|
"encoder_used": "cpu_x265",
|
|
"fps": 8.5
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### Processing Status
|
|
|
|
#### `GET /api/processing`
|
|
Get currently processing files.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"data": {
|
|
"active": true,
|
|
"files": [
|
|
{
|
|
"id": 2,
|
|
"relative_path": "movie2.mkv",
|
|
"started_at": "2025-12-19T18:30:00",
|
|
"profile_name": "sweetspot_cpu"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### System Monitoring
|
|
|
|
#### `GET /api/system`
|
|
Get system resource statistics.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"data": {
|
|
"gpu": [
|
|
{
|
|
"index": 0,
|
|
"name": "NVIDIA GeForce RTX 4090",
|
|
"utilization": 85,
|
|
"memory_used": 8192,
|
|
"memory_total": 24576,
|
|
"temperature": 72
|
|
}
|
|
],
|
|
"cpu": {
|
|
"load_1m": 4.5,
|
|
"load_5m": 3.8,
|
|
"load_15m": 3.2,
|
|
"cpu_count": 48,
|
|
"load_percent": 9.4
|
|
},
|
|
"disk": {
|
|
"work_total": 1000000000000,
|
|
"work_used": 250000000000,
|
|
"work_free": 750000000000,
|
|
"work_percent": 25.0
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### Job Control
|
|
|
|
#### `POST /api/jobs/start`
|
|
Start processing job.
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"profile": "sweetspot_cpu",
|
|
"dry_run": false
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"message": "Processing started",
|
|
"dry_run": false
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### `POST /api/jobs/stop`
|
|
Stop processing job.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"message": "Processing stopped"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### `POST /api/jobs/scan`
|
|
Scan library to populate database.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"message": "Library scan started"
|
|
}
|
|
```
|
|
|
|
**Use cases:**
|
|
- Initial library scan
|
|
- Refresh library after adding new files
|
|
- Re-scan if files were added manually
|
|
|
|
---
|
|
|
|
#### `POST /api/jobs/reencode-selected`
|
|
Queue selected files for re-encoding with specified profile.
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"file_ids": [1, 5, 12, 23],
|
|
"profile": "quality_cpu"
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"message": "4 files queued for re-encoding",
|
|
"count": 4
|
|
}
|
|
```
|
|
|
|
**Use cases:**
|
|
- Re-encode specific files with different quality settings
|
|
- Re-process failed files with a different profile
|
|
- Upgrade completed files to higher quality
|
|
|
|
**Notes:**
|
|
- Resets file state from 'completed' or 'failed' to 'pending'
|
|
- Sets the profile_name for each file
|
|
- Files will be processed when the job is started
|
|
|
|
---
|
|
|
|
### Logs
|
|
|
|
#### `GET /api/logs`
|
|
Get recent log entries.
|
|
|
|
**Query Parameters:**
|
|
- `lines` (optional): Number of lines (default: 100)
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"data": [
|
|
"2025-12-19 18:45:00 - INFO - Processing started",
|
|
"2025-12-19 18:45:01 - INFO - Encoding example.mkv",
|
|
...
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### Configuration
|
|
|
|
#### `GET /api/config`
|
|
Get current configuration.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"data": {
|
|
"movies_dir": "/movies",
|
|
"archive_dir": "/archive",
|
|
"parallel": {
|
|
"max_workers": 8,
|
|
"cpu_slots": 24
|
|
},
|
|
"profiles": {
|
|
"default": "sweetspot_cpu",
|
|
"definitions": { ... }
|
|
},
|
|
"quality_check": {
|
|
"enabled": true,
|
|
"warn_threshold": 10.0,
|
|
"error_threshold": 20.0,
|
|
"skip_on_degradation": false
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### `POST /api/config`
|
|
Save configuration.
|
|
|
|
**Request Body:** (full config object)
|
|
```json
|
|
{
|
|
"movies_dir": "/movies",
|
|
"archive_dir": "/archive",
|
|
"quality_check": {
|
|
"enabled": true,
|
|
"warn_threshold": 15.0
|
|
},
|
|
...
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"message": "Configuration saved successfully",
|
|
"data": { ... }
|
|
}
|
|
```
|
|
|
|
**Notes:**
|
|
- Creates backup before saving (`config.yaml.backup`)
|
|
- Validates required fields
|
|
- Returns validation errors if invalid
|
|
|
|
---
|
|
|
|
#### `POST /api/config/validate`
|
|
Validate configuration without saving.
|
|
|
|
**Request Body:** (config object to validate)
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"data": {
|
|
"valid": true,
|
|
"errors": [],
|
|
"warnings": [
|
|
"max_workers=12 is very high, may cause system instability"
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### Profiles
|
|
|
|
#### `GET /api/profiles`
|
|
Get available encoding profiles.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"data": {
|
|
"default": "sweetspot_cpu",
|
|
"profiles": {
|
|
"sweetspot_cpu": {
|
|
"encoder": "cpu_x265",
|
|
"preset": "slow",
|
|
"quality": 21,
|
|
"description": "Perfect balance..."
|
|
},
|
|
"balanced_cpu": {
|
|
"encoder": "cpu_x265",
|
|
"preset": "medium",
|
|
"quality": 23
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### Encoders
|
|
|
|
#### `GET /api/encoders`
|
|
Get available encoders on the system.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"data": {
|
|
"cpu": {
|
|
"x265": true,
|
|
"x264": true
|
|
},
|
|
"nvidia": {
|
|
"nvenc_h265": true,
|
|
"nvenc_h264": true
|
|
},
|
|
"intel": {
|
|
"qsv_h265": false,
|
|
"qsv_h264": false
|
|
},
|
|
"amd": {
|
|
"vaapi_h265": false,
|
|
"vaapi_h264": false
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### Directory Validation
|
|
|
|
#### `POST /api/directories/validate`
|
|
Validate directory paths.
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"paths": {
|
|
"movies": "/movies",
|
|
"archive": "/archive",
|
|
"work": "/work"
|
|
}
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"data": {
|
|
"movies": {
|
|
"path": "/movies",
|
|
"exists": true,
|
|
"is_directory": true,
|
|
"is_writable": false,
|
|
"is_readable": true
|
|
},
|
|
"archive": {
|
|
"path": "/archive",
|
|
"exists": true,
|
|
"is_directory": true,
|
|
"is_writable": true,
|
|
"is_readable": true
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Workflow Examples
|
|
|
|
### Initial Setup
|
|
|
|
```bash
|
|
# 1. Start dashboard (auto-creates database)
|
|
docker exec encoderpro python3 /app/dashboard.py
|
|
|
|
# 2. Check health
|
|
curl http://localhost:5000/api/health
|
|
|
|
# 3. Trigger library scan via API
|
|
curl -X POST http://localhost:5000/api/jobs/scan
|
|
|
|
# 4. Monitor scan progress
|
|
curl http://localhost:5000/api/stats
|
|
```
|
|
|
|
---
|
|
|
|
### Start Processing
|
|
|
|
```bash
|
|
# Start with default profile
|
|
curl -X POST http://localhost:5000/api/jobs/start \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"dry_run": false}'
|
|
|
|
# Start with specific profile
|
|
curl -X POST http://localhost:5000/api/jobs/start \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"profile": "quality_cpu", "dry_run": false}'
|
|
```
|
|
|
|
---
|
|
|
|
### Monitor Progress
|
|
|
|
```bash
|
|
# Get statistics
|
|
curl http://localhost:5000/api/stats
|
|
|
|
# Get currently processing files
|
|
curl http://localhost:5000/api/processing
|
|
|
|
# Get recent activity
|
|
curl http://localhost:5000/api/activity?limit=10
|
|
|
|
# View logs
|
|
curl http://localhost:5000/api/logs?lines=50
|
|
```
|
|
|
|
---
|
|
|
|
### Update Configuration
|
|
|
|
```bash
|
|
# Get current config
|
|
curl http://localhost:5000/api/config > config.json
|
|
|
|
# Edit config.json
|
|
|
|
# Validate changes
|
|
curl -X POST http://localhost:5000/api/config/validate \
|
|
-H "Content-Type: application/json" \
|
|
-d @config.json
|
|
|
|
# Save if valid
|
|
curl -X POST http://localhost:5000/api/config \
|
|
-H "Content-Type: application/json" \
|
|
-d @config.json
|
|
```
|
|
|
|
---
|
|
|
|
## Environment Variables
|
|
|
|
| Variable | Default | Description |
|
|
|----------|---------|-------------|
|
|
| `STATE_DB` | `/db/state.db` | Database file path |
|
|
| `LOG_DIR` | `/logs` | Log directory |
|
|
| `CONFIG_FILE` | `/config/config.yaml` | Config file path |
|
|
| `REENCODE_SCRIPT` | `/app/reencode-v3.py` | Main script path |
|
|
| `DASHBOARD_HOST` | `0.0.0.0` | Dashboard bind address |
|
|
| `DASHBOARD_PORT` | `5000` | Dashboard port |
|
|
| `DASHBOARD_DEBUG` | `false` | Enable debug mode |
|
|
|
|
---
|
|
|
|
## Error Handling
|
|
|
|
All endpoints follow consistent error handling:
|
|
|
|
**404 - Not Found:**
|
|
```json
|
|
{
|
|
"success": false,
|
|
"error": "File not found"
|
|
}
|
|
```
|
|
|
|
**500 - Server Error:**
|
|
```json
|
|
{
|
|
"success": false,
|
|
"error": "Database connection failed"
|
|
}
|
|
```
|
|
|
|
**400 - Bad Request:**
|
|
```json
|
|
{
|
|
"success": false,
|
|
"error": "Missing required field: movies_dir"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## WebSocket Support (Future)
|
|
|
|
Real-time updates will be added via WebSocket in a future version:
|
|
- Live encoding progress
|
|
- Real-time log streaming
|
|
- File state changes
|
|
- System resource updates
|
|
|
|
---
|
|
|
|
## Security Considerations
|
|
|
|
**Current version (3.1.0):**
|
|
- No authentication (intended for private networks)
|
|
- CORS enabled for all origins
|
|
- No HTTPS (use reverse proxy if needed)
|
|
|
|
**Recommendations:**
|
|
- Run behind reverse proxy (nginx, Traefik)
|
|
- Use firewall to restrict access
|
|
- Enable HTTPS at reverse proxy level
|
|
- Consider adding basic auth if exposed
|
|
|
|
---
|
|
|
|
## Summary
|
|
|
|
The dashboard provides a complete REST API for:
|
|
- ✅ Auto-initializing database
|
|
- ✅ Monitoring processing status
|
|
- ✅ Controlling encoding jobs
|
|
- ✅ Viewing system resources
|
|
- ✅ Managing configuration
|
|
- ✅ Triggering library scans
|
|
- ✅ Viewing logs and activity
|
|
|
|
No manual database setup required - just start the dashboard and it's ready to use!
|