parent
ce52aa6932
commit
16fb2b3023
@ -1,136 +0,0 @@
|
||||
import subprocess
|
||||
import time
|
||||
import os
|
||||
import typer
|
||||
import platform
|
||||
import webbrowser
|
||||
import psutil
|
||||
import ngrok
|
||||
import segno
|
||||
import json
|
||||
|
||||
from pathlib import Path
|
||||
from livekit import api
|
||||
from source.server.livekit.worker import main as worker_main
|
||||
from source.server.livekit.multimodal import main as multimodal_main
|
||||
|
||||
from dotenv import load_dotenv
|
||||
|
||||
|
||||
|
||||
load_dotenv()
|
||||
system_type = platform.system()
|
||||
app = typer.Typer()
|
||||
|
||||
|
||||
|
||||
ROOM_NAME = "my-room"
|
||||
|
||||
|
||||
def pre_clean_process(port):
|
||||
"""Find and kill process running on specified port"""
|
||||
for proc in psutil.process_iter(['pid', 'name', 'connections']):
|
||||
try:
|
||||
for conn in proc.connections():
|
||||
if conn.laddr.port == port:
|
||||
print(f"Killing process {proc.pid} ({proc.name()}) on port {port}")
|
||||
proc.terminate()
|
||||
proc.wait()
|
||||
return True
|
||||
except (psutil.NoSuchProcess, psutil.AccessDenied):
|
||||
pass
|
||||
return False
|
||||
|
||||
|
||||
def cleanup_processes(processes):
|
||||
for process in processes:
|
||||
if process.poll() is None: # if process is still running
|
||||
process.terminate()
|
||||
process.wait() # wait for process to terminate
|
||||
|
||||
if __name__ == "__main__":
|
||||
# preprocess ports
|
||||
ports = [10101, 8000, 3000]
|
||||
for port in ports:
|
||||
pre_clean_process(port)
|
||||
|
||||
|
||||
profiles_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), "source", "server", "profiles")
|
||||
|
||||
profile = "default.py"
|
||||
if profile:
|
||||
if not os.path.isfile(profile):
|
||||
profile = os.path.join(profiles_dir, profile)
|
||||
if not os.path.isfile(profile):
|
||||
profile += ".py"
|
||||
if not os.path.isfile(profile):
|
||||
print(f"Invalid profile path: {profile}")
|
||||
exit(1)
|
||||
|
||||
|
||||
OI_CMD = f"interpreter --serve --profile {profile}"
|
||||
oi_server = subprocess.Popen(OI_CMD, shell=True)
|
||||
print("Interpreter server started")
|
||||
|
||||
|
||||
print("Starting livekit server...")
|
||||
debug = False
|
||||
host = '0.0.0.0'
|
||||
port = 10101
|
||||
if debug:
|
||||
LK_CMD = f"livekit-server --dev --bind {host} --port {port}"
|
||||
else:
|
||||
LK_CMD = f"livekit-server --dev --bind {host} --port {port} > /dev/null 2>&1"
|
||||
|
||||
lk_server = subprocess.Popen(LK_CMD, shell=True)
|
||||
print("Livekit server started")
|
||||
|
||||
lk_url = f"http://localhost:10101"
|
||||
participant_token = str(api.AccessToken('devkey', 'secret') \
|
||||
.with_identity("Participant") \
|
||||
.with_name("You") \
|
||||
.with_grants(api.VideoGrants(
|
||||
room_join=True,
|
||||
room=ROOM_NAME,))
|
||||
.to_jwt())
|
||||
|
||||
processes = [lk_server, oi_server]
|
||||
|
||||
client = 'meet'
|
||||
if client == 'mobile':
|
||||
listener = ngrok.forward(f"{host}:{port}", authtoken_from_env=True)
|
||||
lk_url = listener.url()
|
||||
print(f"Livekit server forwarded to: {lk_url}")
|
||||
|
||||
print("Scan the QR code below with your mobile app to connect to the livekit server.")
|
||||
content = json.dumps({"livekit_server": lk_url, "token": participant_token})
|
||||
qr_code = segno.make(content)
|
||||
qr_code.terminal(compact=True)
|
||||
else: # meet client
|
||||
# Get the path to the meet client directory
|
||||
meet_client_path = Path(__file__).parent / "source" / "clients" / "meet"
|
||||
|
||||
print("Starting Next.js dev server...")
|
||||
next_server = subprocess.Popen(["pnpm", "dev"], cwd=meet_client_path,)
|
||||
print("Next.js dev server started")
|
||||
|
||||
time.sleep(2)
|
||||
meet_url = f'http://localhost:3000/custom?liveKitUrl={lk_url.replace("http", "ws")}&token={participant_token}'
|
||||
print(f"\nOpening meet interface at: {meet_url}")
|
||||
webbrowser.open(meet_url)
|
||||
|
||||
processes.append(next_server)
|
||||
|
||||
multimodal = False
|
||||
try:
|
||||
print("Starting worker...")
|
||||
if multimodal:
|
||||
multimodal_main(lk_url)
|
||||
else:
|
||||
worker_main(lk_url)
|
||||
print("Worker started")
|
||||
except KeyboardInterrupt:
|
||||
print("\nReceived interrupt signal, shutting down...")
|
||||
finally:
|
||||
print("Cleaning up processes...")
|
||||
cleanup_processes(processes)
|
Loading…
Reference in new issue