Use local storage for csv
This commit is contained in:
BIN
__pycache__/config.cpython-312.pyc
Normal file
BIN
__pycache__/config.cpython-312.pyc
Normal file
Binary file not shown.
25
config.py
Normal file
25
config.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
|
class Config:
|
||||||
|
# Configuration générale
|
||||||
|
SECRET_KEY = os.environ.get('SECRET_KEY', 'dev_key')
|
||||||
|
DEBUG = False
|
||||||
|
TESTING = False
|
||||||
|
REDIS_URL = os.environ.get("REDIS_URL", "redis://localhost:6379")
|
||||||
|
|
||||||
|
class DevelopmentConfig(Config):
|
||||||
|
DEBUG = True
|
||||||
|
# Configuration pour le développement local
|
||||||
|
REDIS_URL = "redis://localhost:6379"
|
||||||
|
|
||||||
|
class ProductionConfig(Config):
|
||||||
|
# Configuration pour la production (Render, etc.)
|
||||||
|
REDIS_URL = os.environ.get("REDIS_URL")
|
||||||
|
# Peut désactiver le debug mode pour la prod
|
||||||
|
DEBUG = False
|
||||||
|
|
||||||
|
config = {
|
||||||
|
'development': DevelopmentConfig,
|
||||||
|
'production': ProductionConfig,
|
||||||
|
'default': DevelopmentConfig
|
||||||
|
}
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
Watched Date,Name,Year,Letterboxd URI,Rating,Rewatch,Tags,Watched Date
|
|
||||||
2023-12-15,Ghost in the Shell,1995,https://boxd.it/5k8vT3,3.5,,,2023-12-13
|
|
||||||
2024-01-03,Baby Driver,2017,https://boxd.it/5tDbaP,4.0,,,2024-01-02
|
|
||||||
2024-01-04,The Shawshank Redemption,1994,https://boxd.it/5ugTgP,4.5,,,2024-01-03
|
|
||||||
2024-01-05,Léon: The Professional,1994,https://boxd.it/5uRr6B,4.0,,,2024-01-04
|
|
||||||
2024-01-06,Brothers,2009,https://boxd.it/5vuRQN,3.5,,,2024-01-05
|
|
||||||
2024-01-07,"Crazy, Stupid, Love.",2011,https://boxd.it/5wgeFn,4.0,,,2024-01-06
|
|
||||||
2024-01-08,There Will Be Blood,2007,https://boxd.it/5x4B37,4.5,,,2024-01-07
|
|
||||||
2024-01-09,(500) Days of Summer,2009,https://boxd.it/5xDHe1,4.0,,,2024-01-08
|
|
||||||
2024-01-20,Dallas Buyers Club,2013,https://boxd.it/5DrLPb,4.0,,,2024-01-19
|
|
||||||
2024-01-22,Boogie Nights,1997,https://boxd.it/5EEjCN,4.0,,,2024-01-21
|
|
||||||
2024-01-24,Saltburn,2023,https://boxd.it/5FxIYT,4.0,,,2024-01-23
|
|
||||||
2024-01-25,Under the Skin,2013,https://boxd.it/5G0SG9,2.5,,,2024-01-24
|
|
||||||
2024-01-26,Anatomy of a Fall,2023,https://boxd.it/5GuroR,4.0,,,2024-01-25
|
|
||||||
2024-01-31,Poor Things,2023,https://boxd.it/5J4AI7,4.5,,,2024-01-30
|
|
||||||
2024-02-01,In the Mood for Love,2000,https://boxd.it/5JweK7,4.5,,,2024-01-31
|
|
||||||
2024-02-07,Black Swan,2010,https://boxd.it/5MhygD,4.0,,,2024-02-06
|
|
||||||
2024-02-13,Rain Man,1988,https://boxd.it/5OXE5j,4.0,,,2024-02-12
|
|
||||||
2024-02-20,The 40 Year Old Virgin,2005,https://boxd.it/5Sgvxj,3.5,,,2024-02-19
|
|
||||||
2024-02-21,Captain Fantastic,2016,https://boxd.it/5SHgol,4.0,,,2024-02-20
|
|
||||||
2024-02-23,The Prestige,2006,https://boxd.it/5TwaTp,4.5,,,2024-02-22
|
|
||||||
2024-02-29,The Shining,1980,https://boxd.it/5WgsV9,4.0,,,2024-02-28
|
|
||||||
2024-03-02,Dune: Part Two,2024,https://boxd.it/5X4Ep5,5.0,,,2024-03-01
|
|
||||||
2024-03-12,Fantastic Mr. Fox,2009,https://boxd.it/622Xk5,4.5,,,2024-03-11
|
|
||||||
2024-03-13,Past Lives,2023,https://boxd.it/62uP1F,4.5,,,2024-03-12
|
|
||||||
2024-03-19,Little Women,2019,https://boxd.it/65jkNX,3.0,,,2024-03-18
|
|
||||||
2024-03-21,The Perks of Being a Wallflower,2012,https://boxd.it/668ca1,4.0,,,2024-03-20
|
|
||||||
2024-03-28,Amélie,2001,https://boxd.it/69lEoN,4.5,,,2024-03-27
|
|
||||||
2024-03-29,Lost in Translation,2003,https://boxd.it/69Kn1n,4.0,,,2024-03-28
|
|
||||||
2024-04-03,No Country for Old Men,2007,https://boxd.it/6clZZd,4.0,,,2024-04-02
|
|
||||||
2024-04-05,Fargo,1996,https://boxd.it/6dadIv,3.5,,,2024-04-04
|
|
||||||
2024-04-09,No Hard Feelings,2023,https://boxd.it/6f0cwL,2.5,,,2024-04-08
|
|
||||||
2024-04-17,"OSS 117: Cairo, Nest of Spies",2006,https://boxd.it/6i7AOl,4.0,,,2024-04-16
|
|
||||||
2024-04-20,The Neon Demon,2016,https://boxd.it/6j9IF5,3.0,,,2024-04-19
|
|
||||||
2024-04-23,Taxi Driver,1976,https://boxd.it/6ktjeR,3.5,,,2024-04-22
|
|
||||||
2024-04-30,The Theory of Everything,2014,https://boxd.it/6nlzHL,4.5,,,2024-04-29
|
|
||||||
2024-05-09,Civil War,2024,https://boxd.it/6rbidl,4.5,,,2024-05-08
|
|
||||||
2024-05-10,Scott Pilgrim vs. the World,2010,https://boxd.it/6rxEAl,4.0,,,2024-05-09
|
|
||||||
2024-05-15,Asteroid City,2023,https://boxd.it/6txkqD,3.5,,,2024-05-14
|
|
||||||
2024-05-22,Battle of the Sexes,2017,https://boxd.it/6wiCsp,3.5,,,2024-05-22
|
|
||||||
2024-05-26,War Dogs,2016,https://boxd.it/6xS8YB,3.5,,,2024-05-25
|
|
||||||
2024-05-28,The Creator,2023,https://boxd.it/6yPVwT,4.5,,,2024-05-27
|
|
||||||
2024-05-30,Full Metal Jacket,1987,https://boxd.it/6zEwVV,4.0,,,2024-05-29
|
|
||||||
2024-06-04,Dead Poets Society,1989,https://boxd.it/6BNjNv,3.5,,,2024-06-03
|
|
||||||
2024-06-05,Perfect Days,2023,https://boxd.it/6C9zSb,4.0,,,2024-06-04
|
|
||||||
2024-06-07,Burn After Reading,2008,https://boxd.it/6CQVG3,3.0,,,2024-06-06
|
|
||||||
2024-06-12,Before Sunrise,1995,https://boxd.it/6EWJMD,4.0,,,2024-06-11
|
|
||||||
2024-06-20,OSS 117: Lost in Rio,2009,https://boxd.it/6I1d3j,3.5,,,2024-06-19
|
|
||||||
2024-06-23,Inside Out 2,2024,https://boxd.it/6J9mU7,4.0,,,2024-06-22
|
|
||||||
2024-06-26,May December,2023,https://boxd.it/6KqGP5,2.5,,,2024-06-25
|
|
||||||
2024-06-29,Ferrari,2023,https://boxd.it/6Lv8pV,3.0,,,2024-06-28
|
|
||||||
2024-06-30,Sicario,2015,https://boxd.it/6LUq2b,4.0,,,2024-06-29
|
|
||||||
2024-07-21,Gladiator,2000,https://boxd.it/6Vcoij,4.5,,,2024-07-20
|
|
||||||
2024-07-22,Perfect Blue,1997,https://boxd.it/6VIhi1,4.0,,,2024-07-21
|
|
||||||
2024-07-23,Paprika,2006,https://boxd.it/6WcVWb,4.5,,,2024-07-22
|
|
||||||
2024-07-24,Dream Scenario,2023,https://boxd.it/6WCG0t,4.0,,,2024-07-23
|
|
||||||
2024-07-29,Yes Man,2008,https://boxd.it/6ZbFWJ,3.0,,,2024-07-29
|
|
||||||
2024-07-30,Deadpool & Wolverine,2024,https://boxd.it/6Zo8Sb,3.5,,,2024-07-29
|
|
||||||
2024-07-31,Source Code,2011,https://boxd.it/6ZPH0H,3.5,,,2024-07-30
|
|
||||||
2024-08-04,Almost Famous,2000,https://boxd.it/71w9tb,4.0,,,2024-08-03
|
|
||||||
2024-08-05,The Master,2012,https://boxd.it/72e6pN,3.0,,,2024-08-05
|
|
||||||
2024-08-10,Millennium Actress,2001,https://boxd.it/747e7V,4.0,,,2024-08-10
|
|
||||||
2024-08-14,The King of Comedy,1982,https://boxd.it/75VeGl,4.5,,,2024-08-13
|
|
||||||
2024-08-15,American Fiction,2023,https://boxd.it/76lZ2J,4.0,,,2024-08-14
|
|
||||||
2024-08-18,The Diary of a Teenage Girl,2015,https://boxd.it/77HSDB,3.5,,,2024-08-17
|
|
||||||
2024-08-20,Punch-Drunk Love,2002,https://boxd.it/78Mk2P,4.0,,,2024-08-19
|
|
||||||
|
5
main.py
5
main.py
@@ -3,12 +3,15 @@ from flask import Flask
|
|||||||
from flask_cors import CORS
|
from flask_cors import CORS
|
||||||
from src.api.routes import api_bp
|
from src.api.routes import api_bp
|
||||||
from flask_sse import sse
|
from flask_sse import sse
|
||||||
|
from config import config
|
||||||
|
|
||||||
def create_app():
|
def create_app():
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
CORS(app)
|
CORS(app)
|
||||||
|
|
||||||
app.config["REDIS_URL"] = "redis://localhost:6379"
|
env = os.environ.get('FLASK_ENV', 'default')
|
||||||
|
app.config.from_object(config[env])
|
||||||
|
|
||||||
app.register_blueprint(sse, url_prefix='/stream')
|
app.register_blueprint(sse, url_prefix='/stream')
|
||||||
app.register_blueprint(api_bp, url_prefix='/api')
|
app.register_blueprint(api_bp, url_prefix='/api')
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -1,6 +1,7 @@
|
|||||||
|
import io
|
||||||
import math
|
import math
|
||||||
import os
|
import os
|
||||||
from flask import Blueprint, jsonify, request
|
from flask import Blueprint, jsonify, request, session
|
||||||
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
|
||||||
from src.services.image_service import ImageService
|
from src.services.image_service import ImageService
|
||||||
@@ -12,10 +13,9 @@ api_bp = Blueprint('api', __name__)
|
|||||||
tmdb_service = TMDBService()
|
tmdb_service = TMDBService()
|
||||||
image_service = ImageService()
|
image_service = ImageService()
|
||||||
|
|
||||||
UPLOAD_FOLDER = './data'
|
|
||||||
ALLOWED_EXTENSIONS = {'csv'}
|
ALLOWED_EXTENSIONS = {'csv'}
|
||||||
|
|
||||||
csv_file = os.path.join(UPLOAD_FOLDER, 'diary.csv')
|
user_csvs = {}
|
||||||
|
|
||||||
@lru_cache(maxsize=1000)
|
@lru_cache(maxsize=1000)
|
||||||
def get_poster_url(movie_name, movie_year):
|
def get_poster_url(movie_name, movie_year):
|
||||||
@@ -28,17 +28,26 @@ def get_poster_url(movie_name, movie_year):
|
|||||||
|
|
||||||
@api_bp.route('/movies', methods=['GET'])
|
@api_bp.route('/movies', methods=['GET'])
|
||||||
def get_movies():
|
def get_movies():
|
||||||
try:
|
user_id = session.get('user_id') # Récupérer l'ID de l'utilisateur de la session
|
||||||
if not os.path.exists(csv_file):
|
|
||||||
|
if user_id not in user_csvs:
|
||||||
return jsonify({'movies': [], 'message': 'No movies found. Please upload a CSV file.'}), 200
|
return jsonify({'movies': [], 'message': 'No movies found. Please upload a CSV file.'}), 200
|
||||||
|
|
||||||
|
# Lire le DataFrame à partir du cache
|
||||||
|
csv_content = user_csvs[user_id]
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Si csv_content est une chaîne, il n'est pas nécessaire de décoder
|
||||||
|
if isinstance(csv_content, bytes):
|
||||||
|
df = pd.read_csv(io.StringIO(csv_content.decode('utf-8')))
|
||||||
|
else:
|
||||||
|
df = pd.read_csv(io.StringIO(csv_content))
|
||||||
|
|
||||||
|
# Reste de votre code pour la pagination et le traitement...
|
||||||
page = int(request.args.get('page', 1))
|
page = int(request.args.get('page', 1))
|
||||||
limit = int(request.args.get('limit', 10))
|
limit = int(request.args.get('limit', 10))
|
||||||
|
|
||||||
df = pd.read_csv(csv_file)
|
|
||||||
|
|
||||||
df = df.iloc[::-1].reset_index(drop=True)
|
df = df.iloc[::-1].reset_index(drop=True)
|
||||||
|
|
||||||
total_movies = len(df)
|
total_movies = len(df)
|
||||||
total_pages = math.ceil(total_movies / limit)
|
total_pages = math.ceil(total_movies / limit)
|
||||||
|
|
||||||
@@ -88,25 +97,26 @@ def allowed_file(filename):
|
|||||||
|
|
||||||
@api_bp.route('/upload-csv', methods=['POST'])
|
@api_bp.route('/upload-csv', methods=['POST'])
|
||||||
def upload_csv():
|
def upload_csv():
|
||||||
|
user_id = session.get('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']
|
||||||
if file.filename == '':
|
if file.filename == '':
|
||||||
return jsonify({'error': 'No selected file'}), 400
|
return jsonify({'error': 'No selected file'}), 400
|
||||||
if file and allowed_file(file.filename):
|
if file and allowed_file(file.filename):
|
||||||
filename = secure_filename(file.filename)
|
content = file.read()
|
||||||
file_path = os.path.join(UPLOAD_FOLDER, filename)
|
user_csvs[user_id] = content
|
||||||
file.save(file_path)
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
df = pd.read_csv(file_path)
|
df = pd.read_csv(io.StringIO(content.decode('utf-8')))
|
||||||
df = df.rename(columns={
|
df = df.rename(columns={
|
||||||
'Date': 'Watched Date',
|
'Date': 'Watched Date',
|
||||||
'Name': 'Name',
|
'Name': 'Name',
|
||||||
'Year': 'Year'
|
'Year': 'Year'
|
||||||
})
|
})
|
||||||
|
|
||||||
df.to_csv(csv_file, index=False)
|
user_csvs[user_id] = df.to_csv(index=False)
|
||||||
|
|
||||||
return jsonify({'success': True, 'message': 'File uploaded and processed successfully'}), 200
|
return jsonify({'success': True, 'message': 'File uploaded and processed successfully'}), 200
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -115,8 +125,10 @@ def upload_csv():
|
|||||||
|
|
||||||
@api_bp.route('/check-csv', methods=['GET'])
|
@api_bp.route('/check-csv', methods=['GET'])
|
||||||
def check_csv():
|
def check_csv():
|
||||||
|
user_id = session.get('user_id')
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if os.path.exists(csv_file):
|
if user_id in user_csvs:
|
||||||
return jsonify({'fileExists': True}), 200
|
return jsonify({'fileExists': True}), 200
|
||||||
else:
|
else:
|
||||||
return jsonify({'fileExists': False}), 200
|
return jsonify({'fileExists': False}), 200
|
||||||
@@ -126,9 +138,11 @@ def check_csv():
|
|||||||
|
|
||||||
@api_bp.route('/delete-csv', methods=['DELETE'])
|
@api_bp.route('/delete-csv', methods=['DELETE'])
|
||||||
def delete_csv():
|
def delete_csv():
|
||||||
|
user_id = session.get('user_id')
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if os.path.exists(csv_file):
|
if user_id in user_csvs:
|
||||||
os.remove(csv_file)
|
del user_csvs[user_id]
|
||||||
return jsonify({'success': True, 'message': 'CSV file deleted successfully'}), 200
|
return jsonify({'success': True, 'message': 'CSV file deleted successfully'}), 200
|
||||||
else:
|
else:
|
||||||
return jsonify({'error': 'CSV file not found'}), 404
|
return jsonify({'error': 'CSV file not found'}), 404
|
||||||
|
|||||||
Reference in New Issue
Block a user