def test_clean_url(self):
        """
        Test cleaning of urls
        """
        log = logging.getLogger(__name__)
        test = namedtuple('test', 'expected_result dirty clean')

        url_tests = [
            test(True, "https://subdomain.domain.tld/endpoint", "https://subdomain.domain.tld/endpoint"),  # does not add a final /
            test(True, "http://www.example.com/folder/", "http://www.example.com/folder/"),  # does not remove the final /
            test(True, "google.com/xml.rpc", "http://google.com/xml.rpc"),  # add scheme if missing
            test(True, "google.com", "http://google.com/"),  # add scheme if missing and final / if its just the domain
            test(True, "scgi:///home/user/.config/path/socket", "scgi:///home/user/.config/path/socket"),  # scgi identified as scheme
            test(True, None, ''),  # None URL returns empty string
            test(False, "https://subdomain.domain.tld/endpoint", "http://subdomain.domain.tld/endpoint"),  # does not change schemes from https to http
            test(False, "http://subdomain.domain.tld/endpoint", "https://subdomain.domain.tld/endpoint"),  # ...or vice versa
            test(False, "google.com/xml.rpc", "google.com/xml.rpc"),  # scheme is always added
            test(False, "google.com", "https://google.com/"),  # does not default to https
            test(False, "http://www.example.com/folder/", "http://www.example.com/folder"),  # does not strip final /
            test(False, "scgi:///home/user/.config/path/socket", "scgi:///home/user/.config/path/socket/"),  # does not add a final /
            test(AttributeError, 1, 1),  # None URL returns empty string
        ]

        for test_url in url_tests:
            if issubclass(type(Exception), type(test_url.expected_result)):
                with self.assertRaises(test_url.expected_result):
                    self.assertEqual(config.clean_url(test_url.dirty), test_url.clean)
            elif test_url.expected_result is True:
                self.assertEqual(config.clean_url(test_url.dirty), test_url.clean)
            elif test_url.expected_result is False:
                self.assertNotEqual(config.clean_url(test_url.dirty), test_url.clean)
            else:
                log.error('Test not defined for %s', test_url)
Exemple #2
0
    def test_clean_url(self):
        """
        Test cleaning of urls
        """
        log = logging.getLogger(__name__)
        test = namedtuple('test', 'expected_result dirty clean')

        url_tests = [
            test(True, "https://subdomain.domain.tld/endpoint", "https://subdomain.domain.tld/endpoint"),  # does not add a final /
            test(True, "http://www.example.com/folder/", "http://www.example.com/folder/"),  # does not remove the final /
            test(True, "google.com/xml.rpc", "http://google.com/xml.rpc"),  # add scheme if missing
            test(True, "google.com", "http://google.com/"),  # add scheme if missing and final / if its just the domain
            test(True, "scgi:///home/user/.config/path/socket", "scgi:///home/user/.config/path/socket"),  # scgi identified as scheme
            test(True, None, ''),  # None URL returns empty string
            test(False, "https://subdomain.domain.tld/endpoint", "http://subdomain.domain.tld/endpoint"),  # does not change schemes from https to http
            test(False, "http://subdomain.domain.tld/endpoint", "https://subdomain.domain.tld/endpoint"),  # ...or vice versa
            test(False, "google.com/xml.rpc", "google.com/xml.rpc"),  # scheme is always added
            test(False, "google.com", "https://google.com/"),  # does not default to https
            test(False, "http://www.example.com/folder/", "http://www.example.com/folder"),  # does not strip final /
            test(False, "scgi:///home/user/.config/path/socket", "scgi:///home/user/.config/path/socket/"),  # does not add a final /
            test(AttributeError, 1, 1),  # None URL returns empty string
        ]

        for test_url in url_tests:
            if issubclass(type(Exception), type(test_url.expected_result)):
                with self.assertRaises(test_url.expected_result):
                    self.assertEqual(config.clean_url(test_url.dirty), test_url.clean)
            elif test_url.expected_result is True:
                self.assertEqual(config.clean_url(test_url.dirty), test_url.clean)
            elif test_url.expected_result is False:
                self.assertNotEqual(config.clean_url(test_url.dirty), test_url.clean)
            else:
                log.error('Test not defined for %s', test_url)
Exemple #3
0
 def test_clean_url(self):
     self.assertEqual(config.clean_url("https://subdomain.domain.tld/endpoint"),
                      "https://subdomain.domain.tld/endpoint")
     self.assertEqual(config.clean_url("google.com/xml.rpc"), "http://google.com/xml.rpc")
     self.assertEqual(config.clean_url("google.com"), "http://google.com/")
     self.assertEqual(config.clean_url("http://www.example.com/folder/"), "http://www.example.com/folder/")
     self.assertEqual(config.clean_url("scgi:///home/user/.config/path/socket"),
                      "scgi:///home/user/.config/path/socket")
Exemple #4
0
 def test_clean_url(self):
     self.assertEqual(
         config.clean_url("https://subdomain.domain.tld/endpoint"), "https://subdomain.domain.tld/endpoint"
     )
     self.assertEqual(config.clean_url("google.com/xml.rpc"), "http://google.com/xml.rpc")
     self.assertEqual(config.clean_url("google.com"), "http://google.com/")
     self.assertEqual(config.clean_url("http://www.example.com/folder/"), "http://www.example.com/folder/")
     self.assertEqual(
         config.clean_url("scgi:///home/user/.config/path/socket"), "scgi:///home/user/.config/path/socket"
     )
Exemple #5
0
    def saveNewznabProvider(name, url, key=''):
        """
        Save a Newznab Provider
        """

        if not name or not url:
            return '0'

        provider_dict = dict(zip([x.name for x in sickbeard.newznabProviderList], sickbeard.newznabProviderList))

        if name in provider_dict:
            if not provider_dict[name].default:
                provider_dict[name].name = name
                provider_dict[name].url = config.clean_url(url)

            provider_dict[name].key = key
            # a 0 in the key spot indicates that no key is needed
            if key == '0':
                provider_dict[name].needs_auth = False
            else:
                provider_dict[name].needs_auth = True

            return '|'.join([provider_dict[name].get_id(), provider_dict[name].configStr()])

        else:
            new_provider = newznab.NewznabProvider(name, url, key=key)
            sickbeard.newznabProviderList.append(new_provider)
            return '|'.join([new_provider.get_id(), new_provider.configStr()])
Exemple #6
0
def sendNZB(nzb):

    if not sickbeard.NZBGET_HOST:
        logger.log(
            u"No NZBGet host found in configuration. Please configure it.",
            logger.ERROR)
        return False

    nzb_filename = nzb.name + ".nzb"

    try:
        url = config.clean_url(sickbeard.NZBGET_HOST)

        scheme, netloc, path, query, fragment = urlparse.urlsplit(
            url)  # @UnusedVariable

        if sickbeard.NZBGET_USERNAME or sickbeard.NZBGET_PASSWORD:
            netloc = urllib.quote_plus(
                sickbeard.NZBGET_USERNAME.encode(
                    "utf-8", 'ignore')) + u":" + urllib.quote_plus(
                        sickbeard.NZBGET_PASSWORD.encode(
                            "utf-8", 'ignore')) + u"@" + netloc

        url = urlparse.urlunsplit((scheme, netloc, u"/xmlrpc", "", ""))

        logger.log(u"Sending NZB to NZBGet")
        logger.log(u"NZBGet URL: " + url, logger.DEBUG)

        nzbGetRPC = xmlrpclib.ServerProxy(url.encode("utf-8", 'ignore'))

        if nzbGetRPC.writelog(
                "INFO", "SickBeard connected to drop off " + nzb_filename +
                " any moment now."):
            logger.log(u"Successful connected to NZBGet", logger.DEBUG)
        else:
            logger.log(
                u"Successful connected to NZBGet, but unable to send a message",
                logger.ERROR)

    except httplib.socket.error:
        logger.log(
            u"Please check if NZBGet is running. NZBGet is not responding.",
            logger.ERROR)
        return False

    except xmlrpclib.ProtocolError, e:
        if (e.errmsg == "Unauthorized"):
            logger.log(u"NZBGet username or password is incorrect.",
                       logger.ERROR)
        else:
            logger.log(u"NZBGet protocol error: " + e.errmsg, logger.ERROR)
        return False
Exemple #7
0
def sendNZB(nzb):

    addToTop = False
    nzbgetprio = 0

    if sickbeard.NZBGET_HOST == None:
        logger.log(
            u"No NZBGet host found in configuration. Please configure it.",
            logger.ERROR)
        return False

    url = config.clean_url(sickbeard.NZBGET_HOST)

    if sickbeard.NZBGET_USERNAME or sickbeard.NZBGET_PASSWORD:
        scheme, netloc, path, query, fragment = urlparse.urlsplit(url)
        netloc = sickbeard.NZBGET_USERNAME + ":" + sickbeard.NZBGET_PASSWORD + "@" + netloc
        url = urlparse.urlunsplit((scheme, netloc, path, query, fragment))

    url = urlparse.urljoin(url, "/xmlrpc")

    try:
        nzbGetRPC = xmlrpclib.ServerProxy(url)

        if nzbGetRPC.writelog(
                "INFO", "SickBeard connected to drop off " + nzb.name +
                ".nzb" + " any moment now."):
            logger.log(u"Successful connected to NZBGet", logger.DEBUG)

        else:
            logger.log(
                u"Successful connected to NZBGet, but unable to send a message",
                logger.ERROR)

    except httplib.socket.error:
        logger.log(
            u"Please check if NZBGet is running. NZBGet is not responding.",
            logger.ERROR)
        return False

    except xmlrpclib.ProtocolError, e:
        if (e.errmsg == "Unauthorized"):
            logger.log(u"NZBGet username or password is incorrect.",
                       logger.ERROR)

        else:
            logger.log(u"Protocol Error: " + e.errmsg, logger.ERROR)

        return False
