package Opals::RSS;

# Version number
$VERSION   = 0.01;

use strict;
use Encode;
use LWP::UserAgent;
use HTTP::Request::Common;
use URI::Escape;
use XML::SAX;
use base qw( XML::SAX::Base );

#===========================================================================================
#Tue, Aug 17, 2010 @ 14:10:44 EDT
#
# public methods:
#       new                     :contructor
#       read                    :read RSS feed and parse 
#
#       return: {chanel=>{title=>title,link=>link,description=>descdription},
#                 itemList=>[{title=>title,link=>link,description=>descdription},...]
#                }
#   example
#    my $rss=Opals::RSS->new();
#    my $rss =$rss->read("http://rss.cbc.ca/lineup/topstories.xml");
#
#============================================================================================

sub new{
    my $type=shift;
    my $self={};
    bless ($self);
    return $self;
}

sub read{
    my($self,$params)=@_;
    my $timeout = 20;
    my $userAgent = LWP::UserAgent->new(agent   => 'OPALS',
                                        timeout =>20);
    
    my $request = HTTP::Request->new(GET => $params->{'rssUrl'}); 
    my $response = $userAgent->request($request );
    if(!$response->is_success){
        return {};
    }
    my $factory = XML::SAX::ParserFactory->new();
    my $parser = $factory->parser( Handler =>Opals::RSSHandler->new() );
    $parser->parse_string($response->content);
    my @retArr=();
    my $nItemShow = $params->{'nItemShow'};
    my $fieldsShow = $params->{'fieldsShow'};
    my @fields= split(",",$params->{'fieldsShow'}) ;
    push @fields,"link";
    for(my $i=0; $i < $nItemShow && $i<scalar(@{$parser->{'Handler'}->{'itemList'}});$i++){
        my $item={};
        foreach my $f(@fields){
            $item->{$f} =$parser->{'Handler'}->{'itemList'}[$i]->{$f};
        }
        push @retArr,$item;
    
    }
    return {channel  =>$parser->{'Handler'}->{'channel'},
            itemList=>\@retArr};
    
}
###################################
# END package Opals::MarcXmlParser;
###################################



1;
#################################################################
package Opals::RSSHandler;
use strict;
sub new {
    my $type = shift;
    return bless {}, $type;
}

sub start_element {
    my ($self, $element) = @_;
    my $name = $element->{'Name'};
    if ($name =~ m/channel|item/g) {
        $self->{'curOuterTag'}=$name;
    }
    else{
        $self->{'curTag'}=$name;
    }
}

#################################################################
sub end_element { 
    my ( $self, $element ) = @_;
    my $name = $element->{ Name };

    if ($name =~ m/title|link|description|pubDate/g) {
    
        $self->{$self->{'curOuterTag'}}->{$name} =$self->{text};
        $self->{text} =undef;
        $self->{'curTag'}=undef;
    }
    elsif($name eq 'item'){
        push @{$self->{'itemList'}}, $self->{'item'};
        $self->{'item'}=undef;
        $self->{'curOuterTag'}='channel';
    }

}
#################################################################
sub characters {
    my $self = shift;
    my $text = shift;
    $self->{text} = $text->{Data};
}

#################################################################
# END package Opals::RSSHandler;
#################################################################




1;
