first commit

This commit is contained in:
2024-09-05 18:34:12 +02:00
commit d175ce4944
18 changed files with 514 additions and 0 deletions

Binary file not shown.

137
src/api/routes.py Normal file
View File

@@ -0,0 +1,137 @@
import math
import os
from flask import Blueprint, jsonify, request
from werkzeug.utils import secure_filename
from src.services.tmdb_service import TMDBService
from src.services.image_service import ImageService
import pandas as pd
from functools import lru_cache
api_bp = Blueprint('api', __name__)
tmdb_service = TMDBService()
image_service = ImageService()
UPLOAD_FOLDER = './data'
ALLOWED_EXTENSIONS = {'csv'}
csv_file = os.path.join(UPLOAD_FOLDER, 'diary.csv')
@lru_cache(maxsize=1000)
def get_poster_url(movie_name, movie_year):
movie = tmdb_service.search_movie(movie_name, movie_year)
if movie:
posters = tmdb_service.get_movie_posters(movie['id'])
if posters:
return posters[0]
return None
@api_bp.route('/movies', methods=['GET'])
def get_movies():
try:
if not os.path.exists(csv_file):
return jsonify({'movies': [], 'message': 'No movies found. Please upload a CSV file.'}), 200
page = int(request.args.get('page', 1))
limit = int(request.args.get('limit', 10))
df = pd.read_csv(csv_file)
df = df.iloc[::-1].reset_index(drop=True)
total_movies = len(df)
total_pages = math.ceil(total_movies / limit)
start_index = (page - 1) * limit
end_index = start_index + limit
df_page = df.iloc[start_index:end_index]
movies = df_page.to_dict('records')
movies_with_posters = [
{
'id': start_index + i + 1,
'Watched Date': movie['Watched Date'],
'Name': movie['Name'],
'Year': movie['Year'],
'Poster': get_poster_url(movie['Name'], movie['Year']),
}
for i, movie in enumerate(movies)
]
return jsonify({
'movies': movies_with_posters,
'total': total_movies,
'page': page,
'total_pages': total_pages
})
except Exception as e:
print(f"Error in get_movies: {str(e)}")
return jsonify({'error': 'An error occurred while fetching movies'}), 500
@api_bp.route('/posters/<movie_name>/<movie_year>', methods=['GET'])
def get_movie_posters(movie_name, movie_year):
tmdb_service = TMDBService()
movie = tmdb_service.search_movie(movie_name, movie_year)
if movie:
posters = tmdb_service.get_movie_posters(movie['id'])
return jsonify({'posters': posters})
else:
return jsonify({'error': 'Movie not found'}), 404
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@api_bp.route('/upload-csv', methods=['POST'])
def upload_csv():
if 'file' not in request.files:
return jsonify({'error': 'No file part'}), 400
file = request.files['file']
if file.filename == '':
return jsonify({'error': 'No selected file'}), 400
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file_path = os.path.join(UPLOAD_FOLDER, filename)
file.save(file_path)
try:
df = pd.read_csv(file_path)
df = df.rename(columns={
'Date': 'Watched Date',
'Name': 'Name',
'Year': 'Year'
})
df.to_csv(csv_file, index=False)
return jsonify({'success': True, 'message': 'File uploaded and processed successfully'}), 200
except Exception as e:
return jsonify({'error': f'Error processing file: {str(e)}'}), 500
return jsonify({'error': 'File type not allowed'}), 400
@api_bp.route('/check-csv', methods=['GET'])
def check_csv():
try:
if os.path.exists(csv_file):
return jsonify({'fileExists': True}), 200
else:
return jsonify({'fileExists': False}), 200
except Exception as e:
print(f"Error in check_csv: {str(e)}")
return jsonify({'error': 'An error occurred while checking the CSV file'}), 500
@api_bp.route('/delete-csv', methods=['DELETE'])
def delete_csv():
try:
if os.path.exists(csv_file):
os.remove(csv_file)
return jsonify({'success': True, 'message': 'CSV file deleted successfully'}), 200
else:
return jsonify({'error': 'CSV file not found'}), 404
except Exception as e:
print(f"Error in delete_csv: {str(e)}")
return jsonify({'error': 'An error occurred while deleting the CSV file'}), 500