-- Leo's gemini proxy

-- Connecting to sl1200.dystopic.world:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini;lang=es-ES

JuntaLetras, agregador de feeds en BASH con Gemget

2023-01-24

#vps #gemini #bash #gemget #chatGPT #AI

Objetivo

Tener un agregador de feeds hecho por mi mismo a partir de un archivo de texto, gemget y un script en BASH.


Metodología

Creo un archivo de texto en el que en cada fila describo cada uno de los gemlogs o feeds que deseo agregar. Separados por comas introduciré tres campos: la url del gemlog o feed, el nombre en mayúsculas y la dirección "raiz" del gemlog.

Utilizo gemget como herramienta para descargar cada uno de los archivos índice de los feeds en una carpeta a tal efecto.

El script analiza los ficheros descargados. De cada línea de esos archivos, que son los links a los artículos en formato "=> url aaaa-mm-dd Título", extrae la fecha, el título y la url, que suele ser una url local del tipo "/gemlog/artículo.gmi" o "/artículo.gmi", casi nunca "gemini://dominio.com/gemlog/artículo.gmi". La dirección "raiz" suele tener el formato "gemini://dominio.com", "gemini://dominio.com/gemlog/" o similar.

El script une la url local de cada artículo con la dirección raiz obteniendo la url completa. Después publica, en el archivo agregador.gmi un listado con todas las entradas encontradas en cada gemlog, con el formato "=> url_completa_del_artículo aaaa-mm-dd AUTOR, Título del artículo"

Finalmente se ordenan de más nueva a más antigua todas las filas del archivo agregador.gmi e inserta una fila en blanco entre cada nuevo día.


Gemget

Es muy fácil de instalar, sólo debes descargar el binario, hacerlo ejecutable y dejarlo en una carpeta incluída en el PATH.

Gemget, a command line downloader for the Gemini protocol


Script

Este es el script que utilizo, no es el mejor pero al menos lo comprendo. Te agradezco cualquier comentario o sugerencia que tengas. Si quieres usarlo estúdialo antes, cambia los nombres de archivos y carpetas y adáptalo a tus necesidades, de lo contrario no funcionará.


#!/bin/bash
DESCARGAS=/home/usuario/bin/suscripciones/descargas/
FEED=/home/usuario/bin/suscripciones/feedsagrupados
touch $FEED
# Establecer la coma como el separador de campos
IFS=','
# Extraer del archivo "feeds" en el que tendo el listado de feeds a agregar las url, nombre y raiz, \
 y usar un bucle para que gemget descargue los archivos índice de cada feed a agregar
while read -r line; do
    # Leer cada línea y asignar los valores a las variables "url" y "name"
    url=$(echo $line | awk '{print $1}')
    name=$(echo $line | awk '{print $2}')
    raiz=$(echo $line | awk '{print $3}')
    #Aplicar gemget
    gemget -q -d $DESCARGAS $url
    find $DESCARGAS -type f -exec sed -i "s/   / /g" {} \;
    # añadir $name a todas las líneas del archivo generado en descargas
    find $DESCARGAS -type f -exec sed -i "s/^\([^ ]* [^ ]* [^ ]*\) /\1 $name , /" {} \;
    # borro => de todo el archivo
    find $DESCARGAS -type f -exec sed -i "s/=> //g" {} \;
    # añado al principio de todas las líneas la raiz
    find $DESCARGAS -type f -exec sed -i "s|^|=> $raiz|" {} \;
    # creo archivo de feeds y borro los archivos descargados
    cat $DESCARGAS* >> $FEED
    rm $DESCARGAS*
done < "feeds"
# elimino cualquier línea que no tenga la fecha aaaa-mm-dd, elimino también algunos caracteres
sed -i '/ [0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} /!d' $FEED
sed -i 's/ -/ /g' $FEED
sed -i 's/ : / /g' $FEED
# ordeno el resultado y limito el número de líneas del archivo, lo guardo en el archivo resultado.gmi
less $FEED | sort -r -k3 -t ' ' | sed '1i\### 📰 JUNTALETRAS, agregador de feeds.' | sed '300,$d' > \
 /home/usuario/bin/suscripciones/resultado.gmi
# añado una línea en blanco cada vez que cambia la fecha, una aportación de chatGPT 🙂
	prev_date=""
	while read line; do
		current_date=$(echo $line | cut -d ' ' -f 3)
			if [ "$prev_date" != "$current_date" ]; then
			echo ""
			fi
		echo "$line"
		prev_date="$current_date"
	done < /home/usuario/bin/suscripciones/resultado.gmi > /home/usuario/gemini/content/juntaletras.gmi
rm $FEED
IFS=$'\ t\n'

Programación

Pues aquí hay un problema, no funciona con cron, así que deberás usar otro método. Se podría crear un servicio systemd, pero en mi caso he optado por usar el comando "nohup" para que se repita el script cada cierto tiempo, este es el comando:


nohup bash -c "while true; do /home/usuario/bin/suscripciones/script; sleep 7200; done" &

chatGPT

Las parte del script que agrupa las líneas por fecha añadiendo líneas en blanco es cosa de chatGPT. El nombre del agregador , "JuntaLetras" es también cosa de chatGPT.


This work by SL1200 is licensed under CC BY 4.0


◄ BACK

🏠 Home

-- Response ended

-- Page fetched on Fri May 17 01:43:58 2024