With PHP XScreensaver displays news

One of my favorite packages that spans the linux distro universe is XScreensaver. Indeed, any OS that uses X can make use of this screensaver package. In setting it up, I found myself drawn to a few specific screensavers that do more than eyecandy. They display text from 1) Host name and time, 2) Static text, 3) Text file, 4) program text output, or 5) URL. So I threw the google news RSS feed URL in and enjoyed seeing the latest news when my screensaver came on.

This provided a problem. Most RSS (and Google’s feed was no exception) provide only brief summaries of their items. I wanted full-text. So, to accomplish this I found the easiest (though not the best) way was to create a PHP script with the help of some prefab scripts (namely Magpie for the RSS and a script [link] to grab the html from each item).

While an imperfect solution, it gives the full stories; the combination of html stripping in PHP and XScreensaver’s HTML parser make it a pretty solid combination.

Screenshot

Please, if you have any suggestions/changes/other similar implementations to shout out about, drop a comment or an e-mail. I’d really like to see what else is out there.

And now the (shoddy) code (Formatted for publication using code2html):

 1 //Needed for magpie:
 2 define('MAGPIE_DIR', './magpierss/');
 3 require_once(MAGPIE_DIR.'rss_fetch.inc');
 4 //From the grabber script:
 5 	$config['start_tag'] = "<p>"; // where you want to start grabbing
 6 	$config['end_tag']   = "</p>"; // where you want to stop grabbing
 7 	$config['show_tags'] = 0; // do you want the tags to be shown when you show the html? 1 = yes, 0 = no
 8 //from the magpie examples:
 9 
10 	//Modified to use a single rss URL
11 	$rss = fetch_rss('http://news.google.com/nwshp?hl=en&ned=us&output=rss');
12 	//Modified to create an explicit array and shuffle it to get a random item.
13 	$rss_array = $rss->items;
14 	shuffle( $rss_array );
15 	foreach ( $rss_array as $key => $item )
16 	{
17 		if ($key > 1) {
18 			break;
19 		}
20 		$config['url'] = $rss_array[1]['link'];
21 		//From grabber script:
22 		$grab = new grabber;
23 		$grab->grabhtml( $config['url'], $config['start_tag'], $config['end_tag'] );
24 		if (!$grab->error) {
25 			foreach( $grab->html[0] as $html )
26 			{
27 				echo htmlspecialchars( $grab->strip( $html, $config['show_tags'], $config['start_tag'], $config['end_tag'] ) ) . "<br />";
28 			}
29 		}
30 	}
31 
32 	//From grabber script:
33 	class grabber
34 	{
35 		var $error = '';
36 		var $html  = '';
37 	
38 		function grabhtml( $url, $start, $end )
39 		{
40 			$file = file_get_contents( $url );
41 		
42 			if( $file )
43 			{
44 				if( preg_match_all( "#$start(.*?)$end#s", $file, $match ) )
45 				{				
46 					$this->html = $match;
47 				}
48 				else
49 				{
50 					$this->error = "Tags cannot be found.";
51 				}
52 			}
53 			else
54 			{
55 				$this->error = "Site cannot be found!";
56 			}
57 		}
58 	
59 		function strip( $html, $show, $start, $end )
60 		{
61 			if( !$show )
62 			{
63 				$html = str_replace( $start, "", $html );
64 				$html = str_replace( $end, "", $html );
65 				
66 				//Added the PHP function strip_tags and strip any numeric html character references:
67 				$pattern = '/^\&\#(\d+);$/u';
68 				return preg_replace( $pattern, '', strip_tags( $html ) );
69 			}
70 			else
71 			{
72 				return $html;
73 			}
74 		}
75 	}