161 lines
6.6 KiB
Python
161 lines
6.6 KiB
Python
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/<int:game_id>', 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)
|