# 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
