Hace un buen tiempo usaba TinyRSS, un lector RSS web alojado en mi servidor. Pero no recuerdo si fue por actualizar PHP o el código de Tiny Tiny RSS mismo, se rompió la instalación. Decidí volver a usar alguna aplicación de escritorio, por el momento estoy usando Akregator en KDE, pero vi que Thunderbird también permitía la importación de Feeds RSS.
Como no quería ingresar los feeds a los que estaba suscripto de a uno y a mano, entré al phpMyAdmin de mi servidor, y me fijé en qué tabla se encontraban mis feeds. La tabla en cuestión es ttrss_feeds
, que incluye los campos title
y feed_url
. Este último el único que realmente me importa para poder tener mis suscripciones. Desde phpMyAdmin mismo tenemos una funcionalidad de exportar las filas de una tabla, y podemos elegir entre varios formatos. Así que exporté los datos en formato JSON al archivo ‘feeds.json’, que en Ruby es súper fácil de procesar.
Intentando importar en Thunderbird o Akregator, OPML era una de las opciones. Así que tenía que ver cómo se formatea un OPML y traducir el JSON a este formato. Agregué un feed de ejemplo a Thunderbird, exporté mis feeds a un archivo OPML, y ahí tenía mi ejemplo. OPML (Outline Processor Markup Language) es un formato XML para esquemas. Y no necesitamos demasiados detalles, en cada “outline” (esquema), hay que definir el título y la URL del sitio y el feed. Todo información que pude extraer del JSON exportado en phpMyAdmin. Cada elemento dentro de la data del JSON se ve algo así:
{"id":"4",
"title":"OMG! Ubuntu!",
"feed_url":"http:\/\/feeds.feedburner.com\/d0od",
"site_url":"https:\/\/www.omgubuntu.co.uk", "auth_login":"",
... # varios campos más que son irrelevantes
},
Con los campos title
, feed_url
y site_url
, tenemos lo necesario.
Usando el OPML exportado de ejemplo, abrimos el JSON, lo procesamos, y creamos un nuevo archivo ‘feeds.opml’ con lo necesario:
require 'json'
require 'json'
require 'time'
file = File.read('./feeds.json') # El archivo con los feeds
data = JSON.parse(file)[2]['data']
template = []
template << <<~OPML
Custom Ruby OPML Export - Blogs & News Feeds
#{Time.now.httpdate}
OPML
feeds = []
data.each do |feed|
title = feed['title'].gsub('&', '&')
feed_item = <<-OPML
OPML
feeds << feed_item
end
template << feeds
template << <<~OPML
OPML
File.write('feeds.opml', template.join)
El resultado feeds.opml
:
Custom Ruby OPML Export - Blogs & News Feeds
Fri, 11 Nov 2022 08:53:46 GMT
...
No sólo lo tengo importado en Akregator, ahora tengo una forma de mantener mis feeds en un archivo portable para leer en cualquier dispositivo.
Espero que a alguien más le sirva de algo