#!/usr/bin/env python import feedparser import re import time import subprocess import urllib2 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 = [] class Feed(object): def __init__(self, url, poll_delay, match): self.url = url self.poll_delay = poll_delay self.match = match def find_relavant(self, seen): f = urllib2.urlopen('https://example.com/rss.php') d = feedparser.parse(f.read()) f.close() found = [] print "New RSS Items:" for i in d['items']: if i.title in seen: continue seen.append(i.title) print " ", i.title if not downloadables.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()