198 lines
4.5 KiB
Markdown
198 lines
4.5 KiB
Markdown
# API Documentation
|
|
|
|
## Overview
|
|
The Downlink API provides endpoints for fetching YouTube video information and downloading videos/audio in various formats.
|
|
|
|
## Base URL
|
|
- Development: `http://localhost:3000`
|
|
- Production: `https://your-domain.com`
|
|
|
|
## Endpoints
|
|
|
|
### Get Video Information
|
|
|
|
Retrieve metadata about a YouTube video without downloading it.
|
|
|
|
**Endpoint**: `POST /api/info`
|
|
|
|
**Request Body**:
|
|
```json
|
|
{
|
|
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
|
|
}
|
|
```
|
|
|
|
**Response** (Success):
|
|
```json
|
|
{
|
|
"success": true,
|
|
"videoInfo": {
|
|
"title": "Video Title",
|
|
"duration": 120,
|
|
"thumbnail": "https://i.ytimg.com/vi/.../maxresdefault.jpg",
|
|
"formats": [
|
|
{
|
|
"formatId": "137",
|
|
"ext": "mp4",
|
|
"resolution": "1920x1080",
|
|
"filesize": 50000000,
|
|
"formatNote": "1080p"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
**Response** (Error):
|
|
```json
|
|
{
|
|
"success": false,
|
|
"error": "Invalid YouTube URL"
|
|
}
|
|
```
|
|
|
|
**Status Codes**:
|
|
- `200`: Success
|
|
- `400`: Bad Request (invalid URL or missing fields)
|
|
- `500`: Internal Server Error
|
|
|
|
---
|
|
|
|
### Download Video/Audio
|
|
|
|
Download a YouTube video or extract audio in the specified format.
|
|
|
|
**Endpoint**: `POST /api/download`
|
|
|
|
**Request Body**:
|
|
```json
|
|
{
|
|
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
|
|
"format": "mp4",
|
|
"formatType": "video"
|
|
}
|
|
```
|
|
|
|
**Format Types**:
|
|
- `"video"`: Download as video file
|
|
- `"audio"`: Extract audio only
|
|
|
|
**Video Formats**:
|
|
- `"mp4"`: MP4 video (most compatible)
|
|
- `"webm"`: WebM video (web-optimized)
|
|
- `"mkv"`: MKV container (high quality)
|
|
- `"avi"`: AVI video (legacy)
|
|
|
|
**Audio Formats**:
|
|
- `"mp3"`: MP3 audio (most compatible)
|
|
- `"wav"`: WAV audio (uncompressed)
|
|
- `"m4a"`: M4A audio (Apple format)
|
|
- `"opus"`: Opus audio (modern, efficient)
|
|
|
|
**Response** (Success):
|
|
```json
|
|
{
|
|
"success": true,
|
|
"downloadUrl": "/downloads/1234567890-abc123.mp4",
|
|
"filename": "Video_Title.mp4",
|
|
"videoInfo": {
|
|
"title": "Video Title",
|
|
"duration": 120,
|
|
"thumbnail": "https://...",
|
|
"formats": [...]
|
|
}
|
|
}
|
|
```
|
|
|
|
**Response** (Error):
|
|
```json
|
|
{
|
|
"success": false,
|
|
"error": "Failed to download video"
|
|
}
|
|
```
|
|
|
|
**Status Codes**:
|
|
- `200`: Success
|
|
- `400`: Bad Request (invalid URL, format, or missing fields)
|
|
- `500`: Internal Server Error
|
|
|
|
## Error Handling
|
|
|
|
All endpoints return JSON responses with a `success` boolean field. When `success` is `false`, an `error` field contains the error message.
|
|
|
|
Common error messages:
|
|
- `"Missing required fields"`: Required request body fields are missing
|
|
- `"Invalid YouTube URL"`: The provided URL is not a valid YouTube URL
|
|
- `"Failed to get video info"`: Error occurred while fetching video metadata
|
|
- `"Failed to download video"`: Error occurred during download/transcoding
|
|
|
|
## Rate Limiting
|
|
|
|
Currently, no rate limiting is implemented. Consider adding rate limiting for production use.
|
|
|
|
## File Storage
|
|
|
|
Downloaded files are stored in `/public/downloads/` and are accessible via the `downloadUrl` returned in the response. Files are named with a timestamp and random ID to avoid conflicts.
|
|
|
|
**Note**: Files are not automatically cleaned up. Consider implementing a cleanup job for production.
|
|
|
|
## Examples
|
|
|
|
### JavaScript/TypeScript
|
|
|
|
```typescript
|
|
// Get video info
|
|
const infoResponse = await fetch('/api/info', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({
|
|
url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'
|
|
})
|
|
});
|
|
const infoData = await infoResponse.json();
|
|
|
|
// Download MP4 video
|
|
const downloadResponse = await fetch('/api/download', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({
|
|
url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
|
|
format: 'mp4',
|
|
formatType: 'video'
|
|
})
|
|
});
|
|
const downloadData = await downloadResponse.json();
|
|
|
|
if (downloadData.success) {
|
|
// Download the file
|
|
window.location.href = downloadData.downloadUrl;
|
|
}
|
|
```
|
|
|
|
### cURL
|
|
|
|
```bash
|
|
# Get video info
|
|
curl -X POST http://localhost:3000/api/info \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ"}'
|
|
|
|
# Download MP3 audio
|
|
curl -X POST http://localhost:3000/api/download \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ",
|
|
"format":"mp3",
|
|
"formatType":"audio"
|
|
}'
|
|
```
|
|
|
|
## Security Considerations
|
|
|
|
- URLs are validated to ensure they are YouTube URLs
|
|
- Filenames are sanitized to prevent directory traversal
|
|
- No user authentication is currently implemented
|
|
- Consider adding file size limits and download quotas
|
|
- Implement CORS policies if needed for cross-origin requests
|