summaryrefslogtreecommitdiff
path: root/feed-transmission.py
blob: ff30502df905dec15b6b293bab9ca51c86f58caf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#!/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()