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

18 KiB

Web GUI Development - Quick Start Guide

What We're Building

Transform your CLI media downloader into a professional web application with:

Real-time monitoring - Watch downloads happen live Visual queue management - Drag, drop, prioritize Live browser screenshots - See what scrapers are doing Automated scheduling - Set it and forget it Beautiful dashboard - Stats, charts, analytics Mobile responsive - Works on phone/tablet/desktop


Technology Stack Summary

┌─────────────────────────────────────────┐
│  Vue.js 3 + Vuetify (Frontend)         │
│  Modern, beautiful Material Design UI   │
└─────────────────┬───────────────────────┘
                  │
                  ▼
┌─────────────────────────────────────────┐
│  FastAPI (Backend API)                  │
│  Fast, async, auto-documented           │
└─────────────────┬───────────────────────┘
                  │
                  ▼
┌─────────────────────────────────────────┐
│  Celery + Redis (Background Jobs)       │
│  Existing modules run as workers        │
└─────────────────┬───────────────────────┘
                  │
                  ▼
┌─────────────────────────────────────────┐
│  SQLite (Database - existing)           │
│  Already have this, minimal changes     │
└─────────────────────────────────────────┘

Key Point: Your existing downloader modules (fastdl_module.py, toolzu_module.py, etc.) are reused as-is. They become Celery workers instead of CLI commands.


What It Will Look Like

Dashboard View

┌──────────────────────────────────────────────────────────────┐
│  Media Downloader    [Queue] [Scheduler] [Settings] [Logs]  │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│  ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌──────────┐ │
│  │Downloads   │ │Queue Size  │ │Success Rate│ │Storage   │ │
│  │    45      │ │   2,731    │ │   99.2%    │ │  42.5 GB │ │
│  │  Today     │ │  Pending   │ │  This Week │ │  Used    │ │
│  └────────────┘ └────────────┘ └────────────┘ └──────────┘ │
│                                                              │
│  Recent Downloads                 [LIVE] Platform Status    │
│  ┌──────────────────────────┐    ┌──────────────────────┐  │
│  │ ⬇️ evalongoria_post.jpg  │    │ 🟢 Instagram  (35)   │  │
│  │ ⬇️ evalongoria_story.jpg │    │ 🟢 TikTok     (2)    │  │
│  │ ✅ mariarbravo_post.jpg  │    │ 🟢 Forums     (8)    │  │
│  │ ⬇️ picturepub_img_1.jpg  │    └──────────────────────┘  │
│  └──────────────────────────┘                               │
│                                                              │
│  Download Activity (Last 7 Days)                            │
│  ┌──────────────────────────────────────────────────────┐  │
│  │     ▂▄▅▇█▇▅                                          │  │
│  │                                                       │  │
│  └──────────────────────────────────────────────────────┘  │
└──────────────────────────────────────────────────────────────┘

Queue Manager with Live Screenshots

┌──────────────────────────────────────────────────────────────┐
│  Download Queue                              [+ Add Download]│
├───────────────────────────┬──────────────────────────────────┤
│ Queue Items (2,731)       │  Live Scraper View - Instagram   │
│                           │  [LIVE] 🔴                       │
│ 🔵 Instagram @evalongoria │  ┌─────────────────────────────┐ │
│    Status: Downloading    │  │                             │ │
│    Progress: ████░░ 65%   │  │   [Browser Screenshot]      │ │
│    13/20 posts            │  │   Showing Instagram page    │ │
│                           │  │   being scraped right now   │ │
│ ⏸️ TikTok @evalongoria    │  │                             │ │
│    Status: Paused         │  └─────────────────────────────┘ │
│    Priority: High         │  Action: Scrolling to load...   │
│                           │  Updated 2s ago                  │
│ ⏳ Forum - PicturePub     │                                  │
│    Status: Pending        │  [Pause] [Save Screenshot]       │
│    Priority: Normal       │                                  │
│                           │                                  │
│ [Bulk Actions ▾]          │                                  │
│ □ Clear Completed         │                                  │
│ □ Retry Failed            │                                  │
└───────────────────────────┴──────────────────────────────────┘

Scheduler View

