diff options
author | dakkar <dakkar@thenautilus.net> | 2012-12-09 15:53:25 +0000 |
---|---|---|
committer | dakkar <dakkar@thenautilus.net> | 2012-12-09 15:53:25 +0000 |
commit | dee275ea44030e283beb4e4c3f998c811d262fe3 (patch) | |
tree | e4ab5262dd62c2d826db813199e0ed8e783a93ad /lib | |
parent | fix date formatting (diff) | |
download | feeder-dee275ea44030e283beb4e4c3f998c811d262fe3.tar.gz feeder-dee275ea44030e283beb4e4c3f998c811d262fe3.tar.bz2 feeder-dee275ea44030e283beb4e4c3f998c811d262fe3.zip |
utility functions
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Feed/Utils.pm | 78 |
1 files changed, 78 insertions, 0 deletions
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; |