Add exception handling so a malformed media file does nto crash Lutris, and does not prevent you from setting a new media.

Resolves #5474
This commit is contained in:
Daniel Johnson 2024-05-13 04:35:00 -04:00
parent 075b531080
commit 5959768f8a
2 changed files with 17 additions and 3 deletions

View file

@ -348,8 +348,13 @@ class GameDialogCommon(SavableModelessDialog, DialogInstallUIDelegate):
service_media = self.service_medias[image_format] service_media = self.service_medias[image_format]
game_slug = self.slug or (self.game.slug if self.game else "") game_slug = self.slug or (self.game.slug if self.game else "")
media_path = resolve_media_path(service_media.get_possible_media_paths(game_slug)) media_path = resolve_media_path(service_media.get_possible_media_paths(game_slug))
try:
image = ScaledImage.new_from_media_path(media_path, service_media.config_ui_size, scale_factor) image = ScaledImage.new_from_media_path(media_path, service_media.config_ui_size, scale_factor)
image_button.set_image(image) image_button.set_image(image)
except Exception as ex:
# We need to survive nasty data in the media files, so the user can replace
# them.
logger.exception("Unable to load media '%s': %s", image_format, ex)
def _get_runner_dropdown(self): def _get_runner_dropdown(self):
runner_liststore = self._get_runner_liststore() runner_liststore = self._get_runner_liststore()

View file

@ -7,6 +7,7 @@ from math import floor
import gi import gi
from lutris.util.jobs import schedule_at_idle from lutris.util.jobs import schedule_at_idle
from lutris.util.log import logger
gi.require_version("PangoCairo", "1.0") gi.require_version("PangoCairo", "1.0")
@ -535,7 +536,15 @@ class GridViewCellRendererImage(Gtk.CellRenderer):
def _get_surface_by_path(self, widget, path, size=None, preserve_aspect_ratio=True): def _get_surface_by_path(self, widget, path, size=None, preserve_aspect_ratio=True):
cell_size = size or (self.media_width, self.media_height) cell_size = size or (self.media_width, self.media_height)
scale_factor = widget.get_scale_factor() if widget else 1 scale_factor = widget.get_scale_factor() if widget else 1
return get_scaled_surface_by_path(path, cell_size, scale_factor, preserve_aspect_ratio=preserve_aspect_ratio) try:
return get_scaled_surface_by_path(
path, cell_size, scale_factor, preserve_aspect_ratio=preserve_aspect_ratio
)
except Exception as ex:
# We need to survive nasty data in the media files, so the user can replace
# them.
logger.exception("Unable to load media '%s': %s", path, ex)
return None
def _on_media_cached_invalidated() -> None: def _on_media_cached_invalidated() -> None: