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()
|