Browse Source

Change of RSS feature.

- Preview and Download button
- Enable checkbox
- RSS rate and Bookmarks rate: interval in minutes between 15m and 24h (default 60m)
tags/0.6.0
shypike 17 years ago
parent
commit
c923aaadfb
  1. 2
      main/interfaces/Default/templates/config_general.tmpl
  2. 2
      main/interfaces/Default/templates/config_newzbin.tmpl
  3. 12
      main/interfaces/Default/templates/config_rss.tmpl
  4. 24
      main/sabnzbd/__init__.py
  5. 93
      main/sabnzbd/interface.py
  6. 70
      main/sabnzbd/rss.py

2
main/interfaces/Default/templates/config_general.tmpl

@ -106,7 +106,7 @@ Refresh interval of the queue web-interface page(sec, 0= none)<br>
<br>
<br>
<strong>RSS checking rate:</strong><br>
Checking rate (times per day 1..48)<br>
Checking interval (minutes, at least 15))<br>
<input type="text" name="rss_rate" value="$rss_rate">
<br>
<br>

2
main/interfaces/Default/templates/config_newzbin.tmpl

@ -72,7 +72,7 @@ Remove from bookmark list, when download is complete.<br>
<br/>
<br/>
<strong>Checking interval:</strong><br>
Check how often per day (max 48 = every 30 min).<br>
In minutes (at least 15 min).<br>
<input type="text" name="bookmark_rate" value="$bookmark_rate">
</fieldset>
</div>

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

