Files
media-downloader/docs/archive/WEB_GUI_DEVELOPMENT_PLAN.md
Todd 0d7b2b1aab Initial commit
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-29 22:42:55 -04:00

1224 lines
36 KiB
Markdown

# Media Downloader Web GUI - Full Development Plan
## Executive Summary
Transform the CLI media downloader into a modern web application with real-time monitoring, queue management, and intuitive configuration. Preserve all existing functionality while adding professional-grade UI/UX.
---
## 1. Technology Stack
### Backend
- **Framework:** FastAPI 0.104+ (async, auto-docs, WebSocket support)
- **Task Queue:** Celery + Redis (background job processing)
- **Database:** SQLite (existing) + Redis (cache/sessions)
- **WebSocket:** FastAPI native WebSocket for real-time updates
- **Authentication:** JWT tokens + secure session management
- **API Documentation:** Auto-generated Swagger/OpenAPI
### Frontend
- **Framework:** Vue.js 3 with Composition API
- **UI Library:** Vuetify 3 (Material Design components)
- **State Management:** Pinia (Vue's official state manager)
- **HTTP Client:** Axios
- **Real-time:** WebSocket with auto-reconnect
- **Build Tool:** Vite (fast, modern)
- **Charts:** Chart.js or Apache ECharts
### DevOps
- **Containerization:** Docker + Docker Compose
- **Process Manager:** Supervisor (for workers)
- **Reverse Proxy:** Nginx (production)
- **Logging:** Structured JSON logs + Log rotation
---
## 2. System Architecture
```
┌─────────────────────────────────────────────────────────┐
│ Web Browser │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Vue.js Frontend (Port 8080) │ │
│ │ - Dashboard - Queue Manager │ │
│ │ - Scheduler - Settings │ │
│ │ - Logs - History │ │
│ └──────────────────────────────────────────────────┘ │
└─────────────────┬───────────────────────────────────────┘
│ HTTP/WebSocket
┌─────────────────────────────────────────────────────────┐
│ FastAPI Backend (Port 8000) │
│ ┌──────────────────────────────────────────────────┐ │
│ │ REST API Endpoints │ │
│ │ /api/v1/downloads /api/v1/queue │ │
│ │ /api/v1/scheduler /api/v1/settings │ │
│ │ /api/v1/platforms /api/v1/logs │ │
│ └──────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ WebSocket Endpoints │ │
│ │ /ws/downloads (real-time progress) │ │
│ │ /ws/logs (live log streaming) │ │
│ └──────────────────────────────────────────────────┘ │
└─────────┬───────────────────────────────────┬───────────┘
│ │
▼ ▼
┌──────────────────────┐ ┌────────────────────────┐
│ SQLite Database │ │ Redis (Cache/Queue) │
│ media_downloader.db │ │ - Task queue │
│ - Downloads │ │ - Session store │
│ - Queue │ │ - Real-time events │
│ - Scheduler │ │ - Rate limit tracking │
└──────────────────────┘ └────────────────────────┘
▲ ▲
│ │
└───────────┬───────────────────────┘
┌─────────────▼──────────────────────────────┐
│ Celery Workers (Background Tasks) │
│ ┌─────────────────────────────────────┐ │
│ │ Worker 1: Instagram Downloads │ │
│ │ Worker 2: TikTok Downloads │ │
│ │ Worker 3: Forum Downloads │ │
│ │ Worker 4: Scheduler Tasks │ │
│ └─────────────────────────────────────┘ │
│ Uses existing modules: │
│ - fastdl_module.py │
│ - toolzu_module.py │
│ - tiktok_module.py │
│ - forum_downloader.py │
└─────────────────────────────────────────────┘
```
---
## 3. Project Structure
```
/opt/media-downloader/
├── backend/
│ ├── api/
│ │ ├── __init__.py
│ │ ├── main.py # FastAPI app entry point
│ │ ├── dependencies.py # Dependency injection
│ │ ├── auth.py # JWT authentication
│ │ └── routes/
│ │ ├── __init__.py
│ │ ├── downloads.py # Download CRUD endpoints
│ │ ├── queue.py # Queue management
│ │ ├── scheduler.py # Scheduler config
│ │ ├── platforms.py # Platform-specific endpoints
│ │ ├── settings.py # App configuration
│ │ ├── logs.py # Log viewer
│ │ ├── stats.py # Statistics/analytics
│ │ └── websocket.py # WebSocket handlers
│ ├── models/
│ │ ├── __init__.py
│ │ ├── download.py # Pydantic models
│ │ ├── queue.py
│ │ ├── scheduler.py
│ │ └── user.py
│ ├── services/
│ │ ├── __init__.py
│ │ ├── download_service.py # Business logic
│ │ ├── queue_service.py
│ │ ├── scheduler_service.py
│ │ └── platform_service.py
│ ├── workers/
│ │ ├── __init__.py
│ │ ├── celery_app.py # Celery configuration
│ │ ├── download_worker.py # Background download tasks
│ │ └── scheduler_worker.py # Scheduled task executor
│ ├── core/
│ │ ├── __init__.py
│ │ ├── config.py # App configuration
│ │ ├── database.py # DB connection management
│ │ └── websocket_manager.py # WebSocket connection pool
│ └── requirements.txt
├── frontend/
│ ├── public/
│ │ ├── index.html
│ │ └── favicon.ico
│ ├── src/
│ │ ├── main.js # Vue app entry
│ │ ├── App.vue # Root component
│ │ ├── router/
│ │ │ └── index.js # Vue Router config
│ │ ├── stores/
│ │ │ ├── downloads.js # Pinia store
│ │ │ ├── queue.js
│ │ │ ├── scheduler.js
│ │ │ └── auth.js
│ │ ├── views/
│ │ │ ├── Dashboard.vue # Main dashboard
│ │ │ ├── QueueManager.vue # Queue UI
│ │ │ ├── SchedulerView.vue # Scheduler config
│ │ │ ├── Settings.vue # App settings
│ │ │ ├── Logs.vue # Log viewer
│ │ │ ├── History.vue # Download history
│ │ │ └── Login.vue # Authentication
│ │ ├── components/
│ │ │ ├── DownloadCard.vue # Download item display
│ │ │ ├── QueueItem.vue # Queue item
│ │ │ ├── ProgressBar.vue # Progress indicator
│ │ │ ├── PlatformSelector.vue
│ │ │ ├── LogViewer.vue
│ │ │ ├── StatCard.vue
│ │ │ └── ScheduleEditor.vue
│ │ ├── services/
│ │ │ ├── api.js # Axios HTTP client
│ │ │ └── websocket.js # WebSocket client
│ │ └── utils/
│ │ ├── formatters.js # Date/size formatters
│ │ └── validators.js # Input validation
│ ├── package.json
│ └── vite.config.js
├── docker/
│ ├── Dockerfile.backend
│ ├── Dockerfile.frontend
│ ├── Dockerfile.worker
│ └── nginx.conf
├── docker-compose.yml # Full stack orchestration
├── docker-compose.dev.yml # Development overrides
├── modules/ # Existing downloader modules (kept as-is)
│ ├── fastdl_module.py
│ ├── toolzu_module.py
│ ├── tiktok_module.py
│ ├── forum_downloader.py
│ ├── unified_database.py
│ └── scheduler.py
├── database/
│ └── media_downloader.db # Existing SQLite DB
├── downloads/ # Downloaded media files
├── logs/ # Application logs
└── config/
└── settings.json # App configuration
```
---
## 4. Database Schema Enhancements
Add new tables to existing `media_downloader.db`:
```sql
-- User management (for authentication)
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
email TEXT UNIQUE NOT NULL,
password_hash TEXT NOT NULL,
role TEXT DEFAULT 'user', -- 'admin', 'user'
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
last_login DATETIME,
active BOOLEAN DEFAULT 1
);
-- API tokens
CREATE TABLE api_tokens (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
token TEXT UNIQUE NOT NULL,
name TEXT,
expires_at DATETIME,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
last_used DATETIME,
FOREIGN KEY (user_id) REFERENCES users(id)
);
-- Activity log
CREATE TABLE activity_log (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER,
action TEXT NOT NULL, -- 'download_started', 'queue_modified', etc.
resource_type TEXT, -- 'download', 'queue', 'scheduler'
resource_id TEXT,
details TEXT, -- JSON
ip_address TEXT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
-- Notification settings
CREATE TABLE notifications (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
type TEXT NOT NULL, -- 'email', 'browser', 'webhook'
events TEXT NOT NULL, -- JSON array of events to notify
config TEXT, -- JSON config (email address, webhook URL)
enabled BOOLEAN DEFAULT 1,
FOREIGN KEY (user_id) REFERENCES users(id)
);
-- System settings (key-value store)
CREATE TABLE system_settings (
key TEXT PRIMARY KEY,
value TEXT NOT NULL, -- JSON
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- Enhance existing download_queue table
ALTER TABLE download_queue ADD COLUMN assigned_worker TEXT;
ALTER TABLE download_queue ADD COLUMN started_at DATETIME;
ALTER TABLE download_queue ADD COLUMN progress INTEGER DEFAULT 0; -- 0-100
ALTER TABLE download_queue ADD COLUMN estimated_completion DATETIME;
```
---
## 5. API Endpoints Design
### Authentication
```
POST /api/v1/auth/login # Login with username/password
POST /api/v1/auth/logout # Logout
POST /api/v1/auth/refresh # Refresh JWT token
GET /api/v1/auth/me # Get current user
```
### Downloads
```
GET /api/v1/downloads # List downloads (with filters)
GET /api/v1/downloads/{id} # Get download details
POST /api/v1/downloads # Manually add download
DELETE /api/v1/downloads/{id} # Delete download record
GET /api/v1/downloads/stats # Get download statistics
POST /api/v1/downloads/bulk # Bulk operations (delete, retry)
```
### Queue Management
```
GET /api/v1/queue # Get download queue
POST /api/v1/queue # Add to queue
DELETE /api/v1/queue/{id} # Remove from queue
PATCH /api/v1/queue/{id} # Update queue item (priority, pause)
POST /api/v1/queue/{id}/retry # Retry failed download
POST /api/v1/queue/clear # Clear completed/failed
GET /api/v1/queue/stats # Queue statistics
```
### Scheduler
```
GET /api/v1/scheduler/jobs # List scheduled jobs
POST /api/v1/scheduler/jobs # Create new job
GET /api/v1/scheduler/jobs/{id} # Get job details
PATCH /api/v1/scheduler/jobs/{id} # Update job
DELETE /api/v1/scheduler/jobs/{id} # Delete job
POST /api/v1/scheduler/jobs/{id}/run # Trigger job manually
GET /api/v1/scheduler/history # Job execution history
```
### Platforms
```
GET /api/v1/platforms # List all platforms (Instagram, TikTok, etc.)
GET /api/v1/platforms/{name} # Get platform details
POST /api/v1/platforms/{name}/test # Test platform connection
POST /api/v1/platforms/{name}/download # Start platform download
# Platform-specific endpoints
POST /api/v1/platforms/instagram/posts # Download Instagram posts
POST /api/v1/platforms/instagram/stories # Download Instagram stories
POST /api/v1/platforms/tiktok/user # Download TikTok user videos
POST /api/v1/platforms/forum/thread # Monitor forum thread
```
### Settings
```
GET /api/v1/settings # Get all settings
PATCH /api/v1/settings # Update settings
GET /api/v1/settings/platforms # Get platform configs
PATCH /api/v1/settings/platforms/{name} # Update platform config
```
### Logs
```
GET /api/v1/logs # Get logs (paginated, filtered)
GET /api/v1/logs/download # Download log file
DELETE /api/v1/logs # Clear old logs
```
### Statistics
```
GET /api/v1/stats/overview # Dashboard overview
GET /api/v1/stats/timeline # Downloads over time
GET /api/v1/stats/platforms # Breakdown by platform
GET /api/v1/stats/sources # Breakdown by source (username)
GET /api/v1/stats/storage # Storage usage
```
### WebSocket
```
WS /ws/downloads # Real-time download updates
WS /ws/queue # Real-time queue updates
WS /ws/logs # Live log streaming
```
---
## 6. Frontend Views & Features
### 6.1 Dashboard View
**Purpose:** At-a-glance overview of system status
**Components:**
- **Stats Cards**
- Total downloads today/week/month
- Queue size (pending/active/failed)
- Success rate percentage
- Storage used/available
- Next scheduled task
- **Recent Activity**
- Live feed of downloads (last 20)
- Real-time progress bars
- Success/failure indicators
- **Platform Status**
- Instagram, TikTok, Forums
- Green/yellow/red status indicators
- Last successful download time
- Error counts
- **Quick Actions**
- Add to queue button
- Pause/Resume all
- Run scheduler manually
### 6.2 Queue Manager View
**Purpose:** Manage download queue with full control
**Features:**
- **Queue List**
- Filterable by status (pending/active/completed/failed)
- Sortable by priority, date, platform
- Bulk selection checkboxes
- Search by URL/username
- **Queue Item Cards**
- Platform icon + source username
- URL preview
- Priority indicator (High/Medium/Low)
- Status badge
- Progress bar (for active downloads)
- Action buttons:
- Retry (failed items)
- Pause/Resume
- Move up/down (priority)
- Delete
- View details
- **Bulk Actions**
- Clear completed
- Retry all failed
- Delete selected
- Change priority
- **Add to Queue Form**
- Platform dropdown
- URL input (with validation)
- Content type selector
- Priority selector
- Schedule for later checkbox
### 6.3 Scheduler View
**Purpose:** Configure automated download schedules
**Features:**
- **Schedule List**
- Active/Paused schedules
- Next run time
- Last run status
- Edit/Delete/Duplicate buttons
- **Schedule Editor**
- Name input
- Platform selector
- Content type (posts/stories/reels/videos)
- Username/source input
- Cron expression editor (with visual helper)
- Frequency presets (Hourly, Daily, Weekly, Custom)
- Date range limits
- Download limits (max items per run)
- Enabled toggle
- **Schedule History**
- Execution log per schedule
- Success/failure counts
- Duration statistics
- Error messages
### 6.4 Settings View
**Purpose:** Configure application and platform settings
**Tabs:**
**General Settings**
- Download directory
- Concurrent downloads limit
- Retry attempts
- Default priority
- Storage limits
- Auto-cleanup old files
**Platform Settings**
- Instagram (FastDL, Toolzu, ImgInn)
- Enable/disable modules
- API keys
- Quality upgrade settings
- Rate limiting
- TikTok
- Download quality
- Watermark removal
- Forums
- Monitored forums list
- Check frequency
- Thread expiration
**Notification Settings**
- Email notifications
- SMTP configuration
- Events to notify
- Browser notifications
- Webhook endpoints
**Security Settings**
- Change password
- API tokens management
- Session timeout
- Two-factor authentication
### 6.5 History View
**Purpose:** Browse and search downloaded content
**Features:**
- **Gallery View**
- Thumbnail grid (for images)
- Platform icons
- Date overlay
- **List View**
- Detailed table
- Sortable columns (date, platform, source, size)
- Filterable
- **Filters Sidebar**
- Date range picker
- Platform checkboxes
- Source/username filter
- Content type filter
- File size range
- **Search**
- Full-text search
- Advanced search (metadata)
- **Actions**
- View file
- Download file
- Copy URL
- Delete (with confirmation)
- Re-download (add to queue)
### 6.6 Logs View
**Purpose:** Monitor application logs in real-time
**Features:**
- **Log Stream**
- Auto-scrolling live feed
- Color-coded by level (DEBUG/INFO/WARNING/ERROR)
- Timestamp column
- Module/component column
- Message column
- **Filters**
- Level filter (show only errors, etc.)
- Module filter (Scheduler, Instagram, etc.)
- Date range
- Search text
- **Actions**
- Pause auto-scroll
- Clear logs
- Download log file
- Copy log entry
---
## 7. Real-Time Features (WebSocket)
### Download Progress Events
```javascript
// WebSocket message format
{
"type": "download_progress",
"data": {
"id": 123,
"url": "https://...",
"platform": "instagram",
"source": "evalongoria",
"status": "downloading",
"progress": 45, // percentage
"speed": "2.5 MB/s",
"eta": "00:01:23",
"file_size": 15728640
}
}
```
### Queue Updates
```javascript
{
"type": "queue_updated",
"data": {
"action": "added", // added, removed, completed, failed
"item": { /* queue item */ }
}
}
```
### Log Streaming
```javascript
{
"type": "log",
"data": {
"timestamp": "2025-10-13T10:30:45.123Z",
"level": "INFO",
"module": "Instagram",
"message": "Downloaded post 123456"
}
}
```
### System Notifications
```javascript
{
"type": "notification",
"data": {
"level": "success", // success, warning, error, info
"title": "Download Complete",
"message": "Downloaded 15 posts from evalongoria",
"action": {
"label": "View",
"link": "/history?source=evalongoria"
}
}
}
```
---
## 8. Implementation Phases
### Phase 1: Foundation (Week 1-2)
**Goal:** Basic infrastructure and authentication
**Backend Tasks:**
- Set up FastAPI project structure
- Create database models (Pydantic)
- Implement JWT authentication
- Create user management endpoints
- Set up Redis connection
- Basic CRUD for downloads/queue
- Set up logging infrastructure
**Frontend Tasks:**
- Initialize Vue.js project with Vite
- Set up Vue Router and Pinia
- Create base layout component
- Implement login page
- Create API service layer
- Set up authentication flow
**Deliverable:** Working login and basic download list view
### Phase 2: Core Features (Week 3-4)
**Goal:** Main functionality - queue and downloads
**Backend Tasks:**
- Complete all download endpoints
- Complete queue management endpoints
- Integrate existing downloader modules
- Set up Celery workers
- Implement basic WebSocket support
- Create download worker tasks
**Frontend Tasks:**
- Build Dashboard view
- Build Queue Manager view
- Create download/queue components
- Implement real-time updates (WebSocket)
- Add progress indicators
- Create notification system
**Deliverable:** Functional queue management and download monitoring
### Phase 3: Scheduler & Settings (Week 5-6)
**Goal:** Automated scheduling and configuration
**Backend Tasks:**
- Implement scheduler endpoints
- Create scheduler worker
- Integrate existing scheduler.py logic
- Implement settings endpoints
- Add validation and error handling
**Frontend Tasks:**
- Build Scheduler view
- Create cron expression editor
- Build Settings view
- Create platform configuration forms
- Add form validation
**Deliverable:** Complete scheduler configuration and settings management
### Phase 4: Advanced Features (Week 7-8)
**Goal:** History, logs, and analytics
**Backend Tasks:**
- Implement log viewer endpoints
- Create statistics/analytics endpoints
- Add advanced filtering
- Implement bulk operations
- Add export functionality
**Frontend Tasks:**
- Build History view with gallery
- Build Logs view with streaming
- Add statistics charts (Chart.js)
- Implement advanced filters
- Create export dialogs
**Deliverable:** Complete application with all views
### Phase 5: Polish & Testing (Week 9-10)
**Goal:** Production readiness
**Tasks:**
- Error handling improvements
- Loading states and skeletons
- Responsive design (mobile/tablet)
- Performance optimization
- Security hardening
- Write unit tests
- Write integration tests
- Create Docker setup
- Write deployment docs
- User documentation
**Deliverable:** Production-ready application
---
## 9. Key Technical Implementations
### 9.1 Background Task Processing
**Celery Task Example:**
```python
# backend/workers/download_worker.py
from celery import Celery
from modules.fastdl_module import FastDLDownloader
from backend.core.database import get_db
from backend.core.websocket_manager import broadcast_update
celery_app = Celery('media_downloader')
@celery_app.task(bind=True)
def download_instagram_posts(self, queue_item_id: int, config: dict):
"""Background task to download Instagram posts"""
# Update queue status to 'downloading'
update_queue_status(queue_item_id, 'downloading')
# Broadcast via WebSocket
broadcast_update({
'type': 'download_started',
'data': {'id': queue_item_id}
})
try:
# Use existing FastDL module
downloader = FastDLDownloader(
unified_db=get_unified_db(),
log_callback=lambda module, level, msg: self.update_state(
state='PROGRESS',
meta={'message': msg}
)
)
count = downloader.download(
username=config['username'],
content_type=config['content_type'],
output_dir=config['output_dir']
)
# Update queue status
update_queue_status(queue_item_id, 'completed')
# Broadcast completion
broadcast_update({
'type': 'download_completed',
'data': {
'id': queue_item_id,
'count': count
}
})
return {'status': 'success', 'count': count}
except Exception as e:
update_queue_status(queue_item_id, 'failed', error=str(e))
broadcast_update({
'type': 'download_failed',
'data': {'id': queue_item_id, 'error': str(e)}
})
raise
```
### 9.2 Real-Time Updates
**WebSocket Manager:**
```python
# backend/core/websocket_manager.py
from fastapi import WebSocket
from typing import List, Dict
import json
import asyncio
class ConnectionManager:
def __init__(self):
self.active_connections: List[WebSocket] = []
self.user_connections: Dict[int, List[WebSocket]] = {}
async def connect(self, websocket: WebSocket, user_id: int):
await websocket.accept()
self.active_connections.append(websocket)
if user_id not in self.user_connections:
self.user_connections[user_id] = []
self.user_connections[user_id].append(websocket)
def disconnect(self, websocket: WebSocket, user_id: int):
self.active_connections.remove(websocket)
if user_id in self.user_connections:
self.user_connections[user_id].remove(websocket)
async def broadcast(self, message: dict):
"""Broadcast to all connected clients"""
disconnected = []
for connection in self.active_connections:
try:
await connection.send_json(message)
except:
disconnected.append(connection)
# Clean up disconnected clients
for conn in disconnected:
self.active_connections.remove(conn)
async def send_to_user(self, user_id: int, message: dict):
"""Send message to specific user's connections"""
if user_id in self.user_connections:
for connection in self.user_connections[user_id]:
try:
await connection.send_json(message)
except:
pass
manager = ConnectionManager()
# Global function for easy broadcasting
async def broadcast_update(message: dict):
await manager.broadcast(message)
```
**WebSocket Endpoint:**
```python
# backend/api/routes/websocket.py
from fastapi import APIRouter, WebSocket, Depends
from backend.core.websocket_manager import manager
from backend.api.auth import get_current_user_ws
router = APIRouter()
@router.websocket("/ws/downloads")
async def websocket_downloads(
websocket: WebSocket,
user_id: int = Depends(get_current_user_ws)
):
await manager.connect(websocket, user_id)
try:
while True:
# Keep connection alive and handle client messages
data = await websocket.receive_text()
# Echo back (for ping/pong)
if data == "ping":
await websocket.send_text("pong")
except Exception:
manager.disconnect(websocket, user_id)
```
**Frontend WebSocket Client:**
```javascript
// frontend/src/services/websocket.js
class WebSocketClient {
constructor() {
this.ws = null;
this.reconnectTimer = null;
this.listeners = new Map();
}
connect(url, token) {
this.ws = new WebSocket(`${url}?token=${token}`);
this.ws.onopen = () => {
console.log('WebSocket connected');
this.startHeartbeat();
};
this.ws.onmessage = (event) => {
const message = JSON.parse(event.data);
this.notifyListeners(message);
};
this.ws.onclose = () => {
console.log('WebSocket disconnected');
this.scheduleReconnect();
};
this.ws.onerror = (error) => {
console.error('WebSocket error:', error);
};
}
on(type, callback) {
if (!this.listeners.has(type)) {
this.listeners.set(type, []);
}
this.listeners.get(type).push(callback);
}
notifyListeners(message) {
const { type, data } = message;
if (this.listeners.has(type)) {
this.listeners.get(type).forEach(callback => callback(data));
}
}
startHeartbeat() {
this.heartbeatTimer = setInterval(() => {
if (this.ws.readyState === WebSocket.OPEN) {
this.ws.send('ping');
}
}, 30000);
}
scheduleReconnect() {
if (this.reconnectTimer) return;
this.reconnectTimer = setTimeout(() => {
console.log('Attempting to reconnect...');
this.connect(this.url, this.token);
this.reconnectTimer = null;
}, 5000);
}
disconnect() {
clearInterval(this.heartbeatTimer);
clearTimeout(this.reconnectTimer);
if (this.ws) {
this.ws.close();
}
}
}
export default new WebSocketClient();
```
### 9.3 Integration with Existing Modules
**Service Layer Example:**
```python
# backend/services/download_service.py
from pathlib import Path
from backend.core.database import get_unified_db
from modules.fastdl_module import FastDLDownloader
from modules.toolzu_module import ToolzuDownloader
from modules.tiktok_module import TikTokDownloader
from backend.workers.download_worker import download_instagram_posts
class DownloadService:
def __init__(self):
self.db = get_unified_db()
async def start_instagram_download(
self,
username: str,
content_type: str,
platform: str = 'fastdl',
max_downloads: int = None
):
"""Start Instagram download (queue as Celery task)"""
# Add to queue in database
queue_item = self.db.add_to_queue(
url=f"https://instagram.com/{username}",
platform='instagram',
source=username,
metadata={
'content_type': content_type,
'downloader': platform,
'max_downloads': max_downloads
}
)
# Queue Celery task
task = download_instagram_posts.delay(
queue_item_id=queue_item.id,
config={
'username': username,
'content_type': content_type,
'output_dir': str(Path('downloads') / platform),
'max_downloads': max_downloads
}
)
return {
'queue_id': queue_item.id,
'task_id': task.id,
'status': 'queued'
}
```
---
## 10. Docker Deployment
**docker-compose.yml:**
```yaml
version: '3.8'
services:
# Backend API
backend:
build:
context: .
dockerfile: docker/Dockerfile.backend
ports:
- "8000:8000"
environment:
- DATABASE_PATH=/app/database/media_downloader.db
- REDIS_URL=redis://redis:6379/0
- SECRET_KEY=${SECRET_KEY}
volumes:
- ./database:/app/database
- ./downloads:/app/downloads
- ./logs:/app/logs
depends_on:
- redis
restart: unless-stopped
# Celery Workers
worker:
build:
context: .
dockerfile: docker/Dockerfile.worker
environment:
- DATABASE_PATH=/app/database/media_downloader.db
- REDIS_URL=redis://redis:6379/0
volumes:
- ./database:/app/database
- ./downloads:/app/downloads
- ./logs:/app/logs
depends_on:
- redis
- backend
restart: unless-stopped
# Redis (cache and task queue)
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
restart: unless-stopped
# Frontend
frontend:
build:
context: .
dockerfile: docker/Dockerfile.frontend
ports:
- "8080:80"
depends_on:
- backend
restart: unless-stopped
# Nginx Reverse Proxy (optional, for production)
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./docker/nginx.conf:/etc/nginx/nginx.conf:ro
- ./ssl:/etc/nginx/ssl:ro
depends_on:
- backend
- frontend
restart: unless-stopped
volumes:
redis_data:
```
---
## 11. Security Considerations
1. **Authentication**
- JWT with short expiration (15 min) + refresh tokens
- Bcrypt password hashing
- Rate limiting on login endpoint
- Optional 2FA
2. **Authorization**
- Role-based access (admin/user)
- API key support for automation
- Scope-based permissions
3. **Input Validation**
- Pydantic models for all inputs
- URL validation and sanitization
- File upload restrictions
4. **Data Protection**
- HTTPS only (in production)
- CORS configuration
- SQL injection prevention (parameterized queries)
- XSS prevention (Vue escaping)
5. **Rate Limiting**
- Per-IP rate limits
- Per-user download limits
- Celery task rate limits
---
## 12. Testing Strategy
### Backend Tests
- **Unit Tests:** pytest for services/models
- **Integration Tests:** API endpoint testing
- **E2E Tests:** Full workflow testing
### Frontend Tests
- **Unit Tests:** Vitest for components
- **Integration Tests:** Vue Test Utils
- **E2E Tests:** Playwright/Cypress
### Load Testing
- Apache JMeter or Locust
- Test concurrent downloads
- Test WebSocket connections
---
## 13. Monitoring & Observability
1. **Logging**
- Structured JSON logs
- Log levels (DEBUG/INFO/WARNING/ERROR)
- Log rotation (daily, 7-day retention)
2. **Metrics** (optional)
- Prometheus + Grafana
- Download success rate
- Queue depth over time
- Worker utilization
3. **Health Checks**
- `/health` endpoint
- Database connectivity
- Redis connectivity
- Worker status
4. **Alerts**
- Email on critical errors
- Webhook on job failures
- Queue backlog alerts
---
## 14. Development Timeline Summary
| Phase | Duration | Deliverable |
|-------|----------|-------------|
| Phase 1: Foundation | 2 weeks | Auth + basic UI |
| Phase 2: Core Features | 2 weeks | Queue + downloads |
| Phase 3: Scheduler | 2 weeks | Automation + settings |
| Phase 4: Advanced | 2 weeks | History + logs + stats |
| Phase 5: Polish | 2 weeks | Production ready |
| **Total** | **10 weeks** | **Full application** |
---
## 15. Post-Launch Features (Future)
1. **Mobile App** (React Native)
- iOS/Android native apps
- Push notifications
- Same API backend
2. **Browser Extension**
- Quick add from Instagram/TikTok
- Right-click menu integration
3. **Advanced Analytics**
- ML-based duplicate detection
- Content recommendations
- Storage optimization suggestions
4. **Multi-tenancy**
- Separate workspaces
- Team collaboration
- Shared queues
5. **Cloud Storage Integration**
- Google Drive
- Dropbox
- AWS S3
6. **AI Features**
- Auto-tagging with AI
- Face recognition
- Content categorization
---
## Conclusion
This is a comprehensive, production-ready architecture that transforms your CLI tool into a modern web application. The design:
- **Preserves** all existing functionality
- **Reuses** existing downloader modules
- **Adds** professional UI/UX
- **Enables** real-time monitoring
- **Scales** for future growth
- **Maintains** simplicity where possible
The 10-week timeline is realistic for a single developer working full-time, or 20 weeks part-time (evenings/weekends).
**Recommended Starting Point:**
Build Phase 1 (authentication + basic UI) first. If you like the direction, continue with Phase 2. This gives you an early proof-of-concept to validate the approach.
Would you like me to start implementing any specific part of this plan?