Subject:
|
Pseudo-streaming live news (was: Re: Monitor Page)
|
Newsgroups:
|
lugnet.admin.general
|
Date:
|
Fri, 17 Mar 2000 22:57:04 GMT
|
Viewed:
|
1520 times
|
| |
| |
In lugnet.admin.general, Steve Bliss writes:
> > Are you looking for something more along the lines of an instant "news
> > ticker" type of thing?
>
> Yah, I think. What I was really thinking of is a live list of the
> most-recent messages. As new messages get posted, the server sends them
> down to my browser.
I was surprised how easy it was to devise a little pseudo-news-streamer --
both on the server end and on the client end.
All a client has to do is poll a special URL periodically and check the global
article count. If the count has changed, the client requests (over HTTP) a
copy of all the new articles since the last count (the client must maintain
its own count). Then the client displays the messages however it pleases --
as subject lines, or snippets, or whole messages with paging.
If you want to give this a try, here is the API:
AT STARTUP
http://www.lugnet.com/news/avid.cgi
Fetch this URL -once- at startup and it tells you the global article count
(for example, 118253). The format of the returned document is of type
text/plain
and the content is a single number followed by a newline (\012):
[0-9]+\n
SUBSEQUENT POLLING
http://www.lugnet.com/news/avid.cgi?n=N
Fetch this URL _periodically_ (no more than once per minute!). It returns
to you all articles posted _after_ N. Replace N with the number of the
last article you received, or with the global article count retrieved at
startup. For example...
http://www.lugnet.com/news/avid.cgi?n=118253
By default, only article headers are sent. (Headers average approximately
1/2 KB each.) If you want to retrieve article bodies as well as headers,
you can optionally specify the maximum body size in bytes. Bodies larger
than this number are truncated to that size. (A trailing \n at the very
end of the last line is always guaranteed.) For example:
http://www.lugnet.com/news/avid.cgi?n=118253&b=1024 (chop past 1 KB)
http://www.lugnet.com/news/avid.cgi?n=118253&b=10240 (chop past 10 KB)
http://www.lugnet.com/news/avid.cgi?n=118253&b=1048576 (chop past 1 MB)
The output is a simple easy-to-parse article list...
list ::= article*
article ::= artnum \n
( head* \n body )?
\. \n
artnum ::= [0-9]+
head ::= headerline*
headerline ::= key : value \n
body ::= bodyline*
bodyline ::= ( \. [^\n]+ \n | [^\.\n] [^\n]* \n )
key ::= [^:]+
value ::= [^\n]*
In other words, the list consists of a series of articles. Each article
consists of an article number (on its own line), followed by the article's
header lines, followed by a pure blank line, followed by the article's body,
and followed finally by a period (".") on its own line. If the article has
been cancelled, the head and body are omitted, and the period-on-its-own-
line immediately follows the article number.
There is one thing special to note about the body lines: Lines beginning
with a period (".") need to be un-escaped back to their original form by
removing the leading period, which was added in transit to ensure that it
didn't accidentally wind up as the single-period end-of-body marker.
At most, 20 articles are returned in one bundle. You can call again for
subsequent bundles, but please put your polling process to SLEEP for at
least 60 seconds once you hit the end!
Well, that's it! The rest of the smarts are up to the client. Now let's
look at a simple client written in Perl.
AN EXAMPLE CLIENT
Below is a Q&D ("quick & dirty") -- but actually working -- client which
implements a "streaming" LUGNET newsreader. It checks for new articles
once every five minutes, and then dumps them to stdout. The polling cycle
is momentarily dropped to one minute if new articles are found, then it
goes back up to five minutes again once new articles stop appearing.
Depending on the I/O routines of your operating system, you might be able
to pipe the output of this program to a pager such as 'more' or 'w3m' for
a bit more interactivity.
--Todd
-------8<--------8<--------8<------ cut here ------8<--------8<--------8<------
#!/bin/perl
# Simple "streaming" LUGNET newsreader.
no strict; $^W = 0; # Quick & Dirty mode
use LWP::Simple;
$\ = "\n";
$url = "http://www.lugnet.com/news/avid.cgi";
$N = get $url; $N or die; chop $N; print $N;
for (;;) { sleep(spit(suck())); }
sub suck { split /\n/, get "$url?b=1000000&n=$N" }
sub spit
{
my $time = @_? 60:300;
while (@_)
{
$N = shift; $N =~ m/^[0-9]+$/ or die;
shift, next if $_[0] eq '.';
print "\a", "_" x 79;
while (defined($_ = shift)) { print; last if m/^$/; }
while (defined($_ = shift)) { last if m/^\.$/; print; }
}
$time;
}
__END__
|
|
Message has 4 Replies:
Message is in Reply To:
| | Re: Monitor Page
|
| (...) OK, as long as you've thought about it. (...) Yah, I think. What I was really thinking of is a live list of the most-recent messages. As new messages get posted, the server sends them down to my browser. Steve (25 years ago, 17-Mar-00, to lugnet.admin.general)
|
66 Messages in This Thread:
- Entire Thread on One Page:
- Nested:
All | Brief | Compact | Dots
Linear:
All | Brief | Compact
This Message and its Replies on One Page:
- Nested:
All | Brief | Compact | Dots
Linear:
All | Brief | Compact
|
|
|
|