┌──────────────────────────────────────────────────────────────┐
│  Scheduled Downloads                       [+ New Schedule]  │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│  ✅ Eva Longoria Instagram Posts                            │
│     Every 4 hours  •  Next: in 1h 23m  •  Last: 8 items    │
│     [Edit] [Run Now] [Pause]                                │
│                                                              │
│  ✅ TikTok Videos Check                                     │
│     Daily at 2:00 AM  •  Next: in 6h 15m  •  Last: 3 items │
│     [Edit] [Run Now] [Pause]                                │
│                                                              │
│  ⏸️ Maria Ramos Instagram Stories                           │
│     Every 6 hours  •  Paused  •  Last: 15 items             │
│     [Edit] [Run Now] [Resume]                               │
│                                                              │
│  Execution History                                          │
│  ┌──────────────────────────────────────────────────────┐  │
│  │ 2025-10-13 12:00  Eva Longoria Posts  ✅ 8 items     │  │
│  │ 2025-10-13 08:00  Eva Longoria Posts  ✅ 12 items    │  │
│  │ 2025-10-13 04:00  Eva Longoria Posts  ❌ Failed      │  │
│  └──────────────────────────────────────────────────────┘  │
└──────────────────────────────────────────────────────────────┘

Development Approach

Option 1: Full Build (10 weeks)

Build everything from scratch following the full plan.

Pros:

  • Complete control
  • Exactly what you want
  • Learning experience

Cons:

  • Time investment (10 weeks full-time or 20 weeks part-time)
  • Need web development skills

Option 2: Incremental (Start Small)

Build Phase 1 first, then decide.

Week 1-2: Proof of Concept

  • Basic login
  • Dashboard showing database stats
  • Download list (read-only)

Result: See if you like it before committing

Keep CLI for manual use, add web GUI for monitoring only.

Week 1: Simple Dashboard

  • Flask (simpler than FastAPI)
  • Read-only view of database
  • Live log viewer
  • No authentication needed

Result: 80% of value with 20% of effort


Quick Implementation - Option 3 (Monitoring Only)

Here's a 1-week implementation for a simple monitoring dashboard:

Step 1: Install Dependencies

cd /opt/media-downloader
pip3 install flask flask-socketio simple-websocket

Step 2: Create Simple Backend

# web_dashboard.py
from flask import Flask, render_template, jsonify
from flask_socketio import SocketIO
from modules.unified_database import UnifiedDatabase
import sqlite3

app = Flask(__name__)
socketio = SocketIO(app)

db = UnifiedDatabase('database/media_downloader.db')

@app.route('/')
def index():
    return render_template('dashboard.html')

@app.route('/api/stats')
def get_stats():
    return jsonify({
        'downloads_today': get_downloads_today(),
        'queue_size': get_queue_size(),
        'recent_downloads': get_recent_downloads(20)
    })

@app.route('/api/queue')
def get_queue():
    items = db.get_queue_items(status='pending', limit=100)
    return jsonify(items)

if __name__ == '__main__':
    socketio.run(app, host='0.0.0.0', port=8080)

Step 3: Create Simple HTML

<!-- templates/dashboard.html -->
<!DOCTYPE html>
<html>
<head>
    <title>Media Downloader Dashboard</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@3"></script>
    <link href="https://cdn.jsdelivr.net/npm/vuetify@3/dist/vuetify.min.css" rel="stylesheet">
</head>
<body>
    <div id="app">
        <v-app>
            <v-main>
                <v-container>
                    <h1>Media Downloader</h1>

                    <!-- Stats -->
                    <v-row>
                        <v-col cols="3">
                            <v-card>
                                <v-card-text>
                                    <div class="text-h4">{{ stats.downloads_today }}</div>
                                    <div>Downloads Today</div>
                                </v-card-text>
                            </v-card>
                        </v-col>
                        <!-- More stats cards -->
                    </v-row>

                    <!-- Recent Downloads -->
                    <v-list>
                        <v-list-item v-for="download in recent" :key="download.id">
                            {{ download.filename }}
                        </v-list-item>
                    </v-list>
                </v-container>
            </v-main>
        </v-app>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vuetify@3/dist/vuetify.min.js"></script>
    <script>
        const { createApp } = Vue;
        const { createVuetify } = Vuetify;

        const app = createApp({
            data() {
                return {
                    stats: {},
                    recent: []
                }
            },
            mounted() {
                this.loadStats();
                setInterval(this.loadStats, 5000);  // Refresh every 5s
            },
            methods: {
                async loadStats() {
                    const response = await fetch('/api/stats');
                    const data = await response.json();
                    this.stats = data;
                    this.recent = data.recent_downloads;
                }
            }
        });

        const vuetify = createVuetify();
        app.use(vuetify);
        app.mount('#app');
    </script>
