def test_sni_urls(self): """ Test SNI urls :return: """ print "" # Just checking all providers - we should make this error on non-existent urls. for provider in [ provider for provider in providers.makeProviderList() if provider.name not in self.self_signed_cert_providers ]: print "Checking %s" % provider.name try: requests.head(provider.url, verify=certifi.old_where(), timeout=10) except requests.exceptions.Timeout: pass except requests.exceptions.SSLError as error: if u"SSL3_GET_SERVER_CERTIFICATE" not in ex(error): print "SSLError on %s: %s" % (provider.name, ex(error.message)) raise else: print "Cannot verify certificate for %s" % provider.name except Exception: # pylint: disable=broad-except pass
def test_encoding(self): """ Test encoding """ root_dir = 'C:\\Temp\\TV' strings = ['Les Enfants De La T\xe9l\xe9', 'RT� One'] sickbeard.SYS_ENCODING = None try: locale.setlocale(locale.LC_ALL, "") sickbeard.SYS_ENCODING = locale.getpreferredencoding() except (locale.Error, IOError): pass # For OSes that are poorly configured I'll just randomly force UTF-8 if not sickbeard.SYS_ENCODING or sickbeard.SYS_ENCODING in ('ANSI_X3.4-1968', 'US-ASCII', 'ASCII'): sickbeard.SYS_ENCODING = 'UTF-8' for test in strings: try: show_dir = ek(os.path.join, root_dir, sanitize_filename(test)) self.assertTrue(isinstance(show_dir, six.text_type)) except Exception as error: # pylint: disable=broad-except ex(error)
def test_encoding(self): """ Test encoding """ root_dir = 'C:\\Temp\\TV' strings = ['Les Enfants De La T\xe9l\xe9', 'RT� One'] sickbeard.SYS_ENCODING = None try: locale.setlocale(locale.LC_ALL, "") sickbeard.SYS_ENCODING = locale.getpreferredencoding() except (locale.Error, IOError): pass # For OSes that are poorly configured I'll just randomly force UTF-8 if not sickbeard.SYS_ENCODING or sickbeard.SYS_ENCODING in ( 'ANSI_X3.4-1968', 'US-ASCII', 'ASCII'): sickbeard.SYS_ENCODING = 'UTF-8' for test in strings: try: show_dir = ek(os.path.join, root_dir, sanitize_filename(test)) self.assertTrue(isinstance(show_dir, six.text_type)) except Exception as error: # pylint: disable=broad-except ex(error)
def tearDown_test_db(): for current_db in [ TESTDBNAME, TESTCACHEDBNAME, TESTFAILEDDBNAME ]: file_name = ek(os.path.join, TESTDIR, current_db) if ek(os.path.exists,file_name): try: ek(os.remove, file_name) except Exception as e: print sickbeard.ex(e) continue
def _add_torrent_file(self, result): if not (self.auth or result): return False # Send request to rTorrent try: # Send torrent to rTorrent torrent = self.auth.load_torrent(result.content) if not torrent: return False # Set label label = sickbeard.TORRENT_LABEL if result.show.is_anime: label = sickbeard.TORRENT_LABEL_ANIME if label: torrent.set_custom(1, label) if sickbeard.TORRENT_PATH: torrent.set_directory(sickbeard.TORRENT_PATH) # Start torrent torrent.start() except Exception as msg: # pylint: disable=broad-except logger.log('Error while sending torrent: {error}'.format # pylint: disable=no-member (error=ex(msg)), logger.WARNING) return False else: return True
def _add_torrent_uri(self, result): if not self.auth: return False if not result: return False try: # Send magnet to rTorrent torrent = self.auth.load_magnet(result.url, result.hash) if not torrent: return False # Set label label = sickbeard.TORRENT_LABEL if result.show.is_anime: label = sickbeard.TORRENT_LABEL_ANIME if label: torrent.set_custom(1, label) if sickbeard.TORRENT_PATH: torrent.set_directory(sickbeard.TORRENT_PATH) # Start torrent torrent.start() return True except Exception as error: # pylint: disable=broad-except logger.log(u'Error while sending torrent: {error}'.format # pylint: disable=no-member (error=ex(error)), logger.WARNING) return False
def _add_torrent_uri(self, result): if not self.auth: return False if not result: return False try: # Send magnet to rTorrent torrent = self.auth.load_magnet(result.url, result.hash) if not torrent: return False # Set label label = sickbeard.TORRENT_LABEL if result.show.is_anime: label = sickbeard.TORRENT_LABEL_ANIME if label: torrent.set_custom(1, label) if sickbeard.TORRENT_PATH: torrent.set_directory(sickbeard.TORRENT_PATH) if not sickbeard.TORRENT_PAUSED: # Start torrent torrent.start() return True except Exception as error: # pylint: disable=broad-except logger.log(u'Error while sending torrent: {error}'.format # pylint: disable=no-member (error=ex(error)), logger.WARNING) return False
def tearDown_test_db(): for current_db in [TESTDBNAME, TESTCACHEDBNAME, TESTFAILEDDBNAME]: file_name = ek(os.path.join, TESTDIR, current_db) if ek(os.path.exists, file_name): try: ek(os.remove, file_name) except Exception as e: print(sickbeard.ex(e)) continue
def exception_generator(): """ Dummy function to raise a fake exception and log it """ try: raise Exception('FAKE EXCEPTION') except Exception as error: logger.log("FAKE ERROR: " + ex(error), logger.ERROR) # pylint: disable=no-member logger.submit_errors() # pylint: disable=no-member raise
def _add_torrent_file(self, result): if not self.auth: return False if not result: return False # group_name = 'sb_test'.lower() ##### Use provider instead of _test # if not self._set_torrent_ratio(group_name): # return False # Send request to rTorrent try: # Send torrent to rTorrent torrent = self.auth.load_torrent(result.content) if not torrent: return False # Set label label = sickbeard.TORRENT_LABEL if result.show.is_anime: label = sickbeard.TORRENT_LABEL_ANIME if label: torrent.set_custom(1, label) if sickbeard.TORRENT_PATH: torrent.set_directory(sickbeard.TORRENT_PATH) # Set Ratio Group # torrent.set_visible(group_name) if not sickbeard.TORRENT_PAUSED: # Start torrent torrent.start() return True except Exception as error: # pylint: disable=broad-except logger.log( 'Error while sending torrent: {error}'.format # pylint: disable=no-member (error=ex(error)), logger.WARNING) return False
def _add_torrent_file(self, result): if not self.auth: return False if not result: return False # group_name = 'sb_test'.lower() ##### Use provider instead of _test # if not self._set_torrent_ratio(group_name): # return False # Send request to rTorrent try: # Send torrent to rTorrent torrent = self.auth.load_torrent(result.content) if not torrent: return False # Set label label = sickbeard.TORRENT_LABEL if result.show.is_anime: label = sickbeard.TORRENT_LABEL_ANIME if label: torrent.set_custom(1, label) if sickbeard.TORRENT_PATH: torrent.set_directory(sickbeard.TORRENT_PATH) # Set Ratio Group # torrent.set_visible(group_name) if not sickbeard.TORRENT_PAUSED: # Start torrent torrent.start() return True except Exception as error: # pylint: disable=broad-except logger.log(u'Error while sending torrent: {error}'.format # pylint: disable=no-member (error=ex(error)), logger.WARNING) return False
def _connectivity_test(self): # pylint: disable=unused-argument """ Generate tests :param self: :return: test to run """ if not _provider.url: print '%s has no url set, skipping' % _provider.name return try: requests.head(_provider.url, verify=certifi.old_where(), timeout=10) except requests.exceptions.SSLError as error: if 'certificate verify failed' in str(error): print 'Cannot verify certificate for %s' % _provider.name else: print 'SSLError on %s: %s' % (_provider.name, ex(error.message)) raise except requests.exceptions.Timeout: print 'Provider timed out'
def _connectivity_test(): """ Generate tests :param self: :return: test to run """ if not _provider.url: print '%s has no url set, skipping' % _provider.name return try: requests.head(_provider.url, verify=certifi.old_where(), timeout=10) except requests.exceptions.SSLError as error: if 'certificate verify failed' in str(error): print 'Cannot verify certificate for %s' % _provider.name else: print 'SSLError on %s: %s' % (_provider.name, ex(error.message)) raise except requests.exceptions.Timeout: print 'Provider timed out'
def _connectivity_test(): """ Generate tests :param self: :return: test to run """ if not _provider.url: print('{0} has no url set, skipping'.format(_provider.name)) return try: requests.head(_provider.url, verify=certifi.where(), timeout=10) except requests.exceptions.SSLError as error: if 'certificate verify failed' in str(error): print('Cannot verify certificate for {0}'.format(_provider.name)) else: print('SSLError on {0}: {1}'.format(_provider.name, ex(error.message))) raise except requests.exceptions.Timeout: print('Provider timed out')
def _add_torrent_uri(self, result): if not (self.auth and result): return False try: # Send torrent magnet with params to rTorrent and optionally start download torrent = self.auth.load_magnet(result.url, result.hash, start=not sickbeard.TORRENT_PAUSED, params=self._get_params(result)) if not torrent: return False return True except Exception as error: logger.log( 'Error while sending torrent: {error}'.format(error=ex(error)), logger.WARNING) return False
def _add_torrent_file(self, result): if not (self.auth and result): return False try: # Send torrent file with params to rTorrent and optionally start download torrent = self.auth.load_torrent( result.content, start=not sickbeard.TORRENT_PAUSED, params=self._get_params(result)) if not torrent: return False return True except Exception as error: # pylint: disable=broad-except logger.log( 'Error while sending torrent: {error}'.format # pylint: disable=no-member (error=ex(error)), logger.WARNING) return False
def test_none_returns_empty(self): """ Test none returns empty """ self.assertEqual(ex(None), u'')
def test_ex_ret_stringed_args(self): """ Test exception returns stringed args """ self.assertEqual(ex(Exception(303)), 'error 303')
def test_ex_ret_concat_args_strings(self): """ Test exception returns concatenated args and strings """ self.assertEqual(ex(Exception('lots', 'of', 'strings')), 'lots : of : strings')
def test_ex_ret_args_ustring(self): """ Test exception returns args ustring """ self.assertEqual(ex(Exception('\xc3\xa4h')), u'äh')
def test_ex_ret_args_string(self): """ Test exception returns args strings :return: """ self.assertEqual(ex(Exception('hi')), 'hi')
def test_args_of_none_returns_empty(self): """ Test args of none returns empty """ self.assertEqual(ex(Exception(None, None)), u'')
def test_empty_args_returns_empty(self): """ Test empty args returns empty """ self.assertEqual(ex(Exception()), u'')
def _parse_string(self, name): if not name: return matches = [] bestResult = None for (cur_regex_num, cur_regex_name, cur_regex) in self.compiled_regexes: match = cur_regex.match(name) if not match: continue result = ParseResult(name) result.which_regex = [cur_regex_name] result.score = 0 - cur_regex_num named_groups = match.groupdict().keys() if 'series_name' in named_groups: result.series_name = match.group('series_name') if result.series_name: result.series_name = self.clean_series_name(result.series_name) result.score += 1 if 'series_num' in named_groups and match.group('series_num'): result.score += 1 if 'season_num' in named_groups: tmp_season = int(match.group('season_num')) if cur_regex_name == 'bare' and tmp_season in (19, 20): continue result.season_number = tmp_season result.score += 1 if 'ep_num' in named_groups: ep_num = self._convert_number(match.group('ep_num')) if 'extra_ep_num' in named_groups and match.group('extra_ep_num'): result.episode_numbers = range(ep_num, self._convert_number(match.group('extra_ep_num')) + 1) result.score += 1 else: result.episode_numbers = [ep_num] result.score += 1 if 'ep_ab_num' in named_groups: ep_ab_num = self._convert_number(match.group('ep_ab_num')) if 'extra_ab_ep_num' in named_groups and match.group('extra_ab_ep_num'): result.ab_episode_numbers = range(ep_ab_num, self._convert_number(match.group('extra_ab_ep_num')) + 1) result.score += 1 else: result.ab_episode_numbers = [ep_ab_num] result.score += 1 if 'air_date' in named_groups: air_date = match.group('air_date') try: result.air_date = parser.parse(air_date, fuzzy=True).date() result.score += 1 except: continue if 'extra_info' in named_groups: tmp_extra_info = match.group('extra_info') # Show.S04.Special or Show.S05.Part.2.Extras is almost certainly not every episode in the season if tmp_extra_info and cur_regex_name == 'season_only' and re.search( r'([. _-]|^)(special|extra)s?\w*([. _-]|$)', tmp_extra_info, re.I): continue result.extra_info = tmp_extra_info result.score += 1 if 'release_group' in named_groups: result.release_group = match.group('release_group') result.score += 1 if 'version' in named_groups: # assigns version to anime file if detected using anime regex. Non-anime regex receives -1 version = match.group('version') if version: result.version = version else: result.version = 1 else: result.version = -1 matches.append(result) if len(matches): # pick best match with highest score based on placement bestResult = max(sorted(matches, reverse=True, key=lambda x: x.which_regex), key=lambda x: x.score) show = None if not self.naming_pattern: # try and create a show object for this result show = helpers.get_show(bestResult.series_name, self.tryIndexers, self.trySceneExceptions) # confirm passed in show object indexer id matches result show object indexer id if show: if self.showObj and show.indexerid != self.showObj.indexerid: show = None bestResult.show = show elif not show and self.showObj: bestResult.show = self.showObj # if this is a naming pattern test or result doesn't have a show object then return best result if not bestResult.show or self.naming_pattern: return bestResult # get quality bestResult.quality = common.Quality.nameQuality(name, bestResult.show.is_anime) new_episode_numbers = [] new_season_numbers = [] new_absolute_numbers = [] # if we have an air-by-date show then get the real season/episode numbers if bestResult.is_air_by_date: airdate = bestResult.air_date.toordinal() myDB = db.DBConnection() sql_result = myDB.select( "SELECT season, episode FROM tv_episodes WHERE showid = ? and indexer = ? and airdate = ?", [bestResult.show.indexerid, bestResult.show.indexer, airdate]) season_number = None episode_numbers = [] if sql_result: season_number = int(sql_result[0][0]) episode_numbers = [int(sql_result[0][1])] if not season_number or not len(episode_numbers): try: lINDEXER_API_PARMS = sickbeard.indexerApi(bestResult.show.indexer).api_params.copy() if bestResult.show.lang: lINDEXER_API_PARMS['language'] = bestResult.show.lang t = sickbeard.indexerApi(bestResult.show.indexer).indexer(**lINDEXER_API_PARMS) epObj = t[bestResult.show.indexerid].airedOn(bestResult.air_date)[0] season_number = int(epObj["seasonnumber"]) episode_numbers = [int(epObj["episodenumber"])] except sickbeard.indexer_episodenotfound: logger.log(u"Unable to find episode with date " + str(bestResult.air_date) + " for show " + bestResult.show.name + ", skipping", logger.WARNING) episode_numbers = [] except sickbeard.indexer_error, e: logger.log(u"Unable to contact " + sickbeard.indexerApi(bestResult.show.indexer).name + ": " + ex(e), logger.WARNING) episode_numbers = [] for epNo in episode_numbers: s = season_number e = epNo if self.convert: (s, e) = scene_numbering.get_indexer_numbering(bestResult.show.indexerid, bestResult.show.indexer, season_number, epNo) new_episode_numbers.append(e) new_season_numbers.append(s) elif bestResult.show.is_anime and len(bestResult.ab_episode_numbers): scene_season = scene_exceptions.get_scene_exception_by_name(bestResult.series_name)[1] for epAbsNo in bestResult.ab_episode_numbers: a = epAbsNo if self.convert: a = scene_numbering.get_indexer_absolute_numbering(bestResult.show.indexerid, bestResult.show.indexer, epAbsNo, True, scene_season) (s, e) = helpers.get_all_episodes_from_absolute_number(bestResult.show, [a]) new_absolute_numbers.append(a) new_episode_numbers.extend(e) new_season_numbers.append(s) elif bestResult.season_number and len(bestResult.episode_numbers): for epNo in bestResult.episode_numbers: s = bestResult.season_number e = epNo if self.convert: (s, e) = scene_numbering.get_indexer_numbering(bestResult.show.indexerid, bestResult.show.indexer, bestResult.season_number, epNo) if bestResult.show.is_anime: a = helpers.get_absolute_number_from_season_and_episode(bestResult.show, s, e) if a: new_absolute_numbers.append(a) new_episode_numbers.append(e) new_season_numbers.append(s) # need to do a quick sanity check heregex. It's possible that we now have episodes # from more than one season (by tvdb numbering), and this is just too much # for sickbeard, so we'd need to flag it. new_season_numbers = list(set(new_season_numbers)) # remove duplicates if len(new_season_numbers) > 1: raise InvalidNameException("Scene numbering results episodes from " "seasons %s, (i.e. more than one) and " "sickrage does not support this. " "Sorry." % (str(new_season_numbers))) # I guess it's possible that we'd have duplicate episodes too, so lets # eliminate them new_episode_numbers = list(set(new_episode_numbers)) new_episode_numbers.sort() # maybe even duplicate absolute numbers so why not do them as well new_absolute_numbers = list(set(new_absolute_numbers)) new_absolute_numbers.sort() if len(new_absolute_numbers): bestResult.ab_episode_numbers = new_absolute_numbers if len(new_season_numbers) and len(new_episode_numbers): bestResult.episode_numbers = new_episode_numbers bestResult.season_number = new_season_numbers[0] if self.convert: logger.log( u"Converted parsed result " + bestResult.original_name + " into " + str(bestResult).decode('utf-8', 'xmlcharrefreplace'), logger.DEBUG)
def _parse_string(self, name): if not name: return matches = [] bestResult = None for (cur_regex_num, cur_regex_name, cur_regex) in self.compiled_regexes: match = cur_regex.match(name) if not match: continue result = ParseResult(name) result.which_regex = [cur_regex_name] result.score = 0 - cur_regex_num named_groups = match.groupdict().keys() if 'series_name' in named_groups: result.series_name = match.group('series_name') if result.series_name: result.series_name = self.clean_series_name(result.series_name) result.score += 1 if 'series_num' in named_groups and match.group('series_num'): result.score += 1 if 'season_num' in named_groups: tmp_season = int(match.group('season_num')) if cur_regex_name == 'bare' and tmp_season in (19, 20): continue result.season_number = tmp_season result.score += 1 if 'ep_num' in named_groups: ep_num = self._convert_number(match.group('ep_num')) if 'extra_ep_num' in named_groups and match.group('extra_ep_num'): result.episode_numbers = range(ep_num, self._convert_number(match.group('extra_ep_num')) + 1) result.score += 1 else: result.episode_numbers = [ep_num] result.score += 1 if 'ep_ab_num' in named_groups: ep_ab_num = self._convert_number(match.group('ep_ab_num')) if 'extra_ab_ep_num' in named_groups and match.group('extra_ab_ep_num'): result.ab_episode_numbers = range(ep_ab_num, self._convert_number(match.group('extra_ab_ep_num')) + 1) result.score += 1 else: result.ab_episode_numbers = [ep_ab_num] result.score += 1 if 'air_date' in named_groups: air_date = match.group('air_date') try: result.air_date = parser.parse(air_date, fuzzy=True).date() result.score += 1 except: continue if 'extra_info' in named_groups: tmp_extra_info = match.group('extra_info') result.audio_langs = 'en' if tmp_extra_info: for (cur_lang_regex_name, cur_lang_regex) in self.compiled_language_regexes: lang_match = cur_lang_regex.match(name) if not lang_match: continue else: logger.log(u"Found " + showLanguages.get(cur_lang_regex_name) + " episode",logger.DEBUG) result.audio_langs = cur_lang_regex_name # Show.S04.Special or Show.S05.Part.2.Extras is almost certainly not every episode in the season if tmp_extra_info and cur_regex_name == 'season_only' and re.search( r'([. _-]|^)(special|extra)s?\w*([. _-]|$)', tmp_extra_info, re.I): continue result.extra_info = tmp_extra_info result.score += 1 if 'release_group' in named_groups: result.release_group = match.group('release_group') result.score += 1 if 'version' in named_groups: # assigns version to anime file if detected using anime regex. Non-anime regex receives -1 version = match.group('version') if version: result.version = version else: result.version = 1 else: result.version = -1 matches.append(result) if len(matches): # pick best match with highest score based on placement bestResult = max(sorted(matches, reverse=True, key=lambda x: x.which_regex), key=lambda x: x.score) show = None if not self.naming_pattern: # try and create a show object for this result show = helpers.get_show(bestResult.series_name, self.tryIndexers, self.trySceneExceptions) # confirm passed in show object indexer id matches result show object indexer id if show: if self.showObj and show.indexerid != self.showObj.indexerid: show = None bestResult.show = show elif not show and self.showObj: bestResult.show = self.showObj # if this is a naming pattern test or result doesn't have a show object then return best result if not bestResult.show or self.naming_pattern: return bestResult # get quality bestResult.quality = common.Quality.nameQuality(name, bestResult.show.is_anime) new_episode_numbers = [] new_season_numbers = [] new_absolute_numbers = [] # if we have an air-by-date show then get the real season/episode numbers if bestResult.is_air_by_date: airdate = bestResult.air_date.toordinal() myDB = db.DBConnection() sql_result = myDB.select( "SELECT season, episode FROM tv_episodes WHERE showid = ? and indexer = ? and airdate = ?", [bestResult.show.indexerid, bestResult.show.indexer, airdate]) season_number = None episode_numbers = [] if sql_result: season_number = int(sql_result[0][0]) episode_numbers = [int(sql_result[0][1])] if not season_number or not len(episode_numbers): try: lINDEXER_API_PARMS = sickbeard.indexerApi(bestResult.show.indexer).api_params.copy() if bestResult.show.lang: lINDEXER_API_PARMS['language'] = bestResult.show.lang t = sickbeard.indexerApi(bestResult.show.indexer).indexer(**lINDEXER_API_PARMS) epObj = t[bestResult.show.indexerid].airedOn(bestResult.air_date)[0] season_number = int(epObj["seasonnumber"]) episode_numbers = [int(epObj["episodenumber"])] except sickbeard.indexer_episodenotfound: logger.log(u"Unable to find episode with date " + str(bestResult.air_date) + " for show " + bestResult.show.name + ", skipping", logger.WARNING) episode_numbers = [] except sickbeard.indexer_error, e: logger.log(u"Unable to contact " + sickbeard.indexerApi(bestResult.show.indexer).name + ": " + ex(e), logger.WARNING) episode_numbers = [] for epNo in episode_numbers: s = season_number e = epNo if self.convert: (s, e) = scene_numbering.get_indexer_numbering(bestResult.show.indexerid, bestResult.show.indexer, season_number, epNo) new_episode_numbers.append(e) new_season_numbers.append(s) elif bestResult.show.is_anime and len(bestResult.ab_episode_numbers): scene_season = scene_exceptions.get_scene_exception_by_name(bestResult.series_name)[1] for epAbsNo in bestResult.ab_episode_numbers: a = epAbsNo if self.convert: a = scene_numbering.get_indexer_absolute_numbering(bestResult.show.indexerid, bestResult.show.indexer, epAbsNo, True, scene_season) (s, e) = helpers.get_all_episodes_from_absolute_number(bestResult.show, [a]) new_absolute_numbers.append(a) new_episode_numbers.extend(e) new_season_numbers.append(s) elif bestResult.season_number and len(bestResult.episode_numbers): for epNo in bestResult.episode_numbers: s = bestResult.season_number e = epNo if self.convert: (s, e) = scene_numbering.get_indexer_numbering(bestResult.show.indexerid, bestResult.show.indexer, bestResult.season_number, epNo) if bestResult.show.is_anime: a = helpers.get_absolute_number_from_season_and_episode(bestResult.show, s, e) if a: new_absolute_numbers.append(a) new_episode_numbers.append(e) new_season_numbers.append(s) # need to do a quick sanity check heregex. It's possible that we now have episodes # from more than one season (by tvdb numbering), and this is just too much # for sickbeard, so we'd need to flag it. new_season_numbers = list(set(new_season_numbers)) # remove duplicates if len(new_season_numbers) > 1: raise InvalidNameException("Scene numbering results episodes from " "seasons %s, (i.e. more than one) and " "sickrage does not support this. " "Sorry." % (str(new_season_numbers))) # I guess it's possible that we'd have duplicate episodes too, so lets # eliminate them new_episode_numbers = list(set(new_episode_numbers)) new_episode_numbers.sort() # maybe even duplicate absolute numbers so why not do them as well new_absolute_numbers = list(set(new_absolute_numbers)) new_absolute_numbers.sort() if len(new_absolute_numbers): bestResult.ab_episode_numbers = new_absolute_numbers if len(new_season_numbers) and len(new_episode_numbers): bestResult.episode_numbers = new_episode_numbers bestResult.season_number = new_season_numbers[0] if self.convert: logger.log( u"Converted parsed result " + bestResult.original_name + " into " + str(bestResult).decode('utf-8', 'xmlcharrefreplace'), logger.DEBUG)