Nexora-Encoder / start_service.py
ChandimaPrabath's picture
upload
e2c1f2e
#!/usr/bin/env python3
import subprocess
import sys
import os
import time
import signal
import argparse
from pathlib import Path
import logging
from app import create_app
# Configure logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
class ServiceManager:
def __init__(self, tmp_dir="/tmp", port=5000, worker_name=None):
self.processes = {}
self.tmp_dir = Path(tmp_dir)
self.port = port
self.worker_name = worker_name or f"encoder_worker_{os.getpid()}"
# Ensure required directories exist
self.uploads_dir = self.tmp_dir / "uploads"
self.encoded_dir = self.tmp_dir / "encoded"
self.uploads_dir.mkdir(parents=True, exist_ok=True)
self.encoded_dir.mkdir(parents=True, exist_ok=True)
# Set environment variables
os.environ['UPLOAD_FOLDER'] = str(self.uploads_dir)
os.environ['ENCODED_FOLDER'] = str(self.encoded_dir)
def start_flask(self):
"""Start Flask application"""
try:
app = create_app()
from werkzeug.serving import run_simple
run_simple('0.0.0.0', self.port, app, use_reloader=False)
return True
except Exception as e:
logger.error(f"Failed to start Flask: {e}")
return False
def start_all(self):
"""Start all services"""
return self.start_flask()
def stop_all(self):
"""Stop all services"""
for name, process in self.processes.items():
try:
process.terminate()
process.wait(timeout=5)
logger.info(f"Stopped {name}")
except Exception as e:
logger.error(f"Error stopping {name}: {e}")
process.kill()
def cleanup(self):
"""Clean up temporary files"""
try:
logger.info("Cleanup completed")
except Exception as e:
logger.error(f"Cleanup error: {e}")
def signal_handler(signum, frame):
"""Handle termination signals"""
logger.info("Received termination signal")
manager.stop_all()
manager.cleanup()
sys.exit(0)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Media Encoder Service Manager")
parser.add_argument("--tmp-dir", default="/tmp/encoder", help="Temporary directory path")
parser.add_argument("--port", type=int, default=5000, help="Port for the service")
parser.add_argument("--worker-name", help="Custom name for worker instance")
args = parser.parse_args()
# Register signal handlers
signal.signal(signal.SIGTERM, signal_handler)
signal.signal(signal.SIGINT, signal_handler)
# Create and start service manager
manager = ServiceManager(
tmp_dir=args.tmp_dir,
port=args.port,
worker_name=args.worker_name
)
if manager.start_all():
logger.info("Service started successfully")
try:
# Keep the script running
while True:
time.sleep(1)
except KeyboardInterrupt:
logger.info("Shutting down...")
manager.stop_all()
manager.cleanup()
else:
logger.error("Failed to start service")
manager.stop_all()
manager.cleanup()
sys.exit(1)