def downloadSubtitles(subtitles_info): existing_subtitles = subtitles_info[b'subtitles'] # First of all, check if we need subtitles languages = getNeededLanguages(existing_subtitles) if not languages: logging.debug('%s: No missing subtitles for S%02dE%02d' % ( subtitles_info[b'show.indexerid'], subtitles_info[b'season'], subtitles_info[b'episode'])) return existing_subtitles, None subtitles_path = getSubtitlesPath(subtitles_info[b'location']).encode(sickbeard.SYS_ENCODING) video_path = subtitles_info[b'location'].encode(sickbeard.SYS_ENCODING) providers = getEnabledServiceList() try: video = subliminal.scan_video(video_path, subtitles=False, embedded_subtitles=False) except Exception: logging.debug('%s: Exception caught in subliminal.scan_video for S%02dE%02d' % (subtitles_info[b'show.indexerid'], subtitles_info[b'season'], subtitles_info[b'episode'])) return existing_subtitles, None provider_configs = {'addic7ed': {'username': sickbeard.ADDIC7ED_USER, 'password': sickbeard.ADDIC7ED_PASS}, 'legendastv': {'username': sickbeard.LEGENDASTV_USER, 'password': sickbeard.LEGENDASTV_PASS}, 'opensubtitles': {'username': sickbeard.OPENSUBTITLES_USER, 'password': sickbeard.OPENSUBTITLES_PASS}} pool = subliminal.api.ProviderPool(providers=providers, provider_configs=provider_configs) try: subtitles_list = pool.list_subtitles(video, languages) if not subtitles_list: logging.debug('%s: No subtitles found for S%02dE%02d on any provider' % ( subtitles_info[b'show.indexerid'], subtitles_info[b'season'], subtitles_info[b'episode'])) return existing_subtitles, None found_subtitles = pool.download_best_subtitles(subtitles_list, video, languages=languages, hearing_impaired=sickbeard.SUBTITLES_HEARING_IMPAIRED, only_one=not sickbeard.SUBTITLES_MULTI) save_subtitles(video, found_subtitles, directory=subtitles_path, single=not sickbeard.SUBTITLES_MULTI) if not sickbeard.EMBEDDED_SUBTITLES_ALL and sickbeard.SUBTITLES_EXTRA_SCRIPTS and video_path.endswith( ('.mkv', '.mp4')): run_subs_extra_scripts(subtitles_info, found_subtitles, video, single=not sickbeard.SUBTITLES_MULTI) current_subtitles = subtitlesLanguages(video_path)[0] new_subtitles = frozenset(current_subtitles).difference(existing_subtitles) except Exception: logging.info("Error occurred when downloading subtitles for: %s" % video_path) logging.error(traceback.format_exc()) return existing_subtitles, None if sickbeard.SUBTITLES_HISTORY: for subtitle in found_subtitles: logging.debug('history.logSubtitle %s, %s' % (subtitle.provider_name, subtitle.language.opensubtitles)) history.logSubtitle(subtitles_info[b'show.indexerid'], subtitles_info[b'season'], subtitles_info[b'episode'], subtitles_info[b'status'], subtitle) return current_subtitles, new_subtitles
def downloadSubtitles(subtitles_info): existing_subtitles = subtitles_info['subtitles'] # First of all, check if we need subtitles languages = getNeededLanguages(existing_subtitles) if not languages: logger.log(u'%s: No missing subtitles for S%02dE%02d' % (subtitles_info['show.indexerid'], subtitles_info['season'], subtitles_info['episode']), logger.DEBUG) return (existing_subtitles, None) subtitles_path = getSubtitlesPath(subtitles_info['location']).encode(sickbeard.SYS_ENCODING) video_path = subtitles_info['location'].encode(sickbeard.SYS_ENCODING) providers = getEnabledServiceList() try: video = subliminal.scan_video(video_path, subtitles=False, embedded_subtitles=False) except Exception: logger.log(u'%s: Exception caught in subliminal.scan_video for S%02dE%02d' % (subtitles_info['show.indexerid'], subtitles_info['season'], subtitles_info['episode']), logger.DEBUG) return (existing_subtitles, None) try: # TODO: Add gui option for hearing_impaired parameter ? found_subtitles = subliminal.download_best_subtitles([video], languages=languages, hearing_impaired=False, only_one=not sickbeard.SUBTITLES_MULTI, providers=providers) if not found_subtitles: logger.log(u'%s: No subtitles found for S%02dE%02d on any provider' % (subtitles_info['show.indexerid'], subtitles_info['season'], subtitles_info['episode']), logger.DEBUG) return (existing_subtitles, None) for index, subtitle in enumerate(found_subtitles[video]): encoding = subliminal.subtitle.Subtitle.guess_encoding(subtitle) found_subtitles[video][index].encoding = encoding subliminal.save_subtitles(video, found_subtitles[video], directory=subtitles_path, single=not sickbeard.SUBTITLES_MULTI) for video, subtitles in found_subtitles.iteritems(): for subtitle in subtitles: new_video_path = subtitles_path + "/" + video.name.rsplit("/", 1)[-1] new_subtitles_path = subliminal.subtitle.get_subtitle_path(new_video_path, subtitle.language if sickbeard.SUBTITLES_MULTI else None) sickbeard.helpers.chmodAsParent(new_subtitles_path) sickbeard.helpers.fixSetGroupID(new_subtitles_path) if not sickbeard.EMBEDDED_SUBTITLES_ALL and sickbeard.SUBTITLES_EXTRA_SCRIPTS and video_path.endswith(('.mkv','.mp4')): run_subs_extra_scripts(subtitles_info, found_subtitles) current_subtitles = subtitlesLanguages(video_path)[0] new_subtitles = frozenset(current_subtitles).difference(existing_subtitles) except Exception as e: logger.log("Error occurred when downloading subtitles for: %s" % video_path) logger.log(traceback.format_exc(), logger.ERROR) return (existing_subtitles, None) if sickbeard.SUBTITLES_HISTORY: for video, subtitles in found_subtitles.iteritems(): for subtitle in subtitles: logger.log(u'history.logSubtitle %s, %s' % (subtitle.provider_name, subtitle.language.opensubtitles), logger.DEBUG) history.logSubtitle(subtitles_info['show.indexerid'], subtitles_info['season'], subtitles_info['episode'], subtitles_info['status'], subtitle) return (current_subtitles, new_subtitles)
def download_subtitles(subtitles_info): # pylint: disable=too-many-locals, too-many-branches, too-many-statements existing_subtitles = subtitles_info['subtitles'] if not needs_subtitles(existing_subtitles): logger.log( u'Episode already has all needed subtitles, skipping {0} {1}'. format( subtitles_info['show_name'], episode_num(subtitles_info['season'], subtitles_info['episode']) or episode_num(subtitles_info['season'], subtitles_info['episode'], numbering='absolute')), logger.DEBUG) return existing_subtitles, None languages = get_needed_languages(existing_subtitles) if not languages: logger.log( u'No subtitles needed for {0} {1}'.format( subtitles_info['show_name'], episode_num(subtitles_info['season'], subtitles_info['episode']) or episode_num(subtitles_info['season'], subtitles_info['episode'], numbering='absolute')), logger.DEBUG) return existing_subtitles, None subtitles_path = get_subtitles_path(subtitles_info['location']) video_path = subtitles_info['location'] # Perfect match = hash score - hearing impaired score - resolution score (subtitle for 720p is the same as for 1080p) # Perfect match = 215 - 1 - 1 = 213 # Non-perfect match = series + year + season + episode # Non-perfect match = 108 + 54 + 18 + 18 = 198 # From latest subliminal code: # episode_scores = {'hash': 215, 'series': 108, 'year': 54, 'season': 18, 'episode': 18, 'release_group': 9, # 'format': 4, 'audio_codec': 2, 'resolution': 1, 'hearing_impaired': 1, 'video_codec': 1} user_score = 213 if sickbeard.SUBTITLES_PERFECT_MATCH else 198 video = get_video(video_path, subtitles_path=subtitles_path) if not video: logger.log( u'Exception caught in subliminal.scan_video for {0} {1}'.format( subtitles_info['show_name'], episode_num(subtitles_info['season'], subtitles_info['episode']) or episode_num(subtitles_info['season'], subtitles_info['episode'], numbering='absolute')), logger.DEBUG) return existing_subtitles, None providers = enabled_service_list() pool = SubtitleProviderPool() try: subtitles_list = pool.list_subtitles(video, languages) for provider in providers: if provider in pool.discarded_providers: logger.log( u'Could not search in {0} provider. Discarding for now'. format(provider), logger.DEBUG) if not subtitles_list: logger.log( u'No subtitles found for {0} {1}'.format( subtitles_info['show_name'], episode_num(subtitles_info['season'], subtitles_info['episode']) or episode_num(subtitles_info['season'], subtitles_info['episode'], numbering='absolute')), logger.DEBUG) return existing_subtitles, None for subtitle in subtitles_list: score = subliminal.score.compute_score( subtitle, video, hearing_impaired=sickbeard.SUBTITLES_HEARING_IMPAIRED) logger.log( u'[{0}] Subtitle score for {1} is: {2} (min={3})'.format( subtitle.provider_name, subtitle.id, score, user_score), logger.DEBUG) found_subtitles = pool.download_best_subtitles( subtitles_list, video, languages=languages, hearing_impaired=sickbeard.SUBTITLES_HEARING_IMPAIRED, min_score=user_score, only_one=not sickbeard.SUBTITLES_MULTI) subliminal.save_subtitles(video, found_subtitles, directory=subtitles_path, single=not sickbeard.SUBTITLES_MULTI) except IOError as error: if 'No space left on device' in ex(error): logger.log(u'Not enough space on the drive to save subtitles', logger.WARNING) else: logger.log(traceback.format_exc(), logger.WARNING) except Exception: logger.log( u'Error occurred when downloading subtitles for: {0}'.format( video_path)) logger.log(traceback.format_exc(), logger.ERROR) return existing_subtitles, None for subtitle in found_subtitles: subtitle_path = subliminal.subtitle.get_subtitle_path( video.name, None if not sickbeard.SUBTITLES_MULTI else subtitle.language) if subtitles_path is not None: subtitle_path = os.path.join(subtitles_path, os.path.split(subtitle_path)[1]) sickbeard.helpers.chmodAsParent(subtitle_path) sickbeard.helpers.fixSetGroupID(subtitle_path) if sickbeard.SUBTITLES_HISTORY: logger.log( u'history.logSubtitle {0}, {1}'.format( subtitle.provider_name, subtitle.language.opensubtitles), logger.DEBUG) history.logSubtitle(subtitles_info['show_indexerid'], subtitles_info['season'], subtitles_info['episode'], subtitles_info['status'], subtitle) if sickbeard.SUBTITLES_EXTRA_SCRIPTS and isMediaFile( video_path) and not sickbeard.EMBEDDED_SUBTITLES_ALL: run_subs_extra_scripts(subtitles_info, subtitle, video, single=not sickbeard.SUBTITLES_MULTI) new_subtitles = sorted( {subtitle.language.opensubtitles for subtitle in found_subtitles}) current_subtitles = sorted( {subtitle for subtitle in new_subtitles + existing_subtitles}) if existing_subtitles else new_subtitles if not sickbeard.SUBTITLES_MULTI and len(found_subtitles) == 1: new_code = found_subtitles[0].language.opensubtitles if new_code not in existing_subtitles: current_subtitles.remove(new_code) current_subtitles.append('und') return current_subtitles, new_subtitles
def download_subtitles(subtitles_info): # pylint: disable=too-many-locals, too-many-branches, too-many-statements existing_subtitles = subtitles_info['subtitles'] if not needs_subtitles(existing_subtitles): logger.log(u'Episode already has all needed subtitles, skipping %s S%02dE%02d' % (subtitles_info['show_name'], subtitles_info['season'], subtitles_info['episode']), logger.DEBUG) return existing_subtitles, None # Check if we really need subtitles languages = get_needed_languages(existing_subtitles) if not languages: logger.log(u'No subtitles needed for %s S%02dE%02d' % (subtitles_info['show_name'], subtitles_info['season'], subtitles_info['episode']), logger.DEBUG) return existing_subtitles, None subtitles_path = get_subtitles_path(subtitles_info['location']).encode(sickbeard.SYS_ENCODING) video_path = subtitles_info['location'].encode(sickbeard.SYS_ENCODING) user_score = 132 if sickbeard.SUBTITLES_PERFECT_MATCH else 111 video = get_video(video_path, subtitles_path=subtitles_path) if not video: logger.log(u'Exception caught in subliminal.scan_video for %s S%02dE%02d' % (subtitles_info['show_name'], subtitles_info['season'], subtitles_info['episode']), logger.DEBUG) return existing_subtitles, None providers = enabled_service_list() provider_configs = {'addic7ed': {'username': sickbeard.ADDIC7ED_USER, 'password': sickbeard.ADDIC7ED_PASS}, 'legendastv': {'username': sickbeard.LEGENDASTV_USER, 'password': sickbeard.LEGENDASTV_PASS}, 'opensubtitles': {'username': sickbeard.OPENSUBTITLES_USER, 'password': sickbeard.OPENSUBTITLES_PASS}} pool = subliminal.api.ProviderPool(providers=providers, provider_configs=provider_configs) try: subtitles_list = pool.list_subtitles(video, languages) if not subtitles_list: logger.log(u'No subtitles found for %s S%02dE%02d on any provider' % (subtitles_info['show_name'], subtitles_info['season'], subtitles_info['episode']), logger.DEBUG) return existing_subtitles, None for subtitle in subtitles_list: matches = subtitle.get_matches(video, hearing_impaired=False) score = subliminal.subtitle.compute_score(matches, video) logger.log(u"[%s] Subtitle score for %s is: %s (min=%s)" % (subtitle.provider_name, subtitle.id, score, user_score), logger.DEBUG) found_subtitles = pool.download_best_subtitles(subtitles_list, video, languages=languages, hearing_impaired=sickbeard.SUBTITLES_HEARING_IMPAIRED, min_score=user_score, only_one=not sickbeard.SUBTITLES_MULTI) subliminal.save_subtitles(video, found_subtitles, directory=subtitles_path, single=not sickbeard.SUBTITLES_MULTI) except IOError as error: if 'No space left on device' in ex(error): logger.log(u'Not enough space on the drive to save subtitles', logger.WARNING) else: logger.log(traceback.format_exc(), logger.WARNING) except Exception: logger.log(u"Error occurred when downloading subtitles for: %s" % video_path) logger.log(traceback.format_exc(), logger.ERROR) return existing_subtitles, None for subtitle in found_subtitles: subtitle_path = subliminal.subtitle.get_subtitle_path(video.name, None if not sickbeard.SUBTITLES_MULTI else subtitle.language) if subtitles_path is not None: subtitle_path = ek(os.path.join, subtitles_path, ek(os.path.split, subtitle_path)[1]) sickbeard.helpers.chmodAsParent(subtitle_path) sickbeard.helpers.fixSetGroupID(subtitle_path) if sickbeard.SUBTITLES_HISTORY: logger.log(u'history.logSubtitle %s, %s' % (subtitle.provider_name, subtitle.language.opensubtitles), logger.DEBUG) history.logSubtitle(subtitles_info['show_indexerid'], subtitles_info['season'], subtitles_info['episode'], subtitles_info['status'], subtitle) if sickbeard.SUBTITLES_EXTRA_SCRIPTS and isMediaFile(video_path) and not sickbeard.EMBEDDED_SUBTITLES_ALL: run_subs_extra_scripts(subtitles_info, subtitle, video, single=not sickbeard.SUBTITLES_MULTI) new_subtitles = sorted({subtitle.language.opensubtitles for subtitle in found_subtitles}) current_subtitles = sorted({subtitle for subtitle in new_subtitles + existing_subtitles}) if existing_subtitles else new_subtitles if not sickbeard.SUBTITLES_MULTI and len(found_subtitles) == 1: new_code = found_subtitles[0].language.opensubtitles if new_code not in existing_subtitles: current_subtitles.remove(new_code) current_subtitles.append('und') return current_subtitles, new_subtitles
def download_subtitles(subtitles_info): # pylint: disable=too-many-locals, too-many-branches, too-many-statements existing_subtitles = subtitles_info['subtitles'] if not needs_subtitles(existing_subtitles): logger.log(u'Episode already has all needed subtitles, skipping {} {}'.format (subtitles_info['show_name'], episode_num(subtitles_info['season'], subtitles_info['episode']) or episode_num(subtitles_info['season'], subtitles_info['episode'], numbering='absolute')), logger.DEBUG) return existing_subtitles, None # Check if we really need subtitles languages = get_needed_languages(existing_subtitles) if not languages: logger.log(u'No subtitles needed for {} {}'.format (subtitles_info['show_name'], episode_num(subtitles_info['season'], subtitles_info['episode']) or episode_num(subtitles_info['season'], subtitles_info['episode'], numbering='absolute')), logger.DEBUG) return existing_subtitles, None subtitles_path = get_subtitles_path(subtitles_info['location']) video_path = subtitles_info['location'] # Perfect match = hash score - hearing impaired score - resolution score (subtitle for 720p its the same for 1080p) # Perfect match = 215 -1 -1 = 213 # No-perfect match = hash score - hearing impaired score - resolution score - release_group score # No-perfect match = 215 -1 -1 -9 = 204 # From latest subliminal code: # episode_scores = {'hash': 215, 'series': 108, 'year': 54, 'season': 18, 'episode': 18, 'release_group': 9, # 'format': 4, 'audio_codec': 2, 'resolution': 1, 'hearing_impaired': 1, 'video_codec': 1} user_score = 213 if sickbeard.SUBTITLES_PERFECT_MATCH else 204 video = get_video(video_path, subtitles_path=subtitles_path) if not video: logger.log(u'Exception caught in subliminal.scan_video for {} {}'.format (subtitles_info['show_name'], episode_num(subtitles_info['season'], subtitles_info['episode']) or episode_num(subtitles_info['season'], subtitles_info['episode'], numbering='absolute')), logger.DEBUG) return existing_subtitles, None providers = enabled_service_list() provider_configs = {'addic7ed': {'username': sickbeard.ADDIC7ED_USER, 'password': sickbeard.ADDIC7ED_PASS}, 'legendastv': {'username': sickbeard.LEGENDASTV_USER, 'password': sickbeard.LEGENDASTV_PASS}, 'opensubtitles': {'username': sickbeard.OPENSUBTITLES_USER, 'password': sickbeard.OPENSUBTITLES_PASS}} pool = ProviderPool(providers=providers, provider_configs=provider_configs) try: subtitles_list = pool.list_subtitles(video, languages) for provider in providers: if provider in pool.discarded_providers: logger.log(u'Could not search in {} provider. Discarding for now'.format(provider), logger.DEBUG) if not subtitles_list: logger.log(u'No subtitles found for {} {}'.format (subtitles_info['show_name'], episode_num(subtitles_info['season'], subtitles_info['episode']) or episode_num(subtitles_info['season'], subtitles_info['episode'], numbering='absolute')), logger.DEBUG) return existing_subtitles, None for subtitle in subtitles_list: score = subliminal.score.compute_score(subtitle, video, hearing_impaired=sickbeard.SUBTITLES_HEARING_IMPAIRED) logger.log(u'[{}] Subtitle score for {} is: {} (min={})'.format (subtitle.provider_name, subtitle.id, score, user_score), logger.DEBUG) found_subtitles = pool.download_best_subtitles(subtitles_list, video, languages=languages, hearing_impaired=sickbeard.SUBTITLES_HEARING_IMPAIRED, min_score=user_score, only_one=not sickbeard.SUBTITLES_MULTI) subliminal.save_subtitles(video, found_subtitles, directory=subtitles_path, single=not sickbeard.SUBTITLES_MULTI) except IOError as error: if 'No space left on device' in ex(error): logger.log(u'Not enough space on the drive to save subtitles', logger.WARNING) else: logger.log(traceback.format_exc(), logger.WARNING) except Exception: logger.log(u'Error occurred when downloading subtitles for: {}'.format(video_path)) logger.log(traceback.format_exc(), logger.ERROR) return existing_subtitles, None for subtitle in found_subtitles: subtitle_path = subliminal.subtitle.get_subtitle_path(video.name, None if not sickbeard.SUBTITLES_MULTI else subtitle.language) if subtitles_path is not None: subtitle_path = os.path.join(subtitles_path, os.path.split(subtitle_path)[1]) sickbeard.helpers.chmodAsParent(subtitle_path) sickbeard.helpers.fixSetGroupID(subtitle_path) if sickbeard.SUBTITLES_HISTORY: logger.log(u'history.logSubtitle {}, {}'.format (subtitle.provider_name, subtitle.language.opensubtitles), logger.DEBUG) history.logSubtitle(subtitles_info['show_indexerid'], subtitles_info['season'], subtitles_info['episode'], subtitles_info['status'], subtitle) if sickbeard.SUBTITLES_EXTRA_SCRIPTS and isMediaFile(video_path) and not sickbeard.EMBEDDED_SUBTITLES_ALL: run_subs_extra_scripts(subtitles_info, subtitle, video, single=not sickbeard.SUBTITLES_MULTI) new_subtitles = sorted({subtitle.language.opensubtitles for subtitle in found_subtitles}) current_subtitles = sorted({subtitle for subtitle in new_subtitles + existing_subtitles}) if existing_subtitles else new_subtitles if not sickbeard.SUBTITLES_MULTI and len(found_subtitles) == 1: new_code = found_subtitles[0].language.opensubtitles if new_code not in existing_subtitles: current_subtitles.remove(new_code) current_subtitles.append('und') return current_subtitles, new_subtitles
def downloadSubtitles(subtitles_info): existing_subtitles = subtitles_info[b'subtitles'] # First of all, check if we need subtitles languages = getNeededLanguages(existing_subtitles) if not languages: logging.debug('%s: No missing subtitles for S%02dE%02d' % (subtitles_info[b'show.indexerid'], subtitles_info[b'season'], subtitles_info[b'episode'])) return existing_subtitles, None subtitles_path = getSubtitlesPath(subtitles_info[b'location']).encode( sickbeard.SYS_ENCODING) video_path = subtitles_info[b'location'].encode(sickbeard.SYS_ENCODING) providers = getEnabledServiceList() try: video = subliminal.scan_video(video_path, subtitles=False, embedded_subtitles=False) except Exception: logging.debug( '%s: Exception caught in subliminal.scan_video for S%02dE%02d' % (subtitles_info[b'show.indexerid'], subtitles_info[b'season'], subtitles_info[b'episode'])) return existing_subtitles, None provider_configs = { 'addic7ed': { 'username': sickbeard.ADDIC7ED_USER, 'password': sickbeard.ADDIC7ED_PASS }, 'legendastv': { 'username': sickbeard.LEGENDASTV_USER, 'password': sickbeard.LEGENDASTV_PASS }, 'opensubtitles': { 'username': sickbeard.OPENSUBTITLES_USER, 'password': sickbeard.OPENSUBTITLES_PASS } } pool = subliminal.api.ProviderPool(providers=providers, provider_configs=provider_configs) try: subtitles_list = pool.list_subtitles(video, languages) if not subtitles_list: logging.debug( '%s: No subtitles found for S%02dE%02d on any provider' % (subtitles_info[b'show.indexerid'], subtitles_info[b'season'], subtitles_info[b'episode'])) return existing_subtitles, None found_subtitles = pool.download_best_subtitles( subtitles_list, video, languages=languages, hearing_impaired=sickbeard.SUBTITLES_HEARING_IMPAIRED, only_one=not sickbeard.SUBTITLES_MULTI) save_subtitles(video, found_subtitles, directory=subtitles_path, single=not sickbeard.SUBTITLES_MULTI) if not sickbeard.EMBEDDED_SUBTITLES_ALL and sickbeard.SUBTITLES_EXTRA_SCRIPTS and video_path.endswith( ('.mkv', '.mp4')): run_subs_extra_scripts(subtitles_info, found_subtitles, video, single=not sickbeard.SUBTITLES_MULTI) current_subtitles = subtitlesLanguages(video_path)[0] new_subtitles = frozenset(current_subtitles).difference( existing_subtitles) except Exception: logging.info("Error occurred when downloading subtitles for: %s" % video_path) logging.error(traceback.format_exc()) return existing_subtitles, None if sickbeard.SUBTITLES_HISTORY: for subtitle in found_subtitles: logging.debug( 'history.logSubtitle %s, %s' % (subtitle.provider_name, subtitle.language.opensubtitles)) history.logSubtitle(subtitles_info[b'show.indexerid'], subtitles_info[b'season'], subtitles_info[b'episode'], subtitles_info[b'status'], subtitle) return current_subtitles, new_subtitles
def download_subtitles(episode, force_lang=None): # pylint: disable=too-many-locals, too-many-branches, too-many-statements existing_subtitles = episode.subtitles if not needs_subtitles(existing_subtitles, force_lang): logger.log('Episode already has all needed subtitles, skipping {0} {1}'.format (episode.show.name, episode_num(episode.season, episode.episode) or episode_num(episode.season, episode.episode, numbering='absolute')), logger.DEBUG) return existing_subtitles, None if not force_lang: languages = get_needed_languages(existing_subtitles) else: languages = {from_code(force_lang)} if not languages: logger.log('No subtitles needed for {0} {1}'.format (episode.show.name, episode_num(episode.season, episode.episode) or episode_num(episode.season, episode.episode, numbering='absolute')), logger.DEBUG) return existing_subtitles, None subtitles_path = get_subtitles_path(episode.location) video_path = episode.location # Perfect match = hash score - hearing impaired score - resolution score # (subtitle for 720p is the same as for 1080p) # Perfect match = 215 - 1 - 1 = 213 # Non-perfect match = series + year + season + episode # Non-perfect match = 108 + 54 + 18 + 18 = 198 # From latest subliminal code: # episode_scores = {'hash': 215, 'series': 108, 'year': 54, 'season': 18, 'episode': 18, 'release_group': 9, # 'format': 4, 'audio_codec': 2, 'resolution': 1, 'hearing_impaired': 1, 'video_codec': 1} user_score = 213 if sickbeard.SUBTITLES_PERFECT_MATCH else 198 video = get_video(video_path, subtitles_path=subtitles_path, episode=episode) if not video: logger.log('Exception caught in subliminal.scan_video for {0} {1}'.format (episode.show.name, episode_num(episode.season, episode.episode) or episode_num(episode.season, episode.episode, numbering='absolute')), logger.DEBUG) return existing_subtitles, None providers = enabled_service_list() pool = SubtitleProviderPool() try: subtitles_list = pool.list_subtitles(video, languages) for provider in providers: if provider in pool.discarded_providers: logger.log('Could not search in {0} provider. Discarding for now'.format(provider), logger.DEBUG) if not subtitles_list: logger.log('No subtitles found for {0} {1}'.format (episode.show.name, episode_num(episode.season, episode.episode) or episode_num(episode.season, episode.episode, numbering='absolute')), logger.DEBUG) return existing_subtitles, None for subtitle in subtitles_list: score = subliminal.score.compute_score(subtitle, video, hearing_impaired=sickbeard.SUBTITLES_HEARING_IMPAIRED) logger.log('[{0}] Subtitle score for {1} is: {2} (min={3})'.format (subtitle.provider_name, subtitle.id, score, user_score), logger.DEBUG) found_subtitles = pool.download_best_subtitles(subtitles_list, video, languages=languages, hearing_impaired=sickbeard.SUBTITLES_HEARING_IMPAIRED, min_score=user_score, only_one=not sickbeard.SUBTITLES_MULTI) subliminal.save_subtitles(video, found_subtitles, directory=subtitles_path, single=not sickbeard.SUBTITLES_MULTI) except IOError as error: if 'No space left on device' in ex(error): logger.log('Not enough space on the drive to save subtitles', logger.WARNING) else: logger.log(traceback.format_exc(), logger.WARNING) except Exception: logger.log('Error occurred when downloading subtitles for: {0}'.format(video_path)) logger.log(traceback.format_exc(), logger.ERROR) return existing_subtitles, None for subtitle in found_subtitles: subtitle_path = subliminal.subtitle.get_subtitle_path(video.name, None if not sickbeard.SUBTITLES_MULTI else subtitle.language) if subtitles_path is not None: subtitle_path = os.path.join(subtitles_path, os.path.split(subtitle_path)[1]) sickbeard.helpers.chmodAsParent(subtitle_path) sickbeard.helpers.fixSetGroupID(subtitle_path) if sickbeard.SUBTITLES_HISTORY: logger.log('history.logSubtitle {0}, {1}'.format (subtitle.provider_name, subtitle.language.opensubtitles), logger.DEBUG) history.logSubtitle(episode.show.indexerid, episode.season, episode.episode, episode.status, subtitle) if sickbeard.SUBTITLES_EXTRA_SCRIPTS and is_media_file(video_path) and not sickbeard.EMBEDDED_SUBTITLES_ALL: run_subs_extra_scripts(episode, subtitle, video, single=not sickbeard.SUBTITLES_MULTI) new_subtitles = sorted({subtitle.language.opensubtitles for subtitle in found_subtitles}) current_subtitles = sorted({subtitle for subtitle in new_subtitles + existing_subtitles}) if existing_subtitles else new_subtitles if not sickbeard.SUBTITLES_MULTI and len(found_subtitles) == 1: new_code = found_subtitles[0].language.opensubtitles if new_code not in existing_subtitles: current_subtitles.remove(new_code) current_subtitles.append('und') return current_subtitles, new_subtitles
def download_subtitles(subtitles_info): existing_subtitles = subtitles_info['subtitles'] if not needs_subtitles(existing_subtitles): logger.log(u'Episode already has all needed subtitles, skipping episode %dx%d of show %s' % (subtitles_info['season'], subtitles_info['episode'], subtitles_info['show_name']), logger.DEBUG) return (existing_subtitles, None) # Check if we really need subtitles languages = get_needed_languages(existing_subtitles) if not languages: logger.log(u'No subtitles needed for %s S%02dE%02d' % (subtitles_info['show_name'], subtitles_info['season'], subtitles_info['episode']), logger.DEBUG) return (existing_subtitles, None) subtitles_path = get_subtitles_path(subtitles_info['location']).encode(sickbeard.SYS_ENCODING) video_path = subtitles_info['location'].encode(sickbeard.SYS_ENCODING) video = get_video(video_path, subtitles_path=subtitles_path) if not video: logger.log(u'Exception caught in subliminal.scan_video for %s S%02dE%02d' % (subtitles_info['show_name'], subtitles_info['season'], subtitles_info['episode']), logger.DEBUG) return (existing_subtitles, None) providers = enabled_service_list() provider_configs = {'addic7ed': {'username': sickbeard.ADDIC7ED_USER, 'password': sickbeard.ADDIC7ED_PASS}, 'legendastv': {'username': sickbeard.LEGENDASTV_USER, 'password': sickbeard.LEGENDASTV_PASS}, 'opensubtitles': {'username': sickbeard.OPENSUBTITLES_USER, 'password': sickbeard.OPENSUBTITLES_PASS}} pool = subliminal.api.ProviderPool(providers=providers, provider_configs=provider_configs) try: subtitles_list = pool.list_subtitles(video, languages) if not subtitles_list: logger.log(u'No subtitles found for %s S%02dE%02d on any provider' % (subtitles_info['show_name'], subtitles_info['season'], subtitles_info['episode']), logger.DEBUG) return (existing_subtitles, None) for sub in subtitles_list: matches = sub.get_matches(video, hearing_impaired=False) score = subliminal.subtitle.compute_score(matches, video) logger.log(u"[%s] Subtitle score for %s is: %s (min=132)" % (sub.provider_name, sub.id, score), logger.DEBUG) found_subtitles = pool.download_best_subtitles(subtitles_list, video, languages=languages, min_score=132, hearing_impaired=sickbeard.SUBTITLES_HEARING_IMPAIRED, only_one=not sickbeard.SUBTITLES_MULTI) subliminal.save_subtitles(video, found_subtitles, directory=subtitles_path, single=not sickbeard.SUBTITLES_MULTI) except Exception: logger.log(u"Error occurred when downloading subtitles for: %s" % video_path) logger.log(traceback.format_exc(), logger.ERROR) return (existing_subtitles, None) for subtitle in found_subtitles: subtitle_path = subliminal.subtitle.get_subtitle_path(video.name, None if not sickbeard.SUBTITLES_MULTI else subtitle.language) if subtitles_path is not None: subtitle_path = ek(os.path.join, subtitles_path, ek(os.path.split, subtitle_path)[1]) sickbeard.helpers.chmodAsParent(subtitle_path) sickbeard.helpers.fixSetGroupID(subtitle_path) if (not sickbeard.EMBEDDED_SUBTITLES_ALL and sickbeard.SUBTITLES_EXTRA_SCRIPTS and video_path.rsplit(".", 1)[1] in media_extensions): run_subs_extra_scripts(subtitles_info, found_subtitles, video, single=not sickbeard.SUBTITLES_MULTI) current_subtitles = [subtitle.language.opensubtitles for subtitle in found_subtitles] new_subtitles = frozenset(current_subtitles).difference(existing_subtitles) current_subtitles += existing_subtitles if sickbeard.SUBTITLES_HISTORY: for subtitle in found_subtitles: logger.log(u'history.logSubtitle %s, %s' % (subtitle.provider_name, subtitle.language.opensubtitles), logger.DEBUG) history.logSubtitle(subtitles_info['show_indexerid'], subtitles_info['season'], subtitles_info['episode'], subtitles_info['status'], subtitle) return (current_subtitles, new_subtitles)
def download_subtitles(subtitles_info): # pylint: disable=too-many-locals existing_subtitles = subtitles_info['subtitles'] if not needs_subtitles(existing_subtitles): logger.log( u'Episode already has all needed subtitles, skipping %s S%02dE%02d' % (subtitles_info['show_name'], subtitles_info['season'], subtitles_info['episode']), logger.DEBUG) return (existing_subtitles, None) # Check if we really need subtitles languages = get_needed_languages(existing_subtitles) if not languages: logger.log( u'No subtitles needed for %s S%02dE%02d' % (subtitles_info['show_name'], subtitles_info['season'], subtitles_info['episode']), logger.DEBUG) return (existing_subtitles, None) subtitles_path = get_subtitles_path(subtitles_info['location']).encode( sickbeard.SYS_ENCODING) video_path = subtitles_info['location'].encode(sickbeard.SYS_ENCODING) user_score = 132 if sickbeard.SUBTITLES_PERFECT_MATCH else 111 video = get_video(video_path, subtitles_path=subtitles_path) if not video: logger.log( u'Exception caught in subliminal.scan_video for %s S%02dE%02d' % (subtitles_info['show_name'], subtitles_info['season'], subtitles_info['episode']), logger.DEBUG) return (existing_subtitles, None) providers = enabled_service_list() provider_configs = { 'addic7ed': { 'username': sickbeard.ADDIC7ED_USER, 'password': sickbeard.ADDIC7ED_PASS }, 'legendastv': { 'username': sickbeard.LEGENDASTV_USER, 'password': sickbeard.LEGENDASTV_PASS }, 'opensubtitles': { 'username': sickbeard.OPENSUBTITLES_USER, 'password': sickbeard.OPENSUBTITLES_PASS } } pool = subliminal.api.ProviderPool(providers=providers, provider_configs=provider_configs) try: subtitles_list = pool.list_subtitles(video, languages) if not subtitles_list: logger.log( u'No subtitles found for %s S%02dE%02d on any provider' % (subtitles_info['show_name'], subtitles_info['season'], subtitles_info['episode']), logger.DEBUG) return (existing_subtitles, None) for sub in subtitles_list: matches = sub.get_matches(video, hearing_impaired=False) score = subliminal.subtitle.compute_score(matches, video) logger.log( u"[%s] Subtitle score for %s is: %s (min=%s)" % (sub.provider_name, sub.id, score, user_score), logger.DEBUG) found_subtitles = pool.download_best_subtitles( subtitles_list, video, languages=languages, hearing_impaired=sickbeard.SUBTITLES_HEARING_IMPAIRED, min_score=user_score, only_one=not sickbeard.SUBTITLES_MULTI) subliminal.save_subtitles(video, found_subtitles, directory=subtitles_path, single=not sickbeard.SUBTITLES_MULTI) except Exception: logger.log(u"Error occurred when downloading subtitles for: %s" % video_path) logger.log(traceback.format_exc(), logger.ERROR) return (existing_subtitles, None) for subtitle in found_subtitles: subtitle_path = subliminal.subtitle.get_subtitle_path( video.name, None if not sickbeard.SUBTITLES_MULTI else subtitle.language) if subtitles_path is not None: subtitle_path = ek(os.path.join, subtitles_path, ek(os.path.split, subtitle_path)[1]) sickbeard.helpers.chmodAsParent(subtitle_path) sickbeard.helpers.fixSetGroupID(subtitle_path) if (not sickbeard.EMBEDDED_SUBTITLES_ALL and sickbeard.SUBTITLES_EXTRA_SCRIPTS and video_path.rsplit(".", 1)[1] in media_extensions): run_subs_extra_scripts(subtitles_info, found_subtitles, video, single=not sickbeard.SUBTITLES_MULTI) current_subtitles = [ subtitle.language.opensubtitles for subtitle in found_subtitles ] new_subtitles = frozenset(current_subtitles).difference(existing_subtitles) current_subtitles += existing_subtitles if sickbeard.SUBTITLES_HISTORY: for subtitle in found_subtitles: logger.log( u'history.logSubtitle %s, %s' % (subtitle.provider_name, subtitle.language.opensubtitles), logger.DEBUG) history.logSubtitle(subtitles_info['show_indexerid'], subtitles_info['season'], subtitles_info['episode'], subtitles_info['status'], subtitle) return (current_subtitles, new_subtitles)