Loading simple_backend.py +38 −27 Original line number Diff line number Diff line from flask import Flask, jsonify, send_from_directory import csv import os app = Flask(__name__, static_folder='frontend') # static_folder auf 'frontend' setzen from flask import Flask, jsonify, send_from_directory app = Flask(__name__, static_folder="frontend") # static_folder auf 'frontend' setzen # Es wird davon ausgegangen, dass die CSV-Datei im selben Verzeichnis wie simple_backend.py liegt. SONGS_CSV_FILE = 'songs.csv' SONGS_CSV_FILE = "songs.csv" songs_data = [] # Definiere den Pfad zum Frontend-Ordner relativ zum Skriptverzeichnis # __file__ ist der Pfad zum aktuellen Skript (simple_backend.py) # os.path.dirname(__file__) ist das Verzeichnis, in dem das Skript liegt # os.path.join(...) erstellt einen plattformunabhängigen Pfad FRONTEND_FOLDER = os.path.join(os.path.dirname(__file__), 'frontend') FRONTEND_FOLDER = os.path.join(os.path.dirname(__file__), "frontend") def load_and_prepare_songs(): Loading @@ -26,56 +27,66 @@ def load_and_prepare_songs(): return try: with open(csv_file_path, mode='r', encoding='utf-8-sig') as infile: # utf-8-sig für BOM-Handling with open( csv_file_path, encoding="utf-8-sig" ) as infile: # utf-8-sig für BOM-Handling reader = csv.DictReader(infile) for i, row in enumerate(reader): song_entry = { 'id': f's{i+1}', # Eindeutige ID generieren 'title': row.get('TITLE', '').strip(), 'artist': row.get('ARTIST', '').strip(), 'genre': row.get('GENRE', '').strip(), 'year': None # Standardmäßig None "id": f"s{i + 1}", # Eindeutige ID generieren "title": row.get("TITLE", "").strip(), "artist": row.get("ARTIST", "").strip(), "genre": row.get("GENRE", "").strip(), "year": None, # Standardmäßig None } year_str = row.get('YEAR', '').strip() year_str = row.get("YEAR", "").strip() if year_str.isdigit(): song_entry['year'] = int(year_str) song_entry["year"] = int(year_str) songs_data.append(song_entry) print(f"{len(songs_data)} Songs erfolgreich geladen und vorbereitet.") except Exception as e: print(f"Fehler beim Lesen oder Verarbeiten der CSV-Datei: {e}") # API-Endpunkt zum Abrufen der Song-Daten @app.route('/api/songs', methods=['GET']) @app.route("/api/songs", methods=["GET"]) def get_songs(): if not songs_data: print("Keine Songdaten im Speicher, versuche erneut zu laden...") load_and_prepare_songs() if not songs_data: return jsonify({"error": "Songdaten konnten nicht geladen werden oder Datei nicht vorhanden."}), 500 return jsonify( { "error": "Songdaten konnten nicht geladen werden oder Datei nicht vorhanden." } ), 500 return jsonify(songs_data) # Route zum Ausliefern der index.html für den Root-Pfad @app.route('/', methods=['GET']) @app.route("/", methods=["GET"]) def serve_index(): # send_from_directory benötigt den Ordner und den Dateinamen return send_from_directory(FRONTEND_FOLDER, 'index.html') return send_from_directory(FRONTEND_FOLDER, "index.html") # Route zum Ausliefern aller anderen statischen Dateien aus dem frontend-Ordner # z.B. /style.css, /app.mjs, etc. @app.route('/<path:filename>') @app.route("/<path:filename>") def serve_static_files(filename): return send_from_directory(FRONTEND_FOLDER, filename) if __name__ == '__main__': if __name__ == "__main__": load_and_prepare_songs() # Lade Songs beim Start des Servers if songs_data: # debug=True ist gut für die Entwicklung, für Produktion auf False setzen app.run(debug=True, port=5001) else: print("Backend startet nicht, da keine Songdaten geladen werden konnten.") print(f"Bitte stelle sicher, dass die Datei '{SONGS_CSV_FILE}' im selben Verzeichnis wie das Skript liegt oder passe den Pfad an.") print( f"Bitte stelle sicher, dass die Datei '{SONGS_CSV_FILE}' im selben Verzeichnis wie das Skript liegt oder passe den Pfad an." ) Loading
simple_backend.py +38 −27 Original line number Diff line number Diff line from flask import Flask, jsonify, send_from_directory import csv import os app = Flask(__name__, static_folder='frontend') # static_folder auf 'frontend' setzen from flask import Flask, jsonify, send_from_directory app = Flask(__name__, static_folder="frontend") # static_folder auf 'frontend' setzen # Es wird davon ausgegangen, dass die CSV-Datei im selben Verzeichnis wie simple_backend.py liegt. SONGS_CSV_FILE = 'songs.csv' SONGS_CSV_FILE = "songs.csv" songs_data = [] # Definiere den Pfad zum Frontend-Ordner relativ zum Skriptverzeichnis # __file__ ist der Pfad zum aktuellen Skript (simple_backend.py) # os.path.dirname(__file__) ist das Verzeichnis, in dem das Skript liegt # os.path.join(...) erstellt einen plattformunabhängigen Pfad FRONTEND_FOLDER = os.path.join(os.path.dirname(__file__), 'frontend') FRONTEND_FOLDER = os.path.join(os.path.dirname(__file__), "frontend") def load_and_prepare_songs(): Loading @@ -26,56 +27,66 @@ def load_and_prepare_songs(): return try: with open(csv_file_path, mode='r', encoding='utf-8-sig') as infile: # utf-8-sig für BOM-Handling with open( csv_file_path, encoding="utf-8-sig" ) as infile: # utf-8-sig für BOM-Handling reader = csv.DictReader(infile) for i, row in enumerate(reader): song_entry = { 'id': f's{i+1}', # Eindeutige ID generieren 'title': row.get('TITLE', '').strip(), 'artist': row.get('ARTIST', '').strip(), 'genre': row.get('GENRE', '').strip(), 'year': None # Standardmäßig None "id": f"s{i + 1}", # Eindeutige ID generieren "title": row.get("TITLE", "").strip(), "artist": row.get("ARTIST", "").strip(), "genre": row.get("GENRE", "").strip(), "year": None, # Standardmäßig None } year_str = row.get('YEAR', '').strip() year_str = row.get("YEAR", "").strip() if year_str.isdigit(): song_entry['year'] = int(year_str) song_entry["year"] = int(year_str) songs_data.append(song_entry) print(f"{len(songs_data)} Songs erfolgreich geladen und vorbereitet.") except Exception as e: print(f"Fehler beim Lesen oder Verarbeiten der CSV-Datei: {e}") # API-Endpunkt zum Abrufen der Song-Daten @app.route('/api/songs', methods=['GET']) @app.route("/api/songs", methods=["GET"]) def get_songs(): if not songs_data: print("Keine Songdaten im Speicher, versuche erneut zu laden...") load_and_prepare_songs() if not songs_data: return jsonify({"error": "Songdaten konnten nicht geladen werden oder Datei nicht vorhanden."}), 500 return jsonify( { "error": "Songdaten konnten nicht geladen werden oder Datei nicht vorhanden." } ), 500 return jsonify(songs_data) # Route zum Ausliefern der index.html für den Root-Pfad @app.route('/', methods=['GET']) @app.route("/", methods=["GET"]) def serve_index(): # send_from_directory benötigt den Ordner und den Dateinamen return send_from_directory(FRONTEND_FOLDER, 'index.html') return send_from_directory(FRONTEND_FOLDER, "index.html") # Route zum Ausliefern aller anderen statischen Dateien aus dem frontend-Ordner # z.B. /style.css, /app.mjs, etc. @app.route('/<path:filename>') @app.route("/<path:filename>") def serve_static_files(filename): return send_from_directory(FRONTEND_FOLDER, filename) if __name__ == '__main__': if __name__ == "__main__": load_and_prepare_songs() # Lade Songs beim Start des Servers if songs_data: # debug=True ist gut für die Entwicklung, für Produktion auf False setzen app.run(debug=True, port=5001) else: print("Backend startet nicht, da keine Songdaten geladen werden konnten.") print(f"Bitte stelle sicher, dass die Datei '{SONGS_CSV_FILE}' im selben Verzeichnis wie das Skript liegt oder passe den Pfad an.") print( f"Bitte stelle sicher, dass die Datei '{SONGS_CSV_FILE}' im selben Verzeichnis wie das Skript liegt oder passe den Pfad an." )