Exemple #8
0
    def canAddTorrentRssProvider(name, url, cookies, titleTAG):

        if not name:
            return json.dumps({'error': 'Invalid name specified'})

        url = config.clean_url(url)
        tempProvider = rsstorrent.TorrentRssProvider(name, url, cookies, titleTAG)

        if tempProvider.get_id() in (x.get_id() for x in sickbeard.torrentRssProviderList):
            return json.dumps({'error': 'Exists as ' + tempProvider.name})
        else:
            (succ, errMsg) = tempProvider.validateRSS()
            if succ:
                return json.dumps({'success': tempProvider.get_id()})
            else:
                return json.dumps({'error': errMsg})
Exemple #9
0
def sendNZB(nzb):

    if not sickbeard.NZBGET_HOST:
        logger.log(u"No NZBGet host found in configuration. Please configure it.", logger.ERROR)
        return False

    nzb_filename = nzb.name + ".nzb"

    try:
        url = config.clean_url(sickbeard.NZBGET_HOST)

        scheme, netloc, path, query, fragment = urlparse.urlsplit(url)  # @UnusedVariable

        if sickbeard.NZBGET_USERNAME or sickbeard.NZBGET_PASSWORD:
            netloc = (
                urllib.quote_plus(sickbeard.NZBGET_USERNAME.encode("utf-8", "ignore"))
                + u":"
                + urllib.quote_plus(sickbeard.NZBGET_PASSWORD.encode("utf-8", "ignore"))
                + u"@"
                + netloc
            )

        url = urlparse.urlunsplit((scheme, netloc, u"/xmlrpc", "", ""))

        logger.log(u"Sending NZB to NZBGet")
        logger.log(u"NZBGet URL: " + url, logger.DEBUG)

        nzbGetRPC = xmlrpclib.ServerProxy(url.encode("utf-8", "ignore"))

        if nzbGetRPC.writelog("INFO", "SickBeard connected to drop off " + nzb_filename + " any moment now."):
            logger.log(u"Successful connected to NZBGet", logger.DEBUG)
        else:
            logger.log(u"Successful connected to NZBGet, but unable to send a message", logger.ERROR)

    except httplib.socket.error:
        logger.log(u"Please check if NZBGet is running. NZBGet is not responding.", logger.ERROR)
        return False

    except xmlrpclib.ProtocolError, e:
        if e.errmsg == "Unauthorized":
            logger.log(u"NZBGet username or password is incorrect.", logger.ERROR)
        else:
            logger.log(u"NZBGet protocol error: " + e.errmsg, logger.ERROR)
        return False
Exemple #10
0
def sendNZB(nzb):

    addToTop = False
    nzbgetprio = 0

    if sickbeard.NZBGET_HOST == None:
        logger.log(u"No NZBGet host found in configuration. Please configure it.", logger.ERROR)
        return False

    url = config.clean_url(sickbeard.NZBGET_HOST)

    if sickbeard.NZBGET_USERNAME or sickbeard.NZBGET_PASSWORD:
        scheme, netloc, path, query, fragment = urlparse.urlsplit(url)
        netloc = sickbeard.NZBGET_USERNAME + ":" + sickbeard.NZBGET_PASSWORD + "@" + netloc
        url = urlparse.urlunsplit((scheme, netloc, path, query, fragment))

    url = urlparse.urljoin(url, "/xmlrpc")

    try:
        nzbGetRPC = xmlrpclib.ServerProxy(url)

        if nzbGetRPC.writelog("INFO", "SickBeard connected to drop off " + nzb.name + ".nzb" + " any moment now."):
            logger.log(u"Successful connected to NZBGet", logger.DEBUG)

        else:
            logger.log(u"Successful connected to NZBGet, but unable to send a message", logger.ERROR)

    except httplib.socket.error:
        logger.log(u"Please check if NZBGet is running. NZBGet is not responding.", logger.ERROR)
        return False

    except xmlrpclib.ProtocolError, e:
        if (e.errmsg == "Unauthorized"):
            logger.log(u"NZBGet username or password is incorrect.", logger.ERROR)

        else:
            logger.log(u"Protocol Error: " + e.errmsg, logger.ERROR)

        return False
Exemple #11
0
    def saveTorrentRssProvider(name, url, cookies, titleTAG):
        """
        Save a Torrent Provider
        """

        if not name or not url:
            return '0'

        provider_dict = dict(zip([x.name for x in sickbeard.torrentRssProviderList], sickbeard.torrentRssProviderList))

        if name in provider_dict:
            provider_dict[name].name = name
            provider_dict[name].url = config.clean_url(url)
            provider_dict[name].cookies = cookies
            provider_dict[name].titleTAG = titleTAG

            return '|'.join([provider_dict[name].get_id(), provider_dict[name].configStr()])

        else:
            new_provider = rsstorrent.TorrentRssProvider(name, url, cookies, titleTAG)
            sickbeard.torrentRssProviderList.append(new_provider)
            return '|'.join([new_provider.get_id(), new_provider.configStr()])
