Skip to content

Commit

Permalink
Merge pull request #222 from pymedusa/manual_providers
Browse files Browse the repository at this point in the history
[Manual Search] Add provider setting 'Enable manual searches'
  • Loading branch information
fernandog committed Mar 28, 2016
2 parents 7e35d88 + ef92ed2 commit 5388164
Show file tree
Hide file tree
Showing 10 changed files with 271 additions and 167 deletions.
37 changes: 37 additions & 0 deletions gui/slick/views/config_providers.mako
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,18 @@ $('#config-components').tabs();
</div>
% endif
% if hasattr(curNewznabProvider, 'enable_manualsearch'):
<div class="field-pair${(' hidden', '')[curNewznabProvider.supports_backlog]}">
<label for="${curNewznabProvider.get_id()}_enable_manualsearch">
<span class="component-title">Enable manual searches</span>
<span class="component-desc">
<input type="checkbox" name="${curNewznabProvider.get_id()}_enable_manualsearch" id="${curNewznabProvider.get_id()}_enable_manualsearch" ${('', 'checked="checked"')[bool(curNewznabProvider.enable_manualsearch and curNewznabProvider.supports_backlog)]}/>
<p>enable provider to perform manual searches.</p>
</span>
</label>
</div>
% endif
% if hasattr(curNewznabProvider, 'enable_backlog'):
<div class="field-pair${(' hidden', '')[curNewznabProvider.supports_backlog]}">
<label for="${curNewznabProvider.get_id()}_enable_backlog">
Expand Down Expand Up @@ -255,6 +267,19 @@ $('#config-components').tabs();
</div>
% endif
% if hasattr(curNzbProvider, 'enable_manualsearch'):
<div class="field-pair${(' hidden', '')[curNzbProvider.supports_backlog]}">
<label for="${curNzbProvider.get_id()}_enable_manualsearch">
<span class="component-title">Enable manual searches</span>
<span class="component-desc">
<input type="checkbox" name="${curNzbProvider.get_id()}_enable_manualsearch" id="${curNzbProvider.get_id()}_enable_manualsearch" ${('', 'checked="checked"')[bool(curNzbProvider.enable_manualsearch and curNzbProvider.supports_backlog)]}/>
<p>enable provider to perform manual searches.</p>
</span>
</label>
</div>
% endif
% if hasattr(curNzbProvider, 'enable_backlog'):
<div class="field-pair${(' hidden', '')[curNzbProvider.supports_backlog]}">
<label for="${curNzbProvider.get_id()}_enable_backlog">
Expand Down Expand Up @@ -528,6 +553,18 @@ $('#config-components').tabs();
</div>
% endif
% if hasattr(curTorrentProvider, 'enable_manualsearch'):
<div class="field-pair${(' hidden', '')[curTorrentProvider.supports_backlog]}">
<label for="${curTorrentProvider.get_id()}_enable_manualsearch">
<span class="component-title">Enable manual searches</span>
<span class="component-desc">
<input type="checkbox" name="${curTorrentProvider.get_id()}_enable_manualsearch" id="${curTorrentProvider.get_id()}_enable_manualsearch" ${('', 'checked="checked"')[bool(curTorrentProvider.enable_manualsearch and curTorrentProvider.supports_backlog)]}/>
<p>enable provider to perform manual searches.</p>
</span>
</label>
</div>
% endif
% if hasattr(curTorrentProvider, 'enable_backlog'):
<div class="field-pair${(' hidden', '')[curTorrentProvider.supports_backlog]}">
<label for="${curTorrentProvider.get_id()}_enable_backlog">
Expand Down
18 changes: 17 additions & 1 deletion sickbeard/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@
CONFIG_FILE = None

# This is the version of the config we EXPECT to find
CONFIG_VERSION = 8
CONFIG_VERSION = 9

# Default encryption version (0 for None)
ENCRYPTION_VERSION = 0
Expand Down Expand Up @@ -1361,6 +1361,11 @@ def path_leaf(path):
curTorrentProvider.get_id() + '_enable_backlog',
curTorrentProvider.supports_backlog))

