from flask import Flask, request, jsonify, g from flask_sqlalchemy import SQLAlchemy from database import init_db from models import db, Game from user_management import user_bp, authenticate import os from datetime import datetime import requests from bs4 import BeautifulSoup import base64 from PIL import Image app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(app.instance_path, 'games.db') app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db.init_app(app) # Stelle sicher, dass der instance-Ordner existiert os.makedirs(app.instance_path, exist_ok=True) os.makedirs(os.path.join(app.instance_path, 'game_images'), exist_ok=True) # Create game_images directory with app.app_context(): init_db() # Ensure the database is initialized before any operations def encode_image_to_base64(image_path): with open(image_path, "rb") as image_file: return base64.b64encode(image_file.read()).decode('utf-8') def resize_image(image_path, max_height=50): with Image.open(image_path) as img: aspect_ratio = img.width / img.height new_height = min(max_height, img.height) new_width = int(aspect_ratio * new_height) img = img.resize((new_width, new_height), Image.LANCZOS) img.save(image_path) @app.route('/games', methods=['POST']) def add_game(): if not authenticate(): return jsonify({'message': 'Unauthorized access!'}), 401 data = request.json buyer_username = g.user.username # Get the username from the authenticated user # Download the image and save it locally image_url = data['image'] image_response = requests.get(image_url) if image_response.status_code == 200: image_filename = f"game_images/{data['title'].replace(' ', '_')}.jpg" # Relative path local_image_path = os.path.join(app.instance_path, image_filename) with open(local_image_path, 'wb') as f: f.write(image_response.content) # Resize the image resize_image(local_image_path) else: return jsonify({'message': 'Image could not be downloaded!'}), 400 new_game = Game( image=image_filename, # Save the relative path to the image title=data['title'], date=datetime.now().strftime('%Y-%m-%d'), # Set current date buyer=buyer_username, # Set buyer as the authenticated user's username owned=True # Set owned to True by default ) db.session.add(new_game) db.session.commit() return jsonify({'message': 'Game added!'}), 201 @app.route('/games', methods=['GET']) def get_games(): if not authenticate(): return jsonify({'message': 'Unauthorized access!'}), 401 games = Game.query.all() games_list = [] for game in games: image_path = os.path.join(app.instance_path, game.image) image_base64 = encode_image_to_base64(image_path) if os.path.exists(image_path) else None games_list.append({ 'id': game.id, 'image': image_base64, # Base64 encoded image 'title': game.title, 'date': game.date, 'buyer': game.buyer, 'owned': game.owned }) return jsonify(games_list) @app.route('/games/', methods=['DELETE']) def delete_game(game_id): if not authenticate(): return jsonify({'message': 'Unauthorized access!'}), 401 game = Game.query.get(game_id) if not game: return jsonify({'message': 'Game not found!'}), 404 # Delete the image file image_path = os.path.join(app.instance_path, game.image) if os.path.exists(image_path): os.remove(image_path) db.session.delete(game) db.session.commit() return jsonify({'message': 'Game deleted!'}), 200 @app.route('/games/search', methods=['GET']) def search_game_api(): if not authenticate(): # Ensure the user is authenticated return jsonify({'message': 'Unauthorized access!'}), 401 search_term = request.args.get('search_keywords') if not search_term: return jsonify({'message': 'No search term provided!'}), 400 url = "https://www.switchscores.com/games/search" params = { '_token': 'UioRaADSoKqKdebnI66WRqBwtgqqte79sEMm0tVK', 'search_keywords': search_term } response = requests.get(url, params=params) if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') results = soup.select('.row > .col-sm-12') # Using CSS selector based on the provided HTML structure games_list = [] # List to hold found games seen_titles = set() # Set to track seen titles to avoid duplicates for game in results: title_tag = game.find('span', class_='h5').find('a') if game.find('span', class_='h5') else None if title_tag: # Only output if a title is found title = title_tag.text.strip() if title not in seen_titles: # Check for duplicates seen_titles.add(title) # Add title to seen set link = title_tag['href'] image_tag = game.find('img') # Find the image tag image_link = image_tag['src'] if image_tag and 'src' in image_tag.attrs else "Kein Bild gefunden" # Get the image link if it exists if image_link != "Kein Bild gefunden": image_link = f"https://www.switchscores.com{image_link}" # Prefix the image link release_date = game.find('span', class_='h6').text.strip() if game.find('span', class_='h6') else "Kein Veröffentlichungsdatum gefunden" price = game.find('span', class_='h4').text.strip() if game.find('span', class_='h4') else "Kein Preis gefunden" rating = game.find('span', class_='switch-rating-badge').text.strip() if game.find('span', class_='switch-rating-badge') else "Keine Bewertung gefunden" games_list.append({ 'title': title, 'link': link, 'image_link': image_link, 'release_date': release_date, 'price': price, 'rating': rating }) return jsonify(games_list), 200 # Return the list of games found else: return jsonify({'message': 'Error fetching the page.'}), 500 app.register_blueprint(user_bp) # Register the user management blueprint if __name__ == '__main__': with app.app_context(): init_db() # Ensure the database is initialized when the app starts app.run(debug=True)