195 lines
4.6 KiB
Markdown
195 lines
4.6 KiB
Markdown
# Remotion Render Service
|
|
|
|
A high-performance video rendering service built with ElysiaJS and Remotion. This service accepts S3 URLs for input videos, renders them using Remotion compositions, and returns S3 URLs for the rendered outputs.
|
|
|
|
## Features
|
|
|
|
- **S3 Integration**: Direct integration with S3-compatible storage (MinIO)
|
|
- **Remotion Rendering**: Leverages Remotion for high-quality video rendering
|
|
- **ElysiaJS Server**: Fast, type-safe API with automatic validation
|
|
- **Bun Runtime**: Utilizes Bun for optimal performance
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
server/
|
|
├── server.ts # Main server entry point
|
|
├── shared/
|
|
│ └── config.ts # Global configuration
|
|
└── routers/
|
|
├── render_file/
|
|
│ ├── index.ts # Render endpoint
|
|
│ ├── service.ts # Render logic
|
|
│ ├── types.ts # Type definitions
|
|
│ └── constants.ts # Endpoint constants
|
|
└── services/
|
|
└── s3_storage/
|
|
├── index.ts # S3 service implementation
|
|
├── types.ts # Type definitions
|
|
├── utils.ts # Helper functions
|
|
└── constants.ts # Service constants
|
|
```
|
|
|
|
## Setup
|
|
|
|
1. **Install Dependencies**
|
|
|
|
```bash
|
|
bun install
|
|
```
|
|
|
|
2. **Configure Environment**
|
|
Copy `.env.example` to `.env` and fill in your configuration:
|
|
|
|
```bash
|
|
cp .env.example .env
|
|
```
|
|
|
|
Required environment variables:
|
|
- `S3_ACCESS_KEY`: Your S3/MinIO access key
|
|
- `S3_SECRET_KEY`: Your S3/MinIO secret key
|
|
- `S3_BUCKET_NAME`: Target bucket name
|
|
- `S3_ENDPOINT_URL`: S3/MinIO endpoint URL
|
|
- `PORT`: Server port (default: 3001)
|
|
|
|
3. **Start the Server**
|
|
```bash
|
|
bun run server
|
|
```
|
|
|
|
## API Endpoints
|
|
|
|
### `POST /render/file`
|
|
|
|
Renders a video from an S3 input URL and returns the rendered output S3 URL.
|
|
|
|
**Request Body:**
|
|
|
|
```json
|
|
{
|
|
"inputS3Url": "https://minio.example.com/bucket/input/video.mp4",
|
|
"compositionId": "Main",
|
|
"outputFormat": "mp4"
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
|
|
```json
|
|
{
|
|
"success": true,
|
|
"outputS3Url": "https://minio.example.com/bucket/rendered/output.mp4",
|
|
"metadata": {
|
|
"inputFile": "https://minio.example.com/bucket/input/video.mp4",
|
|
"outputFile": "https://minio.example.com/bucket/rendered/output.mp4",
|
|
"renderTime": 12500,
|
|
"fileSize": 5242880
|
|
}
|
|
}
|
|
```
|
|
|
|
**Error Response:**
|
|
|
|
```json
|
|
{
|
|
"success": false,
|
|
"error": "Error message description"
|
|
}
|
|
```
|
|
|
|
### `GET /health`
|
|
|
|
Health check endpoint.
|
|
|
|
**Response:**
|
|
|
|
```json
|
|
{
|
|
"status": "healthy",
|
|
"uptime": 123.456,
|
|
"timestamp": "2024-01-01T00:00:00.000Z"
|
|
}
|
|
```
|
|
|
|
### `GET /`
|
|
|
|
Service information endpoint.
|
|
|
|
**Response:**
|
|
|
|
```json
|
|
{
|
|
"service": "Remotion Render Service",
|
|
"version": "1.0.0",
|
|
"status": "running",
|
|
"timestamp": "2024-01-01T00:00:00.000Z"
|
|
}
|
|
```
|
|
|
|
## S3 Storage Service
|
|
|
|
The S3 storage service provides a comprehensive interface for interacting with S3-compatible storage:
|
|
|
|
- `uploadFile()`: Upload files to S3
|
|
- `downloadFile()`: Download files from S3
|
|
- `getFileUrl()`: Generate presigned URLs
|
|
- `deleteFile()`: Remove files from S3
|
|
- `checkFileExists()`: Verify file existence
|
|
- `getFileInfo()`: Retrieve file metadata
|
|
- `getLocalCopy()`: Download file to temp location
|
|
- `uploadFromLocalPath()`: Upload from local filesystem
|
|
|
|
## Development
|
|
|
|
### Run in Development Mode
|
|
|
|
```bash
|
|
bun run server
|
|
```
|
|
|
|
### Type Checking
|
|
|
|
```bash
|
|
bun run lint
|
|
```
|
|
|
|
## Architecture
|
|
|
|
The service follows a modular architecture:
|
|
|
|
1. **Server Layer** (`server.ts`): Main application setup and routing
|
|
2. **Router Layer** (`routers/`): Endpoint definitions and request handling
|
|
3. **Service Layer** (`services/`): Business logic and external integrations
|
|
4. **Shared Layer** (`shared/`): Global configuration and utilities
|
|
|
|
## Integration with Django Backend
|
|
|
|
This service is designed to work alongside the Django backend in `coffee_project_backend_v2`. The Django backend can make requests to this service to render videos stored in the shared MinIO storage.
|
|
|
|
Example Django integration:
|
|
|
|
```python
|
|
import requests
|
|
|
|
response = requests.post(
|
|
'http://localhost:3001/render/file',
|
|
json={
|
|
'inputS3Url': input_url,
|
|
'compositionId': 'Main',
|
|
'outputFormat': 'mp4'
|
|
}
|
|
)
|
|
|
|
result = response.json()
|
|
if result['success']:
|
|
rendered_url = result['outputS3Url']
|
|
```
|
|
|
|
## Technologies
|
|
|
|
- **Bun**: Fast JavaScript runtime
|
|
- **ElysiaJS**: High-performance web framework
|
|
- **Remotion**: Programmatic video rendering
|
|
- **AWS SDK**: S3 client for storage operations
|
|
- **TypeScript**: Type-safe development
|