#!/bin/bash # # Media Downloader Web Interface Startup Script # Starts both backend API and frontend development server # set -e # Colors for output GREEN='\033[0;32m' BLUE='\033[0;34m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' # No Color echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "${BLUE} Media Downloader - Web Interface Startup ${NC}" echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo # Get script directory SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" BACKEND_DIR="$SCRIPT_DIR/backend" FRONTEND_DIR="$SCRIPT_DIR/frontend" # Check dependencies echo -e "${YELLOW}Checking dependencies...${NC}" # Check Python if ! command -v python3 &> /dev/null; then echo -e "${RED}✗ Python 3 is not installed${NC}" exit 1 fi echo -e "${GREEN}✓ Python 3${NC}" # Check Node.js if ! command -v node &> /dev/null; then echo -e "${RED}✗ Node.js is not installed${NC}" exit 1 fi echo -e "${GREEN}✓ Node.js${NC}" # Check npm if ! command -v npm &> /dev/null; then echo -e "${RED}✗ npm is not installed${NC}" exit 1 fi echo -e "${GREEN}✓ npm${NC}" echo # Install backend dependencies echo -e "${YELLOW}Installing backend dependencies...${NC}" cd "$BACKEND_DIR" if [ ! -f "requirements.txt" ]; then echo -e "${RED}✗ requirements.txt not found${NC}" exit 1 fi pip3 install --break-system-packages -q -r requirements.txt || { echo -e "${RED}✗ Failed to install Python dependencies${NC}" exit 1 } echo -e "${GREEN}✓ Backend dependencies installed${NC}" # Install frontend dependencies echo -e "${YELLOW}Installing frontend dependencies...${NC}" cd "$FRONTEND_DIR" if [ ! -f "package.json" ]; then echo -e "${RED}✗ package.json not found${NC}" exit 1 fi if [ ! -d "node_modules" ]; then echo -e "${YELLOW} Running npm install (this may take a while)...${NC}" npm install || { echo -e "${RED}✗ Failed to install npm dependencies${NC}" exit 1 } fi echo -e "${GREEN}✓ Frontend dependencies installed${NC}" echo echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "${GREEN}Starting services...${NC}" echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo # Kill any existing processes on ports 8000 and 5173 echo -e "${YELLOW}Checking for existing processes...${NC}" lsof -ti:8000 | xargs kill -9 2>/dev/null || true lsof -ti:5173 | xargs kill -9 2>/dev/null || true sleep 1 # Start backend in background echo -e "${YELLOW}Starting backend API (port 8000)...${NC}" cd "$BACKEND_DIR" python3 api.py > /tmp/media-downloader-api.log 2>&1 & BACKEND_PID=$! echo -e "${GREEN}✓ Backend started (PID: $BACKEND_PID)${NC}" # Wait for backend to be ready echo -e "${YELLOW}Waiting for backend to be ready...${NC}" for i in {1..30}; do if curl -s http://localhost:8000/api/health > /dev/null 2>&1; then echo -e "${GREEN}✓ Backend is ready!${NC}" break fi if [ $i -eq 30 ]; then echo -e "${RED}✗ Backend failed to start${NC}" echo -e "${YELLOW}Check logs: tail -f /tmp/media-downloader-api.log${NC}" kill $BACKEND_PID 2>/dev/null || true exit 1 fi sleep 1 done # Start frontend in foreground echo -e "${YELLOW}Starting frontend dev server (port 5173)...${NC}" cd "$FRONTEND_DIR" echo echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "${GREEN}✓ Web interface is starting!${NC}" echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo echo -e "${GREEN}Backend API:${NC} http://localhost:8000" echo -e "${GREEN}Frontend UI:${NC} http://localhost:5173" echo -e "${GREEN}API Docs:${NC} http://localhost:8000/docs" echo echo -e "${YELLOW}Logs:${NC}" echo -e " Backend: tail -f /tmp/media-downloader-api.log" echo -e " Frontend: (shown below)" echo echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "${YELLOW}Press Ctrl+C to stop all services${NC}" echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo # Cleanup function cleanup() { echo echo -e "${YELLOW}Shutting down services...${NC}" kill $BACKEND_PID 2>/dev/null || true lsof -ti:8000 | xargs kill -9 2>/dev/null || true lsof -ti:5173 | xargs kill -9 2>/dev/null || true echo -e "${GREEN}✓ Services stopped${NC}" exit 0 } trap cleanup SIGINT SIGTERM # Run frontend (blocks) npm run dev # If npm exits, cleanup cleanup