Docfile commited on
Commit
446664e
·
verified ·
1 Parent(s): eceb012

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +204 -0
app.py ADDED
@@ -0,0 +1,204 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, render_template, request, jsonify
2
+ import google.generativeai as genai
3
+ import os
4
+ from PIL import Image
5
+ import tempfile
6
+
7
+ app = Flask(__name__)
8
+
9
+ # Configuration de l'API Gemini
10
+ token = os.environ.get("TOKEN")
11
+ genai.configure(api_key=token)
12
+
13
+ generation_config = {
14
+ "temperature": 1,
15
+ "max_output_tokens": 8192,
16
+ }
17
+
18
+ safety_settings = [
19
+ {"category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE"},
20
+ {"category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE"},
21
+ {"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "threshold": "BLOCK_NONE"},
22
+ {"category": "HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "BLOCK_NONE"},
23
+ ]
24
+
25
+
26
+ @app.route('/')
27
+ def generale():
28
+ return render_template("generale.html")
29
+
30
+
31
+
32
+
33
+ def upload_and_process_file(file_path):
34
+ """Upload et traite un fichier avec l'API Gemini avec gestion des erreurs améliorée"""
35
+ max_retries = 3
36
+ retry_delay = 2 # secondes
37
+
38
+ for attempt in range(max_retries):
39
+ try:
40
+ print(f"Tentative d'upload {attempt + 1}/{max_retries} pour {file_path}")
41
+
42
+ # Vérification du fichier
43
+ if not os.path.exists(file_path):
44
+ raise FileNotFoundError(f"Le fichier {file_path} n'existe pas")
45
+
46
+ file_size = os.path.getsize(file_path)
47
+ if file_size == 0:
48
+ raise ValueError(f"Le fichier {file_path} est vide")
49
+
50
+ # Upload du fichier
51
+ uploaded_file = genai.upload_file(path=file_path)
52
+ print(f"Upload réussi: {uploaded_file.uri}")
53
+
54
+ # Attente du traitement
55
+ timeout = 300 # 5 minutes
56
+ start_time = time.time()
57
+
58
+ while uploaded_file.state.name == "PROCESSING":
59
+ if time.time() - start_time > timeout:
60
+ raise TimeoutError("Timeout pendant le traitement du fichier")
61
+
62
+ print(f"En attente du traitement... Temps écoulé: {int(time.time() - start_time)}s")
63
+ time.sleep(10)
64
+ uploaded_file = genai.get_file(uploaded_file.name)
65
+
66
+ if uploaded_file.state.name == "FAILED":
67
+ raise ValueError(f"Échec du traitement: {uploaded_file.state.name}")
68
+
69
+ print(f"Traitement terminé avec succès: {uploaded_file.uri}")
70
+ return uploaded_file
71
+
72
+ except ssl.SSLError as e:
73
+ print(f"Erreur SSL lors de l'upload (tentative {attempt + 1}): {e}")
74
+ if attempt < max_retries - 1:
75
+ time.sleep(retry_delay * (attempt + 1))
76
+ else:
77
+ raise
78
+
79
+ except Exception as e:
80
+ print(f"Erreur lors de l'upload (tentative {attempt + 1}): {e}")
81
+ if attempt < max_retries - 1:
82
+ time.sleep(retry_delay * (attempt + 1))
83
+ else:
84
+ raise
85
+
86
+
87
+
88
+ def is_youtube_url(url):
89
+ """Vérifie si l'URL est une URL YouTube"""
90
+ parsed = urlparse(url)
91
+ return any(domain in parsed.netloc for domain in ['youtube.com', 'youtu.be'])
92
+
93
+ def download_youtube_video(url):
94
+ """Télécharge une vidéo YouTube avec gestion des erreurs améliorée"""
95
+ try:
96
+ with tempfile.TemporaryDirectory() as temp_dir:
97
+ ydl_opts = {
98
+ 'format': 'best[filesize<50M]', # Limite la taille du fichier
99
+ 'outtmpl': os.path.join(temp_dir, '%(title)s.%(ext)s'),
100
+ 'quiet': True,
101
+ 'no_warnings': True,
102
+ 'extract_flat': False
103
+ }
104
+
105
+ with yt_dlp.YoutubeDL(ydl_opts) as ydl:
106
+ print(f"Téléchargement de la vidéo: {url}")
107
+ info = ydl.extract_info(url, download=True)
108
+ video_path = os.path.join(temp_dir, ydl.prepare_filename(info))
109
+
110
+ if not os.path.exists(video_path):
111
+ raise FileNotFoundError(f"La vidéo n'a pas été téléchargée correctement: {video_path}")
112
+
113
+ # Copie vers un fichier temporaire permanent
114
+ temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=os.path.splitext(video_path)[1])
115
+ with open(video_path, 'rb') as f:
116
+ temp_file.write(f.read())
117
+
118
+ print(f"Vidéo téléchargée avec succès: {temp_file.name}")
119
+ return temp_file.name
120
+
121
+ except Exception as e:
122
+ print(f"Erreur lors du téléchargement de la vidéo: {e}")
123
+ return None
124
+
125
+ def telecharger_pdf(url):
126
+ """Télécharge un PDF et retourne le chemin du fichier"""
127
+ try:
128
+ response = requests.get(url)
129
+ response.raise_for_status()
130
+
131
+ with tempfile.NamedTemporaryFile(delete=False, suffix='.pdf') as temp_file:
132
+ temp_file.write(response.content)
133
+ return temp_file.name
134
+ except Exception as e:
135
+ print(f"Erreur lors du téléchargement du PDF : {e}")
136
+ return None
137
+
138
+ def allowed_file(filename):
139
+ """Vérifie si l'extension du fichier est autorisée"""
140
+ ALLOWED_EXTENSIONS = {'pdf', 'png', 'jpg', 'jpeg', 'gif', 'mp4', 'mov', 'avi'}
141
+ return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
142
+
143
+ @app.route('/submit', methods=['POST'])
144
+ def submit_question():
145
+ question = request.form.get('question')
146
+ urls = request.form.getlist('urls')
147
+ files = request.files.getlist('files')
148
+
149
+ print("URLs reçues:", urls)
150
+ content = [question]
151
+ temp_files = []
152
+
153
+ try:
154
+ # Traitement des fichiers uploadés
155
+ for file in files:
156
+ if file and allowed_file(file.filename):
157
+ with tempfile.NamedTemporaryFile(delete=False, suffix=os.path.splitext(file.filename)[1]) as temp_file:
158
+ file.save(temp_file.name)
159
+ temp_files.append(temp_file.name)
160
+ if file.filename.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')):
161
+ content.append(PIL.Image.open(temp_file.name))
162
+ else:
163
+ uploaded_file = upload_and_process_file(temp_file.name)
164
+ content.append(uploaded_file)
165
+
166
+ # Traitement des URLs
167
+ for url in urls:
168
+ print(f"Traitement de l'URL : {url}")
169
+ if is_youtube_url(url):
170
+ video_path = download_youtube_video(url)
171
+ if video_path:
172
+ temp_files.append(video_path)
173
+ uploaded_file = upload_and_process_file(video_path)
174
+ content.append(uploaded_file)
175
+ elif url.lower().endswith('.pdf'):
176
+ pdf_path = telecharger_pdf(url)
177
+ if pdf_path:
178
+ temp_files.append(pdf_path)
179
+ uploaded_file = upload_and_process_file(pdf_path)
180
+ content.append(uploaded_file)
181
+
182
+
183
+
184
+
185
+ # Génération de contenu avec Gemini
186
+ model = genai.GenerativeModel(
187
+ model_name="models/gemini-1.5-flash-002",
188
+ safety_settings=safety_settings,
189
+ system_instruction="Tu es un assistant intelligent. ton but est d'assister au mieux que tu peux. tu as été créé par Aenir et tu t'appelles Mariam."
190
+ )
191
+ response = model.generate_content(content, request_options={"timeout": 600})
192
+ return jsonify({"response": response.text})
193
+
194
+ except Exception as e:
195
+ return jsonify({"error": str(e)}), 500
196
+ finally:
197
+ # Nettoyage des fichiers temporaires
198
+ for temp_file in temp_files:
199
+ try:
200
+ os.unlink(temp_file)
201
+ except Exception as e:
202
+ print(f"Erreur lors de la suppression du fichier temporaire {temp_file}: {e}")
203
+
204
+