Add api dependencies
This commit is contained in:
12
main.py
12
main.py
@@ -8,7 +8,17 @@ from config import config
|
|||||||
|
|
||||||
def create_app():
|
def create_app():
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
CORS(app)
|
|
||||||
|
origins = [
|
||||||
|
"http://localhost:3000",
|
||||||
|
"http://127.0.0.1:3000"
|
||||||
|
]
|
||||||
|
CORS(app, supports_credentials=True, origins=origins)
|
||||||
|
|
||||||
|
app.config.update(
|
||||||
|
SESSION_COOKIE_SAMESITE="None", # necessary for cross-site cookies
|
||||||
|
SESSION_COOKIE_SECURE=False # True in prod (HTTPS)
|
||||||
|
)
|
||||||
|
|
||||||
env = os.environ.get('FLASK_ENV', 'default')
|
env = os.environ.get('FLASK_ENV', 'default')
|
||||||
app.config.from_object(config[env])
|
app.config.from_object(config[env])
|
||||||
|
|||||||
Binary file not shown.
@@ -4,6 +4,7 @@ import os
|
|||||||
import zipfile
|
import zipfile
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
|
import uuid
|
||||||
from flask import Blueprint, jsonify, request, session, send_file
|
from flask import Blueprint, jsonify, request, session, send_file
|
||||||
from werkzeug.utils import secure_filename
|
from werkzeug.utils import secure_filename
|
||||||
from src.services.tmdb_service import TMDBService
|
from src.services.tmdb_service import TMDBService
|
||||||
@@ -25,9 +26,7 @@ user_csvs = {}
|
|||||||
def get_poster_url(movie_name, movie_year):
|
def get_poster_url(movie_name, movie_year):
|
||||||
movie = tmdb_service.search_movie(movie_name, movie_year)
|
movie = tmdb_service.search_movie(movie_name, movie_year)
|
||||||
if movie:
|
if movie:
|
||||||
posters = tmdb_service.get_movie_posters(movie['id'])
|
return movie['poster_path']
|
||||||
if posters:
|
|
||||||
return posters[0]
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
@@ -106,6 +105,10 @@ def allowed_file(filename):
|
|||||||
def upload_csv():
|
def upload_csv():
|
||||||
user_id = session.get('user_id')
|
user_id = session.get('user_id')
|
||||||
|
|
||||||
|
if not user_id:
|
||||||
|
user_id = str(uuid.uuid4())
|
||||||
|
session['user_id'] = user_id
|
||||||
|
|
||||||
if 'file' not in request.files:
|
if 'file' not in request.files:
|
||||||
return jsonify({'error': 'No file part'}), 400
|
return jsonify({'error': 'No file part'}), 400
|
||||||
file = request.files['file']
|
file = request.files['file']
|
||||||
@@ -160,17 +163,74 @@ def delete_csv():
|
|||||||
return jsonify({'error': 'An error occurred while deleting the CSV file'}), 500
|
return jsonify({'error': 'An error occurred while deleting the CSV file'}), 500
|
||||||
|
|
||||||
|
|
||||||
|
@api_bp.route('/fetch-diary', methods=['POST'])
|
||||||
|
def fetch_diary_from_username():
|
||||||
|
"""
|
||||||
|
Récupère le diary via l'API publique (api.hugo-pierret.be), transforme en CSV et
|
||||||
|
le stocke dans user_csvs[user_id] pour que le front continue à utiliser le même flux que l'upload.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
data = request.get_json() or {}
|
||||||
|
username = data.get('username')
|
||||||
|
if not username:
|
||||||
|
return jsonify({'error': 'username required'}), 400
|
||||||
|
|
||||||
|
user_id = session.get('user_id')
|
||||||
|
if not user_id:
|
||||||
|
user_id = str(uuid.uuid4())
|
||||||
|
session['user_id'] = user_id
|
||||||
|
|
||||||
|
api_url = f"https://api.hugo-pierret.be/letterboxd/diary?username={username}"
|
||||||
|
resp = requests.get(api_url)
|
||||||
|
if resp.status_code != 200:
|
||||||
|
return jsonify({'error': 'Failed to fetch diary from upstream API'}), 502
|
||||||
|
|
||||||
|
payload = resp.json()
|
||||||
|
entries = payload.get('entries', [])
|
||||||
|
if not entries:
|
||||||
|
return jsonify({'error': 'No entries returned by upstream API'}), 404
|
||||||
|
|
||||||
|
rows = []
|
||||||
|
import re
|
||||||
|
for e in entries:
|
||||||
|
title = e.get('title') or ""
|
||||||
|
date = e.get('date') or ""
|
||||||
|
|
||||||
|
m = re.match(r"^(?P<name>.+?)\s*\((?P<year>\d{4})\)\s*$", title)
|
||||||
|
if m:
|
||||||
|
name = m.group('name').strip()
|
||||||
|
year = m.group('year')
|
||||||
|
else:
|
||||||
|
year_match = re.search(r"(\d{4})", title)
|
||||||
|
year = year_match.group(1) if year_match else ""
|
||||||
|
name = re.sub(r"\(\d{4}\)", "", title).strip()
|
||||||
|
|
||||||
|
rows.append({
|
||||||
|
"Watched Date": date,
|
||||||
|
"Name": name,
|
||||||
|
"Year": year
|
||||||
|
})
|
||||||
|
|
||||||
|
import pandas as pd, io
|
||||||
|
rows.reverse()
|
||||||
|
df = pd.DataFrame(rows)
|
||||||
|
csv_str = df.to_csv(index=False)
|
||||||
|
|
||||||
|
user_csvs[user_id] = csv_str
|
||||||
|
|
||||||
|
return jsonify({'success': True, 'message': 'Diary fetched and stored', 'total': len(rows)}), 200
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print("Error in fetch_diary_from_username:", str(e))
|
||||||
|
return jsonify({'error': 'An internal error occurred'}), 500
|
||||||
|
|
||||||
|
|
||||||
@api_bp.route('/download-posters', methods=['POST'])
|
@api_bp.route('/download-posters', methods=['POST'])
|
||||||
def download_posters():
|
def download_posters():
|
||||||
try:
|
try:
|
||||||
data = request.get_json()
|
data = request.get_json()
|
||||||
selected_posters = data.get('posters', [])
|
selected_posters = data.get('posters', [])
|
||||||
|
|
||||||
<<<<<<< HEAD
|
|
||||||
print(data)
|
|
||||||
|
|
||||||
=======
|
|
||||||
>>>>>>> 496f9e8f62940d1f3544da6e72b74be07e18bd25
|
|
||||||
if not selected_posters:
|
if not selected_posters:
|
||||||
return jsonify({'error': 'No posters selected'}), 400
|
return jsonify({'error': 'No posters selected'}), 400
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -24,7 +24,7 @@ class TMDBService:
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
def get_movie_posters(self, movie_id):
|
def get_movie_posters(self, movie_id):
|
||||||
url = f"{self.base_url}/movie/{movie_id}/images?include_image_language=en"
|
url = f"{self.base_url}/movie/{movie_id}/images?include_image_language=en,fr,null"
|
||||||
headers = {
|
headers = {
|
||||||
"accept": "application/json",
|
"accept": "application/json",
|
||||||
"Authorization": f"Bearer {self.access_token}"
|
"Authorization": f"Bearer {self.access_token}"
|
||||||
|
|||||||
Reference in New Issue
Block a user