Skip to content

Commit 5b9a147

Browse files
committed
Implementar auto-refresco, corrección de ojos rojos, caché de caras y arreglar CI/CD
1 parent d37ec16 commit 5b9a147

File tree

5 files changed

+530
-137
lines changed

5 files changed

+530
-137
lines changed

.github/workflows/build.yml

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,6 @@ jobs:
125125
python-version: '3.11'
126126

127127
- name: Install system dependencies
128-
# AÑADIDO: libarchive-tools necesario para 'bsdtar' (error 127) en creación de paquetes pacman
129128
run: |
130129
sudo apt-get update
131130
sudo apt-get install -y build-essential cmake libopenblas-dev liblapack-dev \
@@ -147,7 +146,7 @@ jobs:
147146
pyinstaller --noconfirm \
148147
--onedir \
149148
--windowed \
150-
--name "visagevault" \
149+
--name "VisageVault" \
151150
--add-data "visagevault.png:." \
152151
--collect-data face_recognition_models \
153152
--collect-all rawpy \
@@ -164,19 +163,20 @@ jobs:
164163
mkdir -p AppDir/usr/share/applications
165164
mkdir -p AppDir/usr/share/icons/hicolor/256x256/apps
166165
167-
# CORRECCIÓN: Copiar TODO el contenido del directorio dist (libs + ejecutable)
168-
cp -r dist/visagevault/* AppDir/usr/bin/
166+
# COHERENCIA: Copiar carpeta generada con nombre "VisageVault"
167+
cp -r dist/VisageVault/* AppDir/usr/bin/
169168
170-
# Asegurar permisos
171-
chmod +x AppDir/usr/bin/visagevault
169+
# Asegurar permisos al binario principal "VisageVault"
170+
chmod +x AppDir/usr/bin/VisageVault
172171
173172
cp visagevault.png AppDir/usr/share/icons/hicolor/256x256/apps/visagevault.png
174173
174+
# COHERENCIA: El Exec apunta a "VisageVault" (Mayúsculas)
175175
cat << EOF > AppDir/usr/share/applications/visagevault.desktop
176176
[Desktop Entry]
177177
Name=VisageVault
178178
Comment=Gestor Inteligente de Fotos y Videos
179-
Exec=visagevault
179+
Exec=VisageVault
180180
Icon=visagevault
181181
Type=Application
182182
Categories=Graphics;Photography;
@@ -189,30 +189,32 @@ jobs:
189189
./linuxdeploy-x86_64.AppImage \
190190
--appdir AppDir \
191191
--desktop-file AppDir/usr/share/applications/visagevault.desktop \
192-
--executable AppDir/usr/bin/visagevault \
192+
--executable AppDir/usr/bin/VisageVault \
193193
--icon-file AppDir/usr/share/icons/hicolor/256x256/apps/visagevault.png \
194194
--output appimage
195195
196196
- name: Build DEB / RPM / PACMAN
197197
run: |
198198
VERSION_TAG=$(echo ${{ github.ref_name }} | sed 's/v//')
199199
200+
# COHERENCIA: Nombre del paquete "VisageVault"
201+
200202
# DEB
201-
fpm -s dir -t deb -n visagevault -v $VERSION_TAG \
203+
fpm -s dir -t deb -n VisageVault -v $VERSION_TAG \
202204
--architecture amd64 \
203205
--description "Gestor de Fotos y Videos Inteligente" \
204206
--maintainer "Daniel Serrano" \
205207
-C AppDir --prefix "/" .
206208
207209
# RPM
208-
fpm -s dir -t rpm -n visagevault -v $VERSION_TAG \
210+
fpm -s dir -t rpm -n VisageVault -v $VERSION_TAG \
209211
--architecture x86_64 \
210212
--description "Gestor de Fotos y Videos Inteligente" \
211213
--maintainer "Daniel Serrano" \
212214
-C AppDir --prefix "/" .
213215
214216
# PACMAN
215-
fpm -s dir -t pacman -n visagevault -v $VERSION_TAG \
217+
fpm -s dir -t pacman -n VisageVault -v $VERSION_TAG \
216218
--architecture x86_64 \
217219
--description "Gestor de Fotos y Videos Inteligente" \
218220
--maintainer "Daniel Serrano" \

README.md

Lines changed: 74 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1,153 +1,120 @@
1+
2+
3+
````markdown
14
<p align="center">
25
<img src="https://github.com/danitxu79/visagevault/raw/master/visagevault.png" alt="Logo de VisageVault">
36
</p>
47

8+
# 📸 VisageVault
59

6-
-----
7-
8-
# VisageVault - Gestor de Fotografías Inteligente
9-
10-
[](https://www.google.com/search?q=https://github.com/danitxu79/VisageVault)
11-
[](https://www.google.com/search?q=LICENSE)
10+
**VisageVault** es un gestor de fotografías y vídeos inteligente, local y privado. Organiza tu colección multimedia por fechas automáticamente y utiliza reconocimiento facial avanzado para agrupar a las personas, permitiéndote etiquetar y encontrar recuerdos rápidamente.
1211

13-
VisageVault es una aplicación de escritorio para macOS, Windows y Linux, diseñada para organizar y explorar grandes colecciones de fotos **y vídeos**. Su característica principal es el **reconocimiento facial** (en fotos), que permite escanear, agrupar y etiquetar personas automáticamente en tu biblioteca.
12+
---
1413

15-
## Características Principales
14+
## Novedades de la Versión 1.4
1615

17-
* **Escaneo de Directorios:** Analiza recursivamente tu carpeta de medios para encontrar todas las imágenes (`.jpg`, `.png`, etc.) **y vídeos** (`.mp4`, `.mkv`, `.mov`, etc.).
18-
* **Organización por Fecha:** Agrupa automáticamente las fotos y vídeos por Año y Mes, leyendo los metadatos EXIF o la fecha de archivo.
19-
* **Soporte de Vídeo Dedicado:** Una pestaña separada para navegar por tus vídeos, con generación de miniaturas (usando OpenCV) y reproducción mediante doble clic (abre el reproductor predeterminado del sistema).
20-
* **Soporte RAW:** **Visualización y reconocimiento facial en formatos RAW comunes (.NEF, .CR2, etc.)**.
21-
* **Detección de Caras (en Fotos):** Utiliza `face_recognition` para escanear cada foto y detectar todas las caras presentes.
22-
* **Agrupamiento (Clustering):** Compara todas las caras "Desconocidas" y las agrupa (usando `sklearn.cluster.DBSCAN`) para sugerir personas que son la misma.
23-
* **Etiquetado Sencillo:** Una interfaz dedicada para revisar las caras agrupadas y asignarles un nombre.
24-
* **Navegación por Persona:** Una vez etiquetadas, puedes ver todas las fotos en las que aparece una persona específica.
25-
* **Gestión de Metadatos:** Permite editar la fecha (Año/Mes) de las fotos si los metadatos son incorrectos, **guardando el cambio permanentemente en el archivo (EXIF/Fecha de Archivo)**.
26-
* **Gestión de Archivos:** **Menú contextual para Ocultar/Restaurar archivos de la vista o Eliminarlos permanentemente del disco.**
27-
* **Selección Mejorada:** **Soporte de selección de rango (Shift + Clic) y por arrastre (cuadro de selección).**
28-
* **Caché de Miniaturas:** Genera y almacena miniaturas para fotos y vídeos para una carga y navegación ultra rápidas.**
16+
Esta versión se centra en el rendimiento, la comodidad y la edición rápida:
2917

30-
-----
18+
* **🔄 Auto-Refresco (Watchdog):** La aplicación detecta automáticamente si añades, borras o modificas fotos en tu carpeta mientras está abierta y actualiza la galería al instante sin reiniciar.
19+
* **👁️ Corrección de Ojos Rojos:** Nueva herramienta en el menú contextual (clic derecho) para detectar y corregir ojos rojos en tus fotos automáticamente.
20+
* **⚡ Rendimiento en Personas:** Implementado un sistema de **caché de caras en disco**. La primera vez detecta las caras, pero las siguientes veces la carga de la pestaña "Personas" es instantánea, incluso con archivos RAW pesados.
21+
* **Soporte RAW Avanzado:** Visualización, carga de miniaturas y reconocimiento facial en archivos RAW comunes (.NEF, .CR2, .ARW, etc.) gracias a `rawpy`.
22+
* **Gestión de Metadatos Persistente:** Opción de **Cambiar Fecha (Mover)** que guarda el cambio en el archivo físico (EXIF para JPG, fecha de modificación para Vídeos/RAW).
23+
* **Gestión de Visibilidad:** Opción para **Ocultar/Restaurar** archivos de la vista principal y **Eliminar** archivos físicamente del disco.
24+
* **Selección Robusta:** Selección de rango con **Shift + Clic**, selección múltiple con **Ctrl + Clic**, y selección por arrastre.
3125

32-
## 🛠️ Requisitos
26+
---
3327

34-
Para ejecutar VisageVault desde el código fuente, necesitarás Python 3.11+ y varias dependencias del sistema.
28+
## 📜 Licencia
3529

36-
### 1\. Dependencias del Sistema
30+
Este proyecto se ofrece bajo un modelo de **Doble Licencia (Dual License)**:
3731

38-
Las librerías de Python necesitan compilar código C++ y acceder a códecs de vídeo.
32+
1. **LGPLv3:** Ideal para proyectos de código abierto. Si usas esta biblioteca (especialmente si la modificas), debes cumplir con las obligaciones de la LGPLv3.
33+
2. **Comercial (Privativa):** Si los términos de la LGPLv3 no se ajustan a tus necesidades (por ejemplo, para software propietario de código cerrado), por favor contacta al autor para adquirir una licencia comercial.
3934

40-
* **En Debian/Ubuntu:**
41-
```bash
42-
sudo apt install build-essential cmake libopenblas-dev liblapack-dev ffmpeg
43-
```
44-
* **En Arch/Manjaro:**
45-
```bash
46-
sudo pacman -S base-devel cmake openblas lapack ffmpeg
47-
```
48-
* **En Fedora:**
49-
```bash
50-
sudo dnf groupinstall "Development Tools"
51-
sudo dnf install cmake openblas-devel lapack-devel ffmpeg
52-
```
35+
Para más detalles, consulta el archivo `LICENSE` o la cabecera de `visagevault.py`.
5336

54-
### 2\. Dependencias de Python
37+
---
5538

56-
Todos los paquetes de Python necesarios están listados en `requirements.txt`. Los principales son:
39+
## 🛠️ Requisitos del Sistema
5740

58-
* `PySide6` (Para la interfaz gráfica Qt 6)
59-
* `face_recognition` (Para la detección de caras)
60-
* `scikit-learn` (Para el clustering de caras)
61-
* `Pillow` (Para el manejo de imágenes)
62-
* `piexif` **(Para leer y escribir metadatos EXIF, ahora usado para la persistencia)**
63-
* `rawpy` **(Nuevo - Para el soporte de archivos RAW)**
64-
* `opencv-python-headless` (¡Nuevo\! Para la generación de miniaturas de vídeo)**
41+
Para ejecutar VisageVault, necesitas **Python 3.11 o superior**.
6542

66-
-----
43+
### Dependencias de Sistema (Compilación)
44+
La librería `face_recognition` y `rawpy` requieren herramientas de compilación de C++ instaladas:
45+
* **Windows:** Visual Studio con "Desarrollo para el escritorio con C++".
46+
* **Linux:** `cmake`, `gcc`, `libarchive-tools` (para empaquetado).
47+
```bash
48+
sudo apt install build-essential cmake libopenblas-dev liblapack-dev ffmpeg libarchive-tools
49+
````
6750

68-
## 🚀 Instalación (desde código fuente)
51+
* **Mac:** Xcode command line tools.
6952

70-
1. **Clona el repositorio:**
53+
### Librerías Python
7154

72-
```bash
73-
git clone [https://github.com/danitxu79/VisageVault.git](https://github.com/danitxu79/VisageVault.git)
74-
cd VisageVault
75-
```
55+
Asegúrate de que tu `requirements.txt` esté actualizado. Las dependencias clave son:
7656

77-
2. **Instala las Dependencias del Sistema:**
57+
* `PySide6` (Interfaz gráfica)
58+
* `face_recognition` (IA Facial)
59+
* `scikit-learn` (Clustering de caras)
60+
* `watchdog` **(Nuevo - Monitorización de archivos)**
61+
* `rawpy` (Soporte RAW)
62+
* `opencv-python-headless` (Miniaturas de vídeo y Ojos Rojos)
63+
* `piexif` (Escritura EXIF)
64+
* `numpy`, `Pillow`
7865

79-
* Asegúrate de haber instalado las herramientas de compilación (`cmake`, `ffmpeg`, etc.) mencionadas en la sección "Requisitos".
66+
## 🚀 Instalación
8067

81-
3. **Crea un entorno virtual:**
68+
1. **Clonar el repositorio:**
8269

8370
```bash
84-
python3 -m venv venv
85-
source venv/bin/activate
71+
git clone [https://github.com/danitxu79/visagevault.git](https://github.com/danitxu79/visagevault.git)
72+
cd visagevault
8673
```
8774

88-
4. **Instala los requisitos de Python:**
89-
90-
* (Este paso puede tardar varios minutos, ya que compilará `dlib` y `numpy`).
75+
2. **Instalar dependencias:**
76+
Se recomienda usar un entorno virtual (`venv`).
9177

9278
```bash
9379
pip install -r requirements.txt
9480
```
9581

96-
-----
82+
3. **Ejecutar la aplicación:**
9783

98-
## 🏃 Ejecución
99-
100-
Una vez que todo esté instalado, puedes ejecutar la aplicación:
101-
102-
```bash
103-
# Activa el entorno virtual (si no lo has hecho)
104-
source venv/bin/activate
105-
106-
# Inicia la aplicación
107-
python visagevault.py
108-
````
109-
110-
La primera vez que la ejecutes, te pedirá que selecciones el directorio raíz que contiene tus fotos y vídeos.
84+
```bash
85+
python visagevault.py
86+
```
11187

11288
-----
11389

114-
## 📦 Compilación (AppImage para Linux)
90+
## 📖 Guía de Uso Rápida
11591

116-
Este repositorio incluye un script `compila.sh` que automatiza la creación de una AppImage autocontenida usando **PyInstaller** y **linuxdeploy**.
92+
### Navegación y Vistas
11793

118-
Este script maneja los pasos complejos de empaquetado, incluyendo las importaciones ocultas (`--hidden-import`) de `numpy`, `sklearn` y `scipy`.
94+
* **Árbol de Fechas:** Las secciones de **Años/Meses** muestran solo archivos visibles. La sección **Ocultas** muestra los archivos que has archivado y permite Restaurarlos o Eliminarlos.
95+
* **Auto-Refresco:** Si copias fotos nuevas a tu carpeta vigilada, aparecerán automáticamente en la aplicación tras unos segundos.
11996

120-
### Requisitos para la Compilación
97+
### Menú Contextual (Clic Derecho)
12198

122-
Además de los requisitos de ejecución, para compilar la AppImage necesitarás:
99+
Selecciona uno o varios elementos y haz clic derecho para acceder a las opciones:
123100

124-
1. **Herramientas de Qt6:** `linuxdeploy` las necesita para empaquetar los plugins de la plataforma Qt.
125-
* **En Arch/Manjaro:** `sudo pacman -S qt6-tools`
126-
* **En Debian/Ubuntu:** `sudo apt install qt6-base-dev`
127-
2. **Herramientas de AppImage:**
128-
```bash
129-
wget [https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage](https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage)
130-
chmod +x linuxdeploy-x86_64.AppImage
131-
```
132-
3. **pyenv (Recomendado):** El script está configurado para usar `pyenv local 3.11.9` para asegurar una compilación consistente.
101+
| Opción | Función |
102+
| :--- | :--- |
103+
| **Cambiar Fecha (Mover)** | Abre un diálogo para reasignar la fecha. Actualiza la BD y los metadatos del archivo físico. |
104+
| **Corregir Ojos Rojos** | Detecta y corrige automáticamente los ojos rojos en las fotos seleccionadas. |
105+
| **Ocultar de la vista** | Archiva los archivos en la sección "Ocultas" sin borrarlos del disco. |
106+
| **Restaurar a la galería** | Devuelve los archivos ocultos a la vista principal (Años/Meses). |
107+
| **Eliminar del disco** | Borra permanentemente los archivos del disco duro y de la base de datos. |
133108

134-
### Compilar
109+
### Controles de Miniaturas
135110

136-
Simplemente ejecuta el script de compilación:
111+
| Acción | Comando |
112+
| :--- | :--- |
113+
| **Zoom Miniaturas** | `Ctrl` + `Rueda Ratón` (o `Ctrl` + `+`/`-`) |
114+
| **Vista Previa Grande** | `Ctrl` + `Rueda Abajo` (sobre una foto/vídeo) |
115+
| **Selección Múltiple** | `Ctrl` + `Clic` |
116+
| **Selección de Rango** | `Shift` + `Clic` |
117+
| **Selección por Arrastre** | Clic izquierdo y arrastrar sobre el fondo gris |
137118

138-
```bash
139-
./compila.sh
140119
```
141-
142-
Si todo sale bien, encontrarás el archivo `VisageVault-x86_64.AppImage` listo para distribuir y ejecutar.
143-
144-
-----
145-
146-
## 📜 Licencia
147-
148-
Este proyecto se ofrece bajo un modelo de **Doble Licencia (Dual License)**:
149-
150-
1. **LGPLv3:** Ideal para proyectos de código abierto. Si usas esta biblioteca (especialmente si la modificas), debes cumplir con las obligaciones de la LGPLv3.
151-
2. **Comercial (Privativa):** Si los términos de la LGPLv3 no se ajustan a tus necesidades (por ejemplo, para software propietario de código cerrado), por favor contacta al autor para adquirir una licencia comercial.
152-
153-
Para más detalles, consulta el archivo `LICENSE` o la cabecera de `visagevault.py`.
120+
```

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ mypy
88
numpy
99
opencv-python-headless
1010
rawpy
11+
watchdog

thumbnail_generator.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,20 @@ def generate_image_thumbnail(original_filepath: str) -> str | None:
5656
raise Exception("No se pudo cargar la imagen con PIL ni rawpy.")
5757

5858
# --- Lógica original (ahora se aplica a la imagen cargada) ---
59-
img_to_process.thumbnail(THUMBNAIL_SIZE)
59+
if img_to_process.mode in ('RGBA', 'LA') or (img_to_process.mode == 'P' and 'transparency' in img_to_process.info):
60+
# Crear una nueva imagen de fondo blanco para pegar la transparente
61+
# (Esto evita que el fondo transparente se vea negro)
62+
background = Image.new('RGB', img_to_process.size, (255, 255, 255))
63+
64+
# Si tiene canal alfa, lo usamos como máscara para pegar
65+
if img_to_process.mode == 'P':
66+
img_to_process = img_to_process.convert('RGBA')
67+
68+
background.paste(img_to_process, mask=img_to_process.split()[3]) # 3 es el canal Alpha
69+
img_to_process = background
70+
elif img_to_process.mode != 'RGB':
71+
# Para otros modos simples sin transparencia, conversión directa
72+
img_to_process = img_to_process.convert('RGB')
6073
img_to_process.save(thumbnail_path, "JPEG")
6174
img_to_process.close() # Importante cerrar
6275

0 commit comments

Comments
 (0)