forked from Lexis/LazyLibrarian
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsearchnzb.py
124 lines (91 loc) · 4.42 KB
/
searchnzb.py
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
114
115
116
117
118
119
import time, threading, urllib, urllib2, os, re
from xml.etree import ElementTree
from xml.etree.ElementTree import Element, SubElement
import lazylibrarian
from lazylibrarian import logger, database, formatter, providers, sabnzbd
def searchbook(books=None):
# rename this thread
threading.currentThread().name = "SEARCHBOOKS"
myDB = database.DBConnection()
searchlist = []
if books is None:
searchbooks = myDB.select('SELECT BookID, AuthorName, Bookname from books WHERE Status="Wanted"')
else:
searchbooks = []
for book in books:
searchbook = myDB.select('SELECT BookID, AuthorName, BookName from books WHERE BookID=? AND Status="Wanted"', [book['bookid']])
for terms in searchbook:
searchbooks.append(terms)
for searchbook in searchbooks:
bookid = searchbook[0]
author = searchbook[1]
book = searchbook[2]
dic = {'...':'', ' & ':' ', ' = ': ' ', '?':'', '$':'s', ' + ':' ', '"':'', ',':'', '*':''}
author = formatter.latinToAscii(formatter.replace_all(author, dic))
book = formatter.latinToAscii(formatter.replace_all(book, dic))
searchterm = author + ' ' + book
searchterm = re.sub('[\.\-\/]', ' ', searchterm).encode('utf-8')
searchlist.append({"bookid": bookid, "searchterm": searchterm})
if not lazylibrarian.SAB_HOST and not lazylibrarian.BLACKHOLE:
logger.info('No downloadmethod is set, use SABnzbd or blackhole')
if not lazylibrarian.NEWZNAB:
logger.info('No providers are set.')
for book in searchlist:
resultlist = []
if lazylibrarian.NEWZNAB and not resultlist:
logger.info('Searching NZB\'s at provider %s ...' % lazylibrarian.NEWZNAB_HOST)
resultlist = providers.NewzNab(book)
if lazylibrarian.NZBMATRIX and not resultlist:
logger.info('Searching NZB at provider NZBMatrix ...')
resultlist = providers.NZBMatrix(book)
if not resultlist:
logger.info("Search didn't have results. Adding book %s to queue." % book['searchterm'])
else:
for nzb in resultlist:
bookid = nzb['bookid']
nzbtitle = nzb['nzbtitle']
nzburl = nzb['nzburl']
nzbprov = nzb['nzbprov']
controlValueDict = {"NZBurl": nzburl}
newValueDict = {
"NZBprov": nzbprov,
"BookID": bookid,
"NZBdate": formatter.today(),
"NZBtitle": nzbtitle,
"Status": "Skipped"
}
myDB.upsert("wanted", newValueDict, controlValueDict)
snatchedbooks = myDB.action('SELECT * from books WHERE BookID=? and Status="Snatched"', [bookid]).fetchone()
if not snatchedbooks:
snatch = DownloadMethod(bookid, nzbprov, nzbtitle, nzburl)
time.sleep(1)
def DownloadMethod(bookid=None, nzbprov=None, nzbtitle=None, nzburl=None):
myDB = database.DBConnection()
if lazylibrarian.SAB_HOST and not lazylibrarian.BLACKHOLE:
download = sabnzbd.SABnzbd(nzbtitle, nzburl)
elif lazylibrarian.BLACKHOLE:
try:
nzbfile = urllib2.urlopen(nzburl, timeout=30).read()
except urllib2.URLError, e:
logger.warn('Error fetching nzb from url: ' + nzburl + ' %s' % e)
nzbname = str.replace(nzbtitle, ' ', '_') + '.nzb'
nzbpath = os.path.join(lazylibrarian.BLACKHOLEDIR, nzbname)
try:
f = open(nzbpath, 'w')
f.write(nzbfile)
f.close()
logger.info('NZB file saved to: ' + nzbpath)
download = True
except Exception, e:
logger.error('%s not writable, NZB not saved. Error: %s' % (nzbpath, e))
download = False
else:
logger.error('No downloadmethod is enabled, check config.')
return False
if download:
logger.info(u'Downloaded nzbfile @ <a href="%s">%s</a>' % (nzburl, lazylibrarian.NEWZNAB_HOST))
myDB.action('UPDATE books SET status = "Snatched" WHERE BookID=?', [bookid])
myDB.action('UPDATE wanted SET status = "Snatched" WHERE NZBurl=?', [nzburl])
else:
logger.error(u'Failed to download nzb @ <a href="%s">%s</a>' % (nzburl, lazylibrarian.NEWZNAB_HOST))
myDB.action('UPDATE wanted SET status = "Failed" WHERE NZBurl=?', [nzburl])