def list_supported_video_types(self): """List supported video types asynchronously. :return: video types supported by the providers. :rtype: tuple of video types """ video_types = [] def get_providers_video_types(provider_name): provider_video_types = None try: provider_video_types = {'provider': provider_name, 'video_types': self[provider_name].video_types} except AttributeError: logger.exception(f"{provider_name} provider doesn't have a video_types attribute") return provider_video_types with ThreadPoolExecutor(self.max_workers) as executor: for future in as_completed([executor.submit(get_providers_video_types, x) for x in self.providers]): provider_video_types = future.result() if provider_video_types is None: continue # add the languages for this provider video_types.append(provider_video_types) return video_types
def list_subtitles(self, video, languages, blacklist=None): subtitles = [] with ThreadPoolExecutor(self.max_workers) as executor: for provider, provider_subtitles in executor.map(self.list_subtitles_provider, self.providers, itertools.repeat(video, len(self.providers)), itertools.repeat(languages, len(self.providers))): # discard provider that failed if provider_subtitles is None: logger.info('Discarding provider %s', provider) self.discarded_providers.add(provider) continue # add subtitles subtitles.extend(provider_subtitles) return subtitles