# core/plugs/rss.py
#
#
""" rss module. """
__copyright__ = "Copyright 2014 B.H.J Thate"
## IMPORTS
from core.utils import parse_urls, short_date, fetch_url, error
from core import Object, kernel
## basic imports
import threading
import logging
import socket
import time
## RSS class
[docs]class RSS(Object):
def __init__(zelf, sleep, *args, **kwargs):
Object.__init__(zelf, *args, **kwargs)
zelf._state = Object()
zelf._state.status = "init"
zelf._state.boot = time.time()
zelf._state.start = time.time()
zelf._state.sleep = int(sleep)
zelf._state.input = time.time()
zelf._state.output = time.time()
zelf._state.nr_out = 0
zelf._state.nr_new = 0
zelf._seen = []
zelf._on_start = True
[docs] def run(zelf, *args, **kwargs):
global kernel
zelf._state.status = "running"
zelf._state.input = time.time()
zelf._state.start = time.time()
zelf.timer = threading.Timer(zelf._state.sleep, zelf.look)
zelf.timer.start()
kernel.services.rss.timer = zelf.timer
[docs] def look(zelf, *args, **kwargs):
import core.contrib.feedparser as fp
zelf._state.status = "looking"
zelf._state.input = time.time()
logging.info("looking")
for obj in kernel.objects():
if "rss" not in obj: continue
try: data = fetch_url("GET", obj.rss).read()
except socket.error: continue
try: data = fp.parse(data)
except Exception as ex: error() ; continue
for entry in data["entries"]:
if entry["link"] in zelf._seen: continue
else:
zelf._seen.append(entry["link"])
if not zelf._on_start: zelf.display(entry)
zelf._state.nr_new += 1 ; continue
zelf._on_start = False
zelf.run()
[docs] def display(zelf, *args, **kwargs):
entry = args[0]
result = "%s %s" % (entry["title"], entry["link"])
zelf._state.nr_out += 1
zelf._state.output = time.time()
kernel.announce(result)
## INIT
[docs]def init(*args, **kwargs):
global kernel
kernel.services.rss = RSS(60.0)
kernel.services.rss.boot()