Exemple #12
0
    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_category_anime=None,
                   sab_category_backlog=None,
                   sab_category_anime_backlog=None,
                   sab_host=None,
                   nzbget_username=None,
                   nzbget_password=None,
                   nzbget_category=None,
                   nzbget_category_backlog=None,
                   nzbget_category_anime=None,
                   nzbget_category_anime_backlog=None,
                   nzbget_priority=None,
                   nzbget_host=None,
                   nzbget_use_https=None,
                   backlog_days=None,
                   backlog_frequency=None,
                   dailysearch_frequency=None,
                   nzb_method=None,
                   torrent_method=None,
                   usenet_retention=None,
                   download_propers=None,
                   check_propers_interval=None,
                   allow_high_priority=None,
                   sab_forced=None,
                   randomize_providers=None,
                   use_failed_downloads=None,
                   delete_failed=None,
                   backlog_missing_only=None,
                   torrent_dir=None,
                   torrent_username=None,
                   torrent_password=None,
                   torrent_host=None,
                   torrent_label=None,
                   torrent_label_anime=None,
                   torrent_path=None,
                   torrent_download_dir_deluge=None,
                   torrent_complete_dir_deluge=None,
                   torrent_verify_cert=None,
                   torrent_seed_time=None,
                   torrent_paused=None,
                   torrent_high_bandwidth=None,
                   torrent_rpcurl=None,
                   torrent_auth_type=None,
                   ignore_words=None,
                   trackers_list=None,
                   require_words=None,
                   ignored_subs_list=None,
                   syno_dsm_host=None,
                   syno_dsm_user=None,
                   syno_dsm_pass=None,
                   syno_dsm_path=None,
                   quality_allow_hevc=False,
                   prefer_words=None):

        results = []

        if not config.change_nzb_dir(nzb_dir):
            results += [
                "Unable to create directory " + ek(os.path.normpath, nzb_dir) +
                ", dir not changed."
            ]

        if not config.change_torrent_dir(torrent_dir):
            results += [
                "Unable to create directory " +
                ek(os.path.normpath, torrent_dir) + ", dir not changed."
            ]

        config.change_daily_search_frequency(dailysearch_frequency)

        config.change_backlog_frequency(backlog_frequency)
        sickbeard.BACKLOG_DAYS = try_int(backlog_days, 7)

        sickbeard.USE_NZBS = config.checkbox_to_value(use_nzbs)
        sickbeard.USE_TORRENTS = config.checkbox_to_value(use_torrents)

        sickbeard.NZB_METHOD = nzb_method
        sickbeard.TORRENT_METHOD = torrent_method
        sickbeard.USENET_RETENTION = try_int(usenet_retention, 500)

        sickbeard.IGNORE_WORDS = ignore_words if ignore_words else ""
        sickbeard.TRACKERS_LIST = trackers_list if trackers_list else ""
        sickbeard.REQUIRE_WORDS = require_words if require_words else ""
        sickbeard.PREFER_WORDS = prefer_words if prefer_words else ""
        sickbeard.IGNORED_SUBS_LIST = ignored_subs_list if ignored_subs_list else ""

        sickbeard.RANDOMIZE_PROVIDERS = config.checkbox_to_value(
            randomize_providers)

        config.change_download_propers(download_propers)

        sickbeard.CHECK_PROPERS_INTERVAL = check_propers_interval

        sickbeard.ALLOW_HIGH_PRIORITY = config.checkbox_to_value(
            allow_high_priority)
        sickbeard.QUALITY_ALLOW_HEVC = config.checkbox_to_value(
            quality_allow_hevc)

        sickbeard.USE_FAILED_DOWNLOADS = config.checkbox_to_value(
            use_failed_downloads)
        sickbeard.DELETE_FAILED = config.checkbox_to_value(delete_failed)

        sickbeard.BACKLOG_MISSING_ONLY = config.checkbox_to_value(
            backlog_missing_only)

        sickbeard.SAB_USERNAME = sab_username
        sickbeard.SAB_PASSWORD = filters.unhide(sickbeard.SAB_PASSWORD,
                                                sab_password)
        sickbeard.SAB_APIKEY = filters.unhide(sickbeard.SAB_APIKEY,
                                              sab_apikey.strip())
        sickbeard.SAB_CATEGORY = sab_category
        sickbeard.SAB_CATEGORY_BACKLOG = sab_category_backlog
        sickbeard.SAB_CATEGORY_ANIME = sab_category_anime
        sickbeard.SAB_CATEGORY_ANIME_BACKLOG = sab_category_anime_backlog
        sickbeard.SAB_HOST = config.clean_url(sab_host)
        sickbeard.SAB_FORCED = config.checkbox_to_value(sab_forced)

        sickbeard.NZBGET_USERNAME = nzbget_username
        sickbeard.NZBGET_PASSWORD = filters.unhide(sickbeard.NZBGET_PASSWORD,
                                                   nzbget_password)
        sickbeard.NZBGET_CATEGORY = nzbget_category
        sickbeard.NZBGET_CATEGORY_BACKLOG = nzbget_category_backlog
        sickbeard.NZBGET_CATEGORY_ANIME = nzbget_category_anime
        sickbeard.NZBGET_CATEGORY_ANIME_BACKLOG = nzbget_category_anime_backlog
        sickbeard.NZBGET_HOST = config.clean_host(nzbget_host)
        sickbeard.NZBGET_USE_HTTPS = config.checkbox_to_value(nzbget_use_https)
        sickbeard.NZBGET_PRIORITY = try_int(nzbget_priority, 100)

        sickbeard.TORRENT_USERNAME = torrent_username
        sickbeard.TORRENT_PASSWORD = filters.unhide(sickbeard.TORRENT_PASSWORD,
                                                    torrent_password)
        sickbeard.TORRENT_LABEL = torrent_label
        sickbeard.TORRENT_LABEL_ANIME = torrent_label_anime
        sickbeard.TORRENT_VERIFY_CERT = config.checkbox_to_value(
            torrent_verify_cert)

        sickbeard.TORRENT_PATH = torrent_path.rstrip('/\\')
        sickbeard.TORRENT_DELUGE_DOWNLOAD_DIR = torrent_download_dir_deluge.rstrip(
            '/\\')
        sickbeard.TORRENT_DELUGE_COMPLETE_DIR = torrent_complete_dir_deluge.rstrip(
            '/\\')

        sickbeard.TORRENT_SEED_TIME = torrent_seed_time
        sickbeard.TORRENT_PAUSED = config.checkbox_to_value(torrent_paused)
        sickbeard.TORRENT_HIGH_BANDWIDTH = config.checkbox_to_value(
            torrent_high_bandwidth)
        sickbeard.TORRENT_HOST = config.clean_url(torrent_host)
        sickbeard.TORRENT_RPCURL = torrent_rpcurl
        sickbeard.TORRENT_AUTH_TYPE = torrent_auth_type

        sickbeard.SYNOLOGY_DSM_HOST = config.clean_url(syno_dsm_host)
        sickbeard.SYNOLOGY_DSM_USERNAME = syno_dsm_user
        sickbeard.SYNOLOGY_DSM_PASSWORD = filters.unhide(
            sickbeard.SYNOLOGY_DSM_PASSWORD, syno_dsm_pass)
        sickbeard.SYNOLOGY_DSM_PATH = syno_dsm_path.rstrip('/\\')

        # This is a PITA, but lets merge the settings if they only set DSM up in one section to save them some time
        if sickbeard.TORRENT_METHOD == 'download_station':
            if not sickbeard.SYNOLOGY_DSM_HOST:
                sickbeard.SYNOLOGY_DSM_HOST = sickbeard.TORRENT_HOST
            if not sickbeard.SYNOLOGY_DSM_USERNAME:
                sickbeard.SYNOLOGY_DSM_USERNAME = sickbeard.TORRENT_USERNAME
            if not sickbeard.SYNOLOGY_DSM_PASSWORD:
                sickbeard.SYNOLOGY_DSM_PASSWORD = sickbeard.TORRENT_PASSWORD
            if not sickbeard.SYNOLOGY_DSM_PATH:
                sickbeard.SYNOLOGY_DSM_PATH = sickbeard.TORRENT_PATH

        if sickbeard.NZB_METHOD == 'download_station':
            if not sickbeard.TORRENT_HOST:
                sickbeard.TORRENT_HOST = sickbeard.SYNOLOGY_DSM_HOST
            if not sickbeard.TORRENT_USERNAME:
                sickbeard.TORRENT_USERNAME = sickbeard.SYNOLOGY_DSM_USERNAME
            if not sickbeard.TORRENT_PASSWORD:
                sickbeard.TORRENT_PASSWORD = sickbeard.SYNOLOGY_DSM_PASSWORD
            if not sickbeard.TORRENT_PATH:
                sickbeard.TORRENT_PATH = sickbeard.SYNOLOGY_DSM_PATH

        helpers.manage_torrents_url(reset=True)

        sickbeard.save_config()

        if len(results) > 0:
            for x in results:
                logger.log(x, logger.ERROR)
            ui.notifications.error(_('Error(s) Saving Configuration'),
                                   '<br>\n'.join(results))
        else:
            ui.notifications.message(_('Configuration Saved'),
                                     ek(os.path.join, sickbeard.CONFIG_FILE))

        return self.redirect("/config/search/")