if hasattr(curTorrentProvider, 'enable_manualsearch'):
curTorrentProvider.enable_manualsearch = bool(check_setting_int(CFG, curTorrentProvider.get_id().upper(),
curTorrentProvider.get_id() + '_enable_manualsearch',
1))

if hasattr(curTorrentProvider, 'cat'):
curTorrentProvider.cat = check_setting_int(CFG, curTorrentProvider.get_id().upper(),
curTorrentProvider.get_id() + '_cat', 0)
Expand Down Expand Up @@ -1396,6 +1401,11 @@ def path_leaf(path):
curNzbProvider.get_id() + '_enable_backlog',
curNzbProvider.supports_backlog))

if hasattr(curNzbProvider, 'enable_manualsearch'):
curNzbProvider.enable_manualsearch = bool(check_setting_int(CFG, curNzbProvider.get_id().upper(),
curNzbProvider.get_id() + '_enable_manualsearch',
1))

if not ek(os.path.isfile, CONFIG_FILE):
logger.log(u"Unable to find '" + CONFIG_FILE + "', all settings will be default!", logger.DEBUG)
save_config()
Expand Down Expand Up @@ -1856,6 +1866,9 @@ def save_config(): # pylint: disable=too-many-statements, too-many-branches
if hasattr(curTorrentProvider, 'enable_backlog'):
new_config[curTorrentProvider.get_id().upper()][curTorrentProvider.get_id() + '_enable_backlog'] = int(
curTorrentProvider.enable_backlog)
if hasattr(curTorrentProvider, 'enable_manualsearch'):
new_config[curTorrentProvider.get_id().upper()][curTorrentProvider.get_id() + '_enable_manualsearch'] = int(
curTorrentProvider.enable_manualsearch)
if hasattr(curTorrentProvider, 'cat'):
new_config[curTorrentProvider.get_id().upper()][curTorrentProvider.get_id() + '_cat'] = int(
curTorrentProvider.cat)
Expand Down Expand Up @@ -1886,6 +1899,9 @@ def save_config(): # pylint: disable=too-many-statements, too-many-branches
if hasattr(curNzbProvider, 'enable_backlog'):
new_config[curNzbProvider.get_id().upper()][curNzbProvider.get_id() + '_enable_backlog'] = int(
curNzbProvider.enable_backlog)
if hasattr(curNzbProvider, 'enable_manualsearch'):
new_config[curNzbProvider.get_id().upper()][curNzbProvider.get_id() + '_enable_manualsearch'] = int(
curNzbProvider.enable_manualsearch)

new_config['NZBs'] = {}
new_config['NZBs']['nzbs'] = int(NZBS)
Expand Down
7 changes: 7 additions & 0 deletions sickbeard/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -915,3 +915,10 @@ def _migrate_v8(self):
sickbeard.PLEX_SERVER_USERNAME = check_setting_str(self.config_obj, 'Plex', 'plex_username', '', censor_log=True)
sickbeard.PLEX_SERVER_PASSWORD = check_setting_str(self.config_obj, 'Plex', 'plex_password', '', censor_log=True)
sickbeard.USE_PLEX_SERVER = bool(check_setting_int(self.config_obj, 'Plex', 'use_plex', 0))

def _migrate_v9(self):
"""
Migrate to config version 9
"""
# Added setting "enable_manualsearch" for providers (dynamic setting)
pass
30 changes: 18 additions & 12 deletions sickbeard/manual_snatch.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,11 @@
import time

import sickbeard
import threading
from sickbeard import search_queue
from sickbeard.common import Quality, Overview, statusStrings, cpu_presets
from sickbeard import logger, db
from sickrage.helper.common import try_int
from sickrage.helper.common import try_int, enabled_providers

from sickrage.show.Show import Show

