diff --git a/app.py b/app.py index 7189cf6..293c9d0 100644 --- a/app.py +++ b/app.py @@ -7,6 +7,7 @@ import os import spotipy from spotipy.oauth2 import SpotifyOAuth import random +from difflib import SequenceMatcher app = Flask(__name__) app.secret_key = os.getenv("SECRET_KEY") @@ -23,6 +24,9 @@ def get_spotify_client(): cache_path=".cache" )) +def similarity(a, b): + return SequenceMatcher(None, a.lower(), b.lower()).ratio() + @app.route("/") def home(): return render_template("login.html") @@ -60,6 +64,8 @@ def playlists(): @app.route("/quiz/") def quiz(playlist_id): + game_mode = request.args.get('mode', 'artist') + sp = get_spotify_client() items = sp.playlist_items(playlist_id, additional_types=["track"])["items"] @@ -77,7 +83,75 @@ def quiz(playlist_id): # Zugriff auf access_token access_token = token_info['access_token'] - return render_template("quiz.html", track=track, access_token=access_token, playlist_id=playlist_id) + # Alle Tracks für die Suchfunktion (für title und artist mode) + all_tracks = [] + for item in tracks: + track_info = { + "id": item["id"], + "name": item["name"], + "artist": item["artists"][0]["name"], + "uri": item["uri"], + "release_date": item.get("album", {}).get("release_date", "Unbekannt")[:4] # Nur das Jahr + } + all_tracks.append(track_info) + + return render_template( + "quiz.html", + track=track, + access_token=access_token, + playlist_id=playlist_id, + game_mode=game_mode, + all_tracks=all_tracks + ) + +@app.route("/search_track", methods=["POST"]) +def search_track(): + data = request.json + query = data.get('query', '').lower() + all_tracks = data.get('all_tracks', []) + + if not query or not all_tracks: + return {"results": []} + + # Tracks nach Ähnlichkeit filtern (80% Übereinstimmung) + results = [] + for track in all_tracks: + name_similarity = similarity(query, track["name"]) + artist_similarity = similarity(query, track["artist"]) + + # Wenn Name oder Künstler zu 80% übereinstimmt + if name_similarity >= 0.8 or artist_similarity >= 0.8: + results.append({ + "id": track["id"], + "name": track["name"], + "artist": track["artist"], + "uri": track["uri"], + "similarity": max(name_similarity, artist_similarity) + }) + + # Nach Ähnlichkeit sortieren + results.sort(key=lambda x: x["similarity"], reverse=True) + + return {"results": results} + +@app.route("/check_answer", methods=["POST"]) +def check_answer(): + data = request.json + guess = data.get('guess', '').lower() + correct_answer = data.get('correct_answer', '').lower() + game_mode = data.get('game_mode', 'artist') + + # Bei Jahr-Modus: Exakte Übereinstimmung prüfen + if game_mode == 'year': + is_correct = guess == correct_answer + else: + # Bei anderen Modi: Ähnlichkeitsprüfung (90% Übereinstimmung gilt als korrekt) + is_correct = similarity(guess, correct_answer) >= 0.9 + + return { + "correct": is_correct, + "correct_answer": correct_answer + } @app.route("/play_track", methods=["POST"]) def play_track(): diff --git a/templates/quiz.html b/templates/quiz.html index da7ebfd..96ec735 100644 --- a/templates/quiz.html +++ b/templates/quiz.html @@ -4,7 +4,100 @@ Musik Quiz + - -

Wer ist der Künstler dieses Songs?

+

Wer ist der Künstler dieses Songs?

- -
- + +
+ + +
- -

Antwort: {{ track.artists[0].name }} (für Demo-Zwecke)

- Neue Frage - - + +
+ + +
+ + + +
+ + +
+ {% if game_mode == 'artist' %} +

Tipp: Gib den Namen des Künstlers ein, der diesen Song performt.

+ {% elif game_mode == 'title' %} +

Tipp: Gib den Titel des Songs ein, den du gerade hörst.

+ {% elif game_mode == 'year' %} +

Tipp: Gib das Erscheinungsjahr des Songs ein.

+ {% endif %} +