File size: 7,591 Bytes
bd7cf3a
91e78b3
 
bd7cf3a
 
 
 
91e78b3
bd7cf3a
 
 
91e78b3
bd7cf3a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
91e78b3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bd7cf3a
 
 
 
91e78b3
bd7cf3a
91e78b3
bd7cf3a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
91e78b3
 
bd7cf3a
 
91e78b3
bd7cf3a
 
 
 
 
 
 
 
 
 
 
 
 
3923041
bd7cf3a
 
 
 
 
3923041
bd7cf3a
 
 
 
 
 
 
 
 
 
 
91e78b3
1c19a65
 
bd7cf3a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a042c23
bd7cf3a
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
from flask import Flask, render_template, request, jsonify
import os
import tempfile
from PIL import Image
from google import genai
from google.genai import types
import uuid

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'static/uploads'
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024  # 16 MB max upload

# Ensure upload directory exists
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)

# Google Gemini API setup
def init_gemini():
    api_key = os.environ.get('GOOGLE_API_KEY')
    if not api_key:
        print("WARNING: GOOGLE_API_KEY environment variable not set")
        return None
    return genai.Client(api_key=api_key)

client = init_gemini()

# Prompts for analysis
ICONOGRAPHIC_PROMPT = """
je souhaite faire mon travail d'espagnol qui consiste 脿 de l'analyse de documents iconographique. j'aimerais que tu le phase en respectant scrupuleusement la m茅thodologie suivante. j'aimerais que tu fasses ce travail en espagnol en donnant 茅galement la traduction fran莽aise

Metodolog铆a del comentario de un documento iconogr谩fico

Un documento iconogr谩fico es un documento centrado en una imagen. Puede ser: una foto, un cuadro, una publicidad, un dibujo, un tebeo, una tira dibujada, una caricatura, etc. Su comentario respeta las etapas siguientes: la presentaci贸n, la descripci贸n, el an谩lisis y la conclusi贸n.

La presentaci贸n

Se trata de resaltar los elementos esenciales para identificar el documento:

El t铆tulo (si existe)

La naturaleza (si es una foto/dibujo/cuadro, en color o blanco y negro)

El autor (el fot贸grafo/el dibujante/el publicista...)

La fuente (si existe)

El tema evocado

La descripci贸n

Se trata de decir lo que vemos.

Dominar el vocabulario relativo a la imagen.

Dominar el vocabulario de la situaci贸n en el espacio (arriba, abajo, delante, detr谩s, etc.)

Conocer la organizaci贸n interna de la descripci贸n.

驴Qu茅 debemos hacer concretamente?

Determinar el n煤mero de planos o t茅rminos.

(Ej: La imagen tiene dos planos/tres planos/un plan 煤nico)

Hacer la descripci贸n plano por plano y acabar antes de pasar al siguiente si hay m谩s de un plano.

Ej: en el primer plano vemos...

Ordenar la descripci贸n de cada plano ( a la derecha, a la izquierda, arriba, abajo, delante, detr谩s, en el centro, a lo lejos...

驴Qu茅 se debe describir?

Los protagonistas (los personajes):

Los protagonistas

Sexo, edad (hombre o mujer, joven o adulto)

Las posturas (de pie, sentado, arrodillado, etc.)

Los vestidos (ropas)

Los rasgos f铆sicos (color de pelo, gordo, flaco, etc.)

Los rasgos sicol贸gicos (triste, optimista, activo, pasivo, etc.)

Las actitudes (est谩 riendo, triste, llorando, contento, etc.)

Las acciones (lo que est谩n haciendo)

Los objetos alrededor, los colores (fr铆os o c谩lidos), los contrastes...

El an谩lisis

Interpretamos y comentamos los elementos de la descripci贸n para comprender el mensaje del autor.

La interpretaci贸n debe apoyarse en la descripci贸n porque no se trata de un comentario libre.

Empleamos f贸rmulas subjetivas porque expresamos hip贸tesis e impresiones.

Ej: Cuando examinamos...podemos decir que.../ la postura de..., los vestidos...nos permiten imaginar que.../ lo que nos llama la atenci贸n es... porque/ los colores c谩lidos sugieren que...

La conclusi贸n

Se trata de hacer un balance (resumen) de lo dicho de dar una impresi贸n personal. As铆:

Anunciamos la conclusi贸n: para concluir/ en suma/en conclusi贸n... podemos decir que...

Precisamos el medio de expresi贸n utilizado: a trav茅s de esta foto/mediante este dibujo...

Anunciamos la intenci贸n del autor: el dibujante quiere denunciar/ el fot贸grafo pretende criticar/ el pintor quiere relevar, sensibilizar, mostrar.

Dar la impresi贸n personal: esta foto (no) me parece interesante/escandaloso/pertinente.

Justificamos nuestra impresi贸n: porque revela una realidad social/pol铆tica/cultural...

Un modelo: a trav茅s de este cuadro, el pintor quiere denunciar las injusticias sociales en 脕frica. El cuadro me parece interesante porque releva un fen贸meno social recurrente que incita las autoridades a la responsabilidad. La propia imagen ilustra muy bien el tema de las injusticias entre ricos y ricos...
"""