</body>
</html>

Step 4: Run It

python3 web_dashboard.py

# Visit: http://localhost:8080

Result: Working dashboard in ~1 day!


Full Implementation Path

If you want the complete professional version:

Phase 1: Foundation (Week 1-2)

# Backend setup
cd /opt/media-downloader
mkdir -p backend/{api,models,services,workers,core}
pip3 install fastapi uvicorn celery redis pydantic

# Frontend setup
cd /opt/media-downloader
npm create vite@latest frontend -- --template vue
cd frontend
npm install vuetify axios pinia vue-router

Deliverable: Login + basic download list

Phase 2: Core (Week 3-4)

  • Build queue manager
  • Integrate Celery workers
  • Add WebSocket for real-time

Deliverable: Functional queue management

Phase 3: Scheduler (Week 5-6)

  • Build scheduler UI
  • Settings pages
  • Platform configs

Deliverable: Complete automation

Phase 4: Advanced (Week 7-8)

  • History browser
  • Log viewer
  • Live screenshots
  • Analytics

Deliverable: Full-featured app

Phase 5: Polish (Week 9-10)

  • Testing
  • Docker setup
  • Documentation
  • Deploy

Deliverable: Production ready


File Structure After Implementation

/opt/media-downloader/
├── backend/              # New FastAPI backend
│   ├── api/
│   ├── models/
│   ├── services/
│   └── workers/
├── frontend/             # New Vue.js frontend
│   ├── src/
│   │   ├── views/
│   │   ├── components/
│   │   └── stores/
│   └── package.json
├── modules/              # Existing (kept as-is)
│   ├── fastdl_module.py
│   ├── toolzu_module.py
│   ├── tiktok_module.py
│   └── unified_database.py
├── database/             # Existing (kept as-is)
│   └── media_downloader.db
├── downloads/            # Existing (kept as-is)
├── docker-compose.yml    # New deployment
└── media-downloader.py   # Can keep for CLI use

Deployment (Final Step)

Development

# Terminal 1: Backend
cd /opt/media-downloader/backend
uvicorn api.main:app --reload

# Terminal 2: Workers
celery -A workers.celery_app worker --loglevel=info

# Terminal 3: Frontend
cd /opt/media-downloader/frontend
npm run dev

Production

# One command to start everything
docker-compose up -d

# Access at:
# - Frontend: http://localhost:8080
# - Backend API: http://localhost:8000
# - API Docs: http://localhost:8000/docs

Cost Analysis

Time Investment

  • Simple dashboard (monitoring only): 1 week
  • Minimal viable product: 6 weeks
  • Full professional version: 10 weeks

Skills Needed

  • Basic: Python, HTML, JavaScript
  • Intermediate: FastAPI, Vue.js, Docker
  • Advanced: WebSockets, Celery, Redis

Infrastructure

  • Hardware: Current server is fine
  • Software: All free/open-source
  • Hosting: Self-hosted (no cost)

Decision Matrix

Feature CLI Simple Dashboard Full Web GUI
Run downloads
Monitor progress
Queue management
Scheduler config
Live screenshots
Mobile access
Multi-user
Development time 0 1 week 10 weeks
Maintenance Low Low Medium

Recommendation

Start with Simple Dashboard (1 week)

  • See your downloads in a browser
  • Check queue status visually
  • Access from phone/tablet
  • Decide if you want more

If you like it, upgrade to Full Web GUI

  • Add interactive features
  • Enable queue management
  • Implement scheduling UI
  • Add live screenshots

Keep CLI as fallback

  • Web GUI is primary interface
  • CLI for edge cases or debugging
  • Both use same database

Next Steps

  1. Review the plans in the markdown files I created:

    • WEB_GUI_DEVELOPMENT_PLAN.md - Complete architecture
    • WEB_GUI_API_SPEC.md - API endpoints
    • WEB_GUI_LIVE_SCREENSHOTS.md - Screenshot streaming
    • WEB_GUI_QUICK_START.md - This file
  2. Decide your approach:

    • Quick monitoring dashboard (1 week)
    • Full professional version (10 weeks)
    • Hybrid (monitor now, expand later)
  3. Let me know if you want me to:

    • Build the simple dashboard (1 week)
    • Start Phase 1 of full build (2 weeks)
    • Create proof-of-concept (2-3 days)

The live screenshot feature alone makes this worth building - being able to watch your scrapers work in real-time is incredibly cool and useful for debugging!

What approach interests you most?