def list_subtitles(self, rating_key, item_type, part_id, language): metadata = get_plex_metadata(rating_key, part_id, item_type) if item_type == "episode": min_score = 66 else: min_score = 23 scanned_parts = scan_videos( [metadata], kind="series" if item_type == "episode" else "movie", ignore_all=True) if not scanned_parts: Log.Error("Couldn't list available subtitles for %s", rating_key) return video, plex_part = scanned_parts.items()[0] config.init_subliminal_patches() available_subs = list_all_subtitles( scanned_parts, {Language.fromietf(language)}, providers=config.providers, provider_configs=config.provider_settings) use_hearing_impaired = Prefs['subtitles.search.hearingImpaired'] in ( "prefer", "force HI") # sort subtitles by score unsorted_subtitles = [] for s in available_subs[video]: Log.Debug("Starting score computation for %s", s) try: matches = s.get_matches(video, hearing_impaired=use_hearing_impaired) except AttributeError: Log.Error("Match computation failed for %s: %s", s, traceback.format_exc()) continue unsorted_subtitles.append((s, compute_score(matches, video), matches)) scored_subtitles = sorted(unsorted_subtitles, key=operator.itemgetter(1), reverse=True) subtitles = [] for subtitle, score, matches in scored_subtitles: # check score if score < min_score: Log.Info('Score %d is below min_score (%d)', score, min_score) continue subtitle.score = score subtitle.matches = matches subtitle.part_id = part_id subtitle.item_type = item_type subtitles.append(subtitle) return subtitles
def download_best_subtitles(self, subtitles, video, languages, min_score=0, hearing_impaired=False, only_one=False, scores=None): """Download the best matching subtitles. :param subtitles: the subtitles to use. :type subtitles: list of :class:`~subliminal.subtitle.Subtitle` :param video: video to download subtitles for. :type video: :class:`~subliminal.video.Video` :param languages: languages to download. :type languages: set of :class:`~babelfish.language.Language` :param int min_score: minimum score for a subtitle to be downloaded. :param bool hearing_impaired: hearing impaired preference. :param bool only_one: download only one subtitle, not one per language. :param dict scores: scores to use, if `None`, the :attr:`~subliminal.video.Video.scores` from the video are used. :return: downloaded subtitles. :rtype: list of :class:`~subliminal.subtitle.Subtitle` """ use_hearing_impaired = hearing_impaired in ("prefer", "force HI") # sort subtitles by score unsorted_subtitles = [] for s in subtitles: logger.debug("Starting score computation for %s", s) matches = s.get_matches(video, hearing_impaired=use_hearing_impaired) unsorted_subtitles.append((s, compute_score(matches, video, scores=scores), matches)) scored_subtitles = sorted(unsorted_subtitles, key=operator.itemgetter(1), reverse=True) # download best subtitles, falling back on the next on error downloaded_subtitles = [] for subtitle, score, matches in scored_subtitles: # check score if score < min_score: logger.info('Score %d is below min_score (%d)', score, min_score) break # stop when all languages are downloaded if set(s.language for s in downloaded_subtitles) == languages: logger.debug('All languages downloaded') break # check downloaded languages if subtitle.language in set(s.language for s in downloaded_subtitles): logger.debug('Skipping subtitle: %r already downloaded', subtitle.language) continue # bail out if hearing_impaired was wrong if not "hearing_impaired" in matches and hearing_impaired in ("force HI", "force non-HI"): logger.debug('Skipping subtitle: %r with score %d because hearing-impaired set to %s', subtitle, score, hearing_impaired) continue # download logger.info('Downloading subtitle %r with score %d', subtitle, score) if self.download_subtitle(subtitle): subtitle.score = score downloaded_subtitles.append(subtitle) # stop if only one subtitle is requested if only_one: logger.debug('Only one subtitle downloaded') break return downloaded_subtitles
def download_best_subtitles(self, subtitles, video, languages, min_score=0, hearing_impaired=False, only_one=False, scores=None): """Download the best matching subtitles. :param subtitles: the subtitles to use. :type subtitles: list of :class:`~subliminal.subtitle.Subtitle` :param video: video to download subtitles for. :type video: :class:`~subliminal.video.Video` :param languages: languages to download. :type languages: set of :class:`~babelfish.language.Language` :param int min_score: minimum score for a subtitle to be downloaded. :param bool hearing_impaired: hearing impaired preference. :param bool only_one: download only one subtitle, not one per language. :param dict scores: scores to use, if `None`, the :attr:`~subliminal.video.Video.scores` from the video are used. :return: downloaded subtitles. :rtype: list of :class:`~subliminal.subtitle.Subtitle` """ use_hearing_impaired = hearing_impaired in ("prefer", "force HI") # sort subtitles by score unsorted_subtitles = [] for s in subtitles: logger.debug("Starting score computation for %s", s) try: matches = s.get_matches(video, hearing_impaired=use_hearing_impaired) except AttributeError: logger.error("Match computation failed for %s: %s", s, traceback.format_exc()) continue unsorted_subtitles.append((s, compute_score(matches, video, scores=scores), matches)) scored_subtitles = sorted(unsorted_subtitles, key=operator.itemgetter(1), reverse=True) # download best subtitles, falling back on the next on error downloaded_subtitles = [] for subtitle, score, matches in scored_subtitles: # check score if score < min_score: logger.info('Score %d is below min_score (%d)', score, min_score) break # stop when all languages are downloaded if set(s.language for s in downloaded_subtitles) == languages: logger.debug('All languages downloaded') break # check downloaded languages if subtitle.language in set(s.language for s in downloaded_subtitles): logger.debug('Skipping subtitle: %r already downloaded', subtitle.language) continue # bail out if hearing_impaired was wrong if "hearing_impaired" not in matches and hearing_impaired in ("force HI", "force non-HI"): logger.debug('Skipping subtitle: %r with score %d because hearing-impaired set to %s', subtitle, score, hearing_impaired) continue # download logger.info('Downloading subtitle %r with score %d', subtitle, score) if self.download_subtitle(subtitle): subtitle.score = score downloaded_subtitles.append(subtitle) # stop if only one subtitle is requested if only_one: logger.debug('Only one subtitle downloaded') break return downloaded_subtitles