Expand Down Expand Up @@ -170,13 +171,15 @@ def get_provider_cache_results(indexer, show_all_results=None, perform_search=No
sql_return = []
found_items = []
provider_results = {'last_prov_updates': {}, 'error': {}, 'found_items': []}
original_thread_name = threading.currentThread().name

providers = [x for x in sickbeard.providers.sortedProviderList(sickbeard.RANDOMIZE_PROVIDERS) if x.is_active() and x.enable_daily]
for curProvider in providers:

for cur_provider in enabled_providers('manualsearch'):
threading.currentThread().name = '{thread} :: [{provider}]'.format(thread=original_thread_name, provider=cur_provider.name)

# Let's check if this provider table already exists
table_exists = main_db_con.select("SELECT name FROM sqlite_master WHERE type='table' AND name=?", [curProvider.get_id()])
columns = [i[1] for i in main_db_con.select("PRAGMA table_info('%s')" % curProvider.get_id())] if table_exists else []
table_exists = main_db_con.select("SELECT name FROM sqlite_master WHERE type='table' AND name=?", [cur_provider.get_id()])
columns = [i[1] for i in main_db_con.select("PRAGMA table_info('%s')" % cur_provider.get_id())] if table_exists else []

# TODO: the implicit sqlite rowid is used, should be replaced with an explicit PK column
# If table doesn't exist, start a search to create table and new columns seeders, leechers and size
Expand All @@ -186,26 +189,26 @@ def get_provider_cache_results(indexer, show_all_results=None, perform_search=No
? as 'provider', ? as 'provider_id', name, season, \
episodes, indexerid, url, time, (select max(time) from '{provider_id}') as lastupdate, \
quality, release_group, version, seeders, leechers, size, time \
FROM '{provider_id}' WHERE indexerid = ?".format(provider_id=curProvider.get_id())
FROM '{provider_id}' WHERE indexerid = ?".format(provider_id=cur_provider.get_id())
additional_sql = " AND episodes LIKE ? AND season = ?"

if not int(show_all_results):
sql_return = main_db_con.select(common_sql + additional_sql,
(curProvider.provider_type.title(), curProvider.image_name(),
curProvider.name, curProvider.get_id(), show, "%|{0}|%".format(episode), season))
(cur_provider.provider_type.title(), cur_provider.image_name(),
cur_provider.name, cur_provider.get_id(), show, "%|{0}|%".format(episode), season))
else:
sql_return = main_db_con.select(common_sql,
(curProvider.provider_type.title(), curProvider.image_name(),
curProvider.name, curProvider.get_id(), show))
(cur_provider.provider_type.title(), cur_provider.image_name(),
cur_provider.name, cur_provider.get_id(), show))

if sql_return:
for item in sql_return:
found_items.append(dict(item))

# Store the last table update, we'll need this to compare later
provider_results['last_prov_updates'][curProvider.get_id()] = str(sql_return[0]['lastupdate'])
provider_results['last_prov_updates'][cur_provider.get_id()] = str(sql_return[0]['lastupdate'])
else:
provider_results['last_prov_updates'][curProvider.get_id()] = "0"
provider_results['last_prov_updates'][cur_provider.get_id()] = "0"

# Always start a search when no items found in cache
if not found_items or int(perform_search):
Expand All @@ -231,4 +234,7 @@ def get_provider_cache_results(indexer, show_all_results=None, perform_search=No
found_items = [d for d in found_items if try_int(d['quality']) < 32768] + [d for d in found_items if try_int(d['quality']) == 32768]
provider_results['found_items'] = found_items

# Remove provider from thread name before return results
threading.currentThread().name = original_thread_name

return provider_results
31 changes: 16 additions & 15 deletions sickbeard/properFinder.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
from sickbeard.common import DOWNLOADED, SNATCHED, SNATCHED_PROPER, Quality, cpu_presets
from sickrage.helper.exceptions import AuthException, ex
from sickrage.show.History import History
from sickrage.helper.common import enabled_providers
from sickbeard.name_parser.parser import NameParser, InvalidNameException, InvalidShowException


Expand Down Expand Up @@ -81,47 +82,47 @@ def _getProperList(self): # pylint: disable=too-many-locals, too-many-branches,
search_date = datetime.datetime.today() - datetime.timedelta(days=2)

# for each provider get a list of the
origThreadName = threading.currentThread().name
providers = [x for x in sickbeard.providers.sortedProviderList(sickbeard.RANDOMIZE_PROVIDERS) if x.is_active()]
for curProvider in providers:
threading.currentThread().name = origThreadName + " :: [" + curProvider.name + "]"
original_thread_name = threading.currentThread().name
providers = enabled_providers('backlog')
for cur_provider in providers:
threading.currentThread().name = '{thread} :: [{provider}]'.format(thread=original_thread_name, provider=cur_provider.name)

logger.log(u"Searching for any new PROPER releases from {provider}".format
(provider=curProvider.name))
(provider=cur_provider.name))

