From 63ebf2d727778cd8b114ed46ce307d13e5d649b5 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 15 Nov 2025 01:04:21 +0100 Subject: [PATCH] modified: app.py modified: templates/playerselect.html new file: templates/quiz_buzzer.html --- app.py | 68 ++++- templates/playerselect.html | 6 + templates/quiz_buzzer.html | 535 ++++++++++++++++++++++++++++++++++++ 3 files changed, 606 insertions(+), 3 deletions(-) create mode 100644 templates/quiz_buzzer.html diff --git a/app.py b/app.py index e65ce4a..1c46385 100644 --- a/app.py +++ b/app.py @@ -142,6 +142,7 @@ def playlists(): def quiz(playlist_id): game_mode = request.args.get('mode', 'artist') local_multiplayer = request.args.get('local_multiplayer', '0') + buzzer_mode = request.args.get('buzzer', '0') sp = get_spotify_client() tracks = get_all_playlist_tracks(sp, playlist_id) @@ -192,8 +193,13 @@ def quiz(playlist_id): } all_tracks.append(track_info) - # Prüfe, ob Multiplayer-Modus aktiviert ist - template_name = "quiz_multiplayer.html" if local_multiplayer == '1' else "quiz.html" + # Wähle das passende Template + if buzzer_mode == '1': + template_name = "quiz_buzzer.html" + elif local_multiplayer == '1': + template_name = "quiz_multiplayer.html" + else: + template_name = "quiz.html" return render_template( template_name, @@ -206,7 +212,10 @@ def quiz(playlist_id): total_questions=len(tracks), score=score, answered=answered, - translations=get_translations() + translations=get_translations(), + max_points=1000, + grace_period=5, + decay_rate=50 ) @app.route('/gamemodes/') @@ -305,6 +314,59 @@ def check_answer(): return response +@app.route("/check_answer_buzzer", methods=["POST"]) +def check_answer_buzzer(): + """Spezielle Route für Buzzer-Modus mit Punktesystem basierend auf Zeit""" + data = request.json + guess = data.get('guess', '').lower() + correct_answer = data.get('correct_answer', '').lower() + game_mode = data.get('game_mode', 'artist') + playlist_id = data.get('playlist_id') + earned_points = data.get('earned_points', 0) + all_tracks = data.get('all_tracks', []) + + # Originalwert für Vergleich speichern + original_guess = guess + + # Bei Titel und Künstler: Sonderzeichen entfernen für besseren Vergleich + if game_mode == 'title' or game_mode == 'artist': + guess = clean_title(guess) + correct_answer = clean_title(correct_answer) + + if game_mode == 'year': + is_correct = guess == correct_answer + else: + is_correct = similarity(guess, correct_answer) >= 0.9 + + # Score erhöhen mit Buzzer-Punkten, wenn richtig + if is_correct and playlist_id: + key = f'score_{playlist_id}' + session[key] = session.get(key, 0) + earned_points + + # Bei falscher Antwort: Finde das eingegebene Lied in all_tracks + guessed_track = None + if not is_correct and all_tracks: + for track in all_tracks: + if game_mode == 'title': + if clean_title(track['name'].lower()) == guess: + guessed_track = track + break + elif game_mode == 'artist': + if clean_title(track['artist'].lower()) == guess: + guessed_track = track + break + + response = { + "correct": is_correct, + "correct_answer": correct_answer, + "earned_points": earned_points if is_correct else 0 + } + + if guessed_track: + response["guessed_track"] = guessed_track + + return response + @app.route("/play_track", methods=["POST"]) def play_track(): device_id = request.args.get('device_id') diff --git a/templates/playerselect.html b/templates/playerselect.html index 2a3bf5f..a5070af 100644 --- a/templates/playerselect.html +++ b/templates/playerselect.html @@ -65,6 +65,12 @@
{{ translations['singleplayer_desc'] if translations['singleplayer_desc'] else 'Play alone and test your knowledge.' }}
+
+ + + +
{{ translations['buzzer_mode_desc'] if translations['buzzer_mode_desc'] else 'Punkte nehmen mit der Zeit ab. Schnell sein zahlt sich aus!' }}
+
diff --git a/templates/quiz_buzzer.html b/templates/quiz_buzzer.html new file mode 100644 index 0000000..85058f5 --- /dev/null +++ b/templates/quiz_buzzer.html @@ -0,0 +1,535 @@ + + + + {{ translations['quiz_title'] }} – Buzzer Mode + + + + + + +
+ +
+
+
{{ translations['songs_in_playlist'] if translations.get('songs_in_playlist') else 'Songs' }}
+
{{ total_questions }}
+
+
+
{{ translations['score'] if translations.get('score') else 'Score' }}
+
{{ score }}
+
+
+
{{ translations['answered'] if translations.get('answered') else 'Answered' }}
+
{{ answered }}
+
+
+ + + +

{{ translations['question_artist'] }}

+ + +
0.00s
+
{{ max_points | default(1000) }} Punkte
+ + + + + +
+

{{ translations['enter_answer'] if translations.get('enter_answer') else 'Enter your answer' }}:

+ + + +
+
+ + +
+ + +
+ + + +
+ + +
+ {{ translations['end_quiz'] if translations.get('end_quiz') else '🏁 End Quiz' }} + {{ translations['back_to_playlists'] if translations.get('back_to_playlists') else '⬅️ Back' }} +
+
+ +