@ -75,16 +75,12 @@
</select>
<!--#end if#-->
<input type="hidden" name="feed" value="$feed">
<input type="hidden" name="feed" value="$feed"/>
<input type="checkbox" onclick="this.form.action='toggle_rss_feed'; this.form.submit(); return false;" name="enable" <!--#if $rss[$feed]['enable'] then "CHECKED" else "" #-->/>Scheduled<br/>
<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[$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"/>
<!--#end if#-->
<input type="submit" onclick="this.form.action='test_rss_feed'; this.form.submit(); return false;" value="Preview"/>
<input type="submit" onclick="this.form.action='download_rss_feed'; this.form.submit(); return false;" value="Download"/>
</fieldset>
</form>
</div>

24
main/sabnzbd/__init__.py

@ -215,6 +215,10 @@ def dir_setup(config, cfg_name, def_loc, def_name, umask=None):
################################################################################
def minimax(val, low, high):
""" Return value forced within range """
try:
val = int(val)
except:
val = 0
if val < low:
return low
if val > high:
@ -359,8 +363,8 @@ def initialize(pause_downloader = False, clean_up = False, force_save= False, ev
NEWZBIN_UNBOOKMARK = bool(check_setting_int(CFG, 'newzbin', 'unbookmark', 0))
BOOKMARK_RATE = check_setting_int(CFG, 'newzbin', 'bookmark_rate', 12)
BOOKMARK_RATE = minimax(BOOKMARK_RATE, 1, 48)
BOOKMARK_RATE = check_setting_int(CFG, 'newzbin', 'bookmark_rate', 60)
BOOKMARK_RATE = minimax(BOOKMARK_RATE, 15, 24*60)
CREATE_CAT_FOLDERS = bool(check_setting_int(CFG, 'newzbin', 'create_category_folders', 0))
@ -407,8 +411,8 @@ def initialize(pause_downloader = False, clean_up = False, force_save= False, ev
refresh_rate = check_setting_int(CFG, 'misc', 'refresh_rate', DEF_QRATE)
rss_rate = check_setting_int(CFG, 'misc', 'rss_rate', 1)
rss_rate = minimax(rss_rate, 1, 48)
rss_rate = check_setting_int(CFG, 'misc', 'rss_rate', 60)
rss_rate = minimax(rss_rate, 15, 24*60)
try:
servers = CFG['servers']
@ -1303,8 +1307,8 @@ def AnalyseSchedules(schedlines):
return paused, speedlimit
def init_SCHED(schedlines, need_rsstask = False, rss_rate = 1, need_versioncheck=True, \
bookmarks=None, bookmark_rate=1):
def init_SCHED(schedlines, need_rsstask = False, rss_rate = 60, need_versioncheck=True, \
bookmarks=None, bookmark_rate=60):
global SCHED
if schedlines or need_rsstask or need_versioncheck:
@ -1349,7 +1353,7 @@ def init_SCHED(schedlines, need_rsstask = False, rss_rate = 1, need_versioncheck
if need_rsstask:
d = range(1, 8) # all days of the week
interval = int((24*60) / rss_rate)
interval = rss_rate
ran_m = random.randint(0,interval-1)
for n in range(0, 24*60, interval):
at = n + ran_m
@ -1371,7 +1375,7 @@ def init_SCHED(schedlines, need_rsstask = False, rss_rate = 1, need_versioncheck
if bookmarks:
d = range(1, 8) # all days of the week
interval = int((24*60) / bookmark_rate)
interval = bookmark_rate
ran_m = random.randint(0,interval-1)
for n in range(0, 24*60, interval):
at = n + ran_m
@ -1405,9 +1409,9 @@ def get_rss_info():
if RSS:
return RSS.get_info()
def run_rss_feed(feed, rematch=False):
def run_rss_feed(feed, download):
if RSS:
return RSS.run_feed(feed, rematch)
return RSS.run_feed(feed, download)
def show_rss_result(feed):
if RSS:

93
main/sabnzbd/interface.py

@ -1226,7 +1226,7 @@ class ConfigGeneral(ProtectedClass):
sabnzbd.CFG['misc']['password'] = encodePassword(password)
sabnzbd.CFG['misc']['bandwith_limit'] = bandwith_limit
sabnzbd.CFG['misc']['refresh_rate'] = refresh_rate
sabnzbd.CFG['misc']['rss_rate'] = rss_rate
sabnzbd.CFG['misc']['rss_rate'] = sabnzbd.minimax(rss_rate, 15, 24*60)
sabnzbd.CFG['misc']['cleanup_list'] = listquote.simplelist(cleanup_list)
sabnzbd.CFG['misc']['cache_limit'] = cache_limitstr
@ -1457,7 +1457,7 @@ class ConfigRss(ProtectedClass):
return template.respond()
@cherrypy.expose
def upd_rss_feed(self, feed=None, uri=None, cat=None, pp=None, script=None, dummy=None):
def upd_rss_feed(self, feed=None, uri=None, cat=None, pp=None, script=None, enable=None, dummy=None):
try:
cfg = sabnzbd.CFG['rss'][feed]
except:
@ -1470,12 +1470,22 @@ class ConfigRss(ProtectedClass):
cfg['pp'] = pp
if script==None or script=='Default': script = ''
cfg['script'] = script
cfg['enable'] = 0
cfg['enable'] = IntConv(enable)
save_configfile(sabnzbd.CFG)
raise Raiser(self.__root, dummy)
@cherrypy.expose
def toggle_rss_feed(self, feed=None, uri=None, cat=None, pp=None, script=None, enable=None, dummy=None):
try:
cfg = sabnzbd.CFG['rss'][feed]
except:
feed = None
if feed:
cfg['enable'] = int(not int(cfg['enable']))
raise Raiser(self.__root, dummy)
@cherrypy.expose
def add_rss_feed(self, feed=None, uri=None, dummy=None):
try:
sabnzbd.CFG['rss'][feed]
@ -1543,24 +1553,23 @@ class ConfigRss(ProtectedClass):
raise Raiser(self.__root, dummy)
@cherrypy.expose
def query_rss_feed(self, *args, **kwargs):
def download_rss_feed(self, *args, **kwargs):
if 'feed' in kwargs:
feed = kwargs['feed']
sabnzbd.CFG['rss'][feed]['enable'] = 0
sabnzbd.run_rss_feed(feed)
return ShowRssLog(feed)
sabnzbd.run_rss_feed(feed, download=True)
sabnzbd.CFG['rss'][feed]['enable'] = 1
return ShowRssLog(feed, False)
if 'dummy' in kwargs:
raise Raiser(self.__root, kwargs['dummy'])
else:
raise Raiser(self.__root, '')
@cherrypy.expose
def rematch_rss_feed(self, *args, **kwargs):
def test_rss_feed(self, *args, **kwargs):
if 'feed' in kwargs:
feed = kwargs['feed']
sabnzbd.CFG['rss'][feed]['enable'] = 0
sabnzbd.run_rss_feed(feed, True)
return ShowRssLog(feed)
sabnzbd.run_rss_feed(feed, download=False)
return ShowRssLog(feed, True)
if 'dummy' in kwargs:
raise Raiser(self.__root, kwargs['dummy'])
else:
@ -1568,43 +1577,6 @@ class ConfigRss(ProtectedClass):
@cherrypy.expose
def rsslog(self, *args, **kwargs):
if 'feed' in kwargs:
return ShowRssLog(kwargs['feed'])
if 'dummy' in kwargs:
raise Raiser(self.__root, kwargs['dummy'])
else:
raise Raiser(self.__root, '')
@cherrypy.expose
def enable_rss_feed(self, *args, **kwargs):
if 'feed' in kwargs:
try:
feed = kwargs['feed']
sabnzbd.CFG['rss'][feed]['enable'] = 1
save_configfile(sabnzbd.CFG)
sabnzbd.run_rss_feed(feed, True)
except:
pass
if 'dummy' in kwargs:
raise Raiser(self.__root, kwargs['dummy'])
else:
raise Raiser(self.__root, '')
@cherrypy.expose
def disable_rss_feed(self, *args, **kwargs):
if 'feed' in kwargs:
try:
sabnzbd.CFG['rss'][kwargs['feed']]['enable'] = 0
save_configfile(sabnzbd.CFG)
except:
pass
if 'dummy' in kwargs:
raise Raiser(self.__root, kwargs['dummy'])
else:
raise Raiser(self.__root, '')
@cherrypy.expose
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, script, cat)
@ -1695,7 +1667,7 @@ class ConfigNewzbin(ProtectedClass):
sabnzbd.CFG['newzbin']['create_category_folders'] = create_category_folders
sabnzbd.CFG['newzbin']['bookmarks'] = newzbin_bookmarks
sabnzbd.CFG['newzbin']['unbookmark'] = newzbin_unbookmark
sabnzbd.CFG['newzbin']['bookmark_rate'] = bookmark_rate
sabnzbd.CFG['newzbin']['bookmark_rate'] = sabnzbd.minimax(bookmark_rate, 15, 24*60)
return saveAndRestart(self.__root, dummy)
@ -1989,7 +1961,7 @@ def ShowFile(name, path):
''' % (name, name, escape(msg))
def ShowRssLog(feed):
def ShowRssLog(feed, all):
"""Return a html page listing an RSS log and a 'back' button
"""
jobs = sabnzbd.show_rss_result(feed)
@ -2025,7 +1997,8 @@ def ShowRssLog(feed):
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 '''
if all:
return '''
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<html>
<head>
@ -2048,6 +2021,24 @@ def ShowRssLog(feed):
</body>
</html>
''' % (escape(feed), escape(feed), goodStr, badStr, doneStr)
else:
return '''
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<html>
<head>
<title>%s</title>
</head>
<body>
<form>
<input type="submit" onclick="this.form.action='.'; this.form.submit(); return false;" value="Back"/>
</form>
<h3>%s</h3>
<b>Downloaded so far</b><br/>
%s
<br/>
</body>
</html>
''' % (escape(feed), escape(feed), doneStr)
def build_header(prim):

70
main/sabnzbd/rss.py

@ -100,7 +100,7 @@ class RSSQueue:
self.shutdown = True
@synchronized(LOCK)
def run_feed(self, feed=None, rematch=False):
def run_feed(self, feed=None, download=False):
""" Run the query for one URI and apply filters """
self.shutdown = False
@ -122,7 +122,6 @@ class RSSQueue:
defCat = cfg['cat']
defPP = cfg['pp']
defScript = cfg['script']
enabled = int(cfg['enable'])
except:
logging.error('[%s] Incorrect RSS feed description "%s"', __NAME__, feed)
return
@ -150,38 +149,25 @@ class RSSQueue:
jobs = self.jobs[feed]
if rematch:
logging.debug('[%s] Rematching RSS-feed %s', __NAME__, uri)
entries = []
for x in jobs:
if jobs[x][0] != 'D': entries.append(x)
else:
# Read the RSS feed
logging.debug("[%s] Running feedparser on %s", __NAME__, uri)
d = feedparser.parse(uri)
logging.debug("[%s] Done parsing %s", __NAME__, uri)
if not d or not d['entries'] or 'bozo_exception' in d:
logging.warning("[%s] Failed to retrieve RSS from %s", __NAME__, uri)
return
entries = d['entries']
# Read the RSS feed
logging.debug("[%s] Running feedparser on %s", __NAME__, uri)
d = feedparser.parse(uri)
logging.debug("[%s] Done parsing %s", __NAME__, uri)
if not d or not d['entries'] or 'bozo_exception' in d:
logging.warning("[%s] Failed to retrieve RSS from %s", __NAME__, uri)
return
entries = d['entries']
# Filter out valid new links
for entry in entries:
if self.shutdown: return
if rematch:
link = entry
else:
link = _get_link(uri, entry)
link = _get_link(uri, entry)
if link:
if rematch:
if link in jobs and jobs[link] != 'D':
title = jobs[link][1]
else:
title = entry.title
newlinks.append(link)
title = entry.title
newlinks.append(link)
if DupTitle(title):
continue
@ -190,7 +176,7 @@ class RSSQueue:
myPP = ''
myScript = ''
if link not in jobs or (rematch and jobs[link][0]!='D'):
if (link not in jobs) or (jobs[link][0]!='D'):
# Match this title against all filters
logging.debug('[%s] Trying link %s', __NAME__, link)
result = False
@ -212,18 +198,17 @@ class RSSQueue:
break
if result:
_HandleLink(jobs, link, title, 'G', myCat, myPP, myScript, enabled and not first)
_HandleLink(jobs, link, title, 'G', myCat, myPP, myScript, download and not first)
else:
_HandleLink(jobs, link, title, 'B', defCat, defPP, defScript, False)
# If links were dropped by feed, remove from our tables too
if not rematch:
olds = jobs.keys()
for old in olds:
if old not in newlinks:
logging.debug("[%s] Purging link %s", __NAME__, old)
del jobs[old]
olds = jobs.keys()
for old in olds:
if old not in newlinks:
logging.debug("[%s] Purging link %s", __NAME__, old)
del jobs[old]
def run(self):
@ -236,14 +221,15 @@ class RSSQueue:
if not self.__running:
self.__running = True
for feed in sabnzbd.CFG['rss']:
self.run_feed(feed)
# Wait two minutes, else newzbin may get irritated
for x in xrange(120):
if self.shutdown:
self.__running = False
return
else:
time.sleep(1.0)
if int(sabnzbd.CFG['rss'][feed]['enable']):
self.run_feed(feed, download=True)
# Wait two minutes, else sites may get irritated
for x in xrange(120):
if self.shutdown:
self.__running = False
return
else:
time.sleep(1.0)
self.save()
self.__running = False

Loading…
Cancel
Save