#!/usr/bin/env perl # customize the next 4 variables my @feeds = ( 'http://slashdot.org/rss/index.rss', 'Slashdot', 'http://www.golem.de/rss.php?feed=RSS2.0', 'Golem', 'http://www.schneier.com/blog/index.rdf', 'Bruce Schneier', 'http://www.heise.de/tp/news-xl.rdf', 'Telepolis', 'http://www.heise.de/newsticker/heise.rdf', 'Heise', 'http://www.voip-info.de/feeds/rss20.xml', 'VoIP News', 'http://wired.com/news/feeds/rss2/0,2610,,00.xml', 'Wired', 'http://www.tagesschau.de/newsticker.rdf', 'Tagesschau', 'http://www.stern.de/standard/rss.php?channel=all', 'Stern', 'http://www.ftd.de/static/ticker/ftd-topnews.rdf', "Financial Times Deutschland", ); my $menutitle='News of the World'; my $menuprompt='Choose your propaganda'; my $defaultrefresh=600; ############################################################################# # @(#) RSS2cisco, An RSS feed to Cisco IP Phone Script version 2.0 # Copyright 2004, Joshua Cantara # # then heavily hacked in 2005 by Dirk Jagdmann to support # caching and better RSS parsing and new title overview. # # This program is licensed under the GPL: http://www.gnu.org/licenses/gpl.txt # Newest version can always be found at: http://dontpokebadgers.com/rss2cisco/ # todo: use strict; use LWP::Simple qw($ua get); use XML::RAI; use CGI; use URI::Escape; # construct url to script $ENV{SERVER_NAME} =~ s!/+$!!; $ENV{SCRIPT_NAME} =~ s!^/+!!; my $pathto = "http://$ENV{SERVER_NAME}/$ENV{SCRIPT_NAME}"; my $query = new CGI; my $item=$query->param('item'); my $url=$query->param('url'); if ($url && $item) { printitem($url, $item, $query->param('maxitem')); } elsif ($url) { printtitles($url); } else { printmenu(); } sub printmenu { my $pth= "$pathto?url="; print "Content-Type: text/xml\n\n"; #foreach my $k (sort keys %ENV) #{ # print "$k: $ENV{$k}\n"; #} print "\n"; print "".substr($menutitle,0,31)."".substr($menuprompt,0,31)."\n"; for (my $i = 0; $i <= ($#feeds) && $i<=64*2;) { print ""; print "".substr($pth.uri_escape($feeds[$i++]), 0, 255).""; print "".substr(cmxml_escape($feeds[$i++]), 0, 63).""; print "\n"; } print "\n"; exit 0; } sub printitem { my ($url, $item, $maxitem) = @_; my $maxlength=4000; my $rai=XML::RAI->parse(getfeed($url)); printmenu() unless $rai; my $title=''; $title=substr(cmxml_escape($rai->channel->title),0,31) if $rai->channel->title; my $it=${$rai->items}[$item-1]; # get item my $date=''; $date=substr(cmxml_escape($it->issued),0,31) if $it->issued; my $txt=''; $txt .= cmxml_escape("$item: ".$it->title) if $it->title; $txt .= "\n--------------------------------\n"; $txt .= cmxml_escape($it->content) if $it->content; $txt=substr($txt,0,3999); print "Content-Type: text/xml\n\n"; print "\n"; print ""; print "$title" if $title; print "$date" if $date; print "$txt"; if($item>1) { my $i=$item-1; my $pth = substr("$pathto?url=".uri_escape($url)."\&maxitem=$maxitem\&item=$i",0,255); print ""; print " <<"; print " $pth"; print " 1"; print ""; } if($item<$maxitem) { my $i=$item+1; my $pth = substr("$pathto?url=".uri_escape($url)."\&maxitem=$maxitem\&item=$i",0,255); print ""; print " >>"; print " $pth"; print " 2"; print ""; } my $pth = substr("$pathto?url=".uri_escape($url),0,255); print ""; print " Back"; print " $pth"; print " 3"; print ""; print "\n"; } sub printtitles { my ($url) = @_; my $rai=XML::RAI->parse(getfeed($url)); printmenu() unless $rai; my $title=''; $title=substr(cmxml_escape($rai->channel->title),0,31) if $rai->channel->title; my $date=''; $date=substr(cmxml_escape($rai->channel->issued),0,31) if $rai->channel->issued; my $refresh=$defaultrefresh; if($rai->channel->src->query('ttl')) { $refresh=$rai->channel->src->query('ttl')*60; } print "Content-Type: text/xml\nRefresh: $refresh\n\n"; print "\n"; print ""; print "$title" if $title; print "$date" if $date; my $maxitem=0; foreach my $item (@{$rai->items}) { $maxitem++; } # todo: better array size detection my $pth = "$pathto?url=".uri_escape($url)."\&maxitem=$maxitem\&item="; my $z=0; foreach my $item (@{$rai->items}) { last if ++$z >99; print ""; print "".substr(cmxml_escape($item->title), 0, 63).""; print "".substr("$pth$z",0,255).""; print "\n"; } print ""; print " Select"; print " SoftKey:Select"; print " 1"; print ""; print ""; print " Reload"; print " ".substr($pth,0,255).""; print " 2"; print ""; print ""; print " Back"; print " ".substr($pathto,0,255).""; print " 3"; print ""; print "\n"; } sub getfeed { my ($url) = @_; my $feed; # construct cache filename my $fn=$url; $fn =~ s/[^\w\d]/_/g; $fn = "/tmp/$fn"; # check if cached rss is valid if(-f $fn) { my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks) = stat($fn); if($mtime > time()-($defaultrefresh-30) && $size>100) { open(A, $fn); $feed.=$_ while ; close(A); return $feed; } } # get RSS data $ua->timeout(15); $feed = get($url); printmenu() if length($feed)==0; # save into cache open(A, ">$fn"); print A $feed; close(A); return $feed; } sub cmxml_escape { ($_) = @_; return unless $_; $_=HTMLentity2latin1($_); s/\s+/ /g; # strip ws s/<.+?>//g; # strip html tags # escape special chars s//\>/g; s/'/\'/g; # ' s/"/\"/g; # " s/\&(?!lt|gt|apos|quot|amp)/\&/g; return $_; } sub HTMLentity2latin1 { ($_) = @_; return unless $_; s/\Æ/AE/g; s/\Æ/AE/g; s/\Á/Á/g; s/\Á/Á/g; s/\Â/Â/g; s/\Â/Â/g; s/\À/À/g; s/\À/À/g; s/\Α/A/g; s/\Α/A/g; s/\Å/Å/g; s/\Å/Å/g; s/\Ã/Ã/g; s/\Ã/Ã/g; s/\Ä/Ä/g; s/\Ä/Ä/g; s/\Β/B/g; s/\Β/B/g; s/\Ç/Ç/g; s/\Ç/Ç/g; s/\Χ/X/g; s/\Χ/X/g; s/\‡/++/g; s/\‡/++/g; s/\Δ/D/g; s/\Δ/D/g; s/\Ð/Ð/g; s/\Ð/Ð/g; s/\É/É/g; s/\É/É/g; s/\Ê/Ê/g; s/\Ê/Ê/g; s/\È/È/g; s/\È/È/g; s/\Ε/E/g; s/\Ε/E/g; s/\Η/H/g; s/\Η/H/g; s/\Ë/Ë/g; s/\Ë/Ë/g; s/\Γ/G/g; s/\Γ/G/g; s/\Í/Í/g; s/\Í/Í/g; s/\Î/Î/g; s/\Î/Î/g; s/\Ì/Ì/g; s/\Ì/Ì/g; s/\Ι/I/g; s/\Ι/I/g; s/\Ï/Ï/g; s/\Ï/Ï/g; s/\Κ/K/g; s/\Κ/K/g; s/\Λ/L/g; s/\Λ/L/g; s/\Μ/M/g; s/\Μ/M/g; s/\Ñ/Ñ/g; s/\Ñ/Ñ/g; s/\Ν/N/g; s/\Ν/N/g; s/\Œ/½/g; s/\Œ/½/g; s/\Ó/Ó/g; s/\Ó/Ó/g; s/\Ô/Ô/g; s/\Ô/Ô/g; s/\Ò/Ò/g; s/\Ò/Ò/g; s/\Ω/O/g; s/\Ω/O/g; s/\Ο/o/g; s/\Ο/o/g; s/\Ø/Ø/g; s/\Ø/Ø/g; s/\Õ/Õ/g; s/\Õ/Õ/g; s/\Ö/Ö/g; s/\Ö/Ö/g; s/\Φ/P/g; s/\Φ/P/g; s/\Π/pi/g; s/\Π/pi/g; s/\″/"/g;s/\″/"/g; s/\Ψ/psi/g; s/\Ψ/psi/g; s/\Ρ/P/g; s/\Ρ/P/g; s/\Š/¦/g; s/\Š/¦/g; s/\Σ/E/g; s/\Σ/E/g; s/\Þ/Þ/g; s/\Þ/Þ/g; s/\Τ/T/g; s/\Τ/T/g; s/\Θ/(x)/g; s/\Θ/(x)/g; s/\Ú/Ú/g; s/\Ú/Ú/g; s/\Û/Û/g; s/\Û/Û/g; s/\Ù/Ù/g; s/\Ù/Ù/g; s/\Υ/Y/g; s/\Υ/Y/g; s/\Ü/Ü/g; s/\Ü/Ü/g; s/\Ξ/[x]/g; s/\Ξ/[x]/g; s/\Ý/Ý/g; s/\Ý/Ý/g; s/\Ÿ/¾/g; s/\Ÿ/¾/g; s/\Ζ/Z/g; s/\Ζ/Z/g; s/\á/á/g; s/\á/á/g; s/\â/â/g; s/\â/â/g; s/\´/'/g; s/\´/'/g; s/\æ/æ/g; s/\æ/æ/g; s/\à/à/g; s/\à/à/g; s/\ℵ/x/g; s/\ℵ/x/g; s/\α/a/g; s/\α/a/g; s/\∧/&/g; s/\∧/&/g; s/\∠/</g; s/\∠/</g; s/\å/å/g; s/\å/å/g; s/\≈/~/g; s/\≈/~/g; s/\ã/ã/g; s/\ã/ã/g; s/\ä/ä/g; s/\ä/ä/g; s/\„/"/g;s/\„/"/g; s/\β/ß/g; s/\β/ß/g; s/\¦/|/g; s/\¦/|/g; s/\•/·/g; s/\•/·/g; s/\∩/cap/g; s/\∩/cap/g; s/\ç/ç/g; s/\ç/ç/g; s/\¸/,/g; s/\¸/,/g; s/\¢/¢/g; s/\¢/¢/g; s/\χ/æ/g; s/\χ/æ/g; s/\ˆ/^/g; s/\ˆ/^/g; s/\♣/*/g; s/\♣/*/g; s/\≅/~=/g; s/\≅/~=/g; s/\©/(c)/g; s/\©/(c)/g; s/\↵/<-|/g;s/\↵/<-|/g; s/\∪/u/g; s/\∪/u/g; s/\¤/¤/g; s/\¤/¤/g; s/\⇓/V/g; s/\⇓/V/g; s/\†/+/g; s/\†/+/g; s/\↓/v/g; s/\↓/v/g; s/\°/°/g; s/\°/°/g; s/\δ/ð/g; s/\δ/ð/g; s/\♦/#/g; s/\♦/#/g; s/\÷/÷/g; s/\÷/÷/g; s/\é/é/g; s/\é/é/g; s/\ê/ê/g; s/\ê/ê/g; s/\è/è/g; s/\è/è/g; s/\∅/ø/g; s/\∅/ø/g; s/\ / /g; s/\ / /g; s/\ / /g; s/\ / /g; s/\ε/e/g; s/\ε/e/g; s/\≡/=/g; s/\≡/=/g; s/\η/n/g; s/\η/n/g; s/\ð/ô/g; s/\ð/ô/g; s/\ë/ë/g; s/\ë/ë/g; s/\€/¤/g; s/\€/¤/g; s/\∃/E/g; s/\∃/E/g; s/\ƒ/f/g; s/\ƒ/f/g; s/\∀/V/g; s/\∀/V/g; s/\½/1\/2/g; s/\½/1\/2/g; s/\¼/1\/4/g; s/\¼/1\/4/g; s/\¾/3\/4/g; s/\¾/3\/4/g; s/\⁄/\//g; s/\⁄/\//g; s/\γ/y/g; s/\γ/y/g; s/\≥/>=/g; s/\≥/>=/g; s/\⇔/<=>/g;s/\⇔/<=>/g; s/\↔/<->/g;s/\↔/<->/g; s/\♥/V/g; s/\♥/V/g; s/\…/.../g; s/\…/.../g; s/\í/í/g; s/\í/í/g; s/\î/î/g; s/\î/î/g; s/\¡/¡/g; s/\¡/¡/g; s/\ì/ì/g; s/\ì/ì/g; s/\ℑ/I/g; s/\ℑ/I/g; s/\∞/oo/g; s/\∞/oo/g; s/\∫/f/g; s/\∫/f/g; s/\ι/i/g; s/\ι/i/g; s/\¿/¿/g; s/\¿/¿/g; s/\∈/E/g; s/\∈/E/g; s/\ï/ï/g; s/\ï/ï/g; s/\κ/k/g; s/\κ/k/g; s/\⇐/<=/g; s/\⇐/<=/g; s/\λ/l/g; s/\λ/l/g; s/\⟨/</g; s/\〈/</g; s/\«/«/g; s/\«/«/g; s/\»/»/g; s/\»/»/g; s/\←/<-/g; s/\←/<-/g; s/\⌈/|-/g; s/\⌈/|-/g; s/\“/"/g;s/\“/"/g; s/\≤/<=/g; s/\≤/<=/g; s/\⌊/|_/g; s/\⌊/|_/g; s/\∗/*/g; s/\∗/*/g; s/\◊/<>/g;s/\◊/<>/g; s/\‎/<-->/g;s/\‎/<-->/g; s/\‹/</g; s/\‹/</g; s/\‘/'/g;s/\‘/'/g; s/\¯/'/g; s/\¯/'/g; s/\—/-/g; s/\—/-/g; s/\µ/µ/g; s/\µ/µ/g; s/\·/·/g; s/\·/·/g; s/\−/-/g; s/\−/-/g; s/\μ/µ/g; s/\μ/µ/g; s/\∇/V/g; s/\∇/V/g; s/\ / /g; s/\ / /g; s/\–/-/g; s/\–/-/g; s/\≠/!=/g; s/\≠/!=/g; s/\∋/E/g; s/\∋/E/g; s/\¬/¬/g; s/\¬/¬/g; s/\∉/¬E/g; s/\∉/¬E/g; s/\⊄/¬</g; s/\⊄/¬</g; s/\ñ/ñ/g; s/\ñ/ñ/g; s/\ν/v/g; s/\ν/v/g; s/\ó/ó/g; s/\ó/ó/g; s/\ô/ô/g; s/\ô/ô/g; s/\œ/½/g; s/\œ/½/g; s/\ò/ò/g; s/\ò/ò/g; s/\‾/'/g; s/\‾/'/g; s/\ω/w/g; s/\ω/w/g; s/\ο/o/g; s/\ο/o/g; s/\⊕/(+)/g; s/\⊕/(+)/g; s/\∨/v/g; s/\∨/v/g; s/\ª/ª/g; s/\ª/ª/g; s/\º/º/g; s/\º/º/g; s/\ø/ø/g; s/\ø/ø/g; s/\õ/ô/g; s/\õ/ô/g; s/\⊗/(x)/g; s/\⊗/(x)/g; s/\ö/ö/g; s/\ö/ö/g; s/\¶/¶/g; s/\¶/¶/g; s/\∂/a/g; s/\∂/a/g; s/\‰/0\/oo/g;s/\‰/0\/oo/g; s/\⊥/^/g; s/\⊥/^/g; s/\φ/phi/g; s/\φ/phi/g; s/\π/pi/g; s/\π/pi/g; s/\ϖ/piv/g; s/\ϖ/piv/g; s/\±/±/g; s/\±/±/g; s/\£/£/g; s/\£/£/g; s/\′/'/g; s/\′/'/g; s/\∏/|'|/g; s/\∏/|'|/g; s/\∝/~/g; s/\∝/~/g; s/\ψ/V/g; s/\ψ/V/g; s/\⇒/=>/g; s/\⇒/=>/g; s/\√/sqrt/g; s/\√/sqrt/g; s/\⟩/>/g; s/\〉/>/g; s/\⌉/'|/g; s/\⌉/'|/g; s/\”/"/g;s/\”/"/g; s/\ℜ/R/g; s/\ℜ/R/g; s/\®/®/g; s/\®/®/g; s/\⌋/_|/g; s/\⌋/_|/g; s/\ρ/p/g; s/\ρ/p/g; s/\‏/<->/g;s/\‏/<->/g; s/\›/>/g; s/\›/>/g; s/\’/'/g; s/\’/'/g; s/\‚/,/g; s/\‚/,/g; s/\š/¦/g; s/\š/¦/g; s/\⋅/·/g; s/\⋅/·/g; s/\§/§/g; s/\§/§/g; s/\­/-/g; s/\­/-/g; s/\σ/o/g; s/\σ/o/g; s/\ς/l/g; s/\ς/l/g; s/\∼/~/g; s/\∼/~/g; s/\♠/*/g; s/\♠/*/g; s/\⊂/sub/g; s/\⊂/sub/g; s/\⊆/sub=/g; s/\⊆/sub=/g; s/\∑/E/g; s/\∑/E/g; s/\¹/¹/g; s/\¹/¹/g; s/\²/²/g; s/\²/²/g; s/\³/³/g; s/\³/³/g; s/\⊃/sup/g; s/\⊃/sup/g; s/\⊇/sup=/g; s/\⊇/sup=/g; s/\ß/ß/g; s/\ß/ß/g; s/\τ/t/g; s/\τ/t/g; s/\∴/:=/g; s/\∴/:=/g; s/\θ/Ø/g; s/\θ/Ø/g; s/\ϑ/v/g; s/\ϑ/v/g; s/\ / /g; s/\ / /g; s/\þ/þ/g; s/\þ/þ/g; s/\˜/~/g; s/\˜/~/g; s/\×/x/g; s/\×/x/g; s/\™/(TM)/g; s/\™/(TM)/g; s/\⇑/^/g; s/\⇑/^/g; s/\ú/ú/g; s/\ú/ú/g; s/\↑/^/g; s/\↑/^/g; s/\û/û/g; s/\û/û/g; s/\ù/ù/g; s/\ù/ù/g; s/\¨/"/g; s/\¨/"/g; s/\ϒ/Y/g; s/\ϒ/Y/g; s/\υ/y/g; s/\υ/y/g; s/\ü/ü/g; s/\ü/ü/g; s/\℘/P/g; s/\℘/P/g; s/\ξ/x/g; s/\ξ/x/g; s/\ý/ý/g; s/\ý/ý/g; s/\¥/¥/g; s/\¥/¥/g; s/\ÿ/ÿ/g; s/\ÿ/ÿ/g; s/\ζ/z/g; s/\ζ/z/g; s/\‍//g; s/\‍//g; s/\‌//g; s/\‌//g; return $_; }