Initial commit
This commit is contained in:
1
Python/buttons.json
Normal file
1
Python/buttons.json
Normal file
@@ -0,0 +1 @@
|
||||
{"1": "192.168.1.34", "2": "192.168.1.42"}
|
||||
56
Python/register.py
Normal file
56
Python/register.py
Normal file
@@ -0,0 +1,56 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
from flask import Flask, request, jsonify
|
||||
import json
|
||||
import threading
|
||||
import os
|
||||
from waitress import serve
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
buttons = {} # Dictionnaire pour stocker les boutons et leurs IP
|
||||
lock = threading.Lock()
|
||||
EXPECTED_BUTTONS = 2 # Nombre de boutons attendus
|
||||
|
||||
# Fichier pour enregistrer la correspondance
|
||||
BUTTONS_FILE = 'buttons.json'
|
||||
|
||||
# Compteur pour attribuer un ID unique à chaque bouton
|
||||
button_counter = 1
|
||||
|
||||
@app.route('/execute')
|
||||
def execute_script():
|
||||
global buttons, button_counter
|
||||
ip_address = request.remote_addr # Obtenir l'adresse IP du client
|
||||
|
||||
# Vérifier si l'adresse IP est déjà enregistrée
|
||||
for button_id, registered_ip in buttons.items():
|
||||
if registered_ip == ip_address:
|
||||
return jsonify({"message": f"Button already registered with ID {button_id}."}), 400
|
||||
|
||||
with lock:
|
||||
# Enregistrer le bouton avec son IP si ce n'est pas déjà fait
|
||||
if len(buttons) < EXPECTED_BUTTONS:
|
||||
# Attribuer un ID basé sur le compteur
|
||||
button_id = button_counter
|
||||
buttons[button_id] = ip_address
|
||||
print(f"Button {button_id} registered from IP: {ip_address}")
|
||||
|
||||
# Incrémenter le compteur pour le prochain bouton
|
||||
button_counter += 1
|
||||
|
||||
# Enregistrer dans le fichier
|
||||
with open(BUTTONS_FILE, 'w') as f:
|
||||
json.dump(buttons, f)
|
||||
|
||||
# Vérifier si tous les boutons sont enregistrés
|
||||
if len(buttons) == EXPECTED_BUTTONS:
|
||||
print("Tous les boutons sont enregistrés. Prêt à commencer le jeu.")
|
||||
# Fermer le serveur après enregistrement
|
||||
os._exit(0) # Quitte le programme
|
||||
|
||||
return jsonify({"message": f"Button {button_id} registered."}), 200
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("Serveur d'enregistrement démarré")
|
||||
serve(app, host='0.0.0.0', port=5000) # Utiliser Waitress pour démarrer le serveur
|
||||
133
Python/server.py
Normal file
133
Python/server.py
Normal file
@@ -0,0 +1,133 @@
|
||||
#!/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)
|
||||
51
Python/vlc_control.py
Normal file
51
Python/vlc_control.py
Normal file
@@ -0,0 +1,51 @@
|
||||
import requests
|
||||
|
||||
# Configurer l'adresse et le port de l'interface Web de VLC
|
||||
VLC_WEB_URL = 'http://localhost:8080'
|
||||
VLC_PASSWORD = 'kiki' # Remplacez ceci par le mot de passe configuré dans l'interface Web
|
||||
DEBUG = False
|
||||
|
||||
def is_vlc_running():
|
||||
try:
|
||||
response = requests.get(f'{VLC_WEB_URL}/requests/status.json', auth=('', VLC_PASSWORD))
|
||||
response.raise_for_status()
|
||||
return True
|
||||
except requests.RequestException:
|
||||
return False
|
||||
|
||||
def get_vlc_status():
|
||||
try:
|
||||
response = requests.get(f'{VLC_WEB_URL}/requests/status.json', auth=('', VLC_PASSWORD))
|
||||
response.raise_for_status()
|
||||
return response.json()
|
||||
except requests.RequestException as e:
|
||||
print(f"Erreur lors de la récupération de l'état de VLC : {e}")
|
||||
return None
|
||||
|
||||
def send_vlc_command(command, check_playing=False):
|
||||
if not is_vlc_running():
|
||||
print(f"VLC n'est pas accessible à {VLC_WEB_URL}. Assurez-vous que VLC est ouvert et que l'interface Web est activée.")
|
||||
return
|
||||
|
||||
if check_playing:
|
||||
status = get_vlc_status()
|
||||
if status is not None:
|
||||
state = status.get('state')
|
||||
if state != 'playing':
|
||||
if DEBUG:
|
||||
print(f"La commande '{command}' n'est pas nécessaire. État actuel : {state}")
|
||||
return
|
||||
try:
|
||||
response = requests.get(f'{VLC_WEB_URL}/requests/status.json?command={command}', auth=('', VLC_PASSWORD))
|
||||
response.raise_for_status()
|
||||
if DEBUG:
|
||||
print(f"Commande '{command}' envoyée à VLC.")
|
||||
except requests.RequestException as e:
|
||||
if DEBUG:
|
||||
print(f"Erreur lors de l'envoi de la commande '{command}' à VLC : {e}")
|
||||
|
||||
def seek_to_time(minutes, seconds):
|
||||
# Convertir le temps en secondes
|
||||
total_seconds = minutes * 60 + seconds
|
||||
send_vlc_command(f'seek&val={total_seconds}')
|
||||
|
||||
Reference in New Issue
Block a user