TEXT_PROMPT = """
Je souhaite faire une analyse de texte en espagnol en respectant scrupuleusement la m茅thodologie suivante. J'aimerais que tu fasses ce travail en espagnol en donnant 茅galement la traduction fran莽aise.

Metodolog铆a del comentario de texto en espa帽ol:

1. Presentaci贸n del documento
   - Autor y contexto hist贸rico
   - Naturaleza del texto (literario, period铆stico, discurso, etc.)
   - Tema principal

2. An谩lisis de la estructura
   - Divisi贸n en partes l贸gicas
   - Identificaci贸n de la organizaci贸n de las ideas

3. An谩lisis del contenido
   - Ideas principales y secundarias
   - Intenci贸n del autor
   - Recursos ling眉铆sticos utilizados
   - Vocabulario y campo sem谩ntico

4. Conclusi贸n
   - S铆ntesis del an谩lisis
   - Aportaci贸n personal
   - Relevancia del texto en su contexto

Por favor, analiza este texto seg煤n la metodolog铆a indicada, proporcionando el an谩lisis completo en espa帽ol y su traducci贸n al franc茅s.
"""

def generate_response(file_path, file_type):
    """Generate response using Gemini API based on file type"""
    try:
        if not client:
            return "Error: Google API key not configured properly."
        
        if file_type == 'image':
            image_data = Image.open(file_path)
            response = client.models.generate_content(
                model="gemini-2.5-flash-preview-04-17",
                contents=[image_data, ICONOGRAPHIC_PROMPT],
                config=types.GenerateContentConfig(
                    thinking_config=types.ThinkingConfig(
                        thinking_budget=8000
                    )
                ),
            )
            return response.candidates[0].content.parts[0].text.strip()
        
        elif file_type == 'text':
            with open(file_path, 'r', encoding='utf-8') as f:
                text_content = f.read()
            
            response = client.models.generate_content(
                model="gemini-2.5-flash-preview-04-17",
                contents=[text_content, TEXT_PROMPT],
                config=types.GenerateContentConfig(
                    thinking_config=types.ThinkingConfig(
                        thinking_budget=8000
                    )
                ),
            )
            return response.candidates[0].content.parts[0].text.strip()
        
    except Exception as e:
        print(f"Error generating response: ")
        return f"Error durante el an谩lisis: "

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/upload', methods=['POST'])
def upload_file():
    if 'file' not in request.files:
        return jsonify({'error': 'No file part'}), 400
    
    file = request.files['file']
    file_type = request.form.get('fileType', 'image')
    
    if file.filename == '':
        return jsonify({'error': 'No selected file'}), 400
    
    if file:
        # Generate a unique filename
        filename = f"{uuid.uuid4()}_{file.filename}"
        file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
        file.save(file_path)
        
        # Generate analysis
        analysis = generate_response(file_path, file_type)
        
        return jsonify({
            'success': True,
            'file_url': f"/static/uploads/{filename}",
            'analysis': analysis
        })

if __name__ == '__main__':
    app.run(debug=True)