try:
curPropers = curProvider.find_propers(search_date)
curPropers = cur_provider.find_propers(search_date)
except AuthException as e:
logger.log(u"Authentication error: {error}".format
(error=ex(e)), logger.DEBUG)
continue
except (SocketTimeout, TypeError) as e:
logger.log(u"Socket time out while searching for propers in {provider}, skipping: {error}".format
(provider=curProvider.name, error=ex(e)), logger.DEBUG)
(provider=cur_provider.name, error=ex(e)), logger.DEBUG)
continue
except (requests_exceptions.HTTPError, requests_exceptions.TooManyRedirects) as e:
logger.log(u"HTTP error while searching for propers in {provider}, skipping: {error}".format
(provider=curProvider.name, error=ex(e)), logger.DEBUG)
(provider=cur_provider.name, error=ex(e)), logger.DEBUG)
continue
except requests_exceptions.ConnectionError as e:
logger.log(u"Connection error while searching for propers in {provider}, skipping: {error}".format
(provider=curProvider.name, error=ex(e)), logger.DEBUG)
(provider=cur_provider.name, error=ex(e)), logger.DEBUG)
continue
except requests_exceptions.Timeout as e:
logger.log(u"Connection timed out while searching for propers in {provider}, skipping: {error}".format
(provider=curProvider.name, error=ex(e)), logger.DEBUG)
(provider=cur_provider.name, error=ex(e)), logger.DEBUG)
continue
except requests_exceptions.ContentDecodingError as e:
logger.log(u"Content-Encoding was gzip, but content was not compressed while searching for propers in {provider}, skipping: {error}".format
(provider=curProvider.name, error=ex(e)), logger.DEBUG)
(provider=cur_provider.name, error=ex(e)), logger.DEBUG)
continue
except Exception as e:
if u'ECONNRESET' in e or (hasattr(e, 'errno') and e.errno == errno.ECONNRESET):
logger.log(u"Connection reset by peer while searching for propers in {provider}, skipping: {error}".format
(provider=curProvider.name, error=ex(e)), logger.DEBUG)
(provider=cur_provider.name, error=ex(e)), logger.DEBUG)
else:
logger.log(u"Unknown exception while searching for propers in {provider}, skipping: {error}".format
(provider=curProvider.name, error=ex(e)), logger.DEBUG)
(provider=cur_provider.name, error=ex(e)), logger.DEBUG)
logger.log(traceback.format_exc(), logger.DEBUG)
continue

Expand All @@ -135,10 +136,10 @@ def _getProperList(self): # pylint: disable=too-many-locals, too-many-branches,
if name not in propers:
logger.log(u'Found new proper result: {name}'.format
(name=proper.name), logger.DEBUG)
proper.provider = curProvider
proper.provider = cur_provider
propers[name] = proper

threading.currentThread().name = origThreadName
threading.currentThread().name = original_thread_name

# take the list of unique propers and get it sorted by
sortedPropers = sorted(propers.values(), key=operator.attrgetter('date'), reverse=True)
Expand Down
Loading

0 comments on commit 5388164

Please sign in to comment.