diff --git a/plugins/rss.lua b/plugins/rss.lua index 2aa8e4d..59794a5 100644 --- a/plugins/rss.lua +++ b/plugins/rss.lua @@ -1,3 +1,41 @@ +feedparser = (loadfile "./libs/feedparser.lua")() + +local function unescape_for_rss(str) + -- Character encoding + str = string.gsub(str, "|", "|") + str = string.gsub(str, "‹", "‹") + str = string.gsub(str, "<", "<") + str = string.gsub(str, ">", ">") + str = string.gsub(str, "'", "'") + str = string.gsub(str, "’", "'") + str = string.gsub(str, "–", "–") + str = string.gsub(str, "»", "»") + str = string.gsub(str, "»", "»") + str = string.gsub(str, "–", "–") + str = string.gsub(str, "“", "“") + str = string.gsub(str, "”", "”") + str = string.gsub(str, "€", "€") + str = string.gsub(str, "ß", "ß") + + -- Ä Ö Ü + str = string.gsub(str, "ä", "ä") + str = string.gsub(str, "Ä", "Ä") + str = string.gsub(str, "ä", "ä") + str = string.gsub(str, "Ä", "Ä") + str = string.gsub(str, "ö", "ö") + str = string.gsub(str, "Ö", "Ö") + str = string.gsub(str, "ö", "ö") + str = string.gsub(str, "Ö", "Ö") + str = string.gsub(str, "ü", "ü") + str = string.gsub(str, "Ü", "Ü") + str = string.gsub(str, "ü", "ü") + str = string.gsub(str, "Ü", "Ü") + -- str = string.gsub( str, '&#(%d+);', function(n) return string.char(n) end ) <- There is a bug, but I don't know!? + str = string.gsub( str, '&#x(%d+);', function(n) return string.char(tonumber(n,16)) end ) + str = string.gsub( str, '&', '&' ) -- Be sure to do this after all others + return str +end + local function get_base_redis(id, option, extra) local ex = '' if option ~= nil then @@ -123,6 +161,7 @@ local function cron() local keys = redis:keys(get_base_redis("*", "subs")) for k,v in pairs(keys) do local base = string.match(v, "rss:(.+):subs") -- Get the URL base + --print('Checke RSS: '..base) local prot = redis:get(get_base_redis(base, "protocol")) local last = redis:get(get_base_redis(base, "last_entry")) local url = prot .. "://" .. base @@ -132,12 +171,16 @@ local function cron() end local newentr = get_new_entries(last, parsed.entries) local subscribers = {} - local text = '' -- Send only one message with all updates + local text = '' -- Send one message per feed with the latest entries for k2, v2 in pairs(newentr) do - local title = v2.title or 'No title' - local link = v2.link or v2.id or 'No Link' - --text = string.gsub(text, "\n", "") - text = text .. '[RSS] '.. title .. '\n(' .. link .. ')\n\n' + local title = v2.title or 'Kein Titel' + local link = v2.link or v2.id or 'Kein Link' + if v2.content then + content = string.sub(unescape_for_rss(v2.content:gsub("%b<>", "")), 1, 250) .. '...' + else + content = string.sub(unescape_for_rss(v2.summary:gsub("%b<>", "")), 1, 250) .. '...' + end + text = text .. '[RSS] '.. title .. '\n'..content..'\n\n(' .. link .. ')\n\n' end if text ~= '' then local newlast = newentr[1].id