#!/usr/bin/perl

#use utf8;
use strict;
use CGI;
use LWP::UserAgent;
use XML::Simple;
use XML::XPath;
use JSON;
my $cgi = CGI->new;
my $input = $cgi->Vars();
my $url=$input->{"q"};
my $cbFn=$input->{"callback"};

my $specs={
    title=>"/rss/channel/title",
    link=>"/rss/channel/link",
    content=>"/rss/channel/description",
    publishedDate=>"/rss/channel/pubDate",
    author=>"/rss/channel/name"

};

my $rssJson=getFeed($url);

print $cgi->header(
        -type    => 'application/javascript',
        -charset => 'utf-8',
   # ),"$rssJson";
    ),"$cbFn($rssJson);";

#====================================================================================
sub getFeed{
    my ($url)=@_;
    my $ua = LWP::UserAgent->new;
    my $response = $ua->get($url);
    my $rs="";
    if ($response->is_success) {
        my $rssXml= $response->decoded_content;
        $rssXml =~ s/<content:encoded>/<content_encoded>/g;
        $rssXml =~ s/<\/content:encoded>/<\/content_encoded>/g;
        my $feed=parseRSS($rssXml);
        $feed->{'feedUrl'}=$url;
        $rs=to_json({feed=>$feed},{pretty=>1});
    }
    else {
      die $response->status_line;
    }
}

sub parseRSS{
    my($xml)=@_;

    my $xmlObj =XML::XPath->new(xml=>$xml);
    my $objData={entries=>[]};
    foreach my $fname(keys %$specs){
        if($xmlObj->exists($specs->{$fname})){
           $objData->{$fname}="" .$xmlObj->getNodeText($specs->{$fname});
        }
    }
    foreach my $node($xmlObj->findnodes("/rss/channel/item")){
         push @{$objData->{'entries'}},getEntry($node->toString());
    }

    return $objData;
}
sub getEntry{
    my ($xml)=@_;
    my $entry={};
    my $specs={
        title=>"item/title",
        link=>"item/link",
        content=>"item/description",
        publishedDate=>"item/pubDate",
        content=>"item/content_encoded",
    };
    my $xmlObj =XML::XPath->new(xml=>$xml);
    foreach my $fname(keys %$specs){
        if($xmlObj->exists($specs->{$fname})){
           $entry->{$fname}="" .$xmlObj->getNodeText($specs->{$fname});
        }
    }
    return $entry;

}
1;
