Procesando Feeds RSS de TinyRSS para consumo OPML

Publicado el 15 de noviembre de 2022

Ruby RSSHace 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
<opml version="1.0">
  <head>
    <title>Custom Ruby OPML Export - Blogs &amp; News Feeds</title>
    <dateCreated>#{Time.now.httpdate}</dateCreated>
  </head>
  <body>
OPML
 
feeds = []
data.each do |feed|
  title = feed['title'].gsub('&', '&amp;')
  feed_item = <<-OPML
    <outline title="#{title}" xmlUrl="#{feed['feed_url']}" htmlUrl="#{feed['site_url']}"/>
  OPML
  feeds << feed_item
end
template << feeds
 
template << <<~OPML
  </body>
</opml>
OPML
File.write('feeds.opml', template.join)

El resultado feeds.opml:

<opml version="1.0">
  <head>
    <title>Custom Ruby OPML Export - Blogs &amp; News Feeds</title>
    <dateCreated>Fri, 11 Nov 2022 08:53:46 GMT</dateCreated>
  </head>
  <body>
    <outline title="OMG! Ubuntu!" xmlUrl="http://feeds.feedburner.com/d0od" htmlUrl="https://www.omgubuntu.co.uk"/>
    <outline title="Barrapunto" xmlUrl="http://barrapunto.com/index.rss" htmlUrl="http://barrapunto.com/"/>
    <outline title="OSNews" xmlUrl="http://osnews.com/files/recent.xml" htmlUrl="https://www.osnews.com"/>
    ...
    <outline title="Pluralistic: Daily links from Cory Doctorow" xmlUrl="https://pluralistic.net/feed/" htmlUrl="https://pluralistic.net"/>
  </body>
</opml>

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 👍🏻

No hay comentarios en este post

Feed de comentarios

Dejar un comentario

Notificarme los nuevos comentarios por correo electrónico. Tambien puedes suscribirte sin comentar.

Toasty!