#!/usr/bin/env python from flask import Flask, request, jsonify from vlc_control import send_vlc_command import threading import keyboard import json import os from waitress import serve import time app = Flask(__name__) DEBUG = False # Variables globales fastest = None lock = threading.Lock() order = [] # Liste pour suivre l'ordre des boutons button_ips = {} # Dictionnaire pour enregistrer les adresses IP des boutons json_file = 'buttons.json' # Charger les boutons depuis le fichier JSON s'il existe if os.path.exists(json_file): with open(json_file, 'r') as f: button_ips = json.load(f) @app.route('/execute') def execute_script(): global fastest client_ip = request.remote_addr # Obtenir l'adresse IP du client # Vérifier si l'adresse IP est enregistrée button_id = None for button, ip in button_ips.items(): if ip == client_ip: button_id = button break if button_id is None: # Si l'IP n'est pas trouvée error_message = {"message": "Erreur : cette adresse IP n'est pas enregistrée."} print(f"{error_message['message']} - IP: {client_ip}") return jsonify(error_message), 400 # Retourne un code d'erreur 400 send_vlc_command('pl_pause', True) # Mettre VLC en pause # Utiliser un verrou pour gérer les accès concurrents with lock: if button_id not in order: order.append(button_id) # Ajouter le boîtier à la liste d'ordre print(f"Boîtiers en ordre: {order}") if fastest is None: fastest = button_id # Le premier à arriver devient le gagnant response_message = {"message": "fastest"} # print(f"Fastest is {button_id}") else: response_message = {"message": "second"} # print(f"{button_id} is second") else: response_message = {"message": "duplicate"} # Requête répétée, rejetée return jsonify(response_message), 200 def good_answer(): while True: # Attendre que la touche 'r' soit pressée pour vider l'ordre keyboard.wait('o') with lock: fastest = None # Réinitialiser le gagnant if order: print(f"--- Boîtier {order[0]} gagne ! ---") order.clear() # Enlever le premier boîtier de l'ordre #seek_to_time('') send_vlc_command('pl_play') def incomplet_answer(): global fastest while True: # Attendre que la touche 'r' soit pressée pour vider l'ordre keyboard.wait('x') with lock: fastest = None # Réinitialiser le gagnant if order: print(f"Boîtier {order[0]} : Réponse incomplète") order.pop(0) # Enlever le premier boîtier de l'ordre print(f"Boîtiers en ordre: {order}") if not order: send_vlc_command('pl_play') def no_answer(): global fastest while True: # Attendre que la touche 'r' soit pressée pour vider l'ordre keyboard.wait('p') with lock: fastest = None # Réinitialiser le gagnant if order: print(f"Boîtier {order[0]} : Pas de réponse") order.pop(0) # Enlever le premier boîtier de l'ordre print(f"Boîtiers en ordre: {order}") if not order: send_vlc_command('pl_play') def next_song(): global fastest while True: # Attendre que la touche 'r' soit pressée pour vider l'ordre keyboard.wait('n') print("Are you sure to next ?") keyboard.wait('n') with lock: fastest = None # Réinitialiser le gagnant if order: order.pop(0) # Enlever le premier boîtier de l'ordre print('Next song') send_vlc_command('pl_next') def pause(): while True: # Attendre que la touche 'r' soit pressée pour vider l'ordre keyboard.wait('space') send_vlc_command('pl_pause', True) if __name__ == '__main__': print("Serveur démarré") threading.Thread(target=good_answer, daemon=True).start() threading.Thread(target=incomplet_answer, daemon=True).start() threading.Thread(target=no_answer, daemon=True).start() threading.Thread(target=next_song, daemon=True).start() threading.Thread(target=pause, daemon=True).start() serve(app, host='0.0.0.0', port=5000)