modified: app.py

modified:   templates/quiz.html
This commit is contained in:
SimolZimol
2025-05-16 12:32:16 +02:00
parent 287f8d5e3e
commit 949ab32ba2
2 changed files with 334 additions and 41 deletions

76
app.py
View File

@@ -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/<playlist_id>")
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():