Un script python para generar automaticamente paginas web por cada video a compartir a través de un Servidor Web

Vamos a desarrollar un pequeño Script en Python para generar archivos HTML para reproducir videos familiares o personales, de su computadora personal y poderlo ver a través de un navegador web. Es para uso familiar o personal, ya que un servidor en producción y comercial, requiere complejos mecanismos de seguridad y de desarrollo que escapan de esta pequeña publicación.

Nos olvidaremos de PHP, Django Python, Base de Datos, etc, etc. Son muy necesarios, y eficientes, pero para pequeños negocios, servicios o requerimientos, puede contemplar esta alternativa que requieren menos recursos para servir páginas web estáticas HTML.

El Script en Python nos generará un número de archivos equivalente al número de videos que tenga para compartir con su familia, amistades, etc, pudiendo ser 100, mil, o diez mil. 

No se preocupe del tamaño de archivos. Para que tenga una idea, cada archivo HTML generado va tener apenas 1k en promedio. Considerando eso, en mil videos tendria 1,000 k, lo que es menor a 1Mb. Una cantidad irrisoria para su computadora, y mejor aun, al ser páginas HTML  generan un bajo consumo de procesador y Memoria RAM.

Tampoco se preocupe de que si el Script pueda tener agujeros de seguridad, que lo hagan vulnerable, ya que, lo va usar internamente, va procesar y listo. No va colocar el Script de manera pública a través de su Servidor Web. Lo único que va hacer público son las páginas HTML generadas, con lo cual no hay ningún riesgo. 

Para esto se requiere:

  • Tener abierto el puerto 80 en su router y dirigido hacia la IP local de la computadora donde están alojadas los videos y también abrir el puerto 80 en el cortafuegos de dicha computadora.
  • Tener instalado Python. En GNU Linux, Python viene por defecto, así que, requisito cumplido.
  • Tener instalado un Servidor Web en la computadora donde están alojados los videos que desea compartir por streaming, pudiendo ser, Apache, NGINX, Lighttpd, etc. Le sugiero, NGINX o Lighttpd, por ser ligeros, ideales para páginas estáticas HTML.
  • Configurar un "alias", en el servidor web, para poder acceder a través de ese alias al directorio con los videos a compartir; o si gusta, puede acceder a la carpeta de videos directamente, es decir, configurando el Virtualhost para que la ruta de la carpeta de videos sea Server Root. Ejemplo: si tiene un subdominio gratuito o propio de la forma: misubdominio.demidominiopersonal.extensionquepuedeser.org.com.o.loquea configure ese Virtualhost para que su Server Root sea el directorio raíz donde están los videos a compartir, por ejemplo, /home/elnombredesusuario/videos/. De esta manera, cuando acceda desde cualquier lugar a http:/susubdominio o dominio/ ingresará directamente al directorio de videos, y a través del Servidor Web, el sistema buscará un archivo index.html.
  • Configurar el subdominio o dominio gratuitos o de pago con su IP Pública. Tenga presente que las conexiones de un usuario normal tienen IP Pública dinámica, es decir, cambian con el tiempo, por tanto debe actualizar y comunicar la IP actual al dominio o subdominio.
  • Tus videos deben estar en formato .mp4 o .webm, y si tuvieran subtítulos deben ser del tipo .vtt para que pueda ser visualizado en la página web HTML.
  • Un archivo .csv que registra las rutas, nombres de archivos y otros datos para que el Script Python pueda generar los archivos o páginas web HTML y ver los videos.


Consideraré que ya tiene instalado su Servidor Web, con su dominio o subdominio, debidamente configurado con el VirtualHost y "alias" respectivo.

Para el archivo .csv, simplemente abra una Hoja de Cálculo, que puede ser LibreOffice, Gnumeric, y rellene datos, similar a la figura siguiente:

 

CSV a partir de una Hoja de Cálculo

La ventaja de éste método, es que, usted puede establecer a mano las rutas correctas y el nombre correcto de ficheros o archivos. Es probable que sus videos esten en un directorio, pero poco probable que los tenga ordenados, difícilmente va tener una subcarpeta para peliculas de acción, otra subcarpeta para películas de terror, comedias u otros géneros. Por eso, al llenar en una tabla, le otorga a usted flexibilidad para indicarlo.

Una vez haya definida su tabla de los datos de los videos a reproducir, seleccione toda el área de datos, y posteriormente elige la opción del Menú -> Datos -> Exportar -> Exportar como .CSV. Digamos que el archivo lo llamaremos peliculas.csv

