From dee275ea44030e283beb4e4c3f998c811d262fe3 Mon Sep 17 00:00:00 2001 From: dakkar Date: Sun, 9 Dec 2012 15:53:25 +0000 Subject: utility functions --- lib/Feed/Utils.pm | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 lib/Feed/Utils.pm (limited to 'lib') diff --git a/lib/Feed/Utils.pm b/lib/Feed/Utils.pm new file mode 100644 index 0000000..da279b3 --- /dev/null +++ b/lib/Feed/Utils.pm @@ -0,0 +1,78 @@ +package Feed::Utils; +use strict; +use warnings; +use 5.016; +my @methods; +BEGIN { + @methods = qw( + set_feed_args + set_feed_class + feed + feeds + feeds_from_opml + ); +} +use Sub::Exporter -setup => { + exports => \@methods, + groups => { + default => \@methods, + }, +}; +use XML::LibXML; +use Try::Tiny; + +my $feed_class = 'Feed'; +sub set_feed_class { + $feed_class = shift; +} +my %feed_args = (); +sub set_feed_args { + %feed_args = @_; +} + +sub feed { + my (%args) = @_; + my $feed = $feed_class->new({ + %feed_args, + %args, + }); + $feed->process; + + return; +} + +sub feeds { + my ($common_args,@args) = @_; + + for my $arg (@args) { + if (!ref($arg)) { + feed(%$common_args,uri=>$arg); + } + else { + feed(%$common_args,%$arg); + } + } + + return; +} + +sub feeds_from_opml { + my ($common_args,$opml_source) = @_; + + my $opml = try { + XML::LibXML->load_xml(location => $opml_source); + } catch { warn $_; return }; + return unless $opml; + + for my $feed_node ($opml->findnodes(q{/opml/body/outline[@xmlUrl != '']})) { + my $title = $feed_node->findvalue('@title') + // $feed_node->findvalue('@text') // ''; + my $uri = $feed_node->findvalue('@xmlUrl'); + + feed(%$common_args,title=>$title,uri=>$uri); + } + + return; +} + +1; -- cgit v1.2.3