134 lines
4.4 KiB
Python
134 lines
4.4 KiB
Python
#!/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)
|