#!/usr/bin/env python3
"""
Genera una galeria navegable en HTML puro - sin CSS, sin JavaScript.
Una pagina HTML por imagen, con links anterior / siguiente / indice.
Funciona en cualquier navegador incluyendo lynx, w3m, links.
Uso:
python3 generar_galeria.py /ruta/carpeta/fotos
"""
import sys
from pathlib import Path
EXT_OK = {".jpg", ".jpeg", ".png", ".gif", ".webp", ".avif", ".bmp"}
def main():
if len(sys.argv) < 2:
print("Uso: python3 generar_galeria.py <carpeta>")
sys.exit(1)
carpeta = Path(sys.argv[1]).resolve()
if not carpeta.exists():
print("No existe: " + str(carpeta))
sys.exit(1)
fotos = sorted(
p for p in carpeta.iterdir()
if p.suffix.lower() in EXT_OK
and not p.name.startswith("thumb-")
and not p.name.startswith("thumb_")
)
if not fotos:
print("No hay imagenes en " + str(carpeta))
sys.exit(1)
n = len(fotos)
print("Imagenes encontradas: " + str(n))
salida = carpeta / "galeria"
salida.mkdir(exist_ok=True)
paginas = [foto.name + ".html" for foto in fotos]
# Una pagina por imagen
for i, foto in enumerate(fotos):
num = i + 1
prev_link = paginas[i - 1] if i > 0 else paginas[-1]
next_link = paginas[i + 1] if i < n - 1 else paginas[0]
prev_nom = fotos[i - 1].name if i > 0 else fotos[-1].name
next_nom = fotos[i + 1].name if i < n - 1 else fotos[0].name
ruta_img = "../" + foto.name
L = []
L.append("<!DOCTYPE html>")
L.append("<html>")
L.append("<head><meta charset='UTF-8'>")
L.append("<title>" + foto.name + " (" + str(num) + "/" + str(n) + ")</title>")
L.append("</head>")
L.append("<body>")
L.append("<p>")
L.append(" <a href='index.html'>[indice]</a>")
L.append(" ")
L.append(" <a href='" + prev_link + "'>< anterior</a>")
L.append(" ")
L.append(" " + str(num) + " / " + str(n))
L.append(" ")
L.append(" <a href='" + next_link + "'>siguiente ></a>")
L.append("</p>")
L.append("<hr>")
L.append("<p><b>" + foto.name + "</b></p>")
L.append("<p><img src='" + ruta_img + "' alt='" + foto.name + "' width='100%'></p>")
L.append("<hr>")
L.append("<p>")
L.append(" <a href='index.html'>[indice]</a>")
L.append(" ")
L.append(" <a href='" + prev_link + "'>< " + prev_nom + "</a>")
L.append(" ")
L.append(" <a href='" + next_link + "'>" + next_nom + " ></a>")
L.append("</p>")
L.append("</body>")
L.append("</html>")
(salida / paginas[i]).write_text("\n".join(L), encoding="utf-8")
# Indice: primera imagen arriba, luego lista completa
I = []
I.append("<!DOCTYPE html>")
I.append("<html>")
I.append("<head><meta charset='UTF-8'><title>Indice (" + str(n) + " fotos)</title></head>")
I.append("<body>")
I.append("<h1>Indice - " + str(n) + " fotos</h1>")
I.append("<p><a href='" + paginas[0] + "'>")
I.append(" <img src='../" + fotos[0].name + "' alt='" + fotos[0].name + "' width='100%'>")
I.append("</a></p>")
I.append("<p><a href='" + paginas[0] + "'>Ver galeria ></a></p>")
I.append("<hr>")
I.append("<ol>")
for i, foto in enumerate(fotos):
I.append(" <li><a href='" + paginas[i] + "'>" + foto.name + "</a></li>")
I.append("</ol>")
I.append("</body>")
I.append("</html>")
(salida / "index.html").write_text("\n".join(I), encoding="utf-8")
print("Galeria generada en: " + str(salida))
print("Punto de entrada: " + str(salida / "index.html"))
if __name__ == "__main__":
main()