Exemple #13
0
    def saveNotifications(self,
                          use_kodi=None,
                          kodi_always_on=None,
                          kodi_notify_onsnatch=None,
                          kodi_notify_ondownload=None,
                          kodi_notify_onsubtitledownload=None,
                          kodi_update_onlyfirst=None,
                          kodi_update_library=None,
                          kodi_update_full=None,
                          kodi_host=None,
                          kodi_username=None,
                          kodi_password=None,
                          use_plex_server=None,
                          plex_notify_onsnatch=None,
                          plex_notify_ondownload=None,
                          plex_notify_onsubtitledownload=None,
                          plex_update_library=None,
                          plex_server_host=None,
                          plex_server_token=None,
                          plex_client_host=None,
                          plex_server_username=None,
                          plex_server_password=None,
                          use_plex_client=None,
                          plex_client_username=None,
                          plex_client_password=None,
                          plex_server_https=None,
                          use_emby=None,
                          emby_host=None,
                          emby_apikey=None,
                          use_growl=None,
                          growl_notify_onsnatch=None,
                          growl_notify_ondownload=None,
                          growl_notify_onsubtitledownload=None,
                          growl_host=None,
                          growl_password=None,
                          use_freemobile=None,
                          freemobile_notify_onsnatch=None,
                          freemobile_notify_ondownload=None,
                          freemobile_notify_onsubtitledownload=None,
                          freemobile_id=None,
                          freemobile_apikey=None,
                          use_telegram=None,
                          telegram_notify_onsnatch=None,
                          telegram_notify_ondownload=None,
                          telegram_notify_onsubtitledownload=None,
                          telegram_id=None,
                          telegram_apikey=None,
                          use_join=None,
                          join_notify_onsnatch=None,
                          join_notify_ondownload=None,
                          join_notify_onsubtitledownload=None,
                          join_id=None,
                          join_apikey=None,
                          use_prowl=None,
                          prowl_notify_onsnatch=None,
                          prowl_notify_ondownload=None,
                          prowl_notify_onsubtitledownload=None,
                          prowl_api=None,
                          prowl_priority=0,
                          prowl_show_list=None,
                          prowl_show=None,
                          prowl_message_title=None,
                          use_twitter=None,
                          twitter_notify_onsnatch=None,
                          twitter_notify_ondownload=None,
                          twitter_notify_onsubtitledownload=None,
                          twitter_usedm=None,
                          twitter_dmto=None,
                          use_twilio=None,
                          twilio_notify_onsnatch=None,
                          twilio_notify_ondownload=None,
                          twilio_notify_onsubtitledownload=None,
                          twilio_phone_sid=None,
                          twilio_account_sid=None,
                          twilio_auth_token=None,
                          twilio_to_number=None,
                          use_boxcar2=None,
                          boxcar2_notify_onsnatch=None,
                          boxcar2_notify_ondownload=None,
                          boxcar2_notify_onsubtitledownload=None,
                          boxcar2_accesstoken=None,
                          use_pushover=None,
                          pushover_notify_onsnatch=None,
                          pushover_notify_ondownload=None,
                          pushover_notify_onsubtitledownload=None,
                          pushover_userkey=None,
                          pushover_apikey=None,
                          pushover_device=None,
                          pushover_sound=None,
                          pushover_priority=0,
                          use_libnotify=None,
                          libnotify_notify_onsnatch=None,
                          libnotify_notify_ondownload=None,
                          libnotify_notify_onsubtitledownload=None,
                          use_nmj=None,
                          nmj_host=None,
                          nmj_database=None,
                          nmj_mount=None,
                          use_synoindex=None,
                          use_nmjv2=None,
                          nmjv2_host=None,
                          nmjv2_dbloc=None,
                          nmjv2_database=None,
                          use_trakt=None,
                          trakt_username=None,
                          trakt_pin=None,
                          trakt_remove_watchlist=None,
                          trakt_sync_watchlist=None,
                          trakt_remove_show_from_sickchill=None,
                          trakt_method_add=None,
                          trakt_start_paused=None,
                          trakt_use_recommended=None,
                          trakt_sync=None,
                          trakt_sync_remove=None,
                          trakt_default_indexer=None,
                          trakt_remove_serieslist=None,
                          trakt_timeout=None,
                          trakt_blacklist_name=None,
                          use_synologynotifier=None,
                          synologynotifier_notify_onsnatch=None,
                          synologynotifier_notify_ondownload=None,
                          synologynotifier_notify_onsubtitledownload=None,
                          use_pytivo=None,
                          pytivo_notify_onsnatch=None,
                          pytivo_notify_ondownload=None,
                          pytivo_notify_onsubtitledownload=None,
                          pytivo_update_library=None,
                          pytivo_host=None,
                          pytivo_share_name=None,
                          pytivo_tivo_name=None,
                          use_pushalot=None,
                          pushalot_notify_onsnatch=None,
                          pushalot_notify_ondownload=None,
                          pushalot_notify_onsubtitledownload=None,
                          pushalot_authorizationtoken=None,
                          use_pushbullet=None,
                          pushbullet_notify_onsnatch=None,
                          pushbullet_notify_ondownload=None,
                          pushbullet_notify_onsubtitledownload=None,
                          pushbullet_api=None,
                          pushbullet_device=None,
                          pushbullet_device_list=None,
                          pushbullet_channel_list=None,
                          pushbullet_channel=None,
                          use_email=None,
                          email_notify_onsnatch=None,
                          email_notify_ondownload=None,
                          email_notify_onpostprocess=None,
                          email_notify_onsubtitledownload=None,
                          email_host=None,
                          email_port=25,
                          email_from=None,
                          email_tls=None,
                          email_user=None,
                          email_password=None,
                          email_list=None,
                          email_subject=None,
                          email_show_list=None,
                          email_show=None,
                          use_slack=False,
                          slack_notify_snatch=None,
                          slack_notify_download=None,
                          slack_notify_subtitledownload=None,
                          slack_webhook=None,
                          slack_icon_emoji=None,
                          use_matrix=False,
                          matrix_notify_snatch=None,
                          matrix_notify_download=None,
                          matrix_notify_subtitledownload=None,
                          matrix_api_token=None,
                          matrix_server=None,
                          matrix_room=None,
                          use_discord=False,
                          discord_notify_snatch=None,
                          discord_notify_download=None,
                          discord_webhook=None,
                          discord_name=None,
                          discord_avatar_url=None,
                          discord_tts=False):

        results = []

        sickbeard.USE_KODI = config.checkbox_to_value(use_kodi)
        sickbeard.KODI_ALWAYS_ON = config.checkbox_to_value(kodi_always_on)
        sickbeard.KODI_NOTIFY_ONSNATCH = config.checkbox_to_value(
            kodi_notify_onsnatch)
        sickbeard.KODI_NOTIFY_ONDOWNLOAD = config.checkbox_to_value(
            kodi_notify_ondownload)
        sickbeard.KODI_NOTIFY_ONSUBTITLEDOWNLOAD = config.checkbox_to_value(
            kodi_notify_onsubtitledownload)
        sickbeard.KODI_UPDATE_LIBRARY = config.checkbox_to_value(
            kodi_update_library)
        sickbeard.KODI_UPDATE_FULL = config.checkbox_to_value(kodi_update_full)
        sickbeard.KODI_UPDATE_ONLYFIRST = config.checkbox_to_value(
            kodi_update_onlyfirst)
        sickbeard.KODI_HOST = config.clean_hosts(kodi_host)
        sickbeard.KODI_USERNAME = kodi_username
        sickbeard.KODI_PASSWORD = filters.unhide(sickbeard.KODI_PASSWORD,
                                                 kodi_password)

        sickbeard.USE_PLEX_SERVER = config.checkbox_to_value(use_plex_server)
        sickbeard.PLEX_NOTIFY_ONSNATCH = config.checkbox_to_value(
            plex_notify_onsnatch)
        sickbeard.PLEX_NOTIFY_ONDOWNLOAD = config.checkbox_to_value(
            plex_notify_ondownload)
        sickbeard.PLEX_NOTIFY_ONSUBTITLEDOWNLOAD = config.checkbox_to_value(
            plex_notify_onsubtitledownload)
        sickbeard.PLEX_UPDATE_LIBRARY = config.checkbox_to_value(
            plex_update_library)
        sickbeard.PLEX_CLIENT_HOST = config.clean_hosts(plex_client_host)
        sickbeard.PLEX_SERVER_HOST = config.clean_hosts(plex_server_host)
        sickbeard.PLEX_SERVER_TOKEN = config.clean_host(plex_server_token)
        sickbeard.PLEX_SERVER_USERNAME = plex_server_username
        sickbeard.PLEX_SERVER_PASSWORD = filters.unhide(
            sickbeard.PLEX_SERVER_PASSWORD, plex_server_password)

        sickbeard.USE_PLEX_CLIENT = config.checkbox_to_value(use_plex_client)
        sickbeard.PLEX_CLIENT_USERNAME = plex_client_username
        sickbeard.PLEX_CLIENT_PASSWORD = filters.unhide(
            sickbeard.PLEX_CLIENT_PASSWORD, plex_client_password)
        sickbeard.PLEX_SERVER_HTTPS = config.checkbox_to_value(
            plex_server_https)

        sickbeard.USE_EMBY = config.checkbox_to_value(use_emby)
        sickbeard.EMBY_HOST = config.clean_url(emby_host)
        sickbeard.EMBY_APIKEY = filters.unhide(sickbeard.EMBY_APIKEY,
                                               emby_apikey)

        sickbeard.USE_GROWL = config.checkbox_to_value(use_growl)
        sickbeard.GROWL_NOTIFY_ONSNATCH = config.checkbox_to_value(
            growl_notify_onsnatch)
        sickbeard.GROWL_NOTIFY_ONDOWNLOAD = config.checkbox_to_value(
            growl_notify_ondownload)
        sickbeard.GROWL_NOTIFY_ONSUBTITLEDOWNLOAD = config.checkbox_to_value(
            growl_notify_onsubtitledownload)
        sickbeard.GROWL_HOST = config.clean_host(growl_host,
                                                 default_port=23053)
        sickbeard.GROWL_PASSWORD = filters.unhide(sickbeard.GROWL_PASSWORD,
                                                  growl_password)

        sickbeard.USE_FREEMOBILE = config.checkbox_to_value(use_freemobile)
        sickbeard.FREEMOBILE_NOTIFY_ONSNATCH = config.checkbox_to_value(
            freemobile_notify_onsnatch)
        sickbeard.FREEMOBILE_NOTIFY_ONDOWNLOAD = config.checkbox_to_value(
            freemobile_notify_ondownload)
        sickbeard.FREEMOBILE_NOTIFY_ONSUBTITLEDOWNLOAD = config.checkbox_to_value(
            freemobile_notify_onsubtitledownload)
        sickbeard.FREEMOBILE_ID = freemobile_id
        sickbeard.FREEMOBILE_APIKEY = filters.unhide(
            sickbeard.FREEMOBILE_APIKEY, freemobile_apikey)

        sickbeard.USE_TELEGRAM = config.checkbox_to_value(use_telegram)
        sickbeard.TELEGRAM_NOTIFY_ONSNATCH = config.checkbox_to_value(
            telegram_notify_onsnatch)
        sickbeard.TELEGRAM_NOTIFY_ONDOWNLOAD = config.checkbox_to_value(
            telegram_notify_ondownload)
        sickbeard.TELEGRAM_NOTIFY_ONSUBTITLEDOWNLOAD = config.checkbox_to_value(
            telegram_notify_onsubtitledownload)
        sickbeard.TELEGRAM_ID = telegram_id
        sickbeard.TELEGRAM_APIKEY = filters.unhide(sickbeard.TELEGRAM_APIKEY,
                                                   telegram_apikey)

        sickbeard.USE_JOIN = config.checkbox_to_value(use_join)
        sickbeard.JOIN_NOTIFY_ONSNATCH = config.checkbox_to_value(
            join_notify_onsnatch)
        sickbeard.JOIN_NOTIFY_ONDOWNLOAD = config.checkbox_to_value(
            join_notify_ondownload)
        sickbeard.JOIN_NOTIFY_ONSUBTITLEDOWNLOAD = config.checkbox_to_value(
            join_notify_onsubtitledownload)
        sickbeard.JOIN_ID = join_id
        sickbeard.JOIN_APIKEY = filters.unhide(sickbeard.JOIN_APIKEY,
                                               join_apikey)

        sickbeard.USE_PROWL = config.checkbox_to_value(use_prowl)
        sickbeard.PROWL_NOTIFY_ONSNATCH = config.checkbox_to_value(
            prowl_notify_onsnatch)
        sickbeard.PROWL_NOTIFY_ONDOWNLOAD = config.checkbox_to_value(
            prowl_notify_ondownload)
        sickbeard.PROWL_NOTIFY_ONSUBTITLEDOWNLOAD = config.checkbox_to_value(
            prowl_notify_onsubtitledownload)
        sickbeard.PROWL_API = prowl_api
        sickbeard.PROWL_PRIORITY = prowl_priority
        sickbeard.PROWL_MESSAGE_TITLE = prowl_message_title

        sickbeard.USE_TWITTER = config.checkbox_to_value(use_twitter)
        sickbeard.TWITTER_NOTIFY_ONSNATCH = config.checkbox_to_value(
            twitter_notify_onsnatch)
        sickbeard.TWITTER_NOTIFY_ONDOWNLOAD = config.checkbox_to_value(
            twitter_notify_ondownload)
        sickbeard.TWITTER_NOTIFY_ONSUBTITLEDOWNLOAD = config.checkbox_to_value(
            twitter_notify_onsubtitledownload)
        sickbeard.TWITTER_USEDM = config.checkbox_to_value(twitter_usedm)
        sickbeard.TWITTER_DMTO = twitter_dmto

        sickbeard.USE_TWILIO = config.checkbox_to_value(use_twilio)
        sickbeard.TWILIO_NOTIFY_ONSNATCH = config.checkbox_to_value(
            twilio_notify_onsnatch)
        sickbeard.TWILIO_NOTIFY_ONDOWNLOAD = config.checkbox_to_value(
            twilio_notify_ondownload)
        sickbeard.TWILIO_NOTIFY_ONSUBTITLEDOWNLOAD = config.checkbox_to_value(
            twilio_notify_onsubtitledownload)
        sickbeard.TWILIO_PHONE_SID = twilio_phone_sid
        sickbeard.TWILIO_ACCOUNT_SID = twilio_account_sid
        sickbeard.TWILIO_AUTH_TOKEN = twilio_auth_token
        sickbeard.TWILIO_TO_NUMBER = twilio_to_number

        sickbeard.USE_SLACK = config.checkbox_to_value(use_slack)
        sickbeard.SLACK_NOTIFY_SNATCH = config.checkbox_to_value(
            slack_notify_snatch)
        sickbeard.SLACK_NOTIFY_DOWNLOAD = config.checkbox_to_value(
            slack_notify_download)
        sickbeard.SLACK_NOTIFY_SUBTITLEDOWNLOAD = config.checkbox_to_value(
            slack_notify_subtitledownload)
        sickbeard.SLACK_WEBHOOK = slack_webhook
        sickbeard.SLACK_ICON_EMOJI = slack_icon_emoji

        sickbeard.USE_MATRIX = config.checkbox_to_value(use_matrix)
        sickbeard.MATRIX_NOTIFY_SNATCH = config.checkbox_to_value(
            matrix_notify_snatch)
        sickbeard.MATRIX_NOTIFY_DOWNLOAD = config.checkbox_to_value(
            matrix_notify_download)
        sickbeard.MATRIX_NOTIFY_SUBTITLEDOWNLOAD = config.checkbox_to_value(
            matrix_notify_subtitledownload)
        sickbeard.MATRIX_API_TOKEN = matrix_api_token
        sickbeard.MATRIX_SERVER = matrix_server
        sickbeard.MATRIX_ROOM = matrix_room

        sickbeard.USE_DISCORD = config.checkbox_to_value(use_discord)
        sickbeard.DISCORD_NOTIFY_SNATCH = config.checkbox_to_value(
            discord_notify_snatch)
        sickbeard.DISCORD_NOTIFY_DOWNLOAD = config.checkbox_to_value(
            discord_notify_download)
        sickbeard.DISCORD_WEBHOOK = discord_webhook
        sickbeard.DISCORD_NAME = discord_name
        sickbeard.DISCORD_AVATAR_URL = discord_avatar_url
        sickbeard.DISCORD_TTS = discord_tts

        sickbeard.USE_BOXCAR2 = config.checkbox_to_value(use_boxcar2)
        sickbeard.BOXCAR2_NOTIFY_ONSNATCH = config.checkbox_to_value(
            boxcar2_notify_onsnatch)
        sickbeard.BOXCAR2_NOTIFY_ONDOWNLOAD = config.checkbox_to_value(
            boxcar2_notify_ondownload)
        sickbeard.BOXCAR2_NOTIFY_ONSUBTITLEDOWNLOAD = config.checkbox_to_value(
            boxcar2_notify_onsubtitledownload)
        sickbeard.BOXCAR2_ACCESSTOKEN = boxcar2_accesstoken

        sickbeard.USE_PUSHOVER = config.checkbox_to_value(use_pushover)
        sickbeard.PUSHOVER_NOTIFY_ONSNATCH = config.checkbox_to_value(
            pushover_notify_onsnatch)
        sickbeard.PUSHOVER_NOTIFY_ONDOWNLOAD = config.checkbox_to_value(
            pushover_notify_ondownload)
        sickbeard.PUSHOVER_NOTIFY_ONSUBTITLEDOWNLOAD = config.checkbox_to_value(
            pushover_notify_onsubtitledownload)
        sickbeard.PUSHOVER_USERKEY = pushover_userkey
        sickbeard.PUSHOVER_APIKEY = filters.unhide(sickbeard.PUSHOVER_APIKEY,
                                                   pushover_apikey)
        sickbeard.PUSHOVER_DEVICE = pushover_device
        sickbeard.PUSHOVER_SOUND = pushover_sound
        sickbeard.PUSHOVER_PRIORITY = pushover_priority

        sickbeard.USE_LIBNOTIFY = config.checkbox_to_value(use_libnotify)
        sickbeard.LIBNOTIFY_NOTIFY_ONSNATCH = config.checkbox_to_value(
            libnotify_notify_onsnatch)
        sickbeard.LIBNOTIFY_NOTIFY_ONDOWNLOAD = config.checkbox_to_value(
            libnotify_notify_ondownload)
        sickbeard.LIBNOTIFY_NOTIFY_ONSUBTITLEDOWNLOAD = config.checkbox_to_value(
            libnotify_notify_onsubtitledownload)

        sickbeard.USE_NMJ = config.checkbox_to_value(use_nmj)
        sickbeard.NMJ_HOST = config.clean_host(nmj_host)
        sickbeard.NMJ_DATABASE = nmj_database
        sickbeard.NMJ_MOUNT = nmj_mount

        sickbeard.USE_NMJv2 = config.checkbox_to_value(use_nmjv2)
        sickbeard.NMJv2_HOST = config.clean_host(nmjv2_host)
        sickbeard.NMJv2_DATABASE = nmjv2_database
        sickbeard.NMJv2_DBLOC = nmjv2_dbloc

        sickbeard.USE_SYNOINDEX = config.checkbox_to_value(use_synoindex)

        sickbeard.USE_SYNOLOGYNOTIFIER = config.checkbox_to_value(
            use_synologynotifier)
        sickbeard.SYNOLOGYNOTIFIER_NOTIFY_ONSNATCH = config.checkbox_to_value(
            synologynotifier_notify_onsnatch)
        sickbeard.SYNOLOGYNOTIFIER_NOTIFY_ONDOWNLOAD = config.checkbox_to_value(
            synologynotifier_notify_ondownload)
        sickbeard.SYNOLOGYNOTIFIER_NOTIFY_ONSUBTITLEDOWNLOAD = config.checkbox_to_value(
            synologynotifier_notify_onsubtitledownload)

        config.change_use_trakt(use_trakt)
        sickbeard.TRAKT_USERNAME = trakt_username
        sickbeard.TRAKT_REMOVE_WATCHLIST = config.checkbox_to_value(
            trakt_remove_watchlist)
        sickbeard.TRAKT_REMOVE_SERIESLIST = config.checkbox_to_value(
            trakt_remove_serieslist)
        sickbeard.TRAKT_REMOVE_SHOW_FROM_SICKCHILL = config.checkbox_to_value(
            trakt_remove_show_from_sickchill)
        sickbeard.TRAKT_SYNC_WATCHLIST = config.checkbox_to_value(
            trakt_sync_watchlist)
        sickbeard.TRAKT_METHOD_ADD = int(trakt_method_add)
        sickbeard.TRAKT_START_PAUSED = config.checkbox_to_value(
            trakt_start_paused)
        sickbeard.TRAKT_USE_RECOMMENDED = config.checkbox_to_value(
            trakt_use_recommended)
        sickbeard.TRAKT_SYNC = config.checkbox_to_value(trakt_sync)
        sickbeard.TRAKT_SYNC_REMOVE = config.checkbox_to_value(
            trakt_sync_remove)
        sickbeard.TRAKT_DEFAULT_INDEXER = int(trakt_default_indexer)
        sickbeard.TRAKT_TIMEOUT = int(trakt_timeout)
        sickbeard.TRAKT_BLACKLIST_NAME = trakt_blacklist_name

        sickbeard.USE_EMAIL = config.checkbox_to_value(use_email)
        sickbeard.EMAIL_NOTIFY_ONSNATCH = config.checkbox_to_value(
            email_notify_onsnatch)
        sickbeard.EMAIL_NOTIFY_ONDOWNLOAD = config.checkbox_to_value(
            email_notify_ondownload)
        sickbeard.EMAIL_NOTIFY_ONPOSTPROCESS = config.checkbox_to_value(
            email_notify_onpostprocess)
        sickbeard.EMAIL_NOTIFY_ONSUBTITLEDOWNLOAD = config.checkbox_to_value(
            email_notify_onsubtitledownload)
        sickbeard.EMAIL_HOST = config.clean_host(email_host)
        sickbeard.EMAIL_PORT = try_int(email_port, 25)
        sickbeard.EMAIL_FROM = email_from
        sickbeard.EMAIL_TLS = config.checkbox_to_value(email_tls)
        sickbeard.EMAIL_USER = email_user
        sickbeard.EMAIL_PASSWORD = filters.unhide(sickbeard.EMAIL_PASSWORD,
                                                  email_password)
        sickbeard.EMAIL_LIST = email_list
        sickbeard.EMAIL_SUBJECT = email_subject

        sickbeard.USE_PYTIVO = config.checkbox_to_value(use_pytivo)
        sickbeard.PYTIVO_NOTIFY_ONSNATCH = config.checkbox_to_value(
            pytivo_notify_onsnatch)
        sickbeard.PYTIVO_NOTIFY_ONDOWNLOAD = config.checkbox_to_value(
            pytivo_notify_ondownload)
        sickbeard.PYTIVO_NOTIFY_ONSUBTITLEDOWNLOAD = config.checkbox_to_value(
            pytivo_notify_onsubtitledownload)
        sickbeard.PYTIVO_UPDATE_LIBRARY = config.checkbox_to_value(
            pytivo_update_library)
        sickbeard.PYTIVO_HOST = config.clean_host(pytivo_host)
        sickbeard.PYTIVO_SHARE_NAME = pytivo_share_name
        sickbeard.PYTIVO_TIVO_NAME = pytivo_tivo_name

        sickbeard.USE_PUSHALOT = config.checkbox_to_value(use_pushalot)
        sickbeard.PUSHALOT_NOTIFY_ONSNATCH = config.checkbox_to_value(
            pushalot_notify_onsnatch)
        sickbeard.PUSHALOT_NOTIFY_ONDOWNLOAD = config.checkbox_to_value(
            pushalot_notify_ondownload)
        sickbeard.PUSHALOT_NOTIFY_ONSUBTITLEDOWNLOAD = config.checkbox_to_value(
            pushalot_notify_onsubtitledownload)
        sickbeard.PUSHALOT_AUTHORIZATIONTOKEN = pushalot_authorizationtoken

        sickbeard.USE_PUSHBULLET = config.checkbox_to_value(use_pushbullet)
        sickbeard.PUSHBULLET_NOTIFY_ONSNATCH = config.checkbox_to_value(
            pushbullet_notify_onsnatch)
        sickbeard.PUSHBULLET_NOTIFY_ONDOWNLOAD = config.checkbox_to_value(
            pushbullet_notify_ondownload)
        sickbeard.PUSHBULLET_NOTIFY_ONSUBTITLEDOWNLOAD = config.checkbox_to_value(
            pushbullet_notify_onsubtitledownload)
        sickbeard.PUSHBULLET_API = pushbullet_api
        sickbeard.PUSHBULLET_DEVICE = pushbullet_device_list
        sickbeard.PUSHBULLET_CHANNEL = pushbullet_channel_list or ""

        sickbeard.save_config()

        if len(results) > 0:
            for x in results:
                logger.log(x, logger.ERROR)
            ui.notifications.error(_('Error(s) Saving Configuration'),
                                   '<br>\n'.join(results))
        else:
            ui.notifications.message(_('Configuration Saved'),
                                     ek(os.path.join, sickbeard.CONFIG_FILE))

        return self.redirect("/config/notifications/")
