#! /usr/bin/perl
### -------------------------------------------------------------------------
### Program: bbc_l1.pl:
### Copyright (c) 2005 Robin Gilks
###
### 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.
###
### This program is distributed in the hope that it will be useful,
### but WITHOUT ANY WARRANTY; without even the implied warranty of
### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
### GNU General Public License for more details.
###
### You should have received a copy of the GNU General Public License
### along with this program; if not, write to the Free Software
### Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
### -------------------------------------------------------------------------
###
### This is a MythStream parser or harvester
### The idea is to get the RealPlayer historic content from the various
### radio stations that the BBC runs. Most programs are available for streaming
### for up to 7 days after broadcast.
### MythStream passes in the URL which is specified in streams.res
### or the database so we get eg
### streams.res = radio/aod/networks/radio4/audiolist.shtml
### get http://www.bbc.co.uk/radio/aod/networks/radio4/audiolist.shtml
### we parse out the lines with 'bbcplayer' in them eg.
###
The Archers
### Just a Minute
### Afternoon Play
### We keep the tag as the name and if there is anything after the
### then we use that as the description. We then pass back with a
### handler=level2 to display the list we have eg.
### -
### Afternoon Play
### aod.shtml?radio4/afternoonplay
### bbc_l2
###
### When the user selects a show we parse the page returned to
### find the 'var AudioStream = "...." url and extract it eg.
### var AudioStream = "/radio/aod/shows/rpms/radio4/archers";
### Append '.rpm' and get that eg.
### get http://www.bbc.co.uk/radio/aod/shows/rpms/radio4/archers.rpm
### The contents of the rpm file is the rtsp url we want which
### we return!! eg.
### -
### Dummy
### rtsp://rmv8.bbc.net.uk/radio4/archers/archers_mon.ra
###
### This is thankfully played immediately :-))
### -------------------------------------------------------------------------
use English;
use XML::DOM;
use HTML::TokeParser;
#------------------------------------------------------------------------------
# Init
#------------------------------------------------------------------------------
&read_parse(); # get commandline parameters into @in
$source = $in[0]; # source filename from command line
my $doc = XML::DOM::Document->new;
my $head = $doc->createXMLDecl ('1.0');
my $root = $doc->createElement('items');
sub newNode
{
local $name = shift;
local $value = shift;
local $node = $doc->createElement($name);
local $text = $doc->createTextNode($value);
$node->appendChild($text);
return $node;
}
#------------------------------------------------------------------------------
# read file into $data
#------------------------------------------------------------------------------
$datafile = $source;
open( INFO, "<$datafile" ); # Open file for reading
undef $/;
$data = ; # Read all
close(INFO) ;
#------------------------------------------------------------------------------
# search url's in $data and create XML
#------------------------------------------------------------------------------
my $p = HTML::TokeParser->new(\$data);
my $s_name = "";
while (my $token = $p->get_tag("a")) {
my $url = $token->[1]{href};
my $name = $p->get_trimmed_text("/a");
my $target = $token->[1]{target};
my $class = $token->[1]{class};
my $description = $p->get_trimmed_text("a", "/li", "/div", "br", "/span");
$description =~ s/-//g; # remove -
if ($class =~ /txday/) {
$name = $s_name." - ".$name;
} else {
$s_name = $name;
}
if ($target =~ /bbcplayer/ ) {
$item = $doc->createElement('item');
$root->appendChild($item);
$item->appendChild( newNode('name', $name) );
$item->appendChild( newNode('url', $url ) );
$item->appendChild( newNode('handler', "bbc_l2") );
$item->appendChild( newNode('descr', $description) );
}
}
print $head->toString;
print $root->toString;
print "\n";
#--------------------------------------------------------------------------------
# get command line parameters
#--------------------------------------------------------------------------------
sub read_parse
{
local (*in) = @_ if @_;
local ($i);
push(@in, @ARGV);
foreach $i (0 .. $#in) { $in[$i] =~ s/\+/ /g;}
return scalar(@in);
}