def is_tmdb_id_missing_trailer(cls, tmdb_id): # type: (int) -> Union[bool, None] """ :param tmdb_id: :return: """ cls.abort_on_shutdown() with cls.lock: if tmdb_id not in cls._all_missing_tmdb_trailers: return None entry = cls._all_missing_tmdb_trailers[tmdb_id] elapsed_time = datetime.date.today() - entry['timestamp'] elapsed_days = elapsed_time.days if elapsed_days > Settings.get_expire_remote_db_trailer_check_days(): del cls._all_missing_tmdb_trailers[tmdb_id] entry = None cls.tmdb_cache_changed() if entry is None: Statistics.add_missing_tmdb_id_cache_miss() else: Statistics.add_missing_tmdb_cache_hit() return entry
def save_cache(cls, ignore_shutdown=False) -> None: """ :return: """ cls.abort_on_shutdown(ignore_shutdown=ignore_shutdown) with cls.lock: if cls.tmdb_unsaved_changes == 0 and cls.library_unsaved_changes == 0: return if cls.tmdb_unsaved_changes > 0: entries_to_delete = [] for key, entry in cls._all_missing_tmdb_trailers.items(): elapsed_time = datetime.date.today() - entry['timestamp'] elapsed_days = elapsed_time.days if elapsed_days > Settings.get_expire_remote_db_trailer_check_days(): if entry[Movie.UNIQUE_ID_TMDB] in cls._all_missing_tmdb_trailers: entries_to_delete.append( entry[Movie.UNIQUE_ID_TMDB]) for entry_to_delete in entries_to_delete: del cls._all_missing_tmdb_trailers[entry_to_delete] cls.abort_on_shutdown(ignore_shutdown=ignore_shutdown) try: path = os.path.join(Settings.get_remote_db_cache_path(), 'index', 'missing_tmdb_trailers.json') temp_path = os.path.join(Settings.get_remote_db_cache_path(), 'index', 'missing_tmdb_trailers.json.temp') # path = path.encode('utf-8') path = xbmcvfs.validatePath(path) temp_path = xbmcvfs.validatePath(temp_path) parent_dir, file_name = os.path.split(temp_path) if not os.path.exists(parent_dir): DiskUtils.create_path_if_needed(parent_dir) with io.open(temp_path, mode='wt', newline=None, encoding='utf-8', ) as cacheFile: json_text = \ json.dumps(cls._all_missing_tmdb_trailers, encoding='utf-8', ensure_ascii=False, default=TrailerUnavailableCache.handler, indent=3, sort_keys=True) cacheFile.write(json_text) cacheFile.flush() try: os.replace(temp_path, path) except OSError: cls._logger.exception(f'Failed to replace index of movies' f' missing trailers cache: {path}') cls.tmdb_last_save = datetime.datetime.now() cls.tmdb_unsaved_changes = 0 except AbortException: reraise(*sys.exc_info()) except IOError as e: cls._logger.exception('') except Exception as e: cls._logger.exception('') finally: try: os.remove(temp_path) except Exception: pass cls.abort_on_shutdown(ignore_shutdown=ignore_shutdown) if cls.library_unsaved_changes > 0: entries_to_delete = [] for key, entry in cls._all_missing_library_trailers.items(): elapsed_time = datetime.date.today() - entry['timestamp'] elapsed_days = elapsed_time.days if elapsed_days > Settings.get_expire_remote_db_trailer_check_days(): if entry[Movie.MOVIEID] in cls._all_missing_library_trailers: entries_to_delete.append(entry[Movie.MOVIEID]) for entry_to_delete in entries_to_delete: del cls._all_missing_library_trailers[entry_to_delete] cls.abort_on_shutdown(ignore_shutdown=ignore_shutdown) try: path = os.path.join(Settings.get_remote_db_cache_path(), 'index', 'missing_library_trailers.json') temp_path = os.path.join(Settings.get_remote_db_cache_path(), 'index', 'missing_library_trailers.json.temp') # path = path.encode('utf-8') path = xbmcvfs.validatePath(path) temp_path = xbmcvfs.validatePath(temp_path) parent_dir, file_name = os.path.split(path) if not os.path.exists(parent_dir): DiskUtils.create_path_if_needed(parent_dir) with io.open(temp_path, mode='wt', newline=None, encoding='utf-8', ) as cacheFile: # TODO: Need ability to interrupt when ABORT. Object_handler # not a valid arg to dumps json_text = \ json.dumps(cls._all_missing_library_trailers, encoding='utf-8', ensure_ascii=False, default=TrailerUnavailableCache.handler, indent=3, sort_keys=True) cacheFile.write(json_text) cacheFile.flush() try: os.replace(temp_path, path) except OSError: cls._logger.exception(f'Failed to replace missing trailer' f' information cache: {path}') cls.library_last_save = datetime.datetime.now() cls.library_unsaved_changes = 0 except AbortException: reraise(*sys.exc_info()) except IOError as e: cls._logger.exception('') except Exception as e: cls._logger.exception('') finally: try: os.remove(temp_path) except Exception: pass