#!/usr/bin/perl use strict; use LWP::UserAgent; use XML::RSS; use DateTime; use DateTime::Format::Mail; use DateTime::Format::Pg; my $cache_dir = "cache"; my $ua = LWP::UserAgent->new; my $response = $ua->get('https://commitfest.postgresql.org/'); die $response->status_line unless $response->is_success; my $top_page = $response->decoded_content; my $items = []; while ($top_page=~s{\d\d\d\d-\d\d \(Open}{}) { my $cf_link = $1; my $response = $ua->get("https://commitfest.postgresql.org$cf_link"); die $response->status_line unless $response->is_success; my $cf_page = $response->decoded_content; my $topic_name = undef; $cf_page =~ s{^.*?

.*?}{}s; foreach my $item_text (split //, $cf_page) { if ($item_text =~ m{(.*?)}) { $topic_name = $1; } next if $item_text =~ /]/; my $item = {}; $item_text =~ s{(.*?)}{}s or die; $item->{id} = "$cf_link$1"; $item->{title} = $2; $item_text =~ s{.*?}{}s or die; $item_text =~ s{(.*?)}{}s or die; $item->{author} = $1; $item->{topic} = $topic_name; die unless defined $topic_name; update_item_date($item); push @$items, $item; } } # Now, as we've parsed it, let's build an RSS my $rss = XML::RSS->new (version => '2.0'); $rss->channel(title => 'Postresql Commitfest: New patches', link => 'https://commitfest.postgresql.org/', language => 'en', description => 'This feed streams a list of new patches on commitfest.postgresql.org', # pubDate => 'Thu, 23 Aug 1999 07:00:00 GMT', # lastBuildDate => 'Thu, 23 Aug 1999 16:20:26 GMT', # managingEditor => 'dhyan@nataraj.su', webMaster => 'dhyan@nataraj.su' ); foreach my $item (sort({$b->{created} cmp $a->{created}} @$items)) { $rss->add_item(title => $item->{title}, permaLink => "https://commitfest.postgresql.org".$item->{id}, pubDate => date_to_RFC822($item->{created}), description => 'Title: '.$item->{title}."
\n". "Topic:: ".$item->{topic}."
\n". "Created: ".$item->{created}."
\n". "Author: ".$item->{author}."
\n". "Url: ".make_a("https://commitfest.postgresql.org".$item->{id})."
\n" , ); } print "Content-Type: application/rss+xml\n\n"; print $rss->as_string; sub update_item_date { my $item = shift; my $page = fetch_or_cache($item->{id}); $page =~ s{^.*Created}{}s or die; $page =~ m{(.*?)} or die ; $item->{created} = $1; } sub fetch_or_cache { my $id = shift; $id=~s{[^a-zA-Z0-9/]}{?}g; # Secure id for file opening my $cache_name = $id; $cache_name =~ s{/}{_}g; $cache_name = "$cache_dir/$cache_name"; my $page; if ( -e $cache_name) { $page = slurp($cache_name); } else { my $response = $ua->get("https://commitfest.postgresql.org".$id); die $response->status_line unless $response->is_success; $page = $response->decoded_content; # put it in the cache open F, ">", "$cache_name" or die; print F $page; close F; } return $page; } sub slurp { my $file_name = shift; my $s = ""; open F, $file_name; while (my $ss = ) { $s.=$ss; } return $s; } sub date_to_RFC822 { my $date = shift; my $dt = DateTime::Format::Pg->parse_datetime($date); return DateTime::Format::Mail->format_datetime( $dt ); } sub make_a { my $url = shift; return "$url"; }