Browse Source

RSS revamped again.

Now named sets, full options for feeds and filters.
Comma-separated filter instead of '|' separated.
tags/0.6.0
shypike 17 years ago
parent
commit
ac24f959ee
  1. 116
      main/interfaces/Default/templates/config_rss.tmpl
  2. 16
      main/sabnzbd/__init__.py
  3. 274
      main/sabnzbd/interface.py
  4. 102
      main/sabnzbd/rss.py

116
main/interfaces/Default/templates/config_rss.tmpl

@ -37,43 +37,50 @@
<form action="add_rss_feed" method="post">
<fieldset class="EntryFieldSet">
<legend>New feed URI</legend>
<input type="text" size="120" name="uri" value=""/><br/><br/>
<input type="text" size="10" name="feed" value="$feed"/>&nbsp;
<input type="text" size="104" name="uri" value=""/><br/><br/>
<input type="submit" value="Save"/>
</fieldset>
</form>
</div>
<!--#for $uri in $rss#-->
<!--#for $feed in $rss#-->
<h3>Feed Definition</h3>
<div class="EntryBlock">
<form action="upd_rss_feed" method="post">
<fieldset class="EntryFieldSet">
<legend>Feed URI</legend>
<legend>Feed $feed</legend>
<input type="text" size="120" name="uri" value="$uri"/><br/><br/>
<input type="text" size="120" name="uri" value="$rss[$feed]['uri']"/><br/><br/>
<!--#if $rss[$uri]['pick_cat']#-->
<!--#if $rss[$feed]['pick_cat']#-->
<select name="cat">
<!--#for $ct in $cat_list#-->
<option value="$ct" <!--#if $ct == $rss[$uri]['cat'] then "selected" else ""#-->>$ct</option>
<option value="$ct" <!--#if $ct == $rss[$feed]['cat'] then "selected" else ""#-->>$ct</option>
<!--#end for#-->
</select>
<!--#end if#-->
<!--#if $rss[$uri]['pick_pp']#-->
<select name="pp">
<option value="0" <!--#if $rss[$uri]['pp'] == "0" then 'selected' else ''#-->>None</option>
<option value="1" <!--#if $rss[$uri]['pp'] == "1" then 'selected' else ''#-->>+Repair</option>
<option value="2" <!--#if $rss[$uri]['pp'] == "2" then 'selected' else ''#-->>+Unpack</option>
<option value="3" <!--#if $rss[$uri]['pp'] == "3" then 'selected' else ''#-->>+Delete</option>
<select name="pp">
<option value="" <!--#if $rss[$feed]['pp'] == "" then 'selected' else ''#-->>Default</option>
<option value="0" <!--#if $rss[$feed]['pp'] == "0" then 'selected' else ''#-->>Download</option>
<option value="1" <!--#if $rss[$feed]['pp'] == "1" then 'selected' else ''#-->>+Repair</option>
<option value="2" <!--#if $rss[$feed]['pp'] == "2" then 'selected' else ''#-->>+Unpack</option>
<option value="3" <!--#if $rss[$feed]['pp'] == "3" then 'selected' else ''#-->>+Delete</option>
</select>
<!--#if $rss[$feed]['pick_script']#-->
<select name="script">
<!--#for $sc in $script_list#-->
<option value="$sc" <!--#if $sc == $rss[$feed]['script'] then "selected" else ""#-->>$sc</option>
<!--#end for#-->
</select>
<!--#end if#-->
<input type="hidden" name="this_uri" value="$uri">
<input type="hidden" name="feed" value="$feed">
<input type="submit" value="Save"/>
<input type="submit" onclick="this.form.action='del_rss_feed'; this.form.submit(); return false;" value="Delete"/>
<input type="submit" onclick="this.form.action='query_rss_feed'; this.form.submit(); return false;" value="Query"/>
<input type="submit" onclick="this.form.action='rematch_rss_feed'; this.form.submit(); return false;" value="Rematch/Show"/>
<!--#if $rss[$uri]['enable']#-->
<!--#if $rss[$feed]['enable']#-->
<input type="submit" onclick="this.form.action='disable_rss_feed'; this.form.submit(); return false;" value="Stop"/>
<!--#else#-->
<input type="submit" onclick="this.form.action='enable_rss_feed'; this.form.submit(); return false;" value="Start/Download"/>
@ -85,12 +92,13 @@
<table>
<tr>
<th></th>
<th>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
<th>Order</th>
<th>Type</th>
<th>Filter</th>
<!--#if $rss[$uri]['pick_cat'] then "<th>Category</th>" else ""#-->
<!--#if $rss[$uri]['pick_pp'] then "<th>Mode</th>" else ""#-->
<!--#if $rss[$feed]['pick_cat'] then "<th>Category</th>" else ""#-->
<th>Mode</th>
<!--#if $rss[$feed]['pick_script'] then "<th>Script</th>" else ""#-->
<th></th>
</tr>
@ -105,58 +113,67 @@
</select>
</td>
<td><input type="text" size="60" name="filter_text" value=""></td>
<!--#if $rss[$uri]['pick_cat']#-->
<!--#if $rss[$feed]['pick_cat']#-->
<td>
<select name="cat">
<!--#for $ct in $cat_list#-->
<option value="$ct" <!--#if $ct == $rss[$uri]['cat'] then "selected" else ""#-->>$ct</option>
<option value="$ct" <!--#if $ct == $rss[$feed]['cat'] then "selected" else ""#-->>$ct</option>
<!--#end for#-->
</select>
</td>
<!--#end if#-->
<!--#if $rss[$uri]['pick_pp']#-->
<td>
<select name="pp">
<option value="" <!--#if $rss[$feed]['pp'] == "0" then 'selected' else ''#-->>Default</option>
<option value="0" <!--#if $rss[$feed]['pp'] == "0" then 'selected' else ''#-->>Download</option>
<option value="1" <!--#if $rss[$feed]['pp'] == "1" then 'selected' else ''#-->>+Repair</option>
<option value="2" <!--#if $rss[$feed]['pp'] == "2" then 'selected' else ''#-->>+Unpack</option>
<option value="3" <!--#if $rss[$feed]['pp'] == "3" then 'selected' else ''#-->>+Delete</option>
</select>
</td>
<!--#if $rss[$feed]['pick_script']#-->
<td>
<select name="pp">
<option value="0" <!--#if $rss[$uri]['pp'] == "0" then 'selected' else ''#-->>None</option>
<option value="1" <!--#if $rss[$uri]['pp'] == "1" then 'selected' else ''#-->>+Repair</option>
<option value="2" <!--#if $rss[$uri]['pp'] == "2" then 'selected' else ''#-->>+Unpack</option>
<option value="3" <!--#if $rss[$uri]['pp'] == "3" then 'selected' else ''#-->>+Delete</option>
<select name="script">
<!--#for $sc in $script_list#-->
<option value="$sc" <!--#if $sc == $rss[$feed]['script'] then "selected" else ""#-->>$sc</option>
<!--#end for#-->
</select>
</td>
<!--#end if#-->
<input type="hidden" value="$rss[$uri]['filtercount']" name="index">
<input type="hidden" value="$uri" name="uri">
<input type="hidden" value="$rss[$feed]['filtercount']" name="index">
<input type="hidden" value="$feed" name="feed">
<td><input type="submit" value="Save"></td>
</tr>
</form>
<!--#for $filter in $rss[$uri].filters#-->
<!--#set $fnum = 0#-->
<!--#for $filter in $rss[$feed].filters#-->
<tr class="odd">
<td>
<form action="del_rss_filter" method="post">
<input type="hidden" value="$filter[3]" name="index">
<input type="hidden" value="$uri" name="uri">
<input type="hidden" value="$fnum" name="index">
<input type="hidden" value="$feed" name="feed">
<input type="submit" value="X"></form>
</td>
<td><form><select onchange="location = this.options[this.selectedIndex].value;">
<!--#for $i in xrange($rss[$uri]['filtercount'])#-->
<option value="pos_rss_filter?uri=$uri&current=$filter[3]&new=$i" <!--#if $i == $filter[3] then "selected" else ""#-->>$i</option>
<!--#for $i in xrange($rss[$feed]['filtercount'])#-->
<option value="pos_rss_filter?feed=$feed&current=$fnum&new=$i" <!--#if int($i) == int($fnum) then "selected" else ""#-->>$i</option>
<!--#end for#-->
</select>
<input type="hidden" value="$uri" name="uri">
<input type="hidden" value="$feed" name="feed">
</form></td>
<form action="upd_rss_filter" method="get">
<td>
<select name="filter_type">
<option value="A" <!--#if $filter[1] == "A" then "selected" else ""#--> /> Accept</option>
<option value="R" <!--#if $filter[1] == "R" then "selected" else ""#--> /> Reject</option>
<option value="A" <!--#if $filter[3] == "A" then "selected" else ""#--> /> Accept</option>
<option value="R" <!--#if $filter[3] == "R" then "selected" else ""#--> /> Reject</option>
</select>
</td>
<td><input type="text" size="60" name="filter_text" value="$filter[2]"/></td>
<!--#if $rss[$uri]['pick_cat']#-->
<td><input type="text" size="60" name="filter_text" value="$filter[4]"/></td>
<!--#if $rss[$feed]['pick_cat']#-->
<td>
<select name="cat">
<!--#for $ct in $cat_list#-->
@ -165,23 +182,32 @@
</select>
</td>
<!--#end if#-->
<!--#if $rss[$uri]['pick_pp']#-->
<td>
<select name="pp">
<option value="" <!--#if $filter[1] == "0" then 'selected' else ''#-->>Default</option>
<option value="0" <!--#if $filter[1] == "0" then 'selected' else ''#-->>Download</option>
<option value="1" <!--#if $filter[1] == "1" then 'selected' else ''#-->>+Repair</option>
<option value="2" <!--#if $filter[1] == "2" then 'selected' else ''#-->>+Unpack</option>
<option value="3" <!--#if $filter[1] == "3" then 'selected' else ''#-->>+Delete</option>
</select>
</td>
<!--#if $rss[$feed]['pick_script']#-->
<td>
<select name="pp">
<option value="0" <!--#if $filter[0] == "0" then 'selected' else ''#-->>None</option>
<option value="1" <!--#if $filter[0] == "1" then 'selected' else ''#-->>+Repair</option>
<option value="2" <!--#if $filter[0] == "2" then 'selected' else ''#-->>+Unpack</option>
<option value="3" <!--#if $filter[0] == "3" then 'selected' else ''#-->>+Delete</option>
<select name="script">
<!--#for $sc in $script_list#-->
<option value="$sc" <!--#if $sc == $filter[2] then "selected" else ""#-->>$sc</option>
<!--#end for#-->
</select>
</td>
<!--#end if#-->
<td>
<input type="hidden" name="index" value="$filter[3]"/>
<input type="hidden" name="uri" value="$uri"/>
<input type="hidden" name="index" value="$fnum"/>
<input type="hidden" name="feed" value="$feed"/>
<input type="submit" value="Save"/>
</td>
</form>
</tr>
<!--#set $fnum = $fnum+1#-->
<!--#end for#-->
</table>

