diff mod_pubsub_feeds/mod_pubsub_feeds.lua @ 2132:b149ea428b81

mod_pubsub_feeds: Switch to use util.xml for parsing feeds and include RSS to Atom translation code from lua-feeds
author Kim Alvefur <zash@zash.se>
date Sun, 20 Mar 2016 12:32:45 +0100
parents 720ff25d94e6
children bd7744df0b4a
line wrap: on
line diff
--- a/mod_pubsub_feeds/mod_pubsub_feeds.lua	Fri Mar 18 09:59:42 2016 +0000
+++ b/mod_pubsub_feeds/mod_pubsub_feeds.lua	Sun Mar 20 12:32:45 2016 +0100
@@ -1,7 +1,5 @@
 -- Fetches Atom feeds and publishes to PubSub nodes
 --
--- Depends: http://code.matthewwild.co.uk/lua-feeds
---
 -- Config:
 -- Component "pubsub.example.com" "pubsub"
 -- modules_enabled = {
@@ -21,12 +19,23 @@
 local dt_parse, dt_datetime = require "util.datetime".parse, require "util.datetime".datetime;
 local uuid = require "util.uuid".generate;
 local hmac_sha1 = require "util.hashes".hmac_sha1;
-local parse_feed = require "feeds".feed_from_string;
+local parse_xml = require "uit.xml".parse;
 local st = require "util.stanza";
---local dump = require"util.serialization".serialize;
+local translate_rss = module:require("feeds").translate_rss;
 
 local xmlns_atom = "http://www.w3.org/2005/Atom";
 
+local function parse_feed(data)
+	local feed, err = parse_xml(data);
+	if not feed then return feed, err; end
+	if feed.attr.xmlns == xmlns_atom then
+		return feed;
+	elseif feed.attr.xmlns == nil and feed.name == "rss" then
+		return translate_rss(feed);
+	end
+	return nil, "unsupported-format";
+end
+
 local use_pubsubhubub = module:get_option_boolean("use_pubsubhubub", true);
 if use_pubsubhubub then
 	module:depends"http";
@@ -75,7 +84,7 @@
 	local node = item.node;
 	module:log("debug", "parsing %d bytes of data in node %s", #item.data or 0, node)
 	local feed = parse_feed(item.data);
-	for _, entry in ipairs(feed) do
+	for entry in feed:childtags("entry") do
 		entry.attr.xmlns = xmlns_atom;
 
 		local e_published = entry:get_child_text("published");
@@ -119,11 +128,12 @@
 	end
 	if use_pubsubhubub and not item.subscription then
 		--module:log("debug", "check if %s has a hub", item.node);
-		local hub = item.hub or feed.links and feed.links.hub;
-		if hub then
-			item.hub = hub;
-			module:log("debug", "%s has a hub: %s", item.node, item.hub);
-			subscribe(item);
+		for link in feed:childtags("link") do
+			if link.attr.rel == "hub" then
+				item.hub = link.attr.href;
+				module:log("debug", "Node %s has a hub: %s", item.node, item.hub);
+				return subscribe(item);
+			end
 		end
 	end
 end