# app.py - SIMPLE VERSION THAT WORKS import pygame import time import threading import base64 import os from flask import Flask, render_template_string from flask_socketio import SocketIO, emit from io import BytesIO os.environ['SDL_VIDEODRIVER'] = 'dummy' pygame.init() app = Flask(__name__) app.config['SECRET_KEY'] = 'secret!' # Use threading mode instead of eventlet socketio = SocketIO(app, async_mode='threading', cors_allowed_origins="*") WIDTH, HEIGHT = 400, 300 shared = { "streaming": True, "x": 200, "frame_count": 0, "clients": 0 } def game_loop(): """Background thread generating frames""" print("🎮 PyGame loop started") screen = pygame.Surface((WIDTH, HEIGHT)) x, speed = 200, 5 while shared["streaming"]: start_time = time.time() # Update position x += speed if x < 30 or x > WIDTH-30: speed *= -1 # Draw frame screen.fill((25, 25, 45)) pygame.draw.circle(screen, (255, 80, 80), (int(x), 150), 20) # Convert to JPEG buf = BytesIO() pygame.image.save(screen, buf, format='JPEG', quality=85) frame_b64 = base64.b64encode(buf.getvalue()).decode('utf-8') # Broadcast to all connected clients socketio.emit('new_frame', { 'frame': frame_b64, 'count': shared['frame_count'], 'x': x }, namespace='/') shared['x'] = x shared['frame_count'] += 1 # Log every 30 frames if shared['frame_count'] % 30 == 0: print(f"Frame {shared['frame_count']}: X={x}, Clients={shared['clients']}") # Control FPS elapsed = time.time() - start_time if elapsed < 1.0/30: time.sleep(1.0/30 - elapsed) print("🛑 PyGame loop stopped") @app.route('/') def index(): return render_template_string('''
Frame: 0 | X: 200
Status: Connecting...
''') @socketio.on('connect') def handle_connect(): shared['clients'] += 1 print(f"Client connected. Total: {shared['clients']}") @socketio.on('disconnect') def handle_disconnect(): shared['clients'] -= 1 print(f"Client disconnected. Total: {shared['clients']}") if __name__ == '__main__': print("🚀 Starting Flask-SocketIO server...") # Start PyGame thread game_thread = threading.Thread(target=game_loop, daemon=True) game_thread.start() # Start server socketio.run( app, host='0.0.0.0', port=int(os.environ.get('PORT', 7860)), debug=False, use_reloader=False, allow_unsafe_werkzeug=True )