Exemple #14
0
    def saveProviders(self, newznab_string='', torrentrss_string='', provider_order=None, **kwargs):
        """
        Save Provider related settings
        """
        results = []

        provider_str_list = provider_order.split()
        provider_list = []

        newznab_provider_dict = dict(
            zip([x.get_id() for x in sickbeard.newznabProviderList], sickbeard.newznabProviderList))

        finished_names = []

        # add all the newznab info we got into our list
        if newznab_string:
            for curNewznabProviderStr in newznab_string.split('!!!'):

                if not curNewznabProviderStr:
                    continue

                cur_name, cur_url, cur_key, cur_cat = curNewznabProviderStr.split('|')
                cur_url = config.clean_url(cur_url)

                new_provider = newznab.NewznabProvider(cur_name, cur_url, key=cur_key, catIDs=cur_cat)

                cur_id = new_provider.get_id()

                # if it already exists then update it
                if cur_id in newznab_provider_dict:
                    newznab_provider_dict[cur_id].name = cur_name
                    newznab_provider_dict[cur_id].url = cur_url
                    newznab_provider_dict[cur_id].key = cur_key
                    newznab_provider_dict[cur_id].catIDs = cur_cat
                    # a 0 in the key spot indicates that no key is needed
                    if cur_key == '0':
                        newznab_provider_dict[cur_id].needs_auth = False
                    else:
                        newznab_provider_dict[cur_id].needs_auth = True

                    try:
                        newznab_provider_dict[cur_id].search_mode = str(kwargs['{id}_search_mode'.format(id=cur_id)]).strip()
                    except (AttributeError, KeyError):
                        pass  # these exceptions are actually catching unselected checkboxes

                    try:
                        newznab_provider_dict[cur_id].search_fallback = config.checkbox_to_value(
                            kwargs['{id}_search_fallback'.format(id=cur_id)])
                    except (AttributeError, KeyError):
                        newznab_provider_dict[cur_id].search_fallback = 0  # these exceptions are actually catching unselected checkboxes

                    try:
                        newznab_provider_dict[cur_id].enable_daily = config.checkbox_to_value(
                            kwargs['{id}_enable_daily'.format(id=cur_id)])
                    except (AttributeError, KeyError):
                        newznab_provider_dict[cur_id].enable_daily = 0  # these exceptions are actually catching unselected checkboxes

                    try:
                        newznab_provider_dict[cur_id].enable_manualsearch = config.checkbox_to_value(
                            kwargs['{id}_enable_manualsearch'.format(id=cur_id)])
                    except (AttributeError, KeyError):
                        newznab_provider_dict[cur_id].enable_manualsearch = 0  # these exceptions are actually catching unselected checkboxes

                    try:
                        newznab_provider_dict[cur_id].enable_backlog = config.checkbox_to_value(
                            kwargs['{id}_enable_backlog'.format(id=cur_id)])
                    except (AttributeError, KeyError):
                        newznab_provider_dict[cur_id].enable_backlog = 0  # these exceptions are actually catching unselected checkboxes
                else:
                    sickbeard.newznabProviderList.append(new_provider)

                finished_names.append(cur_id)

        # delete anything that is missing
        for cur_provider in sickbeard.newznabProviderList:
            if cur_provider.get_id() not in finished_names:
                sickbeard.newznabProviderList.remove(cur_provider)

        torrent_rss_provider_dict = dict(
            zip([x.get_id() for x in sickbeard.torrentRssProviderList], sickbeard.torrentRssProviderList))
        finished_names = []

        if torrentrss_string:
            for curTorrentRssProviderStr in torrentrss_string.split('!!!'):

                if not curTorrentRssProviderStr:
                    continue

                cur_name, cur_url, cur_cookies, cur_title_tag = curTorrentRssProviderStr.split('|')
                cur_url = config.clean_url(cur_url)

                new_provider = rsstorrent.TorrentRssProvider(cur_name, cur_url, cur_cookies, cur_title_tag)

                cur_id = new_provider.get_id()

                # if it already exists then update it
                if cur_id in torrent_rss_provider_dict:
                    torrent_rss_provider_dict[cur_id].name = cur_name
                    torrent_rss_provider_dict[cur_id].url = cur_url
                    torrent_rss_provider_dict[cur_id].cookies = cur_cookies
                    torrent_rss_provider_dict[cur_id].curTitleTAG = cur_title_tag
                else:
                    sickbeard.torrentRssProviderList.append(new_provider)

                finished_names.append(cur_id)

        # delete anything that is missing
        for cur_provider in sickbeard.torrentRssProviderList:
            if cur_provider.get_id() not in finished_names:
                sickbeard.torrentRssProviderList.remove(cur_provider)

        disabled_list = []
        # do the enable/disable
        for cur_providerStr in provider_str_list:
            cur_provider, cur_enabled = cur_providerStr.split(':')
            cur_enabled = try_int(cur_enabled)

            cur_prov_obj = [x for x in sickbeard.providers.sortedProviderList() if
                            x.get_id() == cur_provider and hasattr(x, 'enabled')]
            if cur_prov_obj:
                cur_prov_obj[0].enabled = bool(cur_enabled)

            if cur_enabled:
                provider_list.append(cur_provider)
            else:
                disabled_list.append(cur_provider)

            if cur_provider in newznab_provider_dict:
                newznab_provider_dict[cur_provider].enabled = bool(cur_enabled)
            elif cur_provider in torrent_rss_provider_dict:
                torrent_rss_provider_dict[cur_provider].enabled = bool(cur_enabled)

        provider_list.extend(disabled_list)

        # dynamically load provider settings
        for curTorrentProvider in [prov for prov in sickbeard.providers.sortedProviderList() if
                                   prov.provider_type == GenericProvider.TORRENT]:

            if hasattr(curTorrentProvider, 'custom_url'):
                try:
                    curTorrentProvider.custom_url = str(kwargs['{id}_custom_url'.format(id=curTorrentProvider.get_id())]).strip()
                except (AttributeError, KeyError):
                    curTorrentProvider.custom_url = None  # these exceptions are actually catching unselected checkboxes

            if hasattr(curTorrentProvider, 'minseed'):
                try:
                    curTorrentProvider.minseed = int(str(kwargs['{id}_minseed'.format(id=curTorrentProvider.get_id())]).strip())
                except (AttributeError, KeyError):
                    curTorrentProvider.minseed = 0  # these exceptions are actually catching unselected checkboxes

            if hasattr(curTorrentProvider, 'minleech'):
                try:
                    curTorrentProvider.minleech = int(str(kwargs['{id}_minleech'.format(id=curTorrentProvider.get_id())]).strip())
                except (AttributeError, KeyError):
                    curTorrentProvider.minleech = 0  # these exceptions are actually catching unselected checkboxes

            if hasattr(curTorrentProvider, 'ratio'):
                try:
                    ratio = float(str(kwargs['{id}_ratio'.format(id=curTorrentProvider.get_id())]).strip())
                    curTorrentProvider.ratio = (ratio, -1)[ratio < 0]
                except (AttributeError, KeyError, ValueError):
                    curTorrentProvider.ratio = None  # these exceptions are actually catching unselected checkboxes

            if hasattr(curTorrentProvider, 'digest'):
                try:
                    curTorrentProvider.digest = str(kwargs['{id}_digest'.format(id=curTorrentProvider.get_id())]).strip()
                except (AttributeError, KeyError):
                    curTorrentProvider.digest = None  # these exceptions are actually catching unselected checkboxes

            if hasattr(curTorrentProvider, 'hash'):
                try:
                    curTorrentProvider.hash = str(kwargs['{id}_hash'.format(id=curTorrentProvider.get_id())]).strip()
                except (AttributeError, KeyError):
                    curTorrentProvider.hash = None  # these exceptions are actually catching unselected checkboxes

            if hasattr(curTorrentProvider, 'api_key'):
                try:
                    curTorrentProvider.api_key = str(kwargs['{id}_api_key'.format(id=curTorrentProvider.get_id())]).strip()
                except (AttributeError, KeyError):
                    curTorrentProvider.api_key = None  # these exceptions are actually catching unselected checkboxes

            if hasattr(curTorrentProvider, 'username'):
                try:
                    curTorrentProvider.username = str(kwargs['{id}_username'.format(id=curTorrentProvider.get_id())]).strip()
                except (AttributeError, KeyError):
                    curTorrentProvider.username = None  # these exceptions are actually catching unselected checkboxes

            if hasattr(curTorrentProvider, 'password'):
                try:
                    curTorrentProvider.password = str(kwargs['{id}_password'.format(id=curTorrentProvider.get_id())]).strip()
                except (AttributeError, KeyError):
                    curTorrentProvider.password = None  # these exceptions are actually catching unselected checkboxes

            if hasattr(curTorrentProvider, 'passkey'):
                try:
                    curTorrentProvider.passkey = str(kwargs['{id}_passkey'.format(id=curTorrentProvider.get_id())]).strip()
                except (AttributeError, KeyError):
                    curTorrentProvider.passkey = None  # these exceptions are actually catching unselected checkboxes

            if hasattr(curTorrentProvider, 'pin'):
                try:
                    curTorrentProvider.pin = str(kwargs['{id}_pin'.format(id=curTorrentProvider.get_id())]).strip()
                except (AttributeError, KeyError):
                    curTorrentProvider.pin = None  # these exceptions are actually catching unselected checkboxes

            if hasattr(curTorrentProvider, 'confirmed'):
                try:
                    curTorrentProvider.confirmed = config.checkbox_to_value(
                        kwargs['{id}_confirmed'.format(id=curTorrentProvider.get_id())])
                except (AttributeError, KeyError):
                    curTorrentProvider.confirmed = 0  # these exceptions are actually catching unselected checkboxes

            if hasattr(curTorrentProvider, 'ranked'):
                try:
                    curTorrentProvider.ranked = config.checkbox_to_value(
                        kwargs['{id}_ranked'.format(id=curTorrentProvider.get_id())])
                except (AttributeError, KeyError):
                    curTorrentProvider.ranked = 0  # these exceptions are actually catching unselected checkboxes

            if hasattr(curTorrentProvider, 'engrelease'):
                try:
                    curTorrentProvider.engrelease = config.checkbox_to_value(
                        kwargs['{id}_engrelease'.format(id=curTorrentProvider.get_id())])
                except (AttributeError, KeyError):
                    curTorrentProvider.engrelease = 0  # these exceptions are actually catching unselected checkboxes

            if hasattr(curTorrentProvider, 'onlyspasearch'):
                try:
                    curTorrentProvider.onlyspasearch = config.checkbox_to_value(
                        kwargs['{id}_onlyspasearch'.format(id=curTorrentProvider.get_id())])
                except (AttributeError, KeyError):
                    curTorrentProvider.onlyspasearch = 0  # these exceptions are actually catching unselected checkboxes

            if hasattr(curTorrentProvider, 'sorting'):
                try:
                    curTorrentProvider.sorting = str(kwargs['{id}_sorting'.format(id=curTorrentProvider.get_id())]).strip()
                except (AttributeError, KeyError):
                    curTorrentProvider.sorting = 'seeders'  # these exceptions are actually catching unselected checkboxes

            if hasattr(curTorrentProvider, 'freeleech'):
                try:
                    curTorrentProvider.freeleech = config.checkbox_to_value(
                        kwargs['{id}_freeleech'.format(id=curTorrentProvider.get_id())])
                except (AttributeError, KeyError):
                    curTorrentProvider.freeleech = 0  # these exceptions are actually catching unselected checkboxes

            if hasattr(curTorrentProvider, 'search_mode'):
                try:
                    curTorrentProvider.search_mode = str(kwargs['{id}_search_mode'.format(id=curTorrentProvider.get_id())]).strip()
                except (AttributeError, KeyError):
                    curTorrentProvider.search_mode = 'eponly'  # these exceptions are actually catching unselected checkboxes

            if hasattr(curTorrentProvider, 'search_fallback'):
                try:
                    curTorrentProvider.search_fallback = config.checkbox_to_value(
                        kwargs['{id}_search_fallback'.format(id=curTorrentProvider.get_id())])
                except (AttributeError, KeyError):
                    curTorrentProvider.search_fallback = 0  # these exceptions are catching unselected checkboxes

            if hasattr(curTorrentProvider, 'enable_daily'):
                try:
                    curTorrentProvider.enable_daily = config.checkbox_to_value(
                        kwargs['{id}_enable_daily'.format(id=curTorrentProvider.get_id())])
                except (AttributeError, KeyError):
                    curTorrentProvider.enable_daily = 0  # these exceptions are actually catching unselected checkboxes

            if hasattr(curTorrentProvider, 'enable_manualsearch'):
                try:
                    curTorrentProvider.enable_manualsearch = config.checkbox_to_value(
                        kwargs['{id}_enable_manualsearch'.format(id=curTorrentProvider.get_id())])
                except (AttributeError, KeyError):
                    curTorrentProvider.enable_manualsearch = 0  # these exceptions are actually catching unselected checkboxes

            if hasattr(curTorrentProvider, 'enable_backlog'):
                try:
                    curTorrentProvider.enable_backlog = config.checkbox_to_value(
                        kwargs['{id}_enable_backlog'.format(id=curTorrentProvider.get_id())])
                except (AttributeError, KeyError):
                    curTorrentProvider.enable_backlog = 0  # these exceptions are actually catching unselected checkboxes

            if hasattr(curTorrentProvider, 'cat'):
                try:
                    curTorrentProvider.cat = int(str(kwargs['{id}_cat'.format(id=curTorrentProvider.get_id())]).strip())
                except (AttributeError, KeyError):
                    curTorrentProvider.cat = 0  # these exceptions are actually catching unselected checkboxes

            if hasattr(curTorrentProvider, 'subtitle'):
                try:
                    curTorrentProvider.subtitle = config.checkbox_to_value(
                        kwargs['{id}_subtitle'.format(id=curTorrentProvider.get_id())])
                except (AttributeError, KeyError):
                    curTorrentProvider.subtitle = 0  # these exceptions are actually catching unselected checkboxes

        for curNzbProvider in [prov for prov in sickbeard.providers.sortedProviderList() if
                               prov.provider_type == GenericProvider.NZB]:

            if hasattr(curNzbProvider, 'api_key'):
                try:
                    curNzbProvider.api_key = str(kwargs['{id}_api_key'.format(id=curNzbProvider.get_id())]).strip()
                except (AttributeError, KeyError):
                    curNzbProvider.api_key = None  # these exceptions are actually catching unselected checkboxes

            if hasattr(curNzbProvider, 'username'):
                try:
                    curNzbProvider.username = str(kwargs['{id}_username'.format(id=curNzbProvider.get_id())]).strip()
                except (AttributeError, KeyError):
                    curNzbProvider.username = None  # these exceptions are actually catching unselected checkboxes

            if hasattr(curNzbProvider, 'search_mode'):
                try:
                    curNzbProvider.search_mode = str(kwargs['{id}_search_mode'.format(id=curNzbProvider.get_id())]).strip()
                except (AttributeError, KeyError):
                    curNzbProvider.search_mode = 'eponly'  # these exceptions are actually catching unselected checkboxes

            if hasattr(curNzbProvider, 'search_fallback'):
                try:
                    curNzbProvider.search_fallback = config.checkbox_to_value(
                        kwargs['{id}_search_fallback'.format(id=curNzbProvider.get_id())])
                except (AttributeError, KeyError):
                    curNzbProvider.search_fallback = 0  # these exceptions are actually catching unselected checkboxes

            if hasattr(curNzbProvider, 'enable_daily'):
                try:
                    curNzbProvider.enable_daily = config.checkbox_to_value(
                        kwargs['{id}_enable_daily'.format(id=curNzbProvider.get_id())])
                except (AttributeError, KeyError):
                    curNzbProvider.enable_daily = 0  # these exceptions are actually catching unselected checkboxes

            if hasattr(curNzbProvider, 'enable_manualsearch'):
                try:
                    curNzbProvider.enable_manualsearch = config.checkbox_to_value(
                        kwargs['{id}_enable_manualsearch'.format(id=curNzbProvider.get_id())])
                except (AttributeError, KeyError):
                    curNzbProvider.enable_manualsearch = 0  # these exceptions are actually catching unselected checkboxes

            if hasattr(curNzbProvider, 'enable_backlog'):
                try:
                    curNzbProvider.enable_backlog = config.checkbox_to_value(
                        kwargs['{id}_enable_backlog'.format(id=curNzbProvider.get_id())])
                except (AttributeError, KeyError):
                    curNzbProvider.enable_backlog = 0  # these exceptions are actually catching unselected checkboxes

        sickbeard.NEWZNAB_DATA = '!!!'.join([x.configStr() for x in sickbeard.newznabProviderList])
        sickbeard.PROVIDER_ORDER = provider_list

        sickbeard.save_config()

        if results:
            for x in results:
                logger.log(x, logger.ERROR)
            ui.notifications.error('Error(s) Saving Configuration',
                                   '<br>\n'.join(results))
        else:
            ui.notifications.message('Configuration Saved', ek(os.path.join, sickbeard.CONFIG_FILE))

        return self.redirect('/config/providers/')