16
main/sabnzbd/__init__.py

@ -1328,22 +1328,22 @@ def init_RSS():
return need_rsstask
def del_rss_feed(uri):
def del_rss_feed(feed):
if RSS:
RSS.delete(uri)
RSS.delete(feed)
def get_rss_info():
if RSS:
return RSS.get_info()
def run_rss_feed(uri, rematch=False):
def run_rss_feed(feed, rematch=False):
if RSS:
return RSS.run_uri(uri, rematch)
return RSS.run_feed(feed, rematch)
def show_rss_result(uri):
def show_rss_result(feed):
if RSS:
return RSS.show_result(uri)
return RSS.show_result(feed)
def rss_flag_downloaded(uri, id):
def rss_flag_downloaded(feed, id):
if RSS:
RSS.flag_downloaded(uri, id)
RSS.flag_downloaded(feed, id)

274
main/sabnzbd/interface.py

@ -171,19 +171,26 @@ def IntConv(value):
value = 0
return value
def IsNone(value):
""" Return True if either None, 'None' or '' """
return value==None or value=="" or value.lower()=='none'
def ListHandler(var):
""" Return list option as a comma-seperated string """
if not var:
value = ','
elif type(var) == type(''):
value = '%s,' % var
else:
value = listquote.makelist(var)
value = value.strip('[]')
return value
def List2String(lst):
""" Return list as a comma-separated string """
if type(lst) == type(""):
return lst
txt = ''
r = len(lst)
for n in xrange(r):
txt += lst[n]
if n < r-1: txt += ', '
return txt
def String2List(txt):
""" Return comma-separated string as a list """
#------------------------------------------------------------------------------
class DummyFilter(MultiAuthFilter):
def beforeMain(self):
@ -1177,7 +1184,7 @@ class ConfigGeneral(ProtectedClass):
config['web_colors'] = ListColors(sabnzbd.WEB_DIR2)
config['web_color'] = sabnzbd.WEB_COLOR2
config['cleanup_list'] = ListHandler(sabnzbd.CFG['misc']['cleanup_list'])
config['cleanup_list'] = List2String(sabnzbd.CFG['misc']['cleanup_list'])
template = Template(file=os.path.join(self.__web_dir, 'config_general.tmpl'),
searchList=[config],
@ -1353,34 +1360,33 @@ class ConfigServer(ProtectedClass):
#------------------------------------------------------------------------------
def ListFilters(uri):
""" Make a list of all filters of this uri """
def ListFilters(feed):
""" Make a list of all filters of this feed """
n = 0
filters= []
cfg = sabnzbd.CFG['rss'][feed]
while True:
try:
tup = sabnzbd.CFG['rss'][uri]['filter'+str(n)].split('|')
tup.append(n)
tup = cfg['filter'+str(n)]
filters.append(tup)
n = n + 1
except:
break
return filters
def UnlistFilters(uri, filters):
""" Convert list to filter list for this uri """
cfg = sabnzbd.CFG['rss'][uri]
cat = cfg['cat']
pp = cfg['pp']
del cfg
sabnzbd.CFG['rss'][uri] = {}
cfg = sabnzbd.CFG['rss'][uri]
cfg['cat'] = cat
cfg['pp'] = pp
def UnlistFilters(feed, filters):
""" Convert list to filter list for this feed """
cfg = sabnzbd.CFG['rss'][feed]
n = 0
for filt in filters:
cfg['filter'+str(n)] = '%s|%s|%s' % (filt[0], filt[1], filt[2])
n = n + 1
while True:
try:
del cfg['filter'+str(n)]
n = n + 1
except:
break
for n in xrange(len(filters)):
cfg['filter'+str(n)] = filters[n]
class ConfigRss(ProtectedClass):
@ -1400,20 +1406,28 @@ class ConfigRss(ProtectedClass):
config['have_feedparser'] = sabnzbd.rss.HAVE_FEEDPARSER
config['script_list'] = ListScripts()
config['script_list'].insert(0, 'Default')
config['cat_list'] = ListCats()
rss = {}
for uri in sabnzbd.CFG['rss']:
rss[uri] = {}
rss[uri]['cat'] = sabnzbd.CFG['rss'][uri]['cat']
rss[uri]['pp'] = sabnzbd.CFG['rss'][uri]['pp']
rss[uri]['enable'] = IntConv(sabnzbd.CFG['rss'][uri]['enable'])
rss[uri]['pick_cat'] = config['cat_list'] and not IsNewzbin(uri)
rss[uri]['pick_pp'] = not config['cat_list']
filters = ListFilters(uri)
rss[uri]['filters'] = filters
rss[uri]['filtercount'] = len(filters)
unum = 1
for feed in sabnzbd.CFG['rss']:
rss[feed] = {}
cfg = sabnzbd.CFG['rss'][feed]
rss[feed]['uri'] = cfg['uri']
rss[feed]['cat'] = cfg['cat']
rss[feed]['pp'] = cfg['pp']
rss[feed]['script'] = cfg['script']
rss[feed]['enable'] = IntConv(cfg['enable'])
rss[feed]['pick_cat'] = config['cat_list'] != [] and not IsNewzbin(cfg['uri'])
rss[feed]['pick_script'] = config['script_list'] != []
filters = ListFilters(feed)
rss[feed]['filters'] = filters
rss[feed]['filtercount'] = len(filters)
unum += 1
config['rss'] = rss
config['feed'] = 'Feed' + str(unum)
template = Template(file=os.path.join(self.__web_dir, 'config_rss.tmpl'),
searchList=[config],
@ -1422,92 +1436,98 @@ class ConfigRss(ProtectedClass):
return template.respond()
@cherrypy.expose
def upd_rss_feed(self, this_uri=None, uri=None, cat=None, pp=None, dummy=None):
if this_uri and this_uri != uri:
try:
data = sabnzbd.CFG['rss'][this_uri].copy()
del sabnzbd.CFG['rss'][this_uri]
sabnzbd.del_rss_feed(this_uri)
except:
data = {}
sabnzbd.CFG['rss'][uri] = data
else:
uri = this_uri
logging.debug('++> CHANGING %s %s %s', uri, cat, pp)
if not cat: cat = ''
sabnzbd.CFG['rss'][uri]['cat'] = cat
if not pp: pp = ''
sabnzbd.CFG['rss'][uri]['pp'] = pp
sabnzbd.CFG['rss'][uri]['enable'] = 0
def upd_rss_feed(self, feed=None, uri=None, cat=None, pp=None, script=None, dummy=None):
try:
cfg = sabnzbd.CFG['rss'][feed]
except:
feed = None
if feed and uri:
cfg['uri'] = uri
if IsNone(cat): cat = ''
cfg['cat'] = cat
if IsNone(pp): pp = ''
cfg['pp'] = pp
if script==None or script=='Default': script = ''
cfg['script'] = script
cfg['enable'] = 0
save_configfile(sabnzbd.CFG)
save_configfile(sabnzbd.CFG)
raise Raiser(self.__root, dummy)
@cherrypy.expose
def add_rss_feed(self, uri=None, dummy=None):
def add_rss_feed(self, feed=None, uri=None, dummy=None):
try:
sabnzbd.CFG['rss'][uri]
sabnzbd.CFG['rss'][feed]
except:
sabnzbd.CFG['rss'][uri] = {}
sabnzbd.CFG['rss'][uri]['cat'] = ''
sabnzbd.CFG['rss'][uri]['pp'] = ''
sabnzbd.CFG['rss'][uri]['enable'] = 0
save_configfile(sabnzbd.CFG)
sabnzbd.CFG['rss'][feed] = {}
cfg = sabnzbd.CFG['rss'][feed]
cfg['uri'] = uri
cfg['cat'] = ''
cfg['pp'] = ''
cfg['script'] = ''
cfg['enable'] = 0
save_configfile(sabnzbd.CFG)
raise Raiser(self.__root, dummy)
@cherrypy.expose
def upd_rss_filter(self, uri=None, index=None, filter_text=None,
filter_type=None, cat=None, pp=None, dummy=None):
def upd_rss_filter(self, feed=None, index=None, filter_text=None,
filter_type=None, cat=None, pp=None, script=None, dummy=None):
try:
cfg = sabnzbd.CFG['rss'][uri]
if not cat: cat = ''
if not pp: pp = ''
cfg['filter'+str(index)] = '%s|%s|%s' % (cat+pp, filter_type, filter_text)
cfg['enable'] = 0
cfg = sabnzbd.CFG['rss'][feed]
except:
pass
raise Raiser(self.__root, dummy)
if IsNone(cat): cat = ''
if IsNone(pp): pp = ''
if script==None or script=='Default': script = ''
cfg['filter'+str(index)] = (cat, pp, script, filter_type, filter_text)
cfg['enable'] = 0
save_configfile(sabnzbd.CFG)
raise Raiser(self.__root, dummy)
@cherrypy.expose
def pos_rss_filter(self, uri=None, current=None, new=None, dummy=None):
def pos_rss_filter(self, feed=None, current=None, new=None, dummy=None):
if current != new:
filters = ListFilters(uri)
filters = ListFilters(feed)
filter = filters.pop(int(current))
filters.insert(int(new), filter)
UnlistFilters(uri, filters)
sabnzbd.CFG['rss'][uri]['enable'] = 0
UnlistFilters(feed, filters)
sabnzbd.CFG['rss'][feed]['enable'] = 0
save_configfile(sabnzbd.CFG)
raise Raiser(self.__root, dummy)
@cherrypy.expose
def del_rss_feed(self, this_uri=None, uri=None, cat=None, pp=None, dummy=None):
try:
del sabnzbd.CFG['rss'][this_uri]
sabnzbd.del_rss_feed(this_uri)
except:
pass
save_configfile(sabnzbd.CFG)
raise Raiser(self.__root, dummy)
def del_rss_feed(self, *args, **kwargs):
if 'feed' in kwargs:
feed = kwargs['feed']
try:
del sabnzbd.CFG['rss'][feed]
sabnzbd.del_rss_feed(feed)
except:
pass
save_configfile(sabnzbd.CFG)
if 'dummy' in kwargs:
raise Raiser(self.__root, kwargs['dummy'])
else:
raise Raiser(self.__root, '')
@cherrypy.expose
def del_rss_filter(self, uri=None, index=None, dummy=None):
if uri and index!=None:
filters = ListFilters(uri)
def del_rss_filter(self, feed=None, index=None, dummy=None):
if feed and index!=None:
filters = ListFilters(feed)
filter = filters.pop(int(index))
UnlistFilters(uri, filters)
sabnzbd.CFG['rss'][uri]['enable'] = 0
UnlistFilters(feed, filters)
sabnzbd.CFG['rss'][feed]['enable'] = 0
save_configfile(sabnzbd.CFG)
raise Raiser(self.__root, dummy)
@cherrypy.expose
def query_rss_feed(self, *args, **kwargs):
if 'this_uri' in kwargs:
uri = kwargs['this_uri']
sabnzbd.CFG['rss'][uri]['enable'] = 0
sabnzbd.run_rss_feed(uri)
return ShowRssLog(uri)
if 'feed' in kwargs:
feed = kwargs['feed']
sabnzbd.CFG['rss'][feed]['enable'] = 0
sabnzbd.run_rss_feed(feed)
return ShowRssLog(feed)
if 'dummy' in kwargs:
raise Raiser(self.__root, kwargs['dummy'])
else:
@ -1515,11 +1535,11 @@ class ConfigRss(ProtectedClass):
@cherrypy.expose
def rematch_rss_feed(self, *args, **kwargs):
if 'this_uri' in kwargs:
uri = kwargs['this_uri']
sabnzbd.CFG['rss'][uri]['enable'] = 0
sabnzbd.run_rss_feed(uri, True)
return ShowRssLog(uri)
if 'feed' in kwargs:
feed = kwargs['feed']
sabnzbd.CFG['rss'][feed]['enable'] = 0
sabnzbd.run_rss_feed(feed, True)
return ShowRssLog(feed)
if 'dummy' in kwargs:
raise Raiser(self.__root, kwargs['dummy'])
else:
@ -1528,8 +1548,8 @@ class ConfigRss(ProtectedClass):
@cherrypy.expose
def rsslog(self, *args, **kwargs):
if 'this_uri' in kwargs:
return ShowRssLog(kwargs['this_uri'])
if 'feed' in kwargs:
return ShowRssLog(kwargs['feed'])
if 'dummy' in kwargs:
raise Raiser(self.__root, kwargs['dummy'])
else:
@ -1537,12 +1557,12 @@ class ConfigRss(ProtectedClass):
@cherrypy.expose
def enable_rss_feed(self, *args, **kwargs):
if 'this_uri' in kwargs:
if 'feed' in kwargs:
try:
uri = kwargs['this_uri']
sabnzbd.CFG['rss'][uri]['enable'] = 1
feed = kwargs['feed']
sabnzbd.CFG['rss'][feed]['enable'] = 1
save_configfile(sabnzbd.CFG)
sabnzbd.run_rss_feed(uri, True)
sabnzbd.run_rss_feed(feed, True)
except:
pass
if 'dummy' in kwargs:
@ -1552,9 +1572,9 @@ class ConfigRss(ProtectedClass):
@cherrypy.expose
def disable_rss_feed(self, *args, **kwargs):
if 'this_uri' in kwargs:
if 'feed' in kwargs:
try:
sabnzbd.CFG['rss'][kwargs['this_uri']]['enable'] = 0
sabnzbd.CFG['rss'][kwargs['feed']]['enable'] = 0
save_configfile(sabnzbd.CFG)
except:
pass
@ -1564,12 +1584,12 @@ class ConfigRss(ProtectedClass):
raise Raiser(self.__root, '')
@cherrypy.expose
def rss_download(self, uri=None, id=None, cat=None, pp=None, dummy=None):
def rss_download(self, feed=None, id=None, cat=None, pp=None, script=None, dummy=None):
if id and id.isdigit():
sabnzbd.add_msgid(id, pp, None, cat)
sabnzbd.add_msgid(id, pp, script, cat)
elif id:
sabnzbd.add_url(id, pp, None, cat)
sabnzbd.rss_flag_downloaded(uri, id)
sabnzbd.add_url(id, pp, script, cat)
sabnzbd.rss_flag_downloaded(feed, id)
raise Raiser(self.__root, dummy)
@ -1714,10 +1734,10 @@ class ConfigCats(ProtectedClass):
slot['dir'] = sabnzbd.CFG['categories'][cat]['dir']
except:
slot['dir'] = ''
try:
slot['newzbin'] = ListHandler(sabnzbd.CFG['categories'][cat]['newzbin'])
except:
slot['newzbin'] = ','
#try:
slot['newzbin'] = List2String(sabnzbd.CFG['categories'][cat]['newzbin'])
#except:
# slot['newzbin'] = ''
slotinfo.append(slot)
config['slotinfo'] = slotinfo
@ -1944,11 +1964,11 @@ def ShowFile(name, path):
''' % (name, name, escape(msg))
def ShowRssLog(uri):
def ShowRssLog(feed):
"""Return a html page listing an RSS log and a 'back' button
"""
jobs = sabnzbd.show_rss_result(uri)
quri = escape(uri.replace('/','%2F').replace('?', '%3F'))
jobs = sabnzbd.show_rss_result(feed)
qfeed = escape(feed.replace('/','%2F').replace('?', '%3F'))
doneStr = ""
for x in jobs:
@ -1965,8 +1985,20 @@ def ShowRssLog(uri):
job = jobs[x]
if job[0] == 'B':
name = escape(job[2]).replace('/','%2F').replace('?', '%3F')
badStr += '<a href="rss_download?uri=%s&id=%s&cat=%s&pp=%s">Download</a>&nbsp;&nbsp;&nbsp;%s<br/>' % \
(quri, name, escape(job[3]), escape(job[4]), encode_for_xml(escape(job[1])))
if job[3]:
cat = '&cat=' + escape(job[3])
else:
cat = ''
if job[4]:
pp = '&pp=' + escape(job[4])
else:
pp = ''
if job[5]:
script = '&script=' + escape(job[5])
else:
script = ''
badStr += '<a href="rss_download?feed=%s&id=%s%s%s">Download</a>&nbsp;&nbsp;&nbsp;%s<br/>' % \
(qfeed, name, cat, pp, encode_for_xml(escape(job[1])))
return '''
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
@ -1990,7 +2022,7 @@ def ShowRssLog(uri):
<br/>
</body>
</html>
''' % (escape(uri), escape(uri), goodStr, badStr, doneStr)
''' % (escape(feed), escape(feed), goodStr, badStr, doneStr)
def build_header(prim):

102
main/sabnzbd/rss.py

@ -81,7 +81,7 @@ class RSSQueue:
self.jobs = sabnzbd.load_data(RSS_FILE_NAME, remove = False)
except:
pass
# jobs is a URI-indexed dictionary
# jobs is a NAME-indexed dictionary
# Each element is link-indexed dictionary
# Each element is an array:
# 0 = 'D', 'G', 'B' (downloaded, good-match, bad-match)
@ -89,6 +89,7 @@ class RSSQueue:
# 2 = URL or MsgId
# 3 = cat
# 4 = pp
# 5 = script
if type(self.jobs) != type({}):
self.jobs = {}
@ -96,40 +97,43 @@ class RSSQueue:
@synchronized(LOCK)
def run_uri(self, uri=None, rematch=False):
def run_feed(self, feed=None, rematch=False):
""" Run the query for one URI and apply filters """
if not uri: return
if not feed: return
newlinks = []
# Preparations, get options
if len(sabnzbd.CFG['categories']):
defCat = sabnzbd.CFG['rss'][uri]['cat']
haveCat = True
else:
defCat = sabnzbd.CFG['rss'][uri]['pp']
haveCat = False
cfg = sabnzbd.CFG['rss'][feed]
uri = cfg['uri']
defCat = cfg['cat']
defPP = cfg['pp']
defScript = cfg['script']
enabled = int(sabnzbd.CFG['rss'][uri]['enable'])
enabled = int(cfg['enable'])
# Preparations, convert filters to regex's
filters = ListFilters(uri)
filters = ListFilters(feed)
regexes = []
retypes = []
recats = []
reTypes = []
reCats = []
rePPs = []
reScripts = []
for n in xrange(len(filters)):
recats.append(filters[n][0])
retypes.append(filters[n][1])
regexes.append(ConvertFilter(filters[n][2]))
reCats.append(filters[n][0])
rePPs.append(filters[n][1])
reScripts.append(filters[n][2])
reTypes.append(filters[n][3])
regexes.append(ConvertFilter(filters[n][4]))
regcount = len(regexes)
# Set first if this is the very first scan of this URI
# in that case nothing will be downloaded.
first = uri not in self.jobs
first = feed not in self.jobs
if first:
self.jobs[uri] = {}
self.jobs[feed] = {}
jobs = self.jobs[uri]
jobs = self.jobs[feed]
if rematch:
logging.debug('[%s] Rematching RSS-feed %s', __NAME__, uri)
@ -163,6 +167,8 @@ class RSSQueue:
newlinks.append(link)
myCat = defCat
myPP = ''
myScript = ''
if link not in jobs or (rematch and jobs[link][0]!='D'):
# Match this title against all filters
@ -170,26 +176,25 @@ class RSSQueue:
result = False
for n in xrange(regcount):
found = re.search(regexes[n], title)
if found and retypes[n]=='A':
if found and reTypes[n]=='A':
logging.debug("[%s] Filter matched on rule %d", __NAME__, n)
result = True
if recats[n]: myCat = recats[n]
if reCats[n]: myCat = reCats[n]
if rePPs[n]: myPP = rePPs[n]
if reScripts[n]: myScript = reScripts[n]
if not myCat:
if not myPP: myPP = defPP
if not myScript: myScript = defScript
break
if found and retypes[n]=='R':
if found and reTypes[n]=='R':
logging.debug("[%s] Filter rejected on rule %d", __NAME__, n)
result = False
break
if haveCat:
myPp = ''
else:
myPp = myCat
myCat = ''
if result:
_HandleLink(jobs, link, title, 'G', myPp, myCat, enabled and not first)
_HandleLink(jobs, link, title, 'G', myCat, myPP, myScript, enabled and not first)
else:
_HandleLink(jobs, link, title, 'B', myPp, myCat, False)
_HandleLink(jobs, link, title, 'B', defCat, defPP, defScript, False)
# If links were dropped by feed, remove from our tables too
@ -204,13 +209,13 @@ class RSSQueue:
def run(self):
""" Run all the URI's and filters """
# Protect against second scheduler call before current
# run is completed. Cannot use LOCK, because run_uri
# run is completed. Cannot use LOCK, because run_feed
# already uses the LOCK.
if not self.__running:
self.__running = True
for uri in sabnzbd.CFG['rss']:
self.run_uri(uri)
for feed in sabnzbd.CFG['rss']:
self.run_feed(feed)
# Wait two minutes, else newzbin may get irritated
time.sleep(120)
self.save()
@ -218,10 +223,10 @@ class RSSQueue:
@synchronized(LOCK)
def show_result(self, uri):
if uri in self.jobs:
def show_result(self, feed):
if feed in self.jobs:
try:
return self.jobs[uri]
return self.jobs[feed]
except:
return {}
else:
@ -232,21 +237,24 @@ class RSSQueue:
sabnzbd.save_data(self.jobs, sabnzbd.RSS_FILE_NAME)
@synchronized(LOCK)
def delete(self, uri):
if uri in self.jobs:
del self.jobs[uri]
def delete(self, feed):
if feed in self.jobs:
del self.jobs[feed]
@synchronized(LOCK)
def flag_downloaded(self, uri, id):
if uri in self.jobs:
lst = self.jobs[uri]
def flag_downloaded(self, feed, id):
if feed in self.jobs:
lst = self.jobs[feed]
for link in lst:
if lst[link][2] == id:
lst[link][0] = 'D'
def _HandleLink(jobs, link, title, flag, pp, cat, download):
def _HandleLink(jobs, link, title, flag, cat, pp, script, download):
""" Process one link """
if script=='': script = None
if pp=='': pp = None
m = RE_NEWZBIN.search(link)
if m and m.group(1).lower() == 'newz' and m.group(2) and m.group(3):
jobs[link] = []
@ -256,14 +264,16 @@ def _HandleLink(jobs, link, title, flag, pp, cat, download):
jobs[link].append('')
jobs[link].append('')
jobs[link].append('')
jobs[link].append('')
logging.info("[%s] Adding %s (%s) to queue", __NAME__, m.group(3), title)
sabnzbd.add_msgid(m.group(3), pp=pp, cat=cat)
sabnzbd.add_msgid(m.group(3), pp=pp, script=script, cat=cat)
else:
jobs[link].append(flag)
jobs[link].append(title)
jobs[link].append(m.group(3))
jobs[link].append(cat)
jobs[link].append(pp)
jobs[link].append(script)
else:
jobs[link] = []
if download:
@ -272,14 +282,16 @@ def _HandleLink(jobs, link, title, flag, pp, cat, download):
jobs[link].append('')
jobs[link].append('')
jobs[link].append('')
jobs[link].append('')
logging.info("[%s] Adding %s (%s) to queue", __NAME__, link, title)
sabnzbd.add_url(link, pp=pp, cat=cat)
sabnzbd.add_url(link, pp=pp, script=script, cat=cat)
else:
jobs[link].append(flag)
jobs[link].append(title)
jobs[link].append(link)
jobs[link].append(cat)
jobs[link].append(pp)
jobs[link].append(script)
def _get_link(uri, entry):

Loading…
Cancel
Save