modified: app.py
modified: templates/quiz.html
This commit is contained in:
76
app.py
76
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/<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():
|
||||
|
||||
Reference in New Issue
Block a user