653 lines
13 KiB
Markdown
653 lines
13 KiB
Markdown
# du.pe - API Documentation
|
|
|
|
## 🔌 API Overview
|
|
|
|
The du.pe server provides a RESTful API with WebSocket support for managing torrents, streaming media, and handling file operations. The API is designed to be simple, intuitive, and provides real-time updates through WebSocket connections.
|
|
|
|
**Base URL**: `http://localhost:3001` (configurable via environment)
|
|
|
|
## 📡 WebSocket Connection
|
|
|
|
### **Connection Endpoint**
|
|
```
|
|
ws://localhost:3001/?token={auth_token}
|
|
```
|
|
|
|
### **WebSocket Events**
|
|
|
|
#### **Progress Updates**
|
|
```json
|
|
{
|
|
"type": "progress",
|
|
"torrents": [
|
|
{
|
|
"infoHash": "abc123...",
|
|
"name": "Example Movie",
|
|
"progress": 0.75,
|
|
"downloadSpeed": 1048576,
|
|
"uploadSpeed": 524288,
|
|
"numPeers": 15,
|
|
"state": "downloading",
|
|
"timeRemaining": 1800
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
#### **File Updates**
|
|
```json
|
|
{
|
|
"type": "fileUpdate",
|
|
"action": "added|removed|modified",
|
|
"path": "/downloads/example/",
|
|
"mediaType": "movie|tvshow|file"
|
|
}
|
|
```
|
|
|
|
## 🛣️ REST API Endpoints
|
|
|
|
### **Torrent Management**
|
|
|
|
#### **GET /api/torrents**
|
|
**Description**: Retrieve list of active torrents and their status
|
|
|
|
**Response**:
|
|
```json
|
|
{
|
|
"torrents": [
|
|
{
|
|
"infoHash": "abc123def456...",
|
|
"name": "Example Movie 2024",
|
|
"progress": 0.85,
|
|
"downloadSpeed": 2097152,
|
|
"uploadSpeed": 1048576,
|
|
"numPeers": 25,
|
|
"state": "downloading",
|
|
"timeRemaining": 600,
|
|
"files": [
|
|
{
|
|
"name": "movie.mp4",
|
|
"length": 1073741824,
|
|
"path": "/downloads/example/movie.mp4",
|
|
"type": "video"
|
|
}
|
|
],
|
|
"magnetURI": "magnet:?xt=urn:btih:abc123...",
|
|
"added": "2024-01-15T10:30:00.000Z"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
**Response Codes**:
|
|
- `200` - Success
|
|
- `500` - Server error
|
|
|
|
---
|
|
|
|
#### **POST /api/transfer**
|
|
**Description**: Add a torrent via file upload
|
|
|
|
**Content-Type**: `multipart/form-data`
|
|
|
|
**Request Body**:
|
|
```
|
|
torrent: [file] - .torrent file
|
|
```
|
|
|
|
**Response**:
|
|
```json
|
|
{
|
|
"success": true,
|
|
"infoHash": "abc123def456...",
|
|
"name": "Uploaded Torrent Name"
|
|
}
|
|
```
|
|
|
|
**Response Codes**:
|
|
- `200` - Torrent added successfully
|
|
- `400` - Invalid torrent file
|
|
- `500` - Server error
|
|
|
|
---
|
|
|
|
#### **POST /api/magnet**
|
|
**Description**: Add a torrent via magnet link
|
|
|
|
**Content-Type**: `application/json`
|
|
|
|
**Request Body**:
|
|
```json
|
|
{
|
|
"magnet": "magnet:?xt=urn:btih:abc123def456..."
|
|
}
|
|
```
|
|
|
|
**Response**:
|
|
```json
|
|
{
|
|
"success": true,
|
|
"infoHash": "abc123def456...",
|
|
"name": "Torrent Name from Magnet"
|
|
}
|
|
```
|
|
|
|
**Response Codes**:
|
|
- `200` - Torrent added successfully
|
|
- `400` - Invalid magnet link
|
|
- `500` - Server error
|
|
|
|
---
|
|
|
|
#### **DELETE /api/torrents/:infoHash**
|
|
**Description**: Remove a torrent and optionally delete downloaded files
|
|
|
|
**Request Parameters**:
|
|
- `infoHash` (path): Torrent info hash
|
|
- `deleteFiles` (query, optional): `true` to delete downloaded files
|
|
|
|
**Response**:
|
|
```json
|
|
{
|
|
"success": true,
|
|
"message": "Torrent removed successfully"
|
|
}
|
|
```
|
|
|
|
**Response Codes**:
|
|
- `200` - Torrent removed successfully
|
|
- `404` - Torrent not found
|
|
- `500` - Server error
|
|
|
|
---
|
|
|
|
### **File Streaming**
|
|
|
|
#### **GET /stream/:infoHash/:fileIndex**
|
|
**Description**: Stream a file from a torrent
|
|
|
|
**Request Parameters**:
|
|
- `infoHash` (path): Torrent info hash
|
|
- `fileIndex` (path): Index of the file within the torrent
|
|
- `range` (header, optional): HTTP Range header for partial content
|
|
|
|
**Response**:
|
|
- Binary file stream with appropriate MIME headers
|
|
- Supports HTTP Range requests for seeking in video files
|
|
|
|
**Response Codes**:
|
|
- `200` - Streaming successfully
|
|
- `206` - Partial content (range requests)
|
|
- `404` - File not found
|
|
- `500` - Server error
|
|
|
|
**Example Usage**:
|
|
```javascript
|
|
// HTML5 Video Player
|
|
<video controls>
|
|
<source src="http://localhost:3001/stream/abc123def456/0" type="video/mp4">
|
|
</video>
|
|
```
|
|
|
|
---
|
|
|
|
### **Media Library**
|
|
|
|
#### **GET /api/movies**
|
|
**Description**: Retrieve movie library with metadata
|
|
|
|
**Query Parameters**:
|
|
- `page` (optional): Page number for pagination
|
|
- `limit` (optional): Items per page
|
|
- `search` (optional): Search term
|
|
- `genre` (optional): Filter by genre
|
|
- `year` (optional): Filter by year
|
|
|
|
**Response**:
|
|
```json
|
|
{
|
|
"movies": [
|
|
{
|
|
"id": "movie_123",
|
|
"title": "Example Movie",
|
|
"year": 2024,
|
|
"runtime": 120,
|
|
"rating": 8.5,
|
|
"genres": ["Action", "Drama"],
|
|
"poster": "/cache/movie_data/123/poster.jpg",
|
|
"backdrop": "/cache/movie_data/123/backdrop.jpg",
|
|
"overview": "Movie description...",
|
|
"filePath": "/downloads/example/movie.mp4",
|
|
"fileSize": 1073741824,
|
|
"added": "2024-01-15T10:30:00.000Z",
|
|
"watched": false,
|
|
"thumbnail": "/cache/thumbnails/videos/123/movie.jpg"
|
|
}
|
|
],
|
|
"pagination": {
|
|
"page": 1,
|
|
"limit": 20,
|
|
"total": 45,
|
|
"totalPages": 3
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### **GET /api/tvshows**
|
|
**Description**: Retrieve TV show library with metadata
|
|
|
|
**Query Parameters**:
|
|
- `page` (optional): Page number for pagination
|
|
- `limit` (optional): Items per page
|
|
- `search` (optional): Search term
|
|
|
|
**Response**:
|
|
```json
|
|
{
|
|
"shows": [
|
|
{
|
|
"id": "show_456",
|
|
"title": "Example TV Series",
|
|
"year": 2023,
|
|
"rating": 9.0,
|
|
"seasons": 2,
|
|
"poster": "/cache/tv_data/456/poster.jpg",
|
|
"backdrop": "/cache/tv_data/456/backdrop.jpg",
|
|
"overview": "Series description...",
|
|
"episodes": [
|
|
{
|
|
"season": 1,
|
|
"episode": 1,
|
|
"title": "Pilot Episode",
|
|
"overview": "Episode description...",
|
|
"airDate": "2023-01-15",
|
|
"filePath": "/downloads/example/series/s01e01.mp4",
|
|
"thumbnail": "/cache/tv_data/456/episodes/s01e01.jpg"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"pagination": {
|
|
"page": 1,
|
|
"limit": 20,
|
|
"total": 12,
|
|
"totalPages": 1
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### **GET /api/files**
|
|
**Description**: Browse downloaded files and folders
|
|
|
|
**Query Parameters**:
|
|
- `path` (optional): Directory path to browse (default: root downloads)
|
|
- `type` (optional): Filter by file type (`video`, `audio`, `image`, `document`)
|
|
|
|
**Response**:
|
|
```json
|
|
{
|
|
"path": "/downloads/",
|
|
"parent": "..",
|
|
"items": [
|
|
{
|
|
"name": "Example Folder",
|
|
"type": "directory",
|
|
"path": "/downloads/Example Folder/",
|
|
"size": null,
|
|
"modified": "2024-01-15T10:30:00.000Z",
|
|
"count": 5
|
|
},
|
|
{
|
|
"name": "movie.mp4",
|
|
"type": "file",
|
|
"path": "/downloads/movie.mp4",
|
|
"size": 1073741824,
|
|
"modified": "2024-01-15T10:30:00.000Z",
|
|
"mimeType": "video/mp4",
|
|
"thumbnail": "/cache/thumbnails/videos/abc123/movie.jpg"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### **Search Functionality**
|
|
|
|
#### **GET /api/search**
|
|
**Description**: Search across torrents, files, and media library
|
|
|
|
**Query Parameters**:
|
|
- `q` (required): Search query
|
|
- `type` (optional): Search scope (`all`, `torrents`, `movies`, `tvshows`, `files`)
|
|
- `limit` (optional): Maximum results (default: 50)
|
|
|
|
**Response**:
|
|
```json
|
|
{
|
|
"query": "example",
|
|
"results": {
|
|
"torrents": [
|
|
{
|
|
"infoHash": "abc123...",
|
|
"name": "Example Torrent",
|
|
"progress": 0.75,
|
|
"state": "downloading"
|
|
}
|
|
],
|
|
"movies": [
|
|
{
|
|
"id": "movie_123",
|
|
"title": "Example Movie",
|
|
"year": 2024,
|
|
"poster": "/cache/movie_data/123/poster.jpg"
|
|
}
|
|
],
|
|
"tvshows": [],
|
|
"files": [
|
|
{
|
|
"name": "example.txt",
|
|
"path": "/downloads/example.txt",
|
|
"size": 1024,
|
|
"type": "file"
|
|
}
|
|
]
|
|
},
|
|
"total": 3
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### **System Information**
|
|
|
|
#### **GET /api/system/info**
|
|
**Description**: Get system information and status
|
|
|
|
**Response**:
|
|
```json
|
|
{
|
|
"version": "1.2.0",
|
|
"uptime": 86400,
|
|
"torrents": {
|
|
"active": 3,
|
|
"completed": 15,
|
|
"total": 18
|
|
},
|
|
"storage": {
|
|
"total": 1099511627776,
|
|
"used": 536870912000,
|
|
"free": 562641715776,
|
|
"downloads": 500000000000,
|
|
"cache": 36870912000
|
|
},
|
|
"network": {
|
|
"downloadSpeed": 2097152,
|
|
"uploadSpeed": 1048576
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### **GET /api/system/disk**
|
|
**Description**: Get detailed disk usage information
|
|
|
|
**Response**:
|
|
```json
|
|
{
|
|
"downloads": {
|
|
"path": "/app/server/downloads",
|
|
"total": 1000000000000,
|
|
"used": 500000000000,
|
|
"free": 500000000000,
|
|
"percentage": 50
|
|
},
|
|
"cache": {
|
|
"path": "/app/server/cache",
|
|
"total": 100000000000,
|
|
"used": 20000000000,
|
|
"free": 80000000000,
|
|
"percentage": 20
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### **Trash Management**
|
|
|
|
#### **GET /api/trash**
|
|
**Description**: List items in trash
|
|
|
|
**Response**:
|
|
```json
|
|
{
|
|
"items": [
|
|
{
|
|
"id": "trash_123",
|
|
"originalPath": "/downloads/example.mp4",
|
|
"name": "example.mp4",
|
|
"size": 1073741824,
|
|
"deleted": "2024-01-15T10:30:00.000Z",
|
|
"type": "file"
|
|
}
|
|
],
|
|
"total": 1,
|
|
"totalSize": 1073741824
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### **POST /api/trash/:id/restore**
|
|
**Description**: Restore item from trash
|
|
|
|
**Request Parameters**:
|
|
- `id` (path): Trash item ID
|
|
|
|
**Response**:
|
|
```json
|
|
{
|
|
"success": true,
|
|
"message": "Item restored successfully",
|
|
"restoredPath": "/downloads/example.mp4"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### **DELETE /api/trash/:id**
|
|
**Description**: Permanently delete item from trash
|
|
|
|
**Request Parameters**:
|
|
- `id` (path): Trash item ID
|
|
|
|
**Response**:
|
|
```json
|
|
{
|
|
"success": true,
|
|
"message": "Item permanently deleted"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### **DELETE /api/trash**
|
|
**Description**: Empty trash (permanently delete all items)
|
|
|
|
**Response**:
|
|
```json
|
|
{
|
|
"success": true,
|
|
"message": "Trash emptied successfully",
|
|
"deletedCount": 5
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 🔒 Authentication (Planned)
|
|
|
|
### **Token-Based Authentication**
|
|
Currently, the application uses basic token authentication. Full authentication system is planned for future versions.
|
|
|
|
**Headers**:
|
|
```
|
|
Authorization: Bearer {token}
|
|
```
|
|
|
|
### **Login Endpoint (Planned)**
|
|
```
|
|
POST /api/auth/login
|
|
```
|
|
|
|
### **Logout Endpoint (Planned)**
|
|
```
|
|
POST /api/auth/logout
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 Error Handling
|
|
|
|
### **Standard Error Response Format**
|
|
```json
|
|
{
|
|
"error": {
|
|
"code": "VALIDATION_ERROR",
|
|
"message": "Invalid magnet link format",
|
|
"details": "The provided magnet link is not properly formatted"
|
|
}
|
|
}
|
|
```
|
|
|
|
### **Common Error Codes**
|
|
- `400 Bad Request` - Invalid input parameters
|
|
- `401 Unauthorized` - Authentication required
|
|
- `403 Forbidden` - Insufficient permissions
|
|
- `404 Not Found` - Resource not found
|
|
- `429 Too Many Requests` - Rate limit exceeded
|
|
- `500 Internal Server Error` - Server-side error
|
|
|
|
### **WebSocket Error Events**
|
|
```json
|
|
{
|
|
"type": "error",
|
|
"code": "TORRENT_ERROR",
|
|
"message": "Failed to add torrent",
|
|
"details": "Invalid torrent file format"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 🔄 Rate Limiting
|
|
|
|
### **Current Limits**
|
|
- API requests: No current limits (planned)
|
|
- File uploads: 100MB per file
|
|
- Concurrent torrents: No hard limit
|
|
- WebSocket connections: Standard browser limits
|
|
|
|
### **Planned Enhancements**
|
|
- API rate limiting by IP/user
|
|
- Upload size limits
|
|
- Concurrent download limits
|
|
- Connection throttling
|
|
|
|
---
|
|
|
|
## 🧭 Usage Examples
|
|
|
|
### **JavaScript/TypeScript Client**
|
|
```javascript
|
|
// API client setup
|
|
const API_BASE = 'http://localhost:3001';
|
|
|
|
class DupeAPI {
|
|
constructor(apiUrl) {
|
|
this.apiUrl = apiUrl;
|
|
}
|
|
|
|
async getTorrents() {
|
|
const response = await fetch(`${this.apiUrl}/api/torrents`);
|
|
return response.json();
|
|
}
|
|
|
|
async addMagnet(magnetLink) {
|
|
const response = await fetch(`${this.apiUrl}/api/magnet`, {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ magnet: magnetLink })
|
|
});
|
|
return response.json();
|
|
}
|
|
|
|
async getMovies(page = 1, limit = 20) {
|
|
const params = new URLSearchParams({ page, limit });
|
|
const response = await fetch(`${this.apiUrl}/api/movies?${params}`);
|
|
return response.json();
|
|
}
|
|
|
|
connectWebSocket(token) {
|
|
const ws = new WebSocket(`${this.apiUrl.replace('http', 'ws')}?token=${token}`);
|
|
|
|
ws.onmessage = (event) => {
|
|
const data = JSON.parse(event.data);
|
|
if (data.type === 'progress') {
|
|
// Handle progress updates
|
|
console.log('Torrent progress:', data.torrents);
|
|
}
|
|
};
|
|
|
|
return ws;
|
|
}
|
|
}
|
|
|
|
// Usage
|
|
const api = new DupeAPI(API_BASE);
|
|
const torrents = await api.getTorrents();
|
|
const ws = api.connectWebSocket('your-token');
|
|
```
|
|
|
|
### **cURL Examples**
|
|
```bash
|
|
# Get torrents
|
|
curl -X GET http://localhost:3001/api/torrents
|
|
|
|
# Add magnet link
|
|
curl -X POST http://localhost:3001/api/magnet \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"magnet":"magnet:?xt=urn:btih:abc123..."}'
|
|
|
|
# Upload torrent file
|
|
curl -X POST http://localhost:3001/api/transfer \
|
|
-F "torrent=@/path/to/file.torrent"
|
|
|
|
# Get system info
|
|
curl -X GET http://localhost:3001/api/system/info
|
|
```
|
|
|
|
---
|
|
|
|
## 📚 Cross-References
|
|
|
|
### **Related Documentation**
|
|
- [Project Structure](./project-structure.md) - Overall architecture overview
|
|
- [Component Documentation](./components.md) - Frontend component details
|
|
- [Deployment Guide](./deployment.md) - Production setup instructions
|
|
- [WebSocket Events](./websocket-events.md) - Real-time event reference
|
|
|
|
### **Implementation Files**
|
|
- [server/server.js](../server/server.js) - Main API implementation
|
|
- [client/src/utils/api.js](../client/src/utils/api.js) - Frontend API client
|
|
- [client/src/stores/](../client/src/stores/) - State management stores
|
|
|
|
---
|
|
|
|
*This API documentation provides comprehensive coverage of all available endpoints, WebSocket events, and usage patterns. For implementation details and examples, refer to the cross-referenced files and documentation.* |