Software /
code /
prosody-modules
Comparison
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 |
parent | 1457:720ff25d94e6 |
child | 2134:bd7744df0b4a |
comparison
equal
deleted
inserted
replaced
2131:ba42c8882026 | 2132:b149ea428b81 |
---|---|
1 -- Fetches Atom feeds and publishes to PubSub nodes | 1 -- Fetches Atom feeds and publishes to PubSub nodes |
2 -- | |
3 -- Depends: http://code.matthewwild.co.uk/lua-feeds | |
4 -- | 2 -- |
5 -- Config: | 3 -- Config: |
6 -- Component "pubsub.example.com" "pubsub" | 4 -- Component "pubsub.example.com" "pubsub" |
7 -- modules_enabled = { | 5 -- modules_enabled = { |
8 -- "pubsub_feeds"; | 6 -- "pubsub_feeds"; |
19 | 17 |
20 local date, time = os.date, os.time; | 18 local date, time = os.date, os.time; |
21 local dt_parse, dt_datetime = require "util.datetime".parse, require "util.datetime".datetime; | 19 local dt_parse, dt_datetime = require "util.datetime".parse, require "util.datetime".datetime; |
22 local uuid = require "util.uuid".generate; | 20 local uuid = require "util.uuid".generate; |
23 local hmac_sha1 = require "util.hashes".hmac_sha1; | 21 local hmac_sha1 = require "util.hashes".hmac_sha1; |
24 local parse_feed = require "feeds".feed_from_string; | 22 local parse_xml = require "uit.xml".parse; |
25 local st = require "util.stanza"; | 23 local st = require "util.stanza"; |
26 --local dump = require"util.serialization".serialize; | 24 local translate_rss = module:require("feeds").translate_rss; |
27 | 25 |
28 local xmlns_atom = "http://www.w3.org/2005/Atom"; | 26 local xmlns_atom = "http://www.w3.org/2005/Atom"; |
27 | |
28 local function parse_feed(data) | |
29 local feed, err = parse_xml(data); | |
30 if not feed then return feed, err; end | |
31 if feed.attr.xmlns == xmlns_atom then | |
32 return feed; | |
33 elseif feed.attr.xmlns == nil and feed.name == "rss" then | |
34 return translate_rss(feed); | |
35 end | |
36 return nil, "unsupported-format"; | |
37 end | |
29 | 38 |
30 local use_pubsubhubub = module:get_option_boolean("use_pubsubhubub", true); | 39 local use_pubsubhubub = module:get_option_boolean("use_pubsubhubub", true); |
31 if use_pubsubhubub then | 40 if use_pubsubhubub then |
32 module:depends"http"; | 41 module:depends"http"; |
33 end | 42 end |
73 | 82 |
74 function update_entry(item) | 83 function update_entry(item) |
75 local node = item.node; | 84 local node = item.node; |
76 module:log("debug", "parsing %d bytes of data in node %s", #item.data or 0, node) | 85 module:log("debug", "parsing %d bytes of data in node %s", #item.data or 0, node) |
77 local feed = parse_feed(item.data); | 86 local feed = parse_feed(item.data); |
78 for _, entry in ipairs(feed) do | 87 for entry in feed:childtags("entry") do |
79 entry.attr.xmlns = xmlns_atom; | 88 entry.attr.xmlns = xmlns_atom; |
80 | 89 |
81 local e_published = entry:get_child_text("published"); | 90 local e_published = entry:get_child_text("published"); |
82 e_published = e_published and dt_parse(e_published); | 91 e_published = e_published and dt_parse(e_published); |
83 local e_updated = entry:get_child_text("updated"); | 92 local e_updated = entry:get_child_text("updated"); |
117 item.subscription = nil; | 126 item.subscription = nil; |
118 item.lease_expires = nil; | 127 item.lease_expires = nil; |
119 end | 128 end |
120 if use_pubsubhubub and not item.subscription then | 129 if use_pubsubhubub and not item.subscription then |
121 --module:log("debug", "check if %s has a hub", item.node); | 130 --module:log("debug", "check if %s has a hub", item.node); |
122 local hub = item.hub or feed.links and feed.links.hub; | 131 for link in feed:childtags("link") do |
123 if hub then | 132 if link.attr.rel == "hub" then |
124 item.hub = hub; | 133 item.hub = link.attr.href; |
125 module:log("debug", "%s has a hub: %s", item.node, item.hub); | 134 module:log("debug", "Node %s has a hub: %s", item.node, item.hub); |
126 subscribe(item); | 135 return subscribe(item); |
136 end | |
127 end | 137 end |
128 end | 138 end |
129 end | 139 end |
130 | 140 |
131 function fetch(item, callback) -- HTTP Pull | 141 function fetch(item, callback) -- HTTP Pull |