summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2012-12-09 15:53:25 +0000
committerdakkar <dakkar@thenautilus.net>2012-12-09 15:53:25 +0000
commitdee275ea44030e283beb4e4c3f998c811d262fe3 (patch)
treee4ab5262dd62c2d826db813199e0ed8e783a93ad /lib
parentfix date formatting (diff)
downloadfeeder-dee275ea44030e283beb4e4c3f998c811d262fe3.tar.gz
feeder-dee275ea44030e283beb4e4c3f998c811d262fe3.tar.bz2
feeder-dee275ea44030e283beb4e4c3f998c811d262fe3.zip
utility functions
Diffstat (limited to 'lib')
-rw-r--r--lib/Feed/Utils.pm78
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;