diff --git a/app.py b/app.py index f95038a..7a3a4a7 100644 --- a/app.py +++ b/app.py @@ -14,6 +14,14 @@ import json app = Flask(__name__) app.secret_key = os.getenv("SECRET_KEY") +# Jinja2-Filter für die Bereinigung von Titeln/Künstlern +@app.template_filter('clean') +def clean_filter(text): + """Template-Filter um Sonderzeichen aus Titeln/Künstlern zu entfernen""" + if not text: + return "" + return clean_title(str(text)) + # Erweiterte Berechtigungen für Web Playback SDK SCOPE = "user-library-read playlist-read-private streaming user-read-email user-read-private" @@ -176,8 +184,8 @@ def quiz(playlist_id): for item in tracks: track_info = { "id": item["id"], - "name": item["name"], - "artist": item["artists"][0]["name"], + "name": clean_title(item["name"]), # Bereinigter Name für Frontend + "artist": clean_title(item["artists"][0]["name"]), # Bereinigter Künstler "uri": item["uri"], "release_date": item.get("album", {}).get("release_date", "Unbekannt")[:4] } @@ -251,9 +259,6 @@ def check_answer(): game_mode = data.get('game_mode', 'artist') playlist_id = data.get('playlist_id') - # Speichere Original für Anzeige - original_answer = correct_answer - # Bei Titel und Künstler: Sonderzeichen entfernen für besseren Vergleich if game_mode == 'title' or game_mode == 'artist': guess = clean_title(guess) @@ -271,7 +276,7 @@ def check_answer(): return { "correct": is_correct, - "correct_answer": original_answer + "correct_answer": correct_answer } @app.route("/play_track", methods=["POST"]) diff --git a/templates/quiz.html b/templates/quiz.html index f77fa8f..54d9caf 100644 --- a/templates/quiz.html +++ b/templates/quiz.html @@ -297,11 +297,11 @@ function setCorrectAnswer() { if (currentGameMode === 'artist') { - correctAnswer = "{{ track.artists[0].name }}"; + correctAnswer = "{{ track.artists[0].name | clean }}"; document.getElementById('question-text').innerText = i18n.question_artist; document.getElementById('answerInput').placeholder = i18n.input_artist; } else if (currentGameMode === 'title') { - correctAnswer = "{{ track.name }}"; + correctAnswer = "{{ track.name | clean }}"; document.getElementById('question-text').innerText = i18n.question_title; document.getElementById('answerInput').placeholder = i18n.input_title; } else if (currentGameMode === 'year') { @@ -312,17 +312,6 @@ } } - // Hilfsfunktion: Entfernt Sonderzeichen wie in Python clean_title - function cleanTitle(title) { - // Entferne Klammerzusätze - title = title.replace(/(\s*[\(\[][^)\]]*[\)\]])/g, ''); - // Entferne Apostrophe und Anführungszeichen - title = title.replace(/['''`´ʼ""„""']/g, ''); - // Entferne weitere Sonderzeichen (außer Buchstaben, Zahlen, Leerzeichen, - und &) - title = title.replace(/[^\w\s\-&]/g, ''); - return title.trim(); - } - function togglePlay() { const deviceId = document.getElementById('device_id').value; @@ -367,9 +356,8 @@ item.className = 'search-item'; item.innerHTML = `${result.name} - ${result.artist}`; item.onclick = function() { - // Setze den bereinigten Wert (ohne Sonderzeichen) ins Input - const valueToSet = currentGameMode === 'artist' ? result.artist : result.name; - document.getElementById('answerInput').value = cleanTitle(valueToSet); + document.getElementById('answerInput').value = + currentGameMode === 'artist' ? result.artist : result.name; resultsContainer.style.display = 'none'; }; resultsContainer.appendChild(item); @@ -415,9 +403,9 @@
Cover
-

${i18n.song || 'Song'}: {{ track.name }}

-

${i18n.artist || 'Artist'}: {{ track.artists[0].name }}

-

${i18n.album || 'Album'}: {{ track.album.name }}

+

${i18n.song || 'Song'}: {{ track.name | clean }}

+

${i18n.artist || 'Artist'}: {{ track.artists[0].name | clean }}

+

${i18n.album || 'Album'}: {{ track.album.name | clean }}

${i18n.year || 'Year'}: {{ track.album.release_date[:4] }}

${i18n.open_on_spotify || 'Open on Spotify'}