Por supuesto que si, es como un podcasting a modo texto , es un poco complicado de explicarlo porque se involucran varios programas y realizandolo se pueden aprender varias cosas:
Primero que nada necesitamos :
Instalar perl
Instalar XML-RSS perl module
el rss2html.pl
#!/usr/bin/perl -w
# rss2html - converts an RSS file to HTML
# It take one argument, either a file on the local system,
# or an HTTP URL like http://slashdot.org/slashdot.rdf
# by Jonathan Eisenzopf. v1.0 19990901
# Copyright (c) 1999 Jupitermedia Corp. All Rights Reserved.
# See http://www.webreference.com/perl for more information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# INCLUDES
use strict;
use XML::RSS;
use LWP::Simple;
# Declare variables
my $content;
my $file;
# MAIN
# check for command-line argument
die "Usage: rss2html.pl (<RSS file> | <URL>)\n" unless @ARGV == 1;
# get the command-line argument
my $arg = shift;
# create new instance of XML::RSS
my $rss = new XML::RSS;
# argument is a URL
if ($arg=~ /http:/i) {
$content = get($arg);
die "Could not retrieve $arg" unless $content;
# parse the RSS content
$rss->parse($content);
# argument is a file
} else {
$file = $arg;
die "File \"$file\" does't exist.\n" unless -e $file;
# parse the RSS file
$rss->parsefile($file);
}
# print the HTML channel
&print_html($rss);
# SUBROUTINES
sub print_html {
my $rss = shift;
print <<HTML;
HTML
# print the channel items
my $i = 1;
foreach my $item (@{$rss->{'items'}})
{
next unless defined($item->{'title'});
print "news $i .... ....\n";
print "$item->{'title'} \n";
print "\n$item->{'description'} \n\n";
if($i==4){
last;
}
$i = $i + 1;
}
# if there's a copyright element
if ($rss->{'channel'}->{'copyright'}) {
print <<HTML;
<p><sub>$rss->{'channel'}->{'copyright'}</sub></p>
HTML
}
print <<HTML;
HTML
}
----
Eso nos da lo necesario para descargar los feeds a nuestra PC, el cual si queremos lo podemos ejecutar de forma automatica con un cron job
solo se ejecuta
$perl rss2html.pl "http://rss.slashdot.org/Slashdot/slashdot.RDF" > salida.txt
El script como puede ver no es perfecto, siempre quedan algunos tags de html una que otra vez .
ver ejemplo
por eso vamos a tener que usar sed y arreglaro un poco
$sed -e :a -e 's/<[^>]*>//g;/</N;//ba' salida.txt > slashdot.txt
quedando finalmente algo mas presentable
Hay que acordarse que no todos los feed son iguales y quizas tengan que hacer algunas modicaciones dependiendo del sitio.
La parte del que mas van a editar es la siguiente
foreach my $item (@{$rss->{'items'}})
{
next unless defined($item->{'title'});
# aca podemos escribir un mensaje personalizado al comienzo de cada registro
print "news $i .... ....\n";
# esta linea no se tendria que editar
print "$item->{'title'} \n";
# el script funciona para los feeds de slashdot, digg y otros sitios que
# indexan tanto el <title></title> como <description></description>, pero
# sin embargo para que este funcione en los feeds de sitio (por ejemplo )
#vivalinux.com.ar donde solo indexan los titulares, vamos a tener que dejar
#comentada la linea de abajo o bien crear una copia de todo el
#script rss2html.pl con los arreglos
#necesarios para estas circumstancias
print "\n$item->{'description'} \n\n";
# la cantidad de feeds que queres obtener, no recomiendo mas de 5 o 6, la onda es
# solo tener algo que leer mientras tomamos el desayuno o volvemos del trabajo
if($i==4){
-----------------
Poniendolo todo junto
escribimos un simple bash
leerslash.sh
#!/bin/bash
## se ejecuta con $sh leerslash
## o chmod +x leerslash para luego
## poder ejecutarlos ./leerslash
perl rss2html.pl http://rss.slashdot.org/Slashdot/slashdot.RDF > salida.txt
sed -e :a -e 's/<[^>]*>//g;/</N;//ba' salida.txt > slashdot.txt
cat slashdot.txt |less
rm slashdot.txt salida.txt
Podemos agregar mas feed modificando ese archivo, digamos que queremos ver que esta pasando en los foros de dominio digital
perl rss2html.pl http://rss.slashdot.org/Slashdot/slashdot.RDF > salida.txt
sed -e :a -e 's/<[^>]*>//g;/</N;//ba' salida.txt > feeds.txt
perl rss2html.pl "http://www.psicofxp.com/forums/external.php?type=RSS2&forumids=287" >salida.txt
#usamos nuevamente sed para hacer los arreglos necesarios, en este caso me basto con
sed -e :a -e 's/<[^>]*>//g;/</N;//ba' salida.txt >>feeds.txt
#leemos
cat feeds.txt | less
##borramos los archivos
borrar='salida.txt feeds,txt'
rm $borrar
Y asi tenemos un lindo lector rss para la consola, creo que hay varios ya
No se nada de perl ni mucho menos de sed (que fue lo que mas me volvio loco), pero es un lindo ejercicio. me sirvio para conocer un poco mas sobre la gran utilidad de ambos
Yo les prometi audio y aca les dejo un avance (todavia no aprendi a usar el vcn2swf correctamente y no encuentro forma de embedirle el audio al swf , aca les dejo todo separado
Videito http://orbita78.com.ar/~german/rss.html
al archivo parseado por rss2html y sed http://orbita78.com.ar/~german/slashdot.txt
y finalmente el audio http://orbita78.com.ar/~german/slashdot.ogg
Convertir el archivo de texto a audio
Ahora viene la parte divertida, les recomiendo festival que es un motor tts (text to speech)open source y se usa muy facilmente
una vez instalado podemos usarlos para varios fines , pero no voy a cubrir todos, sino los que son mas importantes para el rss.
festival nos provee del script text2wave y oggenc, y se usa asi
text2wave < slashdot.txt >audio.wav
tambien podemos entubarlo y enviarlo al oggenc para que nos recodifique la salida de audio a un archivo.ogg
text2wave slashdot.txt | oggenc - -o slashdot.ogg
La unica contra es que todavia no encontre manera de como usar el text2wave en archivos de texto en español, pero encontre una vuelta...
en nuestro home creamos el archivo .festivalrc y ponemos lo siguiente
(Parameter.set 'Audio_Method 'Audio_Command)
(Parameter.set 'Audio_Command "cat $FILE >> foo.raw")
Lo que nos va a resultar que cuando entremos a festival de modo interactivo no escuchar nada, ya que la salida de audio se vuelca a un archivo y luego usamos el mismo festival para pasar el texto al audio (nadie es imprecindible, escuchastes text2wave!?)
ejecutamos :
$festival --language spanish --tts archivo.txt
los que nos generara un archivo .raw
Para recodificarlo a un formato mas comun vamos a usar sox...
primero vamos a probarlo mediante play
play -c 2 -f s -r 6500 -s w -t raw foo.raw
los valores que estube manejando fueron entre 5800 a 8000 , queremos algo livianito y para uso personal, no para poder crear un mp3 de 41100 hertz y pasarlo a la ipod. Pero de todas formas no salio tan mal ver prueba de audio http://orbita78.com.ar/~german/prueba.ogg
Despues de jugar con play y encontrarle la frequencia ideal lo recodificamos a wav (hago este paso porque no se como mandarlo como ogg directamente)
$sox -c 2 -r 6500 -s -w foo.raw feed.wav
y por ultimo para codificarlo como mp3 usamos lame
$lame feed.wav feed.mp3
O bien, podemos tomar el camino mas alto y crearnos un lindo ogg, Un convertidor que me gusta usar es dir2ogg , ya que por default me borra los archivos wav al terminar la codificacion
$dir2ogg feed.wav
El comando anterior creara un archivo llamado feed.ogg y borrara el wav si es que no usamos ningun parametro
Ultimo paso
Es actualizar el script para que reprodusca sonida a la vez que leemos los feeds
leerslash.sh
#!/bin/bash
## se ejecuta con $sh leerslash
## o chmod +x leerslash para luego
## poder ejecutarlos ./leerslash
erl rss2html.pl http://rss.slashdot.org/Slashdot/slashdot.RDF > salida.txt
sed -e :a -e 's/<[^>]*>//g;/</N;//ba' salida.txt > feeds_english.txt
## separar dos archivos diferentes para los feeds en ingles y los de español
ingles=feeds_english.txt
perl rss2html "http://www.psicofxp.com/forums/external.php?type=RSS2&forumids=287" >salida.txt
#usamos nuevamente sed para hacer los arreglos necesarios, en este caso me basto con
sed -e :a -e 's/<[^>]*>//g;/</N;//ba' salida.txt >feeds_espaniol.txt
espan=feeds_espaniol.txt
#convertimos los textos a audio
text2wave $ingles | oggenc - -o ingles.ogg
festival --language spanish --tts $espan
sox -c 2 -r 6400 -s -w foo.raw espaniol.wav
dir2ogg espaniol.wav
#concatenamos los feeds
cat $ingles > feeds.txt
cat $espan >>feeds.txt
#iniciamos la reproduccion
play ingles.ogg espaniol.ogg &
#leemos
cat feeds.txt | less
##borramos los archivos
borrar='salida.txt feeds,txt $espan $ingles foo.raw espaniol.ogg ingles.ogg'
rm $borrar
Espero que les haya gustado, como dije antes no se ni perl y recien ahora aprendi alguna maravillas del sed.. Si alguien encuentra algo mal , o algun atajo para ahorrarnos unos pasos... por favor deje un comentario
Fuentes:
http://www.student.northpark.edu/pemente...line52.txt
http://es.tldp.org/
http://www.cstr.ed.ac.uk/projects/festival/
http://leb.net/pub/blinux/doc/blinux/my-tts-linux.txt
http://www.oreillynet.com/pub/wlg/5894
http://www.webreference.com http://www.webreference.com/perl/tutorial/8/rss2html.pl