def test__get_title_and_url(self): """ Test _get_title_and_url """ items_list = [ None, {}, { 'link': None, 'title': None }, { 'link': '', 'title': '' }, { 'link': 'http://www.google.com/&foo=bar%26tr%3Dtest', 'title': 'Some Title' } ] results_list = [('', ''), ('', ''), ('', ''), ('', ''), ('Some.Title', 'http://www.google.com/&foo=bar&tr=test')] unicode_items_list = [{ 'link': '', 'title': '' }, { 'link': 'http://www.google.com/&foo=bar%26tr%3Dtest', 'title': 'Some Title' }] unicode_results_list = [('', ''), ('Some.Title', 'http://www.google.com/&foo=bar&tr=test')] self.assertEqual( len(items_list), len(results_list), 'Number of parameters ({0:d}) and results ({1:d}) does not match'. format(len(items_list), len(results_list))) self.assertEqual( len(unicode_items_list), len(unicode_results_list), 'Number of parameters ({0:d}) and results ({1:d}) does not match'. format(len(unicode_items_list), len(unicode_results_list))) for (index, item) in enumerate(items_list): self.assertEqual( GenericProvider('Test Provider')._get_title_and_url(item), results_list[index]) for (index, item) in enumerate(unicode_items_list): self.assertEqual( GenericProvider('Test Provider')._get_title_and_url(item), unicode_results_list[index])
def test_search(self): """ Test search """ test_cases = { None: [], 123: [], 12.3: [], -123: [], -12.3: [], '': [], '123': [], '12.3': [], '-123': [], '-12.3': [], } unicode_test_cases = { '': [], '123': [], '12.3': [], '-123': [], '-12.3': [], } for test in test_cases, unicode_test_cases: for (search_params, result) in six.iteritems(test): self.assertEqual( GenericProvider('Test Provider').search(search_params), result)
def test_download_file(self, remove_file_mock, df_mock): """ Test download_result """ domain = 'domain' filename = 'TestFilename.nzb' urls = [ 'http://{0}/{1}.torrentNO_DOWNLOAD_NAME'.format(domain, filename), 'http://{0}/{1}.torrent'.format(domain, filename), ] # Test the login() check gp1 = GenericProvider('Test Provider 1') login_mock = MagicMock() login_mock.return_value = False with patch.object(gp1, 'login', login_mock): self.assertFalse(gp1.download_result('result 1')) self.assertTrue(login_mock.called) # Test the _make_url call gp2 = GenericProvider('Test Provider 2') make_url_mock = MagicMock() make_url_mock.return_value = (urls, filename) df_mock.return_value = True with patch.object(gp2, '_make_url', make_url_mock): resp = gp2.download_result('result 2') self.assertTrue(resp) self.assertTrue('Referer' in gp2.headers) self.assertTrue(domain in gp2.headers['Referer']) self.assertTrue(df_mock.called) # Test the remove_file_failed path gp3 = GenericProvider('Test Provider 3') make_url_mock = MagicMock() make_url_mock.return_value = (urls, filename) verify_download_mock = MagicMock() verify_download_mock.return_value = False df_mock.return_value = True with patch.object(gp3, '_make_url', make_url_mock): with patch.object(gp3, '_verify_download', verify_download_mock): resp = gp3.download_result('result 3') self.assertFalse(resp) self.assertTrue(remove_file_mock.called)
def test_download_file(self, remove_file_mock, df_mock): """ Test download_result """ domain = "domain" filename = "TestFilename.nzb" urls = [ "http://{0}/{1}.torrentNO_DOWNLOAD_NAME".format(domain, filename), "http://{0}/{1}.torrent".format(domain, filename), ] # Test the login() check gp1 = GenericProvider("Test Provider 1") login_mock = MagicMock() login_mock.return_value = False with patch.object(gp1, "login", login_mock): self.assertFalse(gp1.download_result("result 1")) self.assertTrue(login_mock.called) # Test the _make_url call gp2 = GenericProvider("Test Provider 2") make_url_mock = MagicMock() make_url_mock.return_value = (urls, filename) df_mock.return_value = True with patch.object(gp2, "_make_url", make_url_mock): resp = gp2.download_result("result 2") self.assertTrue(resp) self.assertTrue("Referer" in gp2.headers) self.assertTrue(domain in gp2.headers["Referer"]) self.assertTrue(df_mock.called) # Test the remove_file_failed path gp3 = GenericProvider("Test Provider 3") make_url_mock = MagicMock() make_url_mock.return_value = (urls, filename) verify_download_mock = MagicMock() verify_download_mock.return_value = False df_mock.return_value = True with patch.object(gp3, "_make_url", make_url_mock): with patch.object(gp3, "_verify_download", verify_download_mock): resp = gp3.download_result("result 3") self.assertFalse(resp) self.assertTrue(remove_file_mock.called)
def __init__(self, name): GenericProvider.__init__(self, name) self.provider_type = GenericProvider.NZB self.torznab = False
def sendNZB(nzb, proper=False): """ Sends NZB to NZBGet client :param nzb: nzb object :param proper: True if this is a Proper download, False if not. Defaults to False """ addToTop = False nzbgetprio = 0 category = sickbeard.NZBGET_CATEGORY if nzb.show.is_anime: category = sickbeard.NZBGET_CATEGORY_ANIME if sickbeard.NZBGET_USE_HTTPS: nzbgetXMLrpc = "https://%(username)s:%(password)s@%(host)s/xmlrpc" else: nzbgetXMLrpc = "http://%(username)s:%(password)s@%(host)s/xmlrpc" if sickbeard.NZBGET_HOST is None: logger.log( u"No NZBget host found in configuration. Please configure it.", logger.WARNING) return False url = nzbgetXMLrpc % { "host": sickbeard.NZBGET_HOST, "username": sickbeard.NZBGET_USERNAME, "password": sickbeard.NZBGET_PASSWORD } nzbGetRPC = xmlrpclib.ServerProxy(url) try: if nzbGetRPC.writelog( "INFO", "SickRage connected to drop of %s any moment now." % (nzb.name + ".nzb")): logger.log(u"Successful connected to NZBget", logger.DEBUG) else: logger.log( u"Successful connected to NZBget, but unable to send a message", logger.WARNING) except httplib.socket.error: logger.log( u"Please check your NZBget host and port (if it is running). NZBget is not responding to this combination", logger.WARNING) return False except xmlrpclib.ProtocolError as e: if e.errmsg == "Unauthorized": logger.log(u"NZBget username or password is incorrect.", logger.WARNING) else: logger.log(u"Protocol Error: " + e.errmsg, logger.ERROR) return False dupekey = "" dupescore = 0 # if it aired recently make it high priority and generate DupeKey/Score for curEp in nzb.episodes: if dupekey == "": if curEp.show.indexer == 1: dupekey = "SickRage-" + str(curEp.show.indexerid) elif curEp.show.indexer == 2: dupekey = "SickRage-tvr" + str(curEp.show.indexerid) dupekey += "-" + str(curEp.season) + "." + str(curEp.episode) if datetime.date.today() - curEp.airdate <= datetime.timedelta(days=7): addToTop = True nzbgetprio = sickbeard.NZBGET_PRIORITY else: category = sickbeard.NZBGET_CATEGORY_BACKLOG if nzb.show.is_anime: category = sickbeard.NZBGET_CATEGORY_ANIME_BACKLOG if nzb.quality != Quality.UNKNOWN: dupescore = nzb.quality * 100 if proper: dupescore += 10 nzbcontent64 = None if nzb.resultType == "nzbdata": data = nzb.extraInfo[0] nzbcontent64 = standard_b64encode(data) logger.log(u"Sending NZB to NZBget") logger.log(u"URL: " + url, logger.DEBUG) try: # Find out if nzbget supports priority (Version 9.0+), old versions beginning with a 0.x will use the old command nzbget_version_str = nzbGetRPC.version() nzbget_version = try_int( nzbget_version_str[:nzbget_version_str.find(".")]) if nzbget_version == 0: if nzbcontent64 is not None: nzbget_result = nzbGetRPC.append(nzb.name + ".nzb", category, addToTop, nzbcontent64) else: if nzb.resultType == "nzb": genProvider = GenericProvider("") data = genProvider.get_url(nzb.url, returns='content') if data is None: return False nzbcontent64 = standard_b64encode(data) nzbget_result = nzbGetRPC.append(nzb.name + ".nzb", category, addToTop, nzbcontent64) elif nzbget_version == 12: if nzbcontent64 is not None: nzbget_result = nzbGetRPC.append(nzb.name + ".nzb", category, nzbgetprio, False, nzbcontent64, False, dupekey, dupescore, "score") else: nzbget_result = nzbGetRPC.appendurl(nzb.name + ".nzb", category, nzbgetprio, False, nzb.url, False, dupekey, dupescore, "score") # v13+ has a new combined append method that accepts both (url and content) # also the return value has changed from boolean to integer # (Positive number representing NZBID of the queue item. 0 and negative numbers represent error codes.) elif nzbget_version >= 13: nzbget_result = True if nzbGetRPC.append( nzb.name + ".nzb", nzbcontent64 if nzbcontent64 is not None else nzb.url, category, nzbgetprio, False, False, dupekey, dupescore, "score") > 0 else False else: if nzbcontent64 is not None: nzbget_result = nzbGetRPC.append(nzb.name + ".nzb", category, nzbgetprio, False, nzbcontent64) else: nzbget_result = nzbGetRPC.appendurl(nzb.name + ".nzb", category, nzbgetprio, False, nzb.url) if nzbget_result: logger.log(u"NZB sent to NZBget successfully", logger.DEBUG) return True else: logger.log( u"NZBget could not add %s to the queue" % (nzb.name + ".nzb"), logger.WARNING) return False except Exception: logger.log( u"Connect Error to NZBget: could not add %s to the queue" % (nzb.name + ".nzb"), logger.WARNING) return False
def test_get_id(self): """ Test get_id """ test_cases = { None: '', 123: '123', 12.3: '12_3', 0: '', -123: '_123', -12.3: '_12_3', '': '', ' ': '', '123': '123', ' 123 ': '123', '12.3': '12_3', ' 12.3 ': '12_3', '0': '0', ' 0 ': '0', '-123': '_123', ' -123 ': '_123', '-12.3': '_12_3', ' -12.3 ': '_12_3', 'abc': 'abc', ' abc ': 'abc', 'ABC': 'abc', ' ABC ': 'abc', '.def': '_def', 'g,hi': 'g_hi', 'jk!l': 'jk_l', 'mno?': 'mno_', '_pqr$': '_pqr_', } unicode_test_cases = { '': '', ' ': '', '123': '123', ' 123 ': '123', '12.3': '12_3', ' 12.3 ': '12_3', '0': '0', ' 0 ': '0', '-123': '_123', ' -123 ': '_123', '-12.3': '_12_3', ' -12.3 ': '_12_3', 'abc': 'abc', ' abc ': 'abc', 'ABC': 'abc', ' ABC ': 'abc', '.def': '_def', 'g,hi': 'g_hi', 'jk!l': 'jk_l', 'mno?': 'mno_', '_pqr$': '_pqr_', } for test in test_cases, unicode_test_cases: for (name, result) in six.iteritems(test): self.assertEqual(GenericProvider(name).get_id(), result)
data = nzb.extraInfo[0] nzbcontent64 = standard_b64encode(data) logger.log(u"Sending NZB to NZBget") logger.log(u"URL: " + url, logger.DEBUG) try: # Find out if nzbget supports priority (Version 9.0+), old versions beginning with a 0.x will use the old command nzbget_version_str = nzbGetRPC.version() nzbget_version = try_int(nzbget_version_str[:nzbget_version_str.find(".")]) if nzbget_version == 0: if nzbcontent64 is not None: nzbget_result = nzbGetRPC.append(nzb.name + ".nzb", category, addToTop, nzbcontent64) else: if nzb.resultType == "nzb": genProvider = GenericProvider("") data = genProvider.get_url(nzb.url) if data is None: return False nzbcontent64 = standard_b64encode(data) nzbget_result = nzbGetRPC.append(nzb.name + ".nzb", category, addToTop, nzbcontent64) elif nzbget_version == 12: if nzbcontent64 is not None: nzbget_result = nzbGetRPC.append(nzb.name + ".nzb", category, nzbgetprio, False, nzbcontent64, False, dupekey, dupescore, "score") else: nzbget_result = nzbGetRPC.appendurl(nzb.name + ".nzb", category, nzbgetprio, False, nzb.url, False, dupekey, dupescore, "score") # v13+ has a new combined append method that accepts both (url and content) # also the return value has changed from boolean to integer # (Positive number representing NZBID of the queue item. 0 and negative numbers represent error codes.)
def test_is_enabled(self): """ Test is_enabled """ self.assertFalse(GenericProvider('Test Provider').is_enabled)
def sendNZB(nzb, proper=False): """ Sends NZB to NZBGet client :param nzb: nzb object :param proper: True if this is a Proper download, False if not. Defaults to False """ addToTop = False nzbgetprio = 0 category = sickbeard.NZBGET_CATEGORY if nzb.show.is_anime: category = sickbeard.NZBGET_CATEGORY_ANIME if sickbeard.NZBGET_USE_HTTPS: nzbgetXMLrpc = "https://%(username)s:%(password)s@%(host)s/xmlrpc" else: nzbgetXMLrpc = "http://%(username)s:%(password)s@%(host)s/xmlrpc" if sickbeard.NZBGET_HOST is None: logger.log(u"No NZBget host found in configuration. Please configure it.", logger.WARNING) return False url = nzbgetXMLrpc % {"host": sickbeard.NZBGET_HOST, "username": sickbeard.NZBGET_USERNAME, "password": sickbeard.NZBGET_PASSWORD} nzbGetRPC = xmlrpclib.ServerProxy(url) try: if nzbGetRPC.writelog("INFO", "SickRage connected to drop of %s any moment now." % (nzb.name + ".nzb")): logger.log(u"Successful connected to NZBget", logger.DEBUG) else: logger.log(u"Successful connected to NZBget, but unable to send a message", logger.WARNING) except httplib.socket.error: logger.log( u"Please check your NZBget host and port (if it is running). NZBget is not responding to this combination", logger.WARNING) return False except xmlrpclib.ProtocolError as e: if e.errmsg == "Unauthorized": logger.log(u"NZBget username or password is incorrect.", logger.WARNING) else: logger.log(u"Protocol Error: " + e.errmsg, logger.ERROR) return False dupekey = "" dupescore = 0 # if it aired recently make it high priority and generate DupeKey/Score for curEp in nzb.episodes: if dupekey == "": if curEp.show.indexer == 1: dupekey = "SickRage-" + str(curEp.show.indexerid) elif curEp.show.indexer == 2: dupekey = "SickRage-tvr" + str(curEp.show.indexerid) dupekey += "-" + str(curEp.season) + "." + str(curEp.episode) if datetime.date.today() - curEp.airdate <= datetime.timedelta(days=7): addToTop = True nzbgetprio = sickbeard.NZBGET_PRIORITY else: category = sickbeard.NZBGET_CATEGORY_BACKLOG if nzb.show.is_anime: category = sickbeard.NZBGET_CATEGORY_ANIME_BACKLOG if nzb.quality != Quality.UNKNOWN: dupescore = nzb.quality * 100 if proper: dupescore += 10 nzbcontent64 = None if nzb.resultType == "nzbdata": data = nzb.extraInfo[0] nzbcontent64 = standard_b64encode(data) logger.log(u"Sending NZB to NZBget") logger.log(u"URL: " + url, logger.DEBUG) try: # Find out if nzbget supports priority (Version 9.0+), old versions beginning with a 0.x will use the old command nzbget_version_str = nzbGetRPC.version() nzbget_version = try_int(nzbget_version_str[:nzbget_version_str.find(".")]) if nzbget_version == 0: if nzbcontent64 is not None: nzbget_result = nzbGetRPC.append(nzb.name + ".nzb", category, addToTop, nzbcontent64) else: if nzb.resultType == "nzb": genProvider = GenericProvider("") data = genProvider.get_url(nzb.url) if data is None: return False nzbcontent64 = standard_b64encode(data) nzbget_result = nzbGetRPC.append(nzb.name + ".nzb", category, addToTop, nzbcontent64) elif nzbget_version == 12: if nzbcontent64 is not None: nzbget_result = nzbGetRPC.append(nzb.name + ".nzb", category, nzbgetprio, False, nzbcontent64, False, dupekey, dupescore, "score") else: nzbget_result = nzbGetRPC.appendurl(nzb.name + ".nzb", category, nzbgetprio, False, nzb.url, False, dupekey, dupescore, "score") # v13+ has a new combined append method that accepts both (url and content) # also the return value has changed from boolean to integer # (Positive number representing NZBID of the queue item. 0 and negative numbers represent error codes.) elif nzbget_version >= 13: nzbget_result = True if nzbGetRPC.append(nzb.name + ".nzb", nzbcontent64 if nzbcontent64 is not None else nzb.url, category, nzbgetprio, False, False, dupekey, dupescore, "score") > 0 else False else: if nzbcontent64 is not None: nzbget_result = nzbGetRPC.append(nzb.name + ".nzb", category, nzbgetprio, False, nzbcontent64) else: nzbget_result = nzbGetRPC.appendurl(nzb.name + ".nzb", category, nzbgetprio, False, nzb.url) if nzbget_result: logger.log(u"NZB sent to NZBget successfully", logger.DEBUG) return True else: logger.log(u"NZBget could not add %s to the queue" % (nzb.name + ".nzb"), logger.WARNING) return False except Exception: logger.log(u"Connect Error to NZBget: could not add %s to the queue" % (nzb.name + ".nzb"), logger.WARNING) return False
def test_make_id(self): """ Test make_id """ test_cases = { None: "", 123: "123", 12.3: "12_3", 0: "", -123: "_123", -12.3: "_12_3", "": "", " ": "", "123": "123", " 123 ": "123", "12.3": "12_3", " 12.3 ": "12_3", "0": "0", " 0 ": "0", "-123": "_123", " -123 ": "_123", "-12.3": "_12_3", " -12.3 ": "_12_3", "abc": "abc", " abc ": "abc", "ABC": "abc", " ABC ": "abc", ".def": "_def", "g,hi": "g_hi", "jk!l": "jk_l", "mno?": "mno_", "_pqr$": "_pqr_", } unicode_test_cases = { u"": "", u" ": "", u"123": "123", u" 123 ": "123", u"12.3": "12_3", u" 12.3 ": "12_3", u"0": "0", u" 0 ": "0", u"-123": "_123", u" -123 ": "_123", u"-12.3": "_12_3", u" -12.3 ": "_12_3", u"abc": "abc", u" abc ": "abc", u"ABC": "abc", u" ABC ": "abc", u".def": "_def", u"g,hi": "g_hi", u"jk!l": "jk_l", u"mno?": "mno_", u"_pqr$": "_pqr_", } for test in test_cases, unicode_test_cases: for (name, result) in test.iteritems(): self.assertEqual(GenericProvider.make_id(name), result)
def test_image_name(self): """ Test image_name """ test_cases = { None: '.png', 123: '123.png', 12.3: '12_3.png', 0: '.png', -123: '_123.png', -12.3: '_12_3.png', '': '.png', ' ': '.png', '123': '123.png', ' 123 ': '123.png', '12.3': '12_3.png', ' 12.3 ': '12_3.png', '0': '0.png', ' 0 ': '0.png', '-123': '_123.png', ' -123 ': '_123.png', '-12.3': '_12_3.png', ' -12.3 ': '_12_3.png', 'abc': 'abc.png', ' abc ': 'abc.png', 'ABC': 'abc.png', ' ABC ': 'abc.png', '.def': '_def.png', 'g,hi': 'g_hi.png', 'jk!l': 'jk_l.png', 'mno?': 'mno_.png', '_pqr$': '_pqr_.png', } unicode_test_cases = { '': '.png', ' ': '.png', '123': '123.png', ' 123 ': '123.png', '12.3': '12_3.png', ' 12.3 ': '12_3.png', '0': '0.png', ' 0 ': '0.png', '-123': '_123.png', ' -123 ': '_123.png', '-12.3': '_12_3.png', ' -12.3 ': '_12_3.png', 'abc': 'abc.png', ' abc ': 'abc.png', 'ABC': 'abc.png', ' ABC ': 'abc.png', '.def': '_def.png', 'g,hi': 'g_hi.png', 'jk!l': 'jk_l.png', 'mno?': 'mno_.png', '_pqr$': '_pqr_.png', } for test in test_cases, unicode_test_cases: for (name, result) in six.iteritems(test): self.assertEqual(GenericProvider(name).image_name(), result)
def test__get_size(self): """ Test _get_size """ self.assertEqual(GenericProvider('Test Provider')._get_size(None), -1)
def test_login(self): """ Test login """ self.assertTrue(GenericProvider('Test Provider').login())
def test__check_auth(self): """ Test _check_auth """ self.assertTrue(GenericProvider('Test Provider')._check_auth())
def test_seed_ratio(self): """ Test seed_ratio """ self.assertEqual(GenericProvider('Test Provider').seed_ratio(), '')
def test_make_id(self): """ Test make_id """ test_cases = { None: '', 123: '123', 12.3: '12_3', 0: '', -123: '_123', -12.3: '_12_3', '': '', ' ': '', '123': '123', ' 123 ': '123', '12.3': '12_3', ' 12.3 ': '12_3', '0': '0', ' 0 ': '0', '-123': '_123', ' -123 ': '_123', '-12.3': '_12_3', ' -12.3 ': '_12_3', 'abc': 'abc', ' abc ': 'abc', 'ABC': 'abc', ' ABC ': 'abc', '.def': '_def', 'g,hi': 'g_hi', 'jk!l': 'jk_l', 'mno?': 'mno_', '_pqr$': '_pqr_', } unicode_test_cases = { u'': '', u' ': '', u'123': '123', u' 123 ': '123', u'12.3': '12_3', u' 12.3 ': '12_3', u'0': '0', u' 0 ': '0', u'-123': '_123', u' -123 ': '_123', u'-12.3': '_12_3', u' -12.3 ': '_12_3', u'abc': 'abc', u' abc ': 'abc', u'ABC': 'abc', u' ABC ': 'abc', u'.def': '_def', u'g,hi': 'g_hi', u'jk!l': 'jk_l', u'mno?': 'mno_', u'_pqr$': '_pqr_', } for test in test_cases, unicode_test_cases: for (name, result) in test.iteritems(): self.assertEqual(GenericProvider.make_id(name), result)
def __init__(self, name): GenericProvider.__init__(self, name) self.provider_type = GenericProvider.TORRENT
def test__verify_download(self): """ Test _verify_download """ self.assertTrue(GenericProvider('Test Provider')._verify_download())
def test__get_storage_dir(self): """ Test _get_storage_dir """ self.assertEqual( GenericProvider('Test Provider')._get_storage_dir(), '')
def test_is_active(self): """ Test is_active """ self.assertFalse(GenericProvider('Test Provider').is_active)
def __init__(self, name): GenericProvider.__init__(self, name) self.ratio = None self.provider_type = GenericProvider.DDL