Ahora solo falta ejecutar el Script en Python, el cual para este ejemplo, y a efectos prácticos, ambos deben estar en el mismo directorio, el Script Python y el archivo peliculas.csv generado.

La plantilla muy sencilla para el index.html será index1.html

-----------------------------------------------------------------
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Peliculas caseras</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">

</head>

<body>
<div class="container">
<div class="col-lg-6 col-sm mx-auto">
<h1>Peliculas en Casa</h1>
{enlaces}
</div>
</div>
</body>

</html>

------------------------------------------------------------------------------------------- 

He colocado la palabra enlaces entre llaves {} para emplear posteriormente la función de reemplazo.

La plantilla para cada archivo o Pagina HTML que mostrará cada película será base1.html.

-------------------------------------------------------------------------------------------------------------------

<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8" />
<title>{titulo}</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">

</head>

<body>
<div class="container">
    <div class="col-lg-6 col-sm">
    <h1>{titulo}</h1>
        <video controls preload="metadata">
        <source src="{ruta}" type="video/mp4">{aleatorio}
        </video>
    </div>
</div>
</body>

</html>

----------------------------------------------------------------------------------------------- 

Igualmente, acá he colocado entre llaves {aleatorio}, {titulo} y {ruta}; los cuales, durante la ejecución del Script Python, serán reemplazados con los valores del archivo .CSV de manera automática.

{aleatorio} tendrá una existencia condicionante a que exista un archivo de subtítulo. De no tenerlo, es porque los subtítulos están embebidos, el video está en español, o desea escuchar en su idioma original sin subtitulos.

Y como puede apreciarse, en ambas plantillas se recurre al framework CSS Bootstrap 4.

El Script en Python es el siguiente:
 

-----------------------------------------------------------------------------------------------------

import sys
import csv

pelis =[]
titulos = []
rutas = []
subtitulos = []
generos = []
generopeli = []
enlace = ''
n=0
m=0
bloque=''
raiz='/home/pepito' #recuerde que aquí debe personalizar la ruta donde estará su alias o la raíz de su VirtualHost
with open('peliculas.csv') as miarchivo:    
    pivote = csv.reader(miarchivo)   
    for row in pivote:  
        titulos.append(row[0])
        rutas.append(row[1]) 
        subtitulos.append(row[2])  
        generos.append(row[3])
        pelis.append(row)
        n=n+1
              
texto1='<track label="Español" kind="subtitles" srclang="es" src="{archivo.vtt}" default>'
with open('generos.csv') as milista:    
        elgenero = csv.reader(milista)   
        for filag in elgenero:  
            generopeli.append(filag[0])
            m=m+1
for i in range(1,n) :
    textual=texto1
    nombre=titulos[i].replace(" ","-")
    nombre=nombre+'.html'
    with open('base1.html', 'r') as file :
        filedata = file.read()
        filedata = filedata.replace('{titulo}',titulos[i])
        filedata = filedata.replace('{ruta}',rutas[i])       
        if (subtitulos[i] !=''):
            textual=textual.replace('{archivo.vtt}',subtitulos[i])
            filedata = filedata.replace('{aleatorio}', textual)
        else :
            filedata = filedata.replace('{aleatorio}','')

    with open(raiz+nombre, 'w') as file:
        file.write(filedata)

for j in range(1,m) :
    argumento=generopeli[j]
    filtrado = filter(lambda c: c[3] == argumento, pelis)
    movies=list(filtrado)
    enlace=''
    if (movies != []) :
        for item in movies:
            enlace = enlace +'<li><a href="./'+item[0].replace(" ","-")+'.html'+'">'+item[0]+'</a></li>'
        bloque = bloque + '<h2>'+argumento+'</h2><ol>' + enlace + '</ol>'

with open('index1.html', 'r') as archivo :
    midata = archivo.read()
    midata = midata.replace('{enlaces}',bloque)       
with open(raiz+'index.html', 'w') as file:
    file.write(midata)   
 

--------------------------------------------------------------------------------------------------------

Este script es sencillo,  y con ese mismo principio, se puede desarrollar otros script para su uso diario. Por ejemplo, para su Consultorio Médico, Dental, Oficina Contable, Ingeniería, etc, desea tener una pagina web por cada paciente. cliente, proyecto, u otro. Simplemente se esboza y maqueta una plantilla y con un script genera tantas Paginas HTML como sea necesaria.
Y sobretodo, con la seguridad de realizarse todo en su computadora.

Comentarios