mirror of
https://github.com/SickGear/SickGear.git
synced 2024-12-01 00:43:37 +00:00
Fix for newznab provider settings not saving properly
Added new show option, delete now removes show from showlist and deletes from hard drive, remove will just remove show from showlist but leave files on hard drive untouched
This commit is contained in:
parent
ea66c2c41b
commit
3cb1c573a3
6 changed files with 83 additions and 26 deletions
|
@ -193,19 +193,19 @@ var show_nzb_providers = #if $sickbeard.USE_NZBS then "true" else "false"#;
|
|||
#end if
|
||||
|
||||
#if $hasattr($curNewznabProvider, 'search_mode'):
|
||||
<div class="field-pair">
|
||||
<label class="nocheck clearfix">
|
||||
<span class="component-title">Season Search Mode</span>
|
||||
<span class="component-desc">
|
||||
<div class="field-pair">
|
||||
When searching for complete seasons<br>
|
||||
you can choose to have it look for season<br>
|
||||
packs ONLY or choose to have it build a<br>
|
||||
complete season from just single episodes.</span>
|
||||
complete season from just single episodes.<br></span>
|
||||
|
||||
<span class="component-title"></span>
|
||||
<input type="radio" name="${curNewznabProvider.getID()}_search_mode" id="${curNewznabProvider.getID()}_search_mode_sponly" value="sponly" class="radio" #if $curNewznabProvider.search_mode=="sponly" then "checked=\"checked\"" else ""# />Season Packs ONLY!<br />
|
||||
<span class="component-title"></span>
|
||||
<input type="radio" name="${curNewznabProvider.getID()}_search_mode" id="${curNewznabProvider.getID()}_search_mode_eponly" value="eponly" class="radio" #if $curNewznabProvider.search_mode=="eponly" then "checked=\"checked\"" else ""# />Episodes ONLY!<br />
|
||||
<span class="component-title"></span>
|
||||
<input type="radio" name="${curNewznabProvider.getID()}_search_mode" id="${curNewznabProvider.getID()}_search_mode_sponly" value="sponly" class="radio" #if $curNewznabProvider.search_mode=="sponly" then "checked=\"checked\"" else ""# />Season Packs ONLY!<br />
|
||||
<span class="component-title"></span>
|
||||
<input type="radio" name="${curNewznabProvider.getID()}_search_mode" id="${curNewznabProvider.getID()}_search_mode_eponly" value="eponly" class="radio" #if $curNewznabProvider.search_mode=="eponly" then "checked=\"checked\"" else ""# />Episodes ONLY!<br />
|
||||
</span>
|
||||
</label>
|
||||
</div>
|
||||
|
|
|
@ -147,6 +147,7 @@ a > i.icon-question-sign { background-image: url("$sbRoot/images/glyphicons-half
|
|||
\$("#SubMenu a[href*='/home/logout/']").addClass('btn').html('<span class="ui-icon ui-icon-power pull-left"></span> Logout');
|
||||
\$("#SubMenu a:contains('Edit')").addClass('btn').html('<span class="ui-icon ui-icon-pencil pull-left"></span> Edit');
|
||||
\$("#SubMenu a:contains('Delete')").addClass('btn').html('<span class="ui-icon ui-icon-trash pull-left"></span> Delete');
|
||||
\$("#SubMenu a:contains('Remove')").addClass('btn').html('<span class="ui-icon ui-icon-trash pull-left"></span> Remove');
|
||||
\$("#SubMenu a:contains('Clear History')").addClass('btn confirm').html('<span class="ui-icon ui-icon-trash pull-left"></span> Clear History');
|
||||
\$("#SubMenu a:contains('Trim History')").addClass('btn confirm').html('<span class="ui-icon ui-icon-trash pull-left"></span> Trim History');
|
||||
\$("#SubMenu a[href$='/errorlogs/clearerrors/']").addClass('btn').html('<span class="ui-icon ui-icon-trash pull-left"></span> Clear Errors');
|
||||
|
|
|
@ -1017,8 +1017,8 @@ def initialize(consoleLogging=True):
|
|||
|
||||
if hasattr(curNzbProvider, 'enable_backlog'):
|
||||
curNzbProvider.enable_backlog = bool(check_setting_int(CFG, curNzbProvider.getID().upper(),
|
||||
curNzbProvider.getID() + '_enable_backlog',
|
||||
1))
|
||||
curNzbProvider.getID() + '_enable_backlog',
|
||||
1))
|
||||
|
||||
if not os.path.isfile(CONFIG_FILE):
|
||||
logger.log(u"Unable to find '" + CONFIG_FILE + "', all settings will be default!", logger.DEBUG)
|
||||
|
|
|
@ -22,6 +22,7 @@ import string
|
|||
from tornado.httputil import HTTPHeaders
|
||||
from tornado.web import RequestHandler
|
||||
from sickbeard import encodingKludge as ek
|
||||
from sickbeard import logger
|
||||
|
||||
# use the built-in if it's available (python 2.6), if not use the included library
|
||||
try:
|
||||
|
@ -80,7 +81,12 @@ def foldersAtPath(path, includeParent=False, includeFiles=False):
|
|||
if path == parentPath and os.name == 'nt':
|
||||
parentPath = ""
|
||||
|
||||
fileList = [{'name': filename, 'path': ek.ek(os.path.join, path, filename)} for filename in ek.ek(os.listdir, path)]
|
||||
try:
|
||||
fileList = [{'name': filename, 'path': ek.ek(os.path.join, path, filename)} for filename in ek.ek(os.listdir, path)]
|
||||
except OSError, e:
|
||||
logger.log(u"Unable to open " + path + ": " + repr(e) + " / " + str(e), logger.WARNING)
|
||||
fileList = [{'name': filename, 'path': ek.ek(os.path.join, parentPath, filename)} for filename in ek.ek(os.listdir, parentPath)]
|
||||
|
||||
if not includeFiles:
|
||||
fileList = filter(lambda entry: ek.ek(os.path.isdir, entry['path']), fileList)
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@ import datetime
|
|||
import threading
|
||||
import re
|
||||
import glob
|
||||
import stat
|
||||
import traceback
|
||||
|
||||
import sickbeard
|
||||
|
@ -962,7 +963,7 @@ class TVShow(object):
|
|||
|
||||
return self.nextaired
|
||||
|
||||
def deleteShow(self):
|
||||
def deleteShow(self, full=False):
|
||||
|
||||
sql_l = [["DELETE FROM tv_episodes WHERE showid = ?", [self.indexerid]],
|
||||
["DELETE FROM tv_shows WHERE indexer_id = ?", [self.indexerid]],
|
||||
|
@ -973,7 +974,6 @@ class TVShow(object):
|
|||
myDB = db.DBConnection()
|
||||
myDB.mass_action(sql_l)
|
||||
|
||||
|
||||
# remove self from show list
|
||||
sickbeard.showList = [x for x in sickbeard.showList if int(x.indexerid) != self.indexerid]
|
||||
|
||||
|
@ -983,6 +983,24 @@ class TVShow(object):
|
|||
logger.log(u"Deleting cache file " + cache_file)
|
||||
os.remove(cache_file)
|
||||
|
||||
# remove entire show folder
|
||||
if full:
|
||||
try:
|
||||
logger.log(u"Deleting show folder " + self.location)
|
||||
# check first the read-only attribute
|
||||
file_attribute = ek.ek(os.stat, self.location)[0]
|
||||
if (not file_attribute & stat.S_IWRITE):
|
||||
# File is read-only, so make it writeable
|
||||
logger.log('Read only mode on folder ' + self.location + ' Will try to make it writeable', logger.DEBUG)
|
||||
try:
|
||||
ek.ek(os.chmod, self.location, stat.S_IWRITE)
|
||||
except:
|
||||
logger.log(u'Cannot change permissions of ' + self.location, logger.WARNING)
|
||||
|
||||
ek.ek(os.rmdir, self.location)
|
||||
except OSError, e:
|
||||
logger.log(u"Unable to delete " + self.location + ": " + repr(e) + " / " + str(e), logger.WARNING)
|
||||
|
||||
def populateCache(self):
|
||||
cache_inst = image_cache.ImageCache()
|
||||
|
||||
|
|
|
@ -1036,8 +1036,10 @@ class Manage(MainHandler):
|
|||
return _munge(t)
|
||||
|
||||
|
||||
def massEditSubmit(self, paused=None, anime=None, sports=None, scene=None, flatten_folders=None, quality_preset=False,
|
||||
subtitles=None, air_by_date=None, anyQualities=[], bestQualities=[], toEdit=None, *args, **kwargs):
|
||||
def massEditSubmit(self, paused=None, anime=None, sports=None, scene=None, flatten_folders=None,
|
||||
quality_preset=False,
|
||||
subtitles=None, air_by_date=None, anyQualities=[], bestQualities=[], toEdit=None, *args,
|
||||
**kwargs):
|
||||
|
||||
dir_map = {}
|
||||
for cur_arg in kwargs:
|
||||
|
@ -1112,7 +1114,8 @@ class Manage(MainHandler):
|
|||
|
||||
exceptions_list = []
|
||||
|
||||
curErrors += Home(self.application, self.request).editShow(curShow, new_show_dir, anyQualities, bestQualities, exceptions_list,
|
||||
curErrors += Home(self.application, self.request).editShow(curShow, new_show_dir, anyQualities,
|
||||
bestQualities, exceptions_list,
|
||||
flatten_folders=new_flatten_folders,
|
||||
paused=new_paused, sports=new_sports,
|
||||
subtitles=new_subtitles, anime=new_anime,
|
||||
|
@ -1601,7 +1604,8 @@ class ConfigSearch(MainHandler):
|
|||
|
||||
def saveSearch(self, use_nzbs=None, use_torrents=None, nzb_dir=None, sab_username=None, sab_password=None,
|
||||
sab_apikey=None, sab_category=None, sab_host=None, nzbget_username=None, nzbget_password=None,
|
||||
nzbget_category=None, nzbget_priority=100, nzbget_host=None, nzbget_use_https=None, dailysearch_frequency=None,
|
||||
nzbget_category=None, nzbget_priority=100, nzbget_host=None, nzbget_use_https=None,
|
||||
dailysearch_frequency=None,
|
||||
nzb_method=None, torrent_method=None, usenet_retention=None, backlog_frequency=None,
|
||||
download_propers=None, check_propers_interval=None, allow_high_priority=None,
|
||||
backlog_startup=None, dailysearch_startup=None,
|
||||
|
@ -1992,19 +1996,42 @@ class ConfigProviders(MainHandler):
|
|||
cur_url = config.clean_url(cur_url)
|
||||
|
||||
newProvider = newznab.NewznabProvider(cur_name, cur_url, key=cur_key)
|
||||
|
||||
cur_id = newProvider.getID()
|
||||
|
||||
# if it already exists then update it
|
||||
if cur_id in newznabProviderDict:
|
||||
newznabProviderDict[cur_id].name = cur_name
|
||||
newznabProviderDict[cur_id].url = cur_url
|
||||
|
||||
newznabProviderDict[cur_id].key = cur_key
|
||||
# a 0 in the key spot indicates that no key is needed
|
||||
if cur_key == '0':
|
||||
newznabProviderDict[cur_id].needs_auth = False
|
||||
else:
|
||||
newznabProviderDict[cur_id].needs_auth = True
|
||||
|
||||
try:
|
||||
newznabProviderDict[cur_id].search_mode = str(kwargs[cur_id + '_search_mode']).strip()
|
||||
except:
|
||||
pass
|
||||
|
||||
try:
|
||||
newznabProviderDict[cur_id].search_fallback = config.checkbox_to_value(
|
||||
kwargs[cur_id + '_search_fallback'])
|
||||
except:
|
||||
pass
|
||||
|
||||
try:
|
||||
newznabProviderDict[cur_id].enable_daily = config.checkbox_to_value(
|
||||
kwargs[cur_id + '_enable_daily'])
|
||||
except:
|
||||
pass
|
||||
|
||||
try:
|
||||
newznabProviderDict[cur_id].enable_backlog = config.checkbox_to_value(
|
||||
kwargs[cur_id + '_enable_backlog'])
|
||||
except:
|
||||
pass
|
||||
else:
|
||||
sickbeard.newznabProviderList.append(newProvider)
|
||||
|
||||
|
@ -2166,14 +2193,14 @@ class ConfigProviders(MainHandler):
|
|||
curTorrentProvider.enable_daily = config.checkbox_to_value(
|
||||
kwargs[curTorrentProvider.getID() + '_enable_daily'])
|
||||
except:
|
||||
curTorrentProvider.enable_daily = 0
|
||||
curTorrentProvider.enable_daily = 1
|
||||
|
||||
if hasattr(curTorrentProvider, 'enable_backlog'):
|
||||
try:
|
||||
curTorrentProvider.enable_backlog = config.checkbox_to_value(
|
||||
kwargs[curTorrentProvider.getID() + '_enable_backlog'])
|
||||
except:
|
||||
curTorrentProvider.enable_backlog = 0
|
||||
curTorrentProvider.enable_backlog = 1
|
||||
|
||||
for curNzbProvider in [curProvider for curProvider in sickbeard.providers.sortedProviderList() if
|
||||
curProvider.providerType == sickbeard.GenericProvider.NZB]:
|
||||
|
@ -2208,14 +2235,14 @@ class ConfigProviders(MainHandler):
|
|||
curNzbProvider.enable_daily = config.checkbox_to_value(
|
||||
kwargs[curNzbProvider.getID() + '_enable_daily'])
|
||||
except:
|
||||
curNzbProvider.enable_daily = 0
|
||||
curNzbProvider.enable_daily = 1
|
||||
|
||||
if hasattr(curNzbProvider, 'enable_backlog'):
|
||||
try:
|
||||
curNzbProvider.enable_backlog = config.checkbox_to_value(
|
||||
kwargs[curNzbProvider.getID() + '_enable_backlog'])
|
||||
except:
|
||||
curNzbProvider.enable_backlog = 0
|
||||
curNzbProvider.enable_backlog = 1
|
||||
|
||||
sickbeard.NEWZNAB_DATA = '!!!'.join([x.configStr() for x in sickbeard.newznabProviderList])
|
||||
sickbeard.PROVIDER_ORDER = provider_list
|
||||
|
@ -2810,8 +2837,9 @@ class NewHomeAddShows(MainHandler):
|
|||
final_results = []
|
||||
|
||||
logger.log(u"Getting recommended shows from Trakt.tv", logger.DEBUG)
|
||||
recommendedlist = TraktCall("recommendations/shows.json/%API%", sickbeard.TRAKT_API, sickbeard.TRAKT_USERNAME, sickbeard.TRAKT_PASSWORD)
|
||||
|
||||
recommendedlist = TraktCall("recommendations/shows.json/%API%", sickbeard.TRAKT_API, sickbeard.TRAKT_USERNAME,
|
||||
sickbeard.TRAKT_PASSWORD)
|
||||
|
||||
if recommendedlist == 'NULL':
|
||||
logger.log(u"No shows found in your recommendedlist, aborting recommendedlist update", logger.DEBUG)
|
||||
return
|
||||
|
@ -2821,7 +2849,8 @@ class NewHomeAddShows(MainHandler):
|
|||
return
|
||||
|
||||
map(final_results.append,
|
||||
([int(show['tvdb_id'] or 0) if sickbeard.TRAKT_DEFAULT_INDEXER == 1 else int(show['tvdb_id'] or 0), show['url'], show['title'], show['overview'],
|
||||
([int(show['tvdb_id'] or 0) if sickbeard.TRAKT_DEFAULT_INDEXER == 1 else int(show['tvdb_id'] or 0),
|
||||
show['url'], show['title'], show['overview'],
|
||||
datetime.date.fromtimestamp(int(show['first_aired']) / 1000.0).strftime('%Y%m%d')] for show in
|
||||
recommendedlist if not helpers.findCertainShow(sickbeard.showList, indexerid=int(show['tvdb_id']))))
|
||||
|
||||
|
@ -3577,7 +3606,10 @@ class Home(MainHandler):
|
|||
if not sickbeard.showQueueScheduler.action.isBeingAdded(showObj): # @UndefinedVariable
|
||||
if not sickbeard.showQueueScheduler.action.isBeingUpdated(showObj): # @UndefinedVariable
|
||||
t.submenu.append(
|
||||
{'title': 'Delete', 'path': 'home/deleteShow?show=%d' % showObj.indexerid, 'confirm': True})
|
||||
{'title': 'Delete', 'path': 'home/deleteShow?show=%d&full=1' % showObj.indexerid,
|
||||
'confirm': True})
|
||||
t.submenu.append(
|
||||
{'title': 'Remove', 'path': 'home/deleteShow?show=%d' % showObj.indexerid, 'confirm': True})
|
||||
t.submenu.append({'title': 'Re-scan files', 'path': 'home/refreshShow?show=%d' % showObj.indexerid})
|
||||
t.submenu.append(
|
||||
{'title': 'Force Full Update', 'path': 'home/updateShow?show=%d&force=1' % showObj.indexerid})
|
||||
|
@ -3909,7 +3941,7 @@ class Home(MainHandler):
|
|||
redirect("/home/displayShow?show=" + show)
|
||||
|
||||
|
||||
def deleteShow(self, show=None):
|
||||
def deleteShow(self, show=None, full=0):
|
||||
|
||||
if show is None:
|
||||
return self._genericMessage("Error", "Invalid show ID")
|
||||
|
@ -3927,7 +3959,7 @@ class Home(MainHandler):
|
|||
# remove show from trakt.tv library
|
||||
sickbeard.traktCheckerScheduler.action.removeShowFromTraktLibrary(showObj)
|
||||
|
||||
showObj.deleteShow()
|
||||
showObj.deleteShow(bool(full))
|
||||
|
||||
ui.notifications.message('<b>%s</b> has been deleted' % showObj.name)
|
||||
redirect("/home/")
|
||||
|
|
Loading…
Reference in a new issue