From 5cfc0b88838148d2ccc4cb080a732a492e1542e7 Mon Sep 17 00:00:00 2001 From: Eric Anderson Date: Fri, 13 Aug 2010 17:00:21 -0500 Subject: Major reorganization to become more like a real app --- feed-transmission.py | 170 ++++++++++++++++++++++++++++----------------------- 1 file changed, 95 insertions(+), 75 deletions(-) diff --git a/feed-transmission.py b/feed-transmission.py index ff30502..f98651c 100755 --- a/feed-transmission.py +++ b/feed-transmission.py @@ -9,18 +9,93 @@ import tempfile import shelve import ConfigParser -POLL_DELAY = 60 * 60 - -threads = [ - ".*Thread: Some thread", -] - -downloadables = re.compile("|".join(threads)) - class App(object): def __init__(self): self.seen = [] self.downloaded = [] + self.feeds = [] + + def load_config(self): + config = ConfigParser.RawConfigParser({}) + config.readfp(file('.feed-transmission.ini')) + feed_names = config.get("config", "feeds") + feed_names = feed_names.split(",") + for i in feed_names: + i = i.strip() + f = {} + url = config.get(i, "url") + poll_delay = config.getint(i, "poll_delay") + match = [] + for m in config.items(i): + if not m[0].startswith("match"): + continue + try: + re.compile(m[1]) + except re.error: + print "Invalid regular expression at %s, %s: %s" % (i, m[0], m[1]) + match.append(m[1]) + match = "|".join(match) + match = re.compile(match) + self.add_feed(Feed(url, poll_delay, match)) + + def load_stor(self): + self.stor = shelve.open(".feed-transmission.data") + + if not "downloaded" in self.stor: + self.stor["downloaded"] = [] + if not "seen" in self.stor: + self.stor["seen"] = [] + self.downloaded = self.stor["downloaded"] + self.seen = self.stor["seen"] + + def setup_env(self): + opener = urllib2.build_opener(urllib2.HTTPCookieProcessor()) + urllib2.install_opener(opener) + + def add_feed(self, feed): + self.feeds.append(feed) + + def get_next_feed(self): + """Returns a (delay, feed) tuple of time to delay before next feed, and + next feed to run + """ + # TODO + return (self.feeds[0].poll_delay, self.feeds[0]) + + def run_relavent(self, feed): + found = feed.find_relavant(self.seen) + self.seen = self.seen[-500:] + self.stor["seen"] = self.seen + for i in found: + if i in self.downloaded: + continue + self.downloaded.append(i) + f = urllib2.urlopen(i) + temp = tempfile.NamedTemporaryFile() + temp.write(f.read()) + f.close() + temp.flush() + ret = subprocess.call(["transmission-remote", "localhost", "-a", temp.name]) + temp.close() + if ret: + print "Error adding torrent" + self.downloaded = self.downloaded[-500:] + self.stor["downloaded"] = self.downloaded + self.stor.sync() + + def main(self): + try: + for feed in self.feeds: + self.run_relavent(feed) + while True: + (delay, feed) = self.get_next_feed() + time.sleep(delay) + try: + self.run_relavent(feed) + except urllib2.URLError, e: + print e + except KeyboardInterrupt: + pass class Feed(object): def __init__(self, url, poll_delay, match): @@ -28,10 +103,14 @@ class Feed(object): self.poll_delay = poll_delay self.match = match - def find_relavant(self, seen): - f = urllib2.urlopen('https://example.com/rss.php') + def load_feed(self): + f = urllib2.urlopen(self.url) d = feedparser.parse(f.read()) f.close() + return d + + def find_relavant(self, seen): + d = self.load_feed() found = [] print "New RSS Items:" for i in d['items']: @@ -39,75 +118,16 @@ class Feed(object): continue seen.append(i.title) print " ", i.title - if not downloadables.match(i.title): + if not self.match.match(i.title): continue print " Matched" found.append(i.link) return found -def load_config(): - config = ConfigParser.RawConfigParser({}) - config.readfp(file('.feed-transmission.ini')) - d = {"feeds": []} - feed_names = config.get("config", "feeds") - feed_names.split(",") - for i in feed_names: - i = i.trim() - f = {} - f["url"] = config.get(i, "url") - f["poll_delay"] = config.getint(i, "poll_delay") - match = [] - for m in config.items(i): - if not m[0].startswith("match") - continue - try: - re.compile(m[1]) - except re.error: - print "Invalid regular expression at %s, %s: %s" % (i, m[0], m[1]) - match.append(m[1]) - match = "|".join(match) - f["match"] = re.compile(match) - d["feeds"].append(f) - return d - -def main(): - opener = urllib2.build_opener(urllib2.HTTPCookieProcessor()) - urllib2.install_opener(opener) - - config = load_config() - stor = shelve.open(".feed-transmission.data") - - if not "downloaded" in stor: - stor["downloaded"] = [] - if not "seen" in stor: - stor["seen"] = [] - downloaded = stor["downloaded"] - seen = stor["seen"] - try: - while True: - found = find_relavant(seen) - seen = seen[-500:] - stor["seen"] = seen - for i in found: - if i in downloaded: - continue - downloaded.append(i) - f = urllib2.urlopen(i) - temp = tempfile.NamedTemporaryFile() - temp.write(f.read()) - f.close() - temp.flush() - ret = subprocess.call(["transmission-remote", "localhost", "-a", temp.name]) - temp.close() - if ret: - print "Error adding torrent" - downloaded = downloaded[-500:] - stor["downloaded"] = downloaded - time.sleep(POLL_DELAY) - except KeyboardInterrupt: - pass - stor.close() - if __name__ == "__main__": - main() + app = App() + app.load_config() + app.load_stor() + app.setup_env() + app.main() -- cgit v1.2.3-54-g00ecf