def get_video(tv_episode, video_path, subtitles_dir=None, subtitles=True, embedded_subtitles=None, release_name=None): """Return the subliminal video for the given path. The video_path is used as a key to cache the video to avoid scanning and parsing the video metadata all the time :param tv_episode: :type tv_episode: medusa.tv.Episode :param video_path: the video path :type video_path: str :param subtitles_dir: the subtitles directory :type subtitles_dir: str or None :param subtitles: True if existing external subtitles should be taken into account :type subtitles: bool or None :param embedded_subtitles: True if embedded subtitles should be taken into account :type embedded_subtitles: bool or None :param release_name: the release name :type release_name: str or None :return: video :rtype: subliminal.video.Video """ key = video_key.format(video_path=video_path) payload = { 'subtitles_dir': subtitles_dir, 'subtitles': subtitles, 'embedded_subtitles': embedded_subtitles, 'release_name': release_name } cached_payload = memory_cache.get(key, expiration_time=VIDEO_EXPIRATION_TIME) if cached_payload != NO_VALUE and { k: v for k, v in iteritems(cached_payload) if k != 'video' } == payload: logger.debug(u'Found cached video information under key %s', key) return cached_payload['video'] video_path = _encode(video_path) subtitles_dir = _encode(subtitles_dir or get_subtitles_dir(video_path)) logger.debug(u'Scanning video %s...', video_path) try: video = scan_video(video_path) except ValueError as e: logger.warning(u'Unable to scan video: %s. Error: %s', video_path, e.message) else: # Add hash of our custom provider Itasa video.size = os.path.getsize(video_path) if video.size > 10485760: video.hashes['itasa'] = hash_itasa(video_path) # external subtitles if subtitles: video.subtitle_languages |= set( search_external_subtitles(video_path, directory=subtitles_dir).values()) if embedded_subtitles is None: embedded_subtitles = bool(not app.IGNORE_EMBEDDED_SUBS and video_path.endswith('.mkv')) refine(video, episode_refiners=episode_refiners, embedded_subtitles=embedded_subtitles, release_name=release_name, tv_episode=tv_episode) video.alternative_series = list(tv_episode.series.aliases) payload['video'] = video memory_cache.set(key, payload) logger.debug(u'Video information cached under key %s', key) return video
def get_video(tv_episode, video_path, subtitles_dir=None, subtitles=True, embedded_subtitles=None, release_name=None): """Return the subliminal video for the given path. The video_path is used as a key to cache the video to avoid scanning and parsing the video metadata all the time :param tv_episode: :type tv_episode: medusa.tv.Episode :param video_path: the video path :type video_path: str :param subtitles_dir: the subtitles directory :type subtitles_dir: str or None :param subtitles: True if existing external subtitles should be taken into account :type subtitles: bool or None :param embedded_subtitles: True if embedded subtitles should be taken into account :type embedded_subtitles: bool or None :param release_name: the release name :type release_name: str or None :return: video :rtype: subliminal.video.Video """ key = video_key.format(video_path=video_path) payload = {'subtitles_dir': subtitles_dir, 'subtitles': subtitles, 'embedded_subtitles': embedded_subtitles, 'release_name': release_name} cached_payload = memory_cache.get(key, expiration_time=VIDEO_EXPIRATION_TIME) if cached_payload != NO_VALUE and {k: v for k, v in iteritems(cached_payload) if k != 'video'} == payload: logger.debug(u'Found cached video information under key %s', key) return cached_payload['video'] video_is_mkv = video_path.endswith('.mkv') subtitles_dir = subtitles_dir or get_subtitles_dir(video_path) logger.debug(u'Scanning video %s...', video_path) try: video = scan_video(video_path) except ValueError as error: logger.warning(u'Unable to scan video: %s. Error: %r', video_path, error) else: # Add hash of our custom provider Itasa video.size = os.path.getsize(video_path) if video.size > 10485760: video.hashes['itasa'] = hash_itasa(video_path) # external subtitles if subtitles: video.subtitle_languages |= set(search_external_subtitles(video_path, directory=subtitles_dir).values()) if embedded_subtitles is None: embedded_subtitles = bool(not app.IGNORE_EMBEDDED_SUBS and video_is_mkv) refine(video, episode_refiners=episode_refiners, embedded_subtitles=embedded_subtitles, release_name=release_name, tv_episode=tv_episode) video.alternative_series = list(tv_episode.series.aliases) payload['video'] = video memory_cache.set(key, payload) logger.debug(u'Video information cached under key %s', key) return video