Exemple #15
0
    def saveProviders(self, newznab_string='', torrentrss_string='', provider_order=None, **kwargs):
        newznabProviderDict = dict(
            zip((x.get_id() for x in sickbeard.newznabProviderList), sickbeard.newznabProviderList))

        finished_names = []

        # add all the newznab info we got into our list
        # if not newznab_string:
        #     logger.log('No newznab_string passed to saveProviders', logger.DEBUG)

        for curNewznabProviderStr in newznab_string.split('!!!'):
            if not curNewznabProviderStr:
                continue

            cur_name, cur_url, cur_key, cur_cat = curNewznabProviderStr.split('|')
            cur_url = config.clean_url(cur_url)
            cur_id = GenericProvider.make_id(cur_name)

            # if it does not already exist then add it
            if cur_id not in newznabProviderDict:
                new_provider = newznab.NewznabProvider(cur_name, cur_url, key=cur_key, catIDs=cur_cat)
                sickbeard.newznabProviderList.append(new_provider)
                newznabProviderDict[cur_id] = new_provider

            # set all params
            newznabProviderDict[cur_id].name = cur_name
            newznabProviderDict[cur_id].url = cur_url
            newznabProviderDict[cur_id].key = cur_key
            newznabProviderDict[cur_id].catIDs = cur_cat
            # a 0 in the key spot indicates that no key is needed
            newznabProviderDict[cur_id].needs_auth = cur_key and cur_key != '0'
            newznabProviderDict[cur_id].search_mode = str(kwargs.get(cur_id + '_search_mode', 'eponly')).strip()
            newznabProviderDict[cur_id].search_fallback = config.checkbox_to_value(kwargs.get(cur_id + 'search_fallback', 0), value_on=1, value_off=0)
            newznabProviderDict[cur_id].enable_daily = config.checkbox_to_value(kwargs.get(cur_id + 'enable_daily', 0), value_on=1, value_off=0)
            newznabProviderDict[cur_id].enable_backlog = config.checkbox_to_value(kwargs.get(cur_id + 'enable_backlog', 0), value_on=1, value_off=0)

            # mark it finished
            finished_names.append(cur_id)

        # delete anything that is in the list that was not processed just now
        if newznab_string:
            for curProvider in sickbeard.newznabProviderList:
                if curProvider.get_id() not in finished_names:
                    sickbeard.newznabProviderList.remove(curProvider)
                    del newznabProviderDict[curProvider.get_id()]

        # if not torrentrss_string:
        #     logger.log('No torrentrss_string passed to saveProviders', logger.DEBUG)

        torrentRssProviderDict = dict(
            zip((x.get_id() for x in sickbeard.torrentRssProviderList), sickbeard.torrentRssProviderList))

        finished_names = []

        if torrentrss_string:
            for curTorrentRssProviderStr in torrentrss_string.split('!!!'):

                if not curTorrentRssProviderStr:
                    continue

                cur_name, cur_url, cur_cookies, cur_title_tag = curTorrentRssProviderStr.split('|')
                cur_url = config.clean_url(cur_url)
                cur_id = GenericProvider.make_id(cur_name)

                # if it does not already exist then create it
                if cur_id not in torrentRssProviderDict:
                    new_provider = rsstorrent.TorrentRssProvider(cur_name, cur_url, cur_cookies, cur_title_tag)
                    sickbeard.torrentRssProviderList.append(new_provider)
                    torrentRssProviderDict[cur_id] = new_provider

                # update values
                torrentRssProviderDict[cur_id].name = cur_name
                torrentRssProviderDict[cur_id].url = cur_url
                torrentRssProviderDict[cur_id].cookies = cur_cookies
                torrentRssProviderDict[cur_id].cur_title_tag = cur_title_tag

                # mark it finished
                finished_names.append(cur_id)

        # delete anything that is in the list that was not processed just now
        if torrentrss_string:
            for curProvider in sickbeard.torrentRssProviderList:
                if curProvider.get_id() not in finished_names:
                    sickbeard.torrentRssProviderList.remove(curProvider)
                    del torrentRssProviderDict[curProvider.get_id()]

        # do the enable/disable
        enabled_provider_list = []
        disabled_provider_list = []
        for cur_id, cur_enabled in (cur_provider_str.split(':') for cur_provider_str in provider_order.split()):
            cur_enabled = bool(try_int(cur_enabled))

            cur_provider_obj = [x for x in sickbeard.providers.sortedProviderList() if x.get_id() == cur_id and hasattr(x, 'enabled')]

            if cur_provider_obj:
                cur_provider_obj[0].enabled = cur_enabled

            if cur_enabled:
                enabled_provider_list.append(cur_id)
            else:
                disabled_provider_list.append(cur_id)

            if cur_id in newznabProviderDict:
                newznabProviderDict[cur_id].enabled = cur_enabled
            elif cur_id in torrentRssProviderDict:
                torrentRssProviderDict[cur_id].enabled = cur_enabled

        # dynamically load provider settings
        for curProvider in sickbeard.providers.sortedProviderList():
            if hasattr(curProvider, 'custom_url'):
                curProvider.custom_url = str(kwargs.get(curProvider.get_id('_custom_url'), '')).strip()

            if hasattr(curProvider, 'minseed'):
                curProvider.minseed = int(str(kwargs.get(curProvider.get_id('_minseed'), 0)).strip())

            if hasattr(curProvider, 'minleech'):
                curProvider.minleech = int(str(kwargs.get(curProvider.get_id('_minleech'), 0)).strip())

            if hasattr(curProvider, 'ratio'):
                if curProvider.get_id('_ratio') in kwargs:
                    ratio = str(kwargs.get(curProvider.get_id('_ratio'))).strip()
                    print (ratio)
                    if ratio in ('None', None, ''):
                        curProvider.ratio = None
                    else:
                        curProvider.ratio = max(float(ratio), -1)
                else:
                    curProvider.ratio = None

            if hasattr(curProvider, 'digest'):
                curProvider.digest = str(kwargs.get(curProvider.get_id('_digest'), '')).strip() or None

            if hasattr(curProvider, 'hash'):
                curProvider.hash = str(kwargs.get(curProvider.get_id('_hash'), '')).strip() or None

            if hasattr(curProvider, 'api_key'):
                curProvider.api_key = str(kwargs.get(curProvider.get_id('_api_key'), '')).strip() or None

            if hasattr(curProvider, 'username'):
                curProvider.username = str(kwargs.get(curProvider.get_id('_username'), '')).strip() or None

            if hasattr(curProvider, 'password'):
                curProvider.password = filters.unhide(curProvider.password, str(kwargs.get(curProvider.get_id('_password'), '')).strip())

            if hasattr(curProvider, 'passkey'):
                curProvider.passkey = filters.unhide(curProvider.passkey, str(kwargs.get(curProvider.get_id('_passkey'), '')).strip())

            if hasattr(curProvider, 'pin'):
                curProvider.pin = filters.unhide(curProvider.pin, str(kwargs.get(curProvider.get_id('_pin'), '')).strip())

            if hasattr(curProvider, 'confirmed'):
                curProvider.confirmed = config.checkbox_to_value(kwargs.get(curProvider.get_id('_confirmed')))

            if hasattr(curProvider, 'ranked'):
                curProvider.ranked = config.checkbox_to_value(kwargs.get(curProvider.get_id('_ranked')))

            if hasattr(curProvider, 'engrelease'):
                curProvider.engrelease = config.checkbox_to_value(kwargs.get(curProvider.get_id('_engrelease')))

            if hasattr(curProvider, 'onlyspasearch'):
                curProvider.onlyspasearch = config.checkbox_to_value(kwargs.get(curProvider.get_id('_onlyspasearch')))

            if hasattr(curProvider, 'sorting'):
                curProvider.sorting = str(kwargs.get(curProvider.get_id('_sorting'), 'seeders')).strip()

            if hasattr(curProvider, 'freeleech'):
                curProvider.freeleech = config.checkbox_to_value(kwargs.get(curProvider.get_id('_freeleech')))

            if hasattr(curProvider, 'search_mode'):
                curProvider.search_mode = str(kwargs.get(curProvider.get_id('_search_mode'), 'eponly')).strip()

            if hasattr(curProvider, 'search_fallback'):
                curProvider.search_fallback = config.checkbox_to_value(kwargs.get(curProvider.get_id('_search_fallback')))

            if hasattr(curProvider, 'enable_daily'):
                curProvider.enable_daily = curProvider.can_daily and config.checkbox_to_value(kwargs.get(curProvider.get_id('_enable_daily')))

            if hasattr(curProvider, 'enable_backlog'):
                curProvider.enable_backlog = curProvider.can_backlog and config.checkbox_to_value(kwargs.get(curProvider.get_id('_enable_backlog')))

            if hasattr(curProvider, 'cat'):
                curProvider.cat = int(str(kwargs.get(curProvider.get_id('_cat'), 0)).strip())

            if hasattr(curProvider, 'subtitle'):
                curProvider.subtitle = config.checkbox_to_value(kwargs.get(curProvider.get_id('_subtitle')))

            if curProvider.enable_cookies:
                curProvider.cookies = str(kwargs.get(curProvider.get_id('_cookies'))).strip()

        sickbeard.NEWZNAB_DATA = '!!!'.join([x.configStr() for x in sickbeard.newznabProviderList])
        sickbeard.PROVIDER_ORDER = enabled_provider_list + disabled_provider_list

        sickbeard.save_config()

        # Add a site_message if no providers are enabled for daily and/or backlog
        sickbeard.providers.check_enabled_providers()

        ui.notifications.message(_('Configuration Saved'), ek(os.path.join, sickbeard.CONFIG_FILE))

        return self.